facts, predicate,
pred(arg1,arg2,…argN).
argument type: interger, atom( low case begin, ’ '), variable(uppoer case begin or _), structure,
事实 (facts)
注:斜粗体字表示Prolog的专有名词

事实(facts)是prolog中最简单的谓词(predicate)。它和关系数据库中的记录十分相似。在下一章中我们会把事实作为数据库来搜索。

谓词: Prolog语言的基本组成元素,可以是一段程序、一个数据类型或者是一种关系。它由谓词名和参数组成。两个名称相同而参数的数目不同的谓词是不同的谓词。

事实的语法结构如下:

pred(arg1, arg2, … argN).

其中pred为谓词的名称。arg1,…为参数,共有N个。‘.’是所有的Prolog子句的结束符。没有参数的谓词形式如下:

pred.

参数可以是以下四种之一:

整数(integer)
绝对值小于某一个数的正数或负数。

原子(atom)
由小写字母开头的字符串。

变量(variable)
由大写字母或下划线(_)开头。

结构(structure)
在以后的章节介绍。

不同的Prolog还增加了一些其他的数据类型,例如浮点数和字符串等。

Prolog字符集包括: 大写字母,A-Z;小写字母,a-z;数字,0-9;±//^,.~:.?#$等。

原子通常是字母和数字组成,开头的字符必须是小写字母。例如:

hello
twoWordsTogether
x14

为了方便阅读,可以使用下划线把单词分开。例如:

a_long_atom_name
z_23

下面的是不合法的原子,

no-embedded-hyphens
123nodigitsatbeginning
Nocapsfirst
下划线不能放在最前面

使用单引号扩起来的字符集都是合法的原子。例如:

‘this-hyphen-is-ok’
‘UpperCase’
‘embedded blanks’

下面的由符号组成的也是合法的原子:

,++

变量和原子相似, 但是开头字符四大写字母或是下划线。例如:

X
Input_List
下划线开头的都是变量
Z56

有了这些基本的知识,我们就可以开始编写事实了。事实通常用来储存程序所需的数据。例如,某次商业买卖中的顾客数据。customer/3。(/3表示customer有三个参数)

customer(‘John Jones’, boston, good_credit).
customer(‘Sally Smith’, chicago, good_credit).

必须使用单引号把顾客名引起来,因为它们是由大写字母开头的,并且中间有空格。

再看一个例子,视窗系统使用事实储存不同的窗口信息。在这个例子中参数有窗口名称和窗口的位置坐标。

window(main, 2, 2, 20, 72).
window(errors, 15, 40, 20, 78).

某个医疗专家系统可能有如下的疾病数据库。

disease(plague, infectious). {疾病(瘟疫,有传染性)}

Prolog的解释器提供了动态储存事实和规则的方法,并且也提供了访问它们的方法。数据库的更新是通过运行‘consult’或‘reconsult’命令。我们也可以直接在解释器中输入谓词,但是这些谓词不会被储存到硬盘上。

寻找Nani

下面我们正式开始“寻找Nani”游戏的编写。我们从定义基本的事实开始,这些事实是本游戏的基本的数据库。它们包括:

房间和它们的联系
物体和它们的位置
物体的属性
玩家在游戏开始时的位置

“寻找Nani”游戏的的房间格局

首先我们使用room/1谓词定义房间,一共有五条子句,它们都是事实,如图2.1。

room(kitchen).
room(office).
room(hall).
room(‘dining room’).
room(cellar).

我们使用具有两个参数的谓词来定义物体的位置。第一个参数代表物体的名称,第二个参数表示物体的位置。开始时,我们加入如下的物体。

location(desk, office).
location(apple, kitchen).
location(flashlight, desk).
location(‘washing machine’, cellar).
location(nani, ‘washing machine’).
location(broccoli, kitchen).
location(crackers, kitchen).
location(computer, office).

注意:我们定义的那些符号,例如:kitchen、desk等对于我们是有意义的,可是它们对于Prolog是没有任何意义的,完全可以使用任何符号来表示房间的名称。

谓词location/2的意思是“第一个参数所代表的物体位于第二个参数所代表的物体中”。Prolog能够区别location(sink, kitchen)和location(kitchen, sink)。因此,参数的顺序是我们定义事实时需要考虑的一个重要问题。

下面我们来表达房间的联系。使用door/2来表示两个房间有门相连,这里遇到了一个小小的困难:

door(office, hall).

我们想要表达的意思是,office和hall之间有一个门。可是由于Prolog能够区分door(office, hall)和door(hall, office), 所以如果我们想要表达一种双向的联系,就必须把每种联系都定义一遍。

door(office, hall).
door(hall, office).

参数的顺序对定义物体的位置有帮助,可是在定义房间的联系时却带来了麻烦。我们不得不把每个房门都定义两次!

在这一章里,只定义单向的门,以后会很好地解决此问题的。

door(office, hall).
door(kitchen, office).
door(hall, ‘dining room’).
door(kitchen, cellar).
door(‘dining room’, kitchen).

下面定义某些物体的属性,

edible(apple).
edible(crackers).

tastes_yucky(broccoli).

最后,定义手电筒(由于是晚上,玩家必须想找到手电筒,并打开它才能到那些关了灯的房间)的状态和玩家的初始位置。

turned_off(flashlight).
here(kitchen).

**调试追踪 trace. (开) notrace(关)
**区分true. true 和false. 没有句号的true 表示查询结果还有其他输出。

Prolog教程 3相关推荐

  1. Atitit.5gl 第五代语言编程语言 PROLOG教程  人工智能语言的标准 与实现

    Atitit.5gl 第五代语言编程语言 PROLOG教程  人工智能语言的标准 与实现 1. 第五代语言就是自然语言又被称为知识库语言或人工智能语言,1 2. 人工智能语言特点2 2.1. 试探法2 ...

  2. Prolog教程 16

      Prolog特别适合开发自然语言的应用系统.在这一章,我们将为寻找Nani游戏添加自然语言理解的部分.(由于Prolog谓词是使用的英文符号,所以这里的自然语言理解只能局限在英文中) 在着手于编制 ...

  3. Prolog教程 1

    (转)Prolog教程 1 今天是2019年1月1日, 因为AI课要用到Prolog, 看到不错的入门教程收录下来学习. 如果你是一位prolog的新手,希望你首先阅读这篇文章,好对prolog的全局 ...

  4. Prolog教程 14--cut的功能

    cut,使用符号!来表示. 直到目前为止,我们都一直在使用Prolog内建的回溯功能.使用此功能可以方便地写出结构紧凑的谓词来. 但是,并不是所有的回溯都是必须的,这时我们需要能够人工地控制回溯过程. ...

  5. Prolog教程 5

      我们可以把简单的查询连接起来,组成一些较复杂的查询.例如,如果我们想知道厨房里能吃的东西,就可以向Prolog进行如下的询问. ?- location(X, kitchen), edible(X) ...

  6. Prolog教程 4

      现在我们的游戏中已经有了一些事实,使用Prolog的解释器调入此程序后,我们就可以对这些事实进行查询了.本章和下一章中的Prolog程序只包括事实,我们要学会如何对这些事实进行查询. Prolog ...

  7. Prolog教程 7

      到现在为止,我们已经对Prolog有了一个基本的了解,现在有必要对我们所学过的知识做一个系统的总结. Prolog的程序是由一系列的事实和规则组成的数据库. 规则之间的调用是通过联合操作完成的,P ...

  8. Prolog教程 9

    Prolog的程序就是谓词的数据库,我们通常把这些谓词的子句写入Prolog的程序中的.在运行Prolog时,解释器首先把所有的子句调入到内存中.所以这些写在程序中的子句都是固定不变的.那么有没有办法 ...

  9. Prolog教程 10

    到目前为止,所介绍的事实.查询以及规则都使用的是最简单的数据结构.谓词的参数都是原子或者整数,这些都是Prolog的基本组成元素.例如我们所使用过的原子有: office, apple flashli ...

最新文章

  1. c语言括号匹配的检验,检验括号匹配的算法
  2. html5倒计时秒杀怎么做,vue 设计一个倒计时秒杀的组件
  3. ip复原Java,力扣:复原IP地址
  4. 主流Java学习路线
  5. 功能Java示例 第6部分–用作参数
  6. 靓仔落泪,性能问题定位难倒我了
  7. 操作系统(1)-进程与线程
  8. iOS在支持arc的工程中,导入不支持arc的第三方的插件
  9. 机器视觉:系统不稳定性因素分析
  10. python strip和split_python strip() 函数和 split() 函数的详解及实例
  11. wordpress 数据库详解
  12. html 5 本地数据库(二)-- Web Sql Database核心方法openDatabase、transaction、executeSql 详解
  13. 生成对抗网络,从DCGAN到StyleGAN、pixel2pixel,人脸生成和图像翻译。
  14. Spring学习路线
  15. Echarts使用之-散点图(各国人均寿命与GDP关系演变)
  16. C语言入门题库——求2+22+222+......+22222的值
  17. 基于tensorflow的LSTM实现PTB预测
  18. 2019暑假找实习工作经历-我太难了
  19. react 中子路由(route)或二级路由如何配置?
  20. Http协议和Python调试过程

热门文章

  1. 适配器的作用计算机网络,网络适配器的作用
  2. 解决 java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.
  3. 外媒曝华为“达芬奇计划” 或对英伟达构成威胁
  4. 坐在电脑前是高一点好还是低一点好
  5. php artisan nohup,artisan命令生成和redis消息订阅和任务调度
  6. 使用飞信机器人发短信需要开放的端口
  7. C语言 一个球从100米高度下落,每次下落反弹原来高度的一半,如此反复,求第10次落地时共经历了多少米?第10次反弹多高?
  8. 申请ssl 验证域名 失败了 中间证书
  9. 光电效应在计算机中应用,光电效应在现在的应用主要包括哪几个方面?
  10. 网狐_经典版机器人添加说明