第2章 逻辑程序设计语言PROLOG(蓝)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
考虑下面的各组谓词是否可匹配合一? pre1(″ob1″,″ob2″,Z) pre1(″ob1″, ″ob3″,Y) pre1(″ob1″,″ob2″,Z) pre1(″ob1″,X, ″ob3″) pre1(″ob1″,″ob2″,Z) pre1(″ob1″,X,Y)
3. 回溯 所谓回溯, 就是在程序运行期间, 当某一个子 目标不能满足(即谓词匹配失败)时,控制就返回到 前一个已经满足的子目标(如果存在的话), 并撤消 其有关变量的约束值, 然后再使其重新满足。 成 功后, 再继续满足原子目标。如果失败的子目标前 再无子目标, 则控制就返回到该子目标的上一级目 标(即该子目标谓词所在规则的头部)使它重新匹配。 回溯也是PROLOG的一个重要机制。
功能 一般表示对象间的因果关系、蕴含关系或对应 关系。
3. 问题(question) 格式 ?-〈谓词名〉(〈项表〉){,〈谓词名〉 (〈项表〉)}. ? -student(john).
? -like(mary,X). 问题就是Horn子句逻辑中的目标子句,只是 形式略有不同 功能 问题表示用户的询问, 它就是程序运行的 目标。 问题可以与规则及事实一同给出,也可以在 程序运行时临时给出。
3) 表 表的一般形式
[x1, x2, …, xn]
相当于规则头部被消去,目标子句变成
?-likes(X,reading),likes(X,music).
对新目标求解: 子目标的求解过程与主目标完全一样,也是从头对程序 进行扫描,不断测试盒匹配合一等,直到匹配成功或扫描完 整个程序为止。 第一个子目标likes(X,reading),没有可以匹配的事实 和规则,因此求解失败,所以第五条语句失败。 那么,刚才的子目标 likes(X,reading),likes(X,music) 被撤销,系统回溯到原目标 friend(john,Y).
PROLOG程序中的事实或规则一般称为它们对 应谓词的子句,例如上面程序中的前四句都是谓词 likes的子句。Prolog规定,同一谓词的子句应排在 一起。从语句形式和程序组成来看,prolog就是一 种基于Horn子句的逻辑程序。这种程序要求用事实 和规则来求证询问,即证明所给出的条件子句和无 条件子句与目标子句是矛盾的,或者说程序中的子 句集是不可满足的。这就是所谓的PROLOG的说明 性语义。 PROLOG语言的文法结构相当简单,描述能力 很强,是一种应用相当广泛的智能程序设计语言。
则求解目标为
friend(john,Y).
系统对程序进行扫描,寻找能与目标谓词匹配合一的事实或 规则头部。显然程序中前面四条事实均不能与目标匹配,而第 五个语句的左端,也即其头部可与目标谓词匹配合一。该规则 若要成立,须其前提全部成立。
新目标
likes(X,reading),likes(X,music).
第2章 逻辑程序设计语言PROLOG
Prolog语言 •Prolog是一种基于一阶谓词的逻辑程序设计语言,它 在AI和知识库的实现技术中具有十分重要的作用。 •Prolog语言是基于Horn子句的,使用归结推理,具有 很强的逻辑描述能力和推理能力。
2.1 基本PROLOG 2.2 Turbo PROLOG程序设计
?-friend(john,Y). //目标:john和谁是朋友
?-likes(mary,X).
或 ?-likes(mary,music).
或
?-friend(X,Y). 或 ?-likes(bell,sports), likes(mary,music), friend(john,X). //三个一起 写出,中间用,隔开
2.2 Turbo PROLOG程序设计 PROLOG版本:
早期基本为解释型语言; 1986年BORLAND公司推出Turbo PROLOG,它是一种编译 型语言。
特点:
速度快; 功能强; 具有集成化开发环境; 可同其它语言接口; 能实现动态数据库和大型外部数据库; 可直接访问机器系统硬软件和图形、窗口等。
领域段 该段说明程序谓词中所有参量项所属的领域。 Turbo PROLOG的标准领域包括整数、实数、符号、串和符 号等, 其具体说明如下表所示。
谓词段 该段说明程序中用到的谓词的名和参量项的名(但 Turbo PROLOG 的内部谓词无须说明)
子句段 该段是Turbo PROLOG程序的核心, 程序中的所有事 实和规则就放在这里, 系统在试图满足程序的目标时就 对它们进行操作。 目标段 该段是放置程序目标的地方。 目标段可以只有一 个目标谓词, 例如上面的例子中就只有一个目标谓词; 也可以含有多个目标谓词, 如 goal readint(X),Y=X+3,write(″Y=″,Y). 就有三个目标谓词。 这种目标称为复合目标。
系统重新从下一个事实开始测试。测试到第三个事实时, 第一个子目标便求解成功,且变量X被约束为mary。这样, 第二个子目标也就变成了 likes(mary,music). 再求解,成功。 两个子目标都求解成功,所以原目标也成功,且变量Y被 约束为mary(Y与X的合一关系)。于是,系统回答: Y=mary 程序运行结束。 上述程序的运行是一个通过推理实现的求值过程。
2.1.3 PROLOG程序的运行机理
prolog的运行机理就是基于归结原理的演绎推理(归结原理 将在第五章介绍)。 prolog程序的运行是从目标出发,并不断进行匹配、合一、 归结,有时还要回溯,直到目标被完全满足或不能满足时为 止。
1. 自由变量与约束变量
自由变量:无值的变量 约束变量:有值的变量
2.1.2 PROLOG的程序 PROLOG程序一般由一组事实、 规则和问题组 成。问题是程序执行的起点, 称为程序的目标。
likes(bell,sports). //描述对象间的关系 likes(mary,music). likes(mary,sports). likes(jane,smith). //同一谓词名排一起 friend(john,X):-likes(X,reading),likes(X,music). friend(john,X):-likes(X,sports),likes(X,music). //描述条件
2.2.1 程序结构
一个完整的Turbo PROLOG(2.0版)程序一般包括常量 段、领域段、数据库段、谓词段、目标段和子句段等六个 部分,其标识及完整程序结构如下(一个程序不一定要包 括所有段): /* 〈 注 释〉 */ 〈编译指令〉 constants 〈常量说明〉 domains 〈域说明〉 // 大多数情况需要,用以说明表、 复合结构及用户自定义的域名 database 〈数据库说明〉 predicates 〈谓词说明〉 //至少有一个 goal 〈目标语句〉//至少且只能有一个 clauses 〈子句集〉 //至少有一个
例 如果把上节的例子程序作为Turbo PROLOG程序, 则应改 写为:
DOMAINS name=symbol PREDICATES likes(name,name) friend(name,name) GOAL friend(john,Y), write(″Y=″, Y)//输出Y= CLAUSES likes(bell,sports). likes(mary,music). likes(mary,sports). likes(jane,smith). friend(john,X):-likes(X,sports),likes(X,music). friend(john,X):-likes(X,reading),likes(X,music).
likes(bell,sports). likes(mary,music). likes(mary,sports). likes(jane,smith). friend(john,X):-likes(X,reading),likes(X,music). friend(john,X):-likes(X,sports),likes(X,music). ?-friend(john,Y). //问题:john和谁是朋友
一个变量取了某值就说该变量约束于某值,或者说该变量 被某值所约束,再或者说该变量被某值实例化了。在程序运行 期间,一个自由变量可以被实例化成约束变量,反之,也可。
2. 匹配合一
两个谓词可匹配合一, 是指两个谓词的名相同, 参量 项的个数相同, 参量类型对应相同, 并且对应参量项还满 足下列条件之一: (1) 如果两个都是常量, 则必须完全相同。 (2) 如果两个都是约束变量, 则两个约束值必须相同。 (3) 如果其中一个是常量, 一个是约束变量, 则约束 值与常量必须相同。 (4) 至少有一个是自由变量。
Prolog程序的执行是一个(归结)演绎推理的过程。 特点: (1)推理方式为反向推理; (2)控制策略是深度优先; (3)有回溯。 具体实现方法: (1)匹配子句的顺序是自上而下; (2)子目标选择顺序是从左向右; (3)归结后产生的新子目标总是插入被削去的目标处 (即目标队列的左部)。 PROLOG的这种归结演绎方法被称为SLD归结,或 SLD反驳-消解法。这就是PROLOG程序的运行机理,它就 是所谓的PROLOG语言的过程性语义。
2.1 基本PROLOG
2.1.1 PROLOG的语句
Prolog语言只有三种语句,分别称为事实、 规则和问题。 1. 事实(fact) 格式 〈谓词名〉(〈项表〉). student(john). like(mary,music). abc. //无参量 repeat. //无参量 功能 一般表示对象的性质或关系。
friend(father(″Li″), father(″Zhao″)). 复合对象在程序中的说明, 需分层进行。 例如, 对于 上面的谓词 likes(″Tom″, sports(football, basketball, table_tennis)). 在程序中可说明如下: domains name=symbol sy=symbol // 说明sy的领域 sp=sports(sy, sy, sy) //sp使用已说明领域的sy predicates likes(name, sp)
2. 规则(rule) 格式 〈谓词名〉(〈项表〉):-〈谓词名〉(〈项表〉){,
〈谓词名〉(〈项表〉)}.
bird(X):-animal(X),has(X,feather).
grandfather(X,Y):father(X,Z),fatheHale Waihona Puke Baidu(Z,Y).
无参量 run:-start,step1(X),step2(X),end. //
系统从失败的匹配语句处(第五条语句)向下继续扫描程 序中的子句,视图重新使原目标匹配,结果发现第六条语句 的左部即规则 friend(john,X):-likes(X,sports),likes(X,music). 的头部可与目标为谓词匹配。 第一个次子目标likes(X,sports)与程序中的事实立即匹 配成功,且变量X被约束为bell。于是系统便接着求解第二个 子目标。由于变量X已被约束,所以这时第二个子目标已变成 了 likes(bell,music). 由于程序中不存在该事实,所以该目标求解失败。于是, 系统就放弃这个子目标,并恢复X为自由变量,然后回溯到第 一个子目标,重新对它进行求解。
2.2.2 数据与表达式 1. 领域
1) 标准领域 整数、实数、 字符、 串和符号 2) 结构 结构也称复合对象(特殊的参量项), 一般形式为 〈函子〉(〈参量表〉) 函子及参量的标示符与谓词相同,结构包含结构,表达树形 数据结构,如下例子: likes(″Tom″, sports(football, basketball, table_tennis)). //红色部分也是谓词结构,就是复合结 构 reading(″王宏″,book(″人工智能技术导论″,″西安电 子科技大学出版社″)).