第9章逻辑程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
诞生于20世纪70年代初
法国马赛大学作为自然语言理解项目的一部分研制成功 目前,爱丁堡大学开发的Prolog版本使用最为广泛 主要应用于人工智能领域相关问题的求解 易于表达人的逻辑思维 “说明式”的语言; 采用一阶谓词演算说明(描述)问题
迄今最能体现逻辑程序设计思想的逻辑编程语言
http://lakk.bildung.hessen.de/netzwerk/faecher/infor matik/swiprolog/indexe.html
第9章 - 24
逻辑程序设计
内容
1.逻辑和逻辑程序 2.Horn子句 3.归结与合一 4.Prolog语言
第9章 - 12
逻辑程序设计
2. Horn 子句
Horn子句是形如
所有的 a为真 则 b真
a1 a2 a3 an b
的命题
其中a只能是简单的不包含连接词的命题
没有or 和量词
b恒真
b 事实
a的数量可以为零
注意:Horn子句能够被用来表示大多数的逻辑命题,但不是全部
4.1 4.2 4.3 4.4 4.5
符号和数据结构 Prolog的执行 合一 Prolog的搜索策略
循环和控制结构
第9章 - 33
逻辑程序设计
4.3 合一
合一
对变量初始化或者分配存储空间和值的过程 在某种意义上是将两个项等同的过程 ?- a=a.
yes Prolog中 “=” 表示合 一 //常量与自己合一 //常量不能与其他常量合一
全称量化变量和存在量化变量仅可以指向论域中的对 象,而不允许指向谓词和函数
(likes)likes( george , kate)
谓词和函数的参数是项
常量 变量 函数
第9章 - 6
逻辑程序设计
1.逻辑和逻辑程序
谓词演算
推理规则
【例】有如下三段论:
“所有人会死;苏格拉底是人,所以苏格拉底会死。”
循环和控制结构
第9章 - 31
逻辑程序设计
4.2 Prolog的执行
Prolog程序运行
通过提问查询知识库
使用分号( ;)查询多个解(multiple answers)
第9章 - 32
逻辑程序设计
内容
1.逻辑和逻辑程序 2.Horn子句 3.归结与合一 4.Prolog语言
第9章 - 8
逻辑程序设计
1.逻辑和逻辑程序
谓词演算
推理规则
为了应用推理规则进行推理,推理机必须能够判断两个表 达式是否相同(匹配)。 这种寻找项对变量的置换,使谓词一致的过程叫做合一的 过程(合一算法)
项:常量、函数或其他变量 公式集F={man(X),man(socrates)}中的两个公式是可合一 的,置换θ= scorates/X是该公式集的一个合一。
1 n
继续用同样的方式修改目标系列
这些新的目标被称为子目标
如果成功消除了所有的目标,则初始命题得证
第9章 - 18
逻辑程序设计
3. 归结与合一
子句集
animal() dog() dog(fido) die( ) animal( ) die(fido) animal() dog()
第9章 - 1
逻辑程序设计
内容
1.逻辑和逻辑程序 2.Horn子句 3.归结与合一 4.Prolog语言
第9章 - 2
逻辑程序设计
1.逻辑和逻辑程序
逻辑程序设计
逻辑程序设计支持说明性程序设计范型
根据问题的高层描述来构建程序
告诉计算机“什么是真的”和“需要做什么”,而不是“怎
样做”。 程序员把精力放在问题(封闭的问题世界)的描述上,而不
求解目标应用子句的顺序
第9章 - 20
逻辑程序设计
3 归结与合一
第9章 - 21
逻辑程序设计
内容
1.逻辑和逻辑程序 2.Horn子句 3.归结与合一 4.Prolog语言
第9章 - 22
逻辑程序设计
Prolog语言概述
Prolog(Programming in Logic)
第9章 - 14
逻辑程序设计
2. Horn 子句
目标驱动
自动推理系统,反向使用Horn子句
b a1 a2 a3 an
子句 头
子句 体
对b的定义
询问(目标语句)
die( fido)
无头子 句
第9章 - 15
逻辑程序设计
内容
1.逻辑和逻辑程序 2.Horn子句 3.归结与合一 4.Prolog语言
第9章 - 28
逻辑程序设计
4.1 符号和数据结构
基本数据结构
表
任何非空的表 = 表头(head) + 表尾(tail)
表头:表的第一个元素; 表尾:除第一个元素,表的其它元素组成的表。
Prolog内部谓词“|”
用于将表分解为表头和表尾; 灵活使用|是写好Prolog表处理程序的关键!
知识库(事实和规则)的描述采用子句(Clause)形式
Prolog是目前唯一广泛使用的逻辑程序设计语言
第9章 - 23
逻辑程序设计
Prolog语言概述
SWI-Prolog
http://www.swi-prolog.org/
安装文件(注意顺序安装)
(1)SWI-Prolog for MS-Windows (2)SWI-Prolog-Editor
for all x,natural(x) -1 是自然数
natural(-1)
第9章 - 4
逻辑程序设计
1.逻辑和逻辑程序
谓词演算
谓词演算元素
natural(0)
①常量:数或名称 ②谓词:值域为真或假的函数名
③函数:区别谓词的其余函数
④变量:不确定值 ⑤连接词:
a为真时 b为真
{Y / X}
die( ) animal( )
合一
dog(fido)
{fido / Y}
die(Y ) dog(Y)
die (fido)
die(fido)
要匹配包含变量的语句 必须令变量等于某项 □
“死狗”问题的归结证
第9章 - 19
逻辑程序设计
3 归结与合一
必须解决的问题
逻辑程序系统必须使用一个高效执行的算法,规定
第9章 - 13
逻辑程序设计
2. Horn 子句
【例】证明:Fido会死
①所有的狗都是动物 ②Fido是狗 ③所有的动物都会死
隐式全 称约束
谓词形式
()(dog() animal ()) dog(fido) ()(animal () die())
子句形式
dog() animal() dog(fido) animal( ) die( )
是写一些诸如“下一步做什么”之类的底层算法指令。
第9章 - 3
逻辑程序设计
1.逻辑和逻辑程序
谓词演算
二值逻 辑
逻辑程序设计中使用的逻辑 【例】用谓词表示的逻辑命题
0是自然数 2是自然数
natural(0)
natural(2) natural(successor(x))
对于所有的x,如果x是自然数,则x+1也是自然数
4.1 4.2 4.3 4.4 4.5
符号和数据结构 Prolog的执行 合一 Prolog的搜索策略
循环和控制结构
第9章 - 25
逻辑程序设计
4.1 符号和数据结构
基本符号
常量
以小写字母开始的一串字母、数字、下划线或用单引号界定 的一串任何可打印的ASCII字符。
变量
以大写字母开始一串字母、数字和下划线; 下划线(_)表示匿名变量; , ; ://and //or //implementation
证明 die(fido)
谓词形式
()(dog() animal ()) dog(fido) ()(animal () die())
①所有的狗都是动物: ②Fido是狗: ④所有的动物都会死:
③取式假言推理和{fido/X}: animal (fido)
⑤取式假言推理和{fido/Y}: die (fido)
第9章 - 10
逻辑程序设计
1.逻辑和逻辑程序
谓词演算
推理规则 自然演绎推理
从一组已知为真的事实出发,直接运用经典逻辑中的推理 规则推出结论的过程
第9章 - 11
逻辑程序设计
内容
1.逻辑和逻辑程序 2.Horn子句 3.归结与合一 4.Prolog语言
?- a=b.
no
?- foo(a,b)=foo(a,b).
yes //结构递归合一
第9章 - 34
逻辑程序设计
4.3 合一
合一
?- X=a.
X=a; no //变量和常量Biblioteka Baidu一 //仅此一次合一 //参数合一 //只有是一种可能
内部共享变量
?- foo(a,b)=foo(X,b).
X=a; no
第9章 - 29
逻辑程序设计
4.1 符号和数据结构
基本数据结构
表
谓词“|”的使用
第9章 - 30
逻辑程序设计
内容
1.逻辑和逻辑程序 2.Horn子句 3.归结与合一 4.Prolog语言
4.1 4.2 4.3 4.4 4.5
符号和数据结构 Prolog的执行 合一 Prolog的搜索策略
注:如果Term2也是变量,互相实例化,共享值。
③如果Term1和Term2都是结构,两者合一,当且仅当
(a)两者有相同的算符(谓词); (b)两者对应的参数匹配,即能够递归地合一; (c)变量实例化必须保持一致性;
?- A=B.
A = _G206 B = _G206; no
第9章 - 35
逻辑程序设计
4.3 合一
合一算法
①如果Term1和Term2是常量,那么当且仅当Term1和 Term2是相同的原子或整数; ②如果Term1是变量, Term2是任何类型的项,那么 Term1实例化为Term2;
a b
, ; ) 全称量 词 存在量 词
⑥量词:描述变量
⑦标点符号:(
for all x,natural(x)
natural(successor(x))
第9章 - 5
逻辑程序设计
1.逻辑和逻辑程序
谓词演算
一阶谓词演算(first-order predicate calculus)
第9章 - 16
逻辑程序设计
3. 归结与合一
归结(消解)
两个Horn子句
a a1 a2 a3 an b b1 b2 b3 bm
bi匹配a
第一个Horn子句的头与第二个子句体的一个命题匹配 则第二个子句中的命题可以被替换为第一个子句的体
b b1 bi 1 a1 an bi 1 bm
(man() mortal ())
man(socrates )
man(socrates ) mortal (socrates )
mortal (socrates )
a ,a
b
b
第9章 - 7
逻辑程序设计
1.逻辑和逻辑程序
【例】证明:Fido会死
①Fido是狗
②所有的狗都是动物 ③所有的动物都会死
连接词
第9章 - 26
逻辑程序设计
4.1 符号和数据结构
基本数据结构
结构(谓词/复杂项)
vertical(line(point(X,Y),point(X,Z))).
第9章 - 27
逻辑程序设计
4.1 符号和数据结构
基本数据结构
表(List):有限的元素序列。
由方括号[ ]之间由逗号隔开的有序元素组成。 表中的元素可以是原子、结构、或任何其它的项,包括表 在内。
第9章 - 9
逻辑程序设计
1.逻辑和逻辑程序
谓词演算
推理规则
①化简式(与消除):P∧Q => P 和 P∧Q=>Q ②附加式: P=>P∨Q 和 Q=>P∨Q P,P V Q => Q ③析取三段论: ④取式假言推理: P,P→Q => Q Q,P → Q => P ⑤拒式假言推理: ⑥假言三段论: P → Q,Q → R => P → R ⑦二难推理: P ∨ Q,P → R,Q →R => R ⑧全称固化: ( x)P(x) => P(a) ⑨存在固化: ( x)P(x) => P(a)
【例】
ba cb
b c, c a b, a
第9章 - 17
逻辑程序设计
3. 归结与合一
归结过程(目标驱动)
询问
a
用已知子句的头部来匹配无头子句体中的一个目标
a a1 , , an
如果成功,用已知子句的体替换被匹配的目标(归结), 建立新的子句 a , , a