Lecture-逻辑程序设计语言Prolog.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Lecture-逻辑程序设计语言Prolog

2.2.4 分支与循环  1. 分支  对于通常的IF-THEN-ELSE分支结构,PROLOG可用两条同头(br)的并列规则实现。例如,将 IF x0 THEN x:=1   ELSE x:=0 用PROLOG实现则是 br:-x0, x=1. br:-x=0. 类似地,对于多路分支,可以用多条规则实现。 例如: br:-x0, x=1. br:-x=0, x=0. br:-x0, x=-1.  2. 循环   PROLOG可以实现计循环次数的FOR循环,也可以实现不计循环次数的DO循环。例如下面的程序段就实现了循环,它使得write语句重复执行了三次,而打印输出了三个学生的记录。 student(1, ″张三″, 90.2). student(2, ″李四″, 95.5). student(3, ″王五″, 96.4). print:-student(Number, Name, Score), write(Number, Name, Score), nl, Number=3.   可以看出,程序第一次执行,student谓词与第一个事实匹配,write语句便输出了张三同学的记录。但当程序执行到最后一句时,由于Number不等于3,则该语句失败,于是,引起回溯。 而write语句和 nl语句均只能执行一次,所以继续向上回溯到student语句。这样,student谓词则因失败而重新匹配。 这一次与第二个事实匹配,结果输出了李四的记录。同理,当执行到最后一句时又引起了回溯。 write语句第三次执行后,由于 Number 已等于3,所以最后一个语句成功,程序段运行结束。   上面例子可以看做是计数循环。当然,也可以通过设置计数器而实现真正的计数循环。   下面程序段实现的则是不计数的DO循环。 student(1, ″张三″, 90.2). student(2, ″李四″, 95.5). student(3, ″王五″, 96.4). print:-student(Number, Name, Score), write(Number, Name, Score), nl, fail. print:-.   这个程序段中的fail是一个内部谓词,它的语义是恒失败。   另外再增加了一个print语句,目的是为程序设置一个出口。 因为fail是恒失败,下面若无出口的话,将引起print本身失败,进而导致程序运行失败。   还需说明的是,用PROLOG的递归机制也可以实现循环,不过用递归实现循环通常需与表相配合。另外,递归的缺点是容易引起内存溢出。 故通常的循环多是用上述方法实现。 2.2.5 动态数据库   动态数据库就是在内存中实现的动态数据结构。它由事实组成,程序可以对它操作,所以在程序运行期间它可以动态变化。 Turbo PROLOG提供了三个动态数据库操作谓词: asserta(〈fact〉). // 把fact插入当前动态数据库中的同名谓词的事实之前; assertz(〈fact〉). // 把fact插入当前动态数据库中的同名谓词的事实之后; retract(〈fact〉). // 把fact从当前动态数据库中删除。 例如语句 asserta(student(20, ″李明″, 90.5)). 将在内存中谓词名为student的事实前插入一个新事实;如果内存中还没有这样的事实,则它就是第一个。 又如 retract(student(20,_,_)). 将从内存的动态数据库中的删除事实 student(20,_,_) 可解释为学号为20的一个学生的记录。 注意,这里用了无名变量_。   PROLOG提供的动态数据库机制,可方便地实现堆栈、队列等动态数据结构,简化了编程。   另外,PROLOG还提供了谓词: save(〈filename〉). /* 动态数据库保存到文件 */ consult(〈filename〉).  /* 文件加载到内存 */ 2.2.6 表处理与递归   表 list 是PROLOG中一种非常有用的数据结构。表的表述能力很强,数字序列、集合、编程语言中的数组、记录等均可用表来表示。   表的最大特点是其长度不固定,在程序的运行过程中可动态地变化。在程序运行时,可对表施行一些操作,如:添加元素、删除元素、或者将两个表合并为一个表等。   用表还可以方便地构造堆栈、队列、链表、树等动态数据结构。 表2.2 表的示例   表还有一个重要特点,就是它可分为头和尾两部分。表头是表中第一个元素,而表尾是表中除第一个元素外的其余元素按原来顺序组成的表

文档评论(0)

cgtk187 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档