提取解答的基本过程
我们通过几个例子说明提取解答的过程。
例1 已知事实如下:
(1)Fido goes where John goes (John走到哪里Fido跟到哪里)。
("x)[AT(JOHN,x)®AT(FIDO,x)]
(2)John is at school (John在学校)。
AT(JOHN,ScHOOL)
解答问题:
(3) where is Fido(Fido在哪里)?
($x)AT(FIDO,x)
首先应证明第三句在逻辑上遵从前两句,然后再找一个x的例,这样就可以解答上述问题了。使用归结反演方法,将上述两个事实公式转换为子句集合为:
{ØAT(JOHN,x)AT(FIDO,x),AT(JOHN,ScHOOL)}
目标公式的否定为 ("x)[ØAT(FIDO,x)]
否定公式的子句形式为 ØAT(FIDO,y)
问题的反演树如图1。提取解答的步骤如下:
图1
(1)在目标公式的否定的子句形式中,附加上该子句的否定,得到
ØAT(FIDO,y)ÚAT(FIDO,y)
这种含有一个文字及其否定的子句称为同语反复,或重言式。
(2)进行与上述反演树相同的归结求解,如图2所示,我们将该图称为修改的证明树。
图2
(3)将根结点的子句作为解答子句。
在本例中,图中根结点的子句 AT(FIDO,ScHOOL)就是问题的解答。从归结的观点看,归结式逻辑上遵从事实子句和重言式,而重言式总为真,因此归结式逻辑上遵从事实子句。
例2 已知事实如下:
(1)对所有的x和y,如果x是y的父辈而y是z的父辈,则x是z的祖辈。
("x)("y)("z){[P(x,y)ÙP(y,z)]®G(x,z)}
(2)每个人都有父辈。
("x)($y)P(x,y)
解答问题:
(3)是否存在具体的x和y,使得x是y的祖辈?
($x)($y)G(x,y)
用归结反演法可给出这个问题的证明,其反演树如图3。为了生成修改证明树的方便,在生成反演树时,对被合一的文字作了标记,并将被合一的文字的集合称为合一集。
图3
事实2的子句P(f(w),w)包括一个Skolem函数f,建立起一个人与其父辈的映射。修改证明树如图4所示,在修改证明树中使用的合一集与图3所示的反演数中的合一集相同。修改树中根结点的子句G(f(f(v)),v)就是问题的解答。
图4
习题
设公理集为
("u)LAST(cons(u,NIL),u)
("x)("y)("z)[LAST(y,z)®LAST(cons(x,y),z)]
其中cons是表构造函数,LAST(x,y)表示y是表x的最后一个元素。
(1) 用归结反演法证明如下定理:
($v)LAST(cons(2,cons(1,NIL)),v)
(2)用解答提取过程求表(2,1)的最后一个元素。
(3)简要描述如何使用这个方法求长表的最后一个元素。