Knowledge 8一阶谓词逻辑-resolution规则

1.写在前面

我们在前面介绍了一阶谓词逻辑的Generalized Modus Ponens规则,这个地方,我们介绍第二个规则resolution,基本上一样要因为有变数的关系一样要找substitution,那你如果找到unify,使得某两个clause里面的literal它们互为一个complement补充关系的话,那你就可以使用。

2.resolution

比如说如果我们这一句的话说,有些人不快乐,那我们又知道,看似有钱的,那我们可以利用unify的方法,去unify这两个两个部分,那你可以unify出来x,其实就是Ken的substitution,结果就是unhappy(x),这就是是resolution。

那你要使用resolution的时候,你先把整个逻辑式都转到CNF(conjunctive normal form),之后你要做的事情就是KB,你不要的那个结论就反证法嘛,矛盾证法,你可以导出矛盾的结果。

那我们之前讲说forward chaining和backward chaining都只能使用在first order logic里面Definite clauses,那它不是整个first order logic的全部,它只是一个小小的substract,那resolution的话它可以apply在first order logic,它基本上是complete的,那不过我们要提一下,这complete 其实是locational complete,就是如果是不对的话,它是可以说出不对的。

我们首先先看一下我们怎么把一个任何一个式子转成conjunctive normal form。其实很单纯,那我们跟之前propositional差不多,只是有多处一些变数的问题,我们看一下怎么处理。比如说我们这边举一个例子:

 

这个语义是说,任何人他只要喜欢所有任何的动物,那都被某人所喜爱。那我们写一下这样的逻辑式,把这写成这样就是只要,∀Y,只要Y是个animal,然后就imply我们讲过for all的话,你要配合是imply,那这个X就喜欢Y,那就是喜欢所有动物的这个本质。那对所有这样的X,这样的人都会存在一个Y,这个Y跟前面animal当然都不一样,存在你这个人,存在一个Y,那个Y 是Love X。这是我们上去这个英文的逻辑式,用first order logic 的翻译。

第一件事情我们要先把CNF没有的implication单箭头或双箭头,如果你有双箭头的话,就事先把它变两个单箭头嘛,就是A和B全等,你就把它改写成A implies B,而且B implies A,好先把它改掉。就是改的方法就是A implies B又改成not A or B,OK。那你改掉后变这个式变(1)中句子。

然后这一句的话接下来其实你要把not引进来,就是neg引进来,那如果针对于qualifier就是for all的话,你就not for all就是存在,那not存在,你就改成for all。然后你就可以把not引进来。好那你就可以看到,这边就是你如果把用这个把not引进来然后变成一个double negation,那double negation我们同样再imply这个double negation rule,就双重否定就等于肯定,就可以把not引进literal的里面。你之前在括弧外面。

经过第二步骤,接下来我们要做的是standardiza那个variable。因为我们在处理variable要小心,我们刚刚有讲过,我们在原式子中用两个Y ,第一个Y指的是某一个animal,第二个Y是指的someone,who love x,所以这两个Y其实是不一样的,那我们应该把它分开,这就引出一个新的variable Z,在处理变数的时候我们接下来要使就是要套UI,希望处理到最后所有的变数都是指的for all。那时候我们对existent需要处理。那存在我们是要替换Ei,但是当下图中(3)要换的的时候:

我们之前只提过一个skolem variable,但是如果你要配合上另外一个变数的时候,其实我们所需要的其实是Skolem function。为什么呢?因为像这个地方,对于你如果Z,你用只替换一个的话,那等于说你是说某一个固定的人,它love所有的这样的X,好那这是不对的语义嘛,那我们在语义的时候说热爱动物的这样的人都会被某人所喜欢,那这个不需要是同一个人,也就是说针对不同的这样的X,它有一个相对应喜欢X的这个人,所以我们所使用这个,我们称为Skolem function,Skolem function就是我们定义的G(x),也就是会这样喜欢X的这一个人,那同样这边animal我们是类似的做法。就是被X所喜欢的animal,好那这我们就第一个F,那这个F和G就是我们这里面大写,当然指的就是常数。那接下来我们Ei已经搞定了嘛,那Ei就是所有的system我们全都把它换成Skolem function之后,那剩下的variable全都是universal quantified就是for all,那既然都是for all,那既然都是for all,我们就可以把所有的for all全部断掉。

好,那我们就得到(5)式子,这只剩下最后一步,就是我们要已经现在这个式子里面都所有的not都跟着直接跟在literal的前面,而且所有的for all和asistant这个画面全部都已经被推掉了,那只剩下最后一步就是and or,这要把它改成CNF,要利用交换结合这些分配律,把它换回CNF,这部分和propositional logic那里提到的一样,经过这些操作,就会得到一个完整的CNF的逻辑式。

我们回头看一下resolution,resolution应用在一阶谓词逻辑其实跟命题逻辑中是一样的,差别是你用的是一个比较general的resolution。就是说你不是complement的,你只要找到unify使得这个clause里面的literal可以是互为反诉就可以。resolution同样既是完备的,也是可靠的。

3.总结

我们从命题逻辑推广到了一阶谓词逻辑怎么做?一阶谓词逻辑应用范围非常广,针对一阶谓词逻辑,首先,如果你的domain不是很大的话,整个世界如果已经知道不大,你的确可以直接使用UI和EI把这些constant全部换完,然后可以把一个一阶谓词逻辑的KB换成一个命题逻辑中的KB,我们之前讲过,forward chaining 和backward chaining以及resolution,都可以直接apply,那如果不行的话,如果你domain非常大的话,那这样做会很没效率,那我们就可以用first order logic的做法,那首先有一个概念,就是unification,那unification做的事就是,把找到一个正确的subsitution,使得左边等于右边。好,那如果我们只focus在first order logic比较小的一个subset,就definite clause的话,那我们可以直接用generalized modus ponus,那这里面就是,给前提,得到结论,那我们一样可以使用forward chaining,backward chaining的技术,那generalized modus ponus基本上是complete,当然也上面complete在definite clause上面。

那当然entailment本身它是semi-decidable的,那我们也提过,如果你是一个data log,就是你没有function,那没有function的这个definite clause 那其实在pronominal time是可以搞定的,那我们也提过嘛,其实你要无穷的一直,你会一直没办法决定下来,是因为你有function的情况下,可function可以无穷的一直套上去,比如说,这样的father的father,是有object有无穷多个,所以你没法在有限的时间内套完,但是你如果没有function的时候,就没有这样的问题。object其实能替换的有限,那所以你可以在pronomial time里面可以做完。

那backward chaining呢,在logic programming会常被用的,譬如说,像prolog system里面,它基本上是可以蛮快的,它为了效率,那它省略了occur check,所以它的导到结论可能unsum的,那因为用DFS是记忆体,所以它导到结论也可以是incomplete,但是即使它可能是unsound的,又complete,但是它在大部分我们所需要,所使用的问题上,大部分都可以work的不错,好,这是大家效率非常非常好,那这是一个trade off,一个牺牲,一些正确性,有些时候会给你不正确,但是得到很大部分的效能的提升,那最后就是,你如果没有那么care效能的话,那你可以使用resolution,那它其实sound又是complete,那在first order logic,你当然要做一件事情,你要先把你的knowledge base换成,整个换成conjunction normal form,那之后你就可以用resolution把它证完,那以上是这一次讲的内容。

发布了289 篇原创文章 · 获赞 163 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/Suyebiubiu/article/details/103635763