形式语义教材Ch3 逻辑式语言Word格式文档下载.docx
- 文档编号:16722934
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:31
- 大小:184.99KB
形式语义教材Ch3 逻辑式语言Word格式文档下载.docx
《形式语义教材Ch3 逻辑式语言Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《形式语义教材Ch3 逻辑式语言Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
-like(mary,candy).回答yes(mary喜欢candy吗?
)
-like(mary,mary).回答no(mary喜欢mary吗?
-like(mary,X).回答yes:
X=candy,X=wine
(mary都喜欢什么?
)
-like(mary,X),like(john,X).回答yes:
X=wine
(什么东西(X)被mary和john所喜欢?
-like(mary,candy),like(john,candy).回答no
(mary和john都喜欢candy吗?
-like(X,candy).回答yes:
X=mary(都谁喜欢candy?
-like(X,wine).回答yes:
X=mary,X=john(都谁喜欢wine?
-like(X,Y).回答yes:
(谁都喜欢什么?
(1)X=mary,Y=food
(2)X=mary,Y=wine
(3)X=john,Y=wine(4)X=john,Y=mary
从本例可以看出,对于同一程序可提出很多很多的问题。
在这些提问里可包含一些变量X1,X2,....,Xn。
如果回答是yes,则将指出当提问中的这些变量取什么样的值时使提问成为真。
在提问时,只要把已知的内容写成常量,而把想知道的部分写成变量,那么即可达到了解未知部分的目的,因此是很有趣的。
提问的语法结构是,由?
-符号打头,并其后是一串原子式(用逗号隔开)。
开始的提问部分称为初始总目标(或称目标子句),而其中的每个原子式称为子目标。
总目标中的最前一个子目标称为当前子目标。
如果所有子目标都成功,则总目标也就成功,这时系统将发出yes,并给出一个具体解。
前面考虑了只有事实的Prolog程序。
但只有事实部分远不能描述很多实际问题,比如“mary喜欢的john都喜欢”等问题。
下面再考虑带规则(推理)部分的Prolog程序例,具体如下:
male(john)."
john是男的"
male(stoy)."
stoy是男的"
male(david)."
david是男的"
female(mary)."
mary是女的"
female(rose)."
rose是女的"
female(mira)."
mira是女的"
parents_of(john,mary,davis)."
john的母父是mary和davis"
parents_of(stoy,mary,davis)."
stoy的母父是mary和davis"
parents_of(rose,mary,davis)."
rose的母父是mary和davis"
parents_of(mira,mary,davis)."
mira的母父是mary和davis"
sister_of(X,Y):
-female(X),female(Y),
parents(X,M,F),parents(Y,M,F).
"
Y是X的姐妹,当X是女的,且Y是女的,且X和Y的母父是一样的"
brother_of(X,Y):
-male(X),male(Y),
"
Y是X的兄弟,若X是男的,且Y是男的,且X和Y的母父是一样的"
child_of(X,Y):
-parents_of(Y,_,X)."
若X是Y的父亲,则Y是X的儿子"
-parents_of(Y,X,_)."
若X是Y的母亲,则Y是X的儿子"
inherit_of(X,Y):
-child_of(X,Y)."
若Y是X的儿子,则Y是X的后辈"
-chile_of(Z,Y),inherit_of(X,Z).
"
若Y是Z的儿子,Z是X的后辈,则Y是X的后辈"
程序由10个事实和6个规则组成。
可以提问如下种种问题:
■?
-female(X).谁是女的?
..........回答:
X=mary;
X=rose;
X=mira
-female(john).john是女的吗?
....回答:
no
-child_of(mary,X).谁是mary的孩子?
...........
回答:
X=john;
-child_of(X,stoy).stoy是谁的孩子?
..回答:
X=davis
-sister_of(mira,X).mary的姐妹都是谁?
...回答:
X=rose
-brother_of(stoy,X).stoy的兄弟都是谁?
-inherit_of(john,X).john的后辈都是谁?
-inherit_of(X,davis).davis的前辈都是谁?
-inherit_of(john,mary).john是mary的前辈吗?
-parents_of(john,M,F).john的母亲和父亲是谁?
-male(X),child_of(mary,X).都有谁是mary的男孩?
3.3逻辑式语言
逻辑式程序设计的主要思想是把一阶谓词逻辑的公式作为程序设计的工具,而Prolog语言是顺序化了的特定逻辑式语言。
逻辑式语言的理论基础是一阶理论与归结理论。
■定义3.3.1.
一阶理论(firstordertheory):
由四部分组成:
(∑,L,A,R)
[1]字母表(alphabet):
∑
[2]一阶语言(firstorderlanguage):
L
[3]公理集(setofaxioms):
A
[4]推理规则集(setofinferencerules):
R
其中字母表∑包括以下几类符号:
□Constant:
a,b,c,..........
□Variable:
x,y,z,...........
□Function:
f,g,h,...........
□Predicate:
p,q,r,..........
□Connective:
~,∧,∨,→
□Quantifier:
□Punctuation:
:
(,)
■定义3.3.2.项原子
(1)任何常量a∈Constant是项,任何变量x∈Variable是项;
若f∈Function是n元函数符号,ti是项,则f(t1,t2,...,tn)是项。
(2)设p∈Predicate是任一n元谓词符号(0≤n),并且ti是项,则p(t1,t2,...,tn)是原子公式。
以后有时也简称为原子。
■定义3.3.3.一阶语言
一阶语言L是合适公式的集合。
其中合适公式的定义如下:
(1)原子公式是合适公式。
(2)若F,F1,F2是合适公式,则下面公式都是合适公式:
F1∧F2,F1∨F2,~F1,(F),F1→F2,F1←F2,
x.F,
x.F
■定义3.3.4.自由变量
设F是一个公式,并且变量X出现于公式F中。
如果X∈FreeF(F),则称变量X为公式F的一个自由变量。
其中FreeF(F)的定义如下:
FreeF(A)=FreeA(A)
FreeF(F1∧F2)=FreeF(F1)∪FreeF(F2)
FreeF(F1∨F2)=FreeF(F1)∪FreeF(F2)
FreeF(~F)=FreeF(F)
FreeF(
x.F)=FreeF(F)-{x}
x.F)=FfreeF(F)-{x}
FreeT(const)={}
FreeT(X)={var}
FreeT(f(t1,..,tn))=∪iFreeT(ti)
FreeA(p(t1,..,tn))=∪iFreeT(ti)
■定义3.3.5.全称闭包
设F为公式,且Free(F)={x1,...,xn}则称下面式子
x1x2...xn(F)
为F的全称闭包(universalclosureofformula)。
■定义3.3.6.文字
原子或原子的非统称为文字(Literal)。
其中原子被称为正文字,而原子的非则被称为负文字。
例3.3.1.
□文字的正确例:
p(f(X),Y),~p(a,f(X))
□文字的错误例:
p(f(X),Y)∧~p(a,f(X))
■定义3.3.7.子句
设Li(1≤i≤n)是文字,{x1,...,xk}=FreeF(L1∨...∨Lm},则称下面形式的式子为子句:
x1x2...xn(L1∨L2∨.....∨Lm)
换言之,子句(Clause)是文字的析取式的全程闭包。
例3.3.2.
□正确子句例:
xy(p(x,y)∨~p(f(a),y)∨~q(a,b))
□错误子句例:
xy(p(x,y)∧q(x,y)∨~p(f(a),x))
假设x1..xn.(A1∨...∨Ak∨~B1∨...∨~Bm)是子句,则可简写成下面形式之一:
□A1∨...∨Ak∨~B1∨...∨~Bm
□A1∨...∨Ak←B1∧...∧Bm
■定理3.3.8.Skolem定理
设F是一阶公式,则F可转换成子句的合取式S:
S=C1∧C2∧....∧Cn
并使得F与S的不可满足性一致。
其中每个Ci是子句。
证明:
略。
例3.3.3.下面是公式到子句的合取式的转换例。
□要转换的公式:
wx[p(x)
[~y[q(x,y)
p(f(w))]∧z[q(x,z)
p(x)]]]
□消除:
wx[~p(x)∨[~y[~q(x,y)∨p(f(w))]∧z[~q(x,z)∨p(x)]]]
□~移入内部:
wx[~p(x)∨[y[q(x,y)∧~p(f(w))]∧z[~q(x,z)∨p(x)]]]
□移右:
wx[~p(x)∨[y.q(x,y)∧~p(f(w))]∧[z.~q(x,z)∨p(x)]]]
□消除:
x[~p(x)∨[q(x,g(x))∧~p(f(a))]∧[z.~q(x,z)∨p(x)]]]
□移外:
xz[~p(x)∨[q(x,g(x))∧~p(f(a))]∧[~q(x,z)∨p(x)]]]
□∨对∧分配:
xz[[~p(x)∨q(x,g(x)]∧[~p(x)∨~p(f(a))]∧
[~p(x)∨~q(x,z)]∨p(x)]]
□所得子句集:
{~p(x)∨q(x,g(x)),~p(x)∨~p(f(a)),~p(x)∨~q(x,z)∨p(x)}
■定义3.3.9.程序子句
至多有一个正文字的子句称为程序子句。
其一般形式是下列之一:
[1]A∨~B1∨...∨~Bm(0≤m)
[2]A←B1∧...∧Bm(0≤m)
■定义3.3.10.断言子句蕴含子句
(1)断言子句(assertion):
无负文字的程序子句。
(2)蕴含子句(implication):
有负文字的程序句子:
[1]A∨~B1∨~B2∨...∨~Bm.(1≤m),或
[2]A←B1∧B2∧...∧Bm.(1≤m)
程序子句中的体部分表示条件,没有体部分则表示无条件成立,因此,称断言子句为事实。
蕴含子句表示推理规则,故也称为规则。
子句表示用了两种形式,其中"
←"
可视为其后面式子的否定。
■定义3.3.11.目标子句
只有负文字的子句,即形如下面的子句称之为目标子句:
[1]~B1∨~B2∨...∨~Bm.(0≤m)
[2]←B1∧B2∧...∧Bm.(0≤m)
目标子句并不出现在程序中,它代表的是提问部分。
■定义3.3.12.空(目标)子句
负文字部分为空的目标子句称为空目标子句,并记为[]。
空目标子句表示没有提问或提问全被解答。
至此我们定义了四种子句型:
■Implicationp←q∧r(蕴含子句)
■Assertionp(断言子句)
■GoalStatment←q∧r(目标子句)
■Nullclause□(空目标子句)
逻辑程序设计语言中涉及到上述四种子句,其中断言子句也称为unit子句。
断言子句和蕴含子句构成逻辑程序的文本,而目标子句则成为逻辑程序的输入部分,空子句则在运行时被产生。
至多有一个正文字的子句称之为Horn子句。
■定义3.3.13.逻辑程序
逻辑程序是程序子句(断言子句/蕴含子句)的有限集:
LP={C1,C2,...,Cn}
其中Ci是程序子句。
■定义3.3.14.过程
设有逻辑程序LP={C1,C2,...,Cn},P∈Predicate,则LP中所有那些程序子句的集合,即子句头(正文字)部分的谓词符均为P的子句集称为p的过程,并记为Proc(p)。
3.4归结原理
我们将用Robinson归结原理(resolution)来说明逻辑程序设计语言的语义,因此,在此将专门介绍有关归结的基本概念。
过程式语言我们已用惯,函数式语言则接近于数学习惯,那么逻辑式语言是否为我们所用惯或习惯了的语言呢?
回答肯定是否定的。
函数本来就是代表计算的,因此,对于函数式语言能否描述计算过程,人们并不抱怀疑态度。
但逻辑式语言则不同,因为在人们的脑子里通常所想到的是,逻辑是用于进行推理而不是用于进行计算,因此,对于逻辑式语言能否描述计算过程一事,抱疑惑态度。
揭开逻辑式程序设计奥秘的最好工具是定理证明中的归结理论。
因此,将专门介绍归结原理。
为了方便起见,通常用集合方式来表示子句的合取式,即把S=C1∧C2...∧Cn表示成S={C1,...,Cn}的形式。
■定义3.4.1.代换
一个代换是变量到项的一个映射θ∈Subs=VAR→TERM。
假设E是公式,θ是代换,则E!
(或E)定义为θ作用于E所得的新公式。
空代换表示为[]或。
例3.4.1.下面是代换例。
p(X,Y)!
[f(a)/X,b/Y]=p(f(a),b)
p(X,b)!
p(a,b)!
[f(a)/X.b/Y]=p(a,b)
■定义3.4.2.代换的积
设和'
是代换,则称.'
为代换和'
的积。
其定义如下:
(.'
)x=ifx∈dom()then(x)!
'
elsex!
。
例3.4.2.设有代换θ=[f(y)/x,g(a)/y],θ'
=[a/x,b/y,y/z],则有
θ.θ'
=[f(b)/x,g(a)/y,y/z]
■定理3.4.3.
是代换,E是公式,则有E!
(.'
)=(E!
)!
■定义3.4.4.合一代换
设有两个公式F1和F2。
说代换是F1和F2的合一代换,如果有F1!
≡F2!
例3.4.3.下面是合一代换例。
(1)g(x,f(b),z)!
[h(a)/x,f(b)/y,z/w]〓g(h(a),f(b),z)
g(h(a),y,w)!
故[h(a)/x,f(b)/y,z/w]是g(x,f(b),z)和g(h(a),y,w)的合一代换。
(2)g(x,f(a))!
[b/x,f(a)/y])〓g(b,f(a))
g(b,y)!
[b/x,f(a)/y])〓g(b,f(a))
故[b/x,f(a)/y]是文字g(x,f(a))和文字g(b,y)的合一代换。
前面讨论了两个公式的合一代换,那么我们要问给了两个公式如何求合一代换?
为此下面将给出归结过程所用到的合一算法UNIFY。
它将判断是否可合一,并且如果是合一的话,将输出合一代换,不过它所合一的是两个文字模式。
如果不可合一,则将输出失败符"
Ω"
这里说的模式是指文字或项,它们的语法结构相同,因此在此把它们统称为模式。
■定义3.4.5.模式的合一算法
UNIFY:
Patt×
Patt→Subst∪{Ω}
UNIFYL:
PattL×
PattL×
Subst→Subst∪{Ω}
在下面c1,c2表示常量,x和y表示变量,t表示一般模式。
▲UNIFY(c1,c2)〓if(c1=c2)then[]elseΩ
UNIFY(x,t)〓[t/x]
UNIFY(t,x)〓[t/x]
UNIFY(x,y)〓[x/y]
UNIFY(f(tl),f'
(tl'
))〓if(f≠f'
)thenΩelseUNIFYL(tl,tl'
[])
▲UNIFYL(t:
tl,t'
:
tl'
)〓let'
=UNIFY(t!
t'
!
)in
if'
=ΩthenΩelseUNIFYL(tl,tl'
.'
UNIFYL(<
>
<
)〓
例3.4.4.合一算法例。
其中X表示变量。
1.UNIFY(a,b)=Ω
2.UNIFY(a,X)=[a/X]
3.UNIFY(p(a,X),p(a,f(b)))=[f(b)/X]
4.UNIFY(p(a,f(a)),p(X,Y))=[a/X,f(a)/Y]
5.UNIFY(p(X,X),p(a,Y))=[a/X,X/Y]
■定义3.4.6.互补文字
称形如p(...)和~p(...)的两个文字为互补文字。
■定义3.4.7.Robinson归结
设C1和C2是子句,L1C1,L2C2,L1和L2为互补文字,且它们的合一代换为,即UNIFY(Li,Lj)=,则称
(C1-L1)!
∨(C2-L2)!
为C1和C2的归结式(Resolvent)。
其中LiCi表示Ci子句式中包含文字Li,而(Ci-Li)则表示从Ci子句式中删掉Li部分后所得到的子句。
例3.4.5.下面是一些归结成功的子句归结例子.
■Clause1■Clause2■Resolvent■Sbstit
p(x)∨q(x)~p(a)∨r(y)q(a)∨r(y)[a/x]
p(x,a)∨q(x)~p(b,y)∨r(y)q(b)∨r(a)[b/x,a/y]
p(x)~p
(1)□[1/x]
p(x)∨q(x)~p(f(a,B))q(f(a,B))[f(a,B)/x]
p(x)∨q(x)~p(A)∨r(A)q(x)∨r(x)[A/x]
p(x)∨q(x)~p(A)∨r(x)q(x)∨r(x2)[A/x]
例3.4.6.下面是一些失败的归结过程例子。
■Clause1■Clause2■ReasonofFailure
p(x)∨q(x)p(x)∨r(x)无负文字
p(x)∨q(y)~r(x)∨s(y)谓词名没有相同的
p(x,a)∨q(y)~p(b)元数不一致
p(a)~p(b)内部的项不匹配
■定理3.4.8.Robinson定理
一个子句集S不可满足的,当且仅当经过有限步归结过程,可导出空的目标子句[]。
注意,这里说的是S的不可满足性,而不是可满足性。
只要看一个例子即可知道,比如令S={p(x),~p(x)},则S对任一x的值都不可满足,并且通过一步的Robinson归结过程即可导出空子句。
■定理3.4.9.
设S={C1,..,Cn}是一给定子句集,C'
是一由S产生的一个归结式,则S是不可满足的,当且仅当S'
={C1,..,Cn,C'
}是不可满足的。
例3.4.7.假设给定子句集为
S={p(a),p(b),q(c),q(X)∨~p(X),r(d),
r(X)∨~p(X)∨~q(X),~r(d)∨~p(X)∨~q(X)}
试给出导出空子句的归结过程。
归结过程具体如下:
■Clause1■Clause2■Resolvent■Subst
~r(d)∨~p(X)∨~q(X)r(d)~p(X)∨~q(X)Ω
~p(X)∨~q(X)p(a)~q(a)[a/X]
~q(a)q(X1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 形式语义教材Ch3 逻辑式语言 形式 语义 教材 Ch3 逻辑 语言