Prolog语言基础知识

上传人:灯火****19 文档编号:142981117 上传时间:2020-08-25 格式:PDF 页数:12 大小:134.25KB
返回 下载 相关 举报
Prolog语言基础知识_第1页
第1页 / 共12页
Prolog语言基础知识_第2页
第2页 / 共12页
Prolog语言基础知识_第3页
第3页 / 共12页
Prolog语言基础知识_第4页
第4页 / 共12页
Prolog语言基础知识_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《Prolog语言基础知识》由会员分享,可在线阅读,更多相关《Prolog语言基础知识(12页珍藏版)》请在金锄头文库上搜索。

1、PrologProlog 语言基础知识语言基础知识 一一. .数据结构数据结构 PROLOG语言与其他任何一种计算机高级语言一样,有其定义的数据结构。下面将介绍 PROLOG语言的基本数据结构。 1.1.常量常量 常量是数据结构的基本组成部分,用来对特定对象及关系的命名。 在PROLOG 语言中,合法的常量有: (1)整数,一个纯数字串,例 182 000,581 202。 (2)原子,分为两种: 1)标识符:以小写字母开头的,包含字母、数字、下划线的串,例 aBC12,is_。 2)符号:PROLOG 语言规定的符号集的非空序列,例?、-、=。若原子用 单引号厂( )括住,则可含有任何字符。

2、 (3)字符集 ab.z 2.2.变量变量 变量是用来表示还无法知道且需要 PROLOG程序来确定的客体。变量用变量名表示,变 量名与标识符相似,所不同的是以大写字母或下划线开头。例 Variable,_ansure。 PROLOG语言中有一个特殊的变量,不需要知道它是什么以及具体名字,只是表示留出 一位置,称为匿名变量。用单一的下划线(_)来表示。比如只想知道是否有人喜欢跳舞,但不 需知道这个人的名字,这时就可以用匿名变量。 3.3.结构结构 结构是PROLOG 语言中的第三类数据结构;用于构造PROLOG数据对象。一个结构是一 个单一的客体,它由一个函子和一个或多个称为分量的项的序列组成。

3、其书写形式为 函子(分量1,分量2,分量n) 其中的分量也可以是结构。 例如可用结构描述事实Mary住zhongshan路120号: person(mary,address(zhongshan,120). 此例中address 是一个具有两个分量即路名和门牌号的结构。该结构是作为事实的一 个分量出现,它将作为关系中的一个客体来对待。 当然,结构中的分量也可以是结构,如上例可写成: person(name(mary),address(street(zhongshan),number(120). 其中name,address,street,number 均为结构。这样,该事实的表示更一目了然了。

4、在PROLOG 语言中,常用的结构形式有: (1)函子(分量1,分量 2,.,分量n)。如上例Mary的住所。 (2)表。表是PROLOG 语言中最常用的数据结构,它由一些有序分量组成,其长度可任 意。有序即表示表中的分量次序是有意义的。同样,表的分量可以是原子、结构等,当然也可 以是表。 例如含有3 个分量a,b,c的表可写成a,b,c。如用函数的方式可写成.(a.(b. (c)。其中符号.是表的函子,也就是说,表是以.为函子的特殊结构。 (3)表达式。PROLOG语言提供了各种运算,如算术运算、比较运算等。PROLOG语言中 的运算可以是中缀形式,简明直观,符合人们的习惯。 算术表达式X+

5、Y否则,如X 已例化,则is退化为=来判断成功与否。) X+Y加法运算。求值时自变量必须例化。 X-Y减法运算。求值时自变量必须例化。 X*Y乘法运算。求值时自变量必须例化。 X/Y整除法运算。求值时自变量必须例化。 X mod Y取模运算。求值时自变量必须例化。 可进行整数或实数求值。运算的优先级是:+、-(正负号),mod(取模),*、/(乘除),+、- (加减)。 3 3 输入输出类输入输出类 PROLOG语言的输入输出类(I/O)谓词是系统从输入流输入一个项、一个字符或一个文 件,或把一个项、一个字符或一个文件输出到输出流。它们仅仅是功能性的,即仅完成一项动 作。 (l)geto(X)

6、。如 X与输入流中的下一个字符匹配,则目标成功。 (2)get(X)。如 X与输入流中的下一个打印字符匹配,则目标成功。 (3)skip(X)。读入并跳过当前输入流中的字符,直到找到一个可与 X匹配的字符。 (4)read(X)。读入当前输入流的下一个项,并使之与 X匹配。 (5)put(X)。把整数X 输出到当前输出流(X必须例化)。 (6)nl。对当前输出流输出控制符回车换行。 (7)write(X)。把项X 输出到当前输出流。 (8) writeq(X)。与write(X)相似。 4 4 控制谓词类控制谓词类 (1)true。该目标永远成功。 (2)fail。该目标永远失败。使用 fai

7、l可以强制回溯,从而得到问题的所有解。 (3)!(cut)。截断谓词!是PROLOG语言控制搜索过程的一个非常重要的内部谓词,它允 许程序员告诉PROLOG 系统,当对已满足的目标的链进行回溯时,前面的那些选择不需要重新 考虑。 截断谓词! 的含义是:作为一个目标,它直接成功,但当回溯到它时,不能重新被满足, 并使其双亲目标(触发含有!的子句的目标)立即失败。即穿过“!”的回溯是不可能的。 5 5表处理表处理 表是PROLOG 中一种非常有用的数据结构。表的表述能力很强,数字中的序列、集合, 通常语言中的数组、记录等均可用表来表示、表的最大特点是其长度不固定,在程序的运行 过程中可动态地变化。

8、具体来讲,就是在程序运行时,可对表施行一些操作,如给表中添加一 个元素,或从中删除一个元素,或者将两个表合并为一个表等等。用表还可以方便地构造堆栈、 队列、链表、树等动态数据结构。 表还有一个重要特点,就是它可分为头和尾两部分。表头是表中第一个元素,而表尾是 表中除第一个元素外的其余元素按原来顺序组成的表。例如下面的例子: 表 表头 表尾表 表头 表尾 1,2,3,4,5 1 2,3,4,5 apple,orange,banana apple orange,banana a,b,c,d,e a,b c,d,e “PROLOG” “PROLOG” 无定义 无定义 在程序中是用竖线|来区分表头和表

9、尾的,而且还可以使用变量。例如一般地用H| T来表示一个表,其中H、T 都是变量,H为表头,T为表尾。注意,此处H 是一个元素(表中第 一个元素),而T 则是一个表(除第一个元素外的表中其余元素按原来顺序组成的表)。表的这 种表示法很有用,它为表的操作提供了极大的方便。下面我们就给出用这种表示法通过匹配 合一提取表头和表尾的例子。 表表1 1 表表2 2 合一后的变量值合一后的变量值 X|Y a,b,c X=a,Y=b,c X|Y a X=a,y= a|Y X,b a,b X=a,Y=b 还需说明的是,表中的竖杠|后面只能有一个变量。例如写法X|Y,Z就是错误的。 但竖杠的前面的变量可以多于一

10、个。例如写法X,Y|Z是允许的。这样,这个表同 a,b,c匹配合一后,有 X=a,Y=b,Z=c 另外,竖杠的前面和后面也可以是常量,例如a|Y和X|b都是允许的,但注意,后一个 表称为无尾表,如果它同表a|Y匹配,则有 X=a,Y=b(而不是Y=b) 如果无竖杠|,则不能分离出表尾。例如,表X,Y,Z与a,b,c合一后得 X=a,Y=b,Z=c 。其中变量Z 并非等于c。 下面给出关于表的几个最常用的程序。 例 设计一个能判断对象X 是表L的成员的程序。 我们可以这样设想: (1)如果 X与表L 中的第一个元素(即表头)是同一个对象,则 X就是L的成员; (2)如果 X是L 的尾部的成员,则

11、 X也就是L的成员。 根据这种逻辑关系.于是有下面的 PROLOG程序: member(X,X|Tail). member(X,Head|Tail):-member(X,Tail). 其中第一个子句的语义就是上面的第一句话,第二个子句的语义就是上面的第二句话。 可以看出,这个程序中使用了递归技术,因为谓词 member的定义中又含有它自身。利用这个 程序我们就可以判定任意给定的一个对象和一个表之间是否具有 member(成员)关系。例如, 我们取表L 为a,b,c,d),取X为 a,对上面的程序提出如下询问: goal:-member(a,a,b,c,d). 则有回答:yes. 同样对于询间:

12、 goal:-member(b,a,b,c,d). goal:-member(c,a,b,c,d). goal:-member(d,a,b,c,d). 都有回答:yes. 但若询问 goal:-member(e,a,b,c,d). 则回答:no. 如果我们这样询问 goal:-member(X,a,b,c,d). 意思是要证明存在这样的X,它是该表的成员,这时系统返回X的值,即 X=a 如果需要的话,系统还会给出X 的其他所有值。 例 表的拼接程序,即把两个表连接成一个表。 append( ,L,L). append(H|T,L2,H|Tn):-append(T,L2,Tn). 程序中第一个子

13、句的意思是空表同任一表 L拼接的结果仍为表L;第M个子句的意思是 说,一个非空的表L1 与另一个表L2拼接的结果L3 是这样一个表,它的头是L1的头,它的尾是 由L1 的尾 T 同 L2拼接的结果 Tn。这个程序刻划了两个表与它们的拼接表之间的逻辑关系。 可以看出,谓词append 是递归定义的,子句append( ,L,L).为终结条件,即递归出口。 对于这个程序,如果我们询问 goal:-append(1,2,3,4,5,L). 则系统便三次递归调用程序中的第二个子句,最后从第一个子句终止,然后反向依次求 出每次的拼接表,最后输出 L=1,2,3,4,5 当然,对于这个程序也可以给出其他各

14、种询问,如: geal:-append(1,2,3,4,5,1,2,3,4,5). 系统回答:yes goal:-append(1,2,3,4,5,1,2,3,4,5,6). 系统回答:no goal:-append(1,2,3,Y,1,2,3,4,5). 系统回答:Y=4,5 goal:-append(X,4,5,1,2,3,4,5). 系统回答:X=l,2,3 goal:-append(X,Y,1,2,3,4,5). 系统回答: X=,Y=1,2,3,4,5 X=1,Y=2,3,4,5 X=1,2,Y=3,4,5 X=l,2,3,Y=4,5 等等(如果需要所有解的话)。 从上例可以看出,P

15、ROLOG具有递归机制。递归技术在表处理中特别有用,几乎所有的 表处理程序都要用到递归。但在一般程序中,使用速归却要谨慎,或者应尽量不用递归,而用 迭代循环。因为递归很容易导致堆栈溢出。 例 表的输出。 print(). print(H|T):-write(H),print(T). 例 表的倒置,即求一个表的逆序表。 reverse(,). reverse(H|T,L):-reverse(T,L1),append(L1,H,L). 这里,reverse的第一个项是输入,即原表,第二个项是输出,即原表的倒置。 四四. PROLOG. PROLOG 语言的搜索策略语言的搜索策略 PROLOG语言是

16、一种描述性的语言。用 PROLOG语言进行程序设计时,程序员只须描述 待解问题中的有关事物及它们之间关系的已知事实和规则,也就是只须告诉计算机做什么, 而不须指出如何做。这是因为PROLOG系统具有模式匹配、回溯等自动搜索功能。因此,当 用户建立了数据库或知识库后,就可以直接向 PROLOG系统询间有关问题。PROLOG系统靠自身 的模式匹配和回溯等功能来自动搜索目标,从而来回答用户的问题。 1 1 例化与匹配例化与匹配 在讨论PROLOG 语言的搜索方法之前,先来了解例化、解脱、匹配等几个重要的概念。 下面通过例子来描述这些概念。 设有知识库 play(mary,swim). play(mary,tennis). play(john,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号