【人工智能】鲁滨逊归结原理-Python实现

一、实验目的

        了解鲁滨逊归结算法原理,利用Python编写程序,实现鲁滨逊归结算法。

二、实验原理

        鲁滨逊归结原理又称为消解原理,是鲁滨逊提出的一种证明子句集不可满足性,从而实现定理证明的一种理论及方法。它是机器定理证明的基础。

        由谓词公式转化为子句集的过程可以看出,在子句集中子句之间是合取关系,其中只要有一个子句不可满足,则子句集就不可满足。由于空子句是不可满足的,所以,若一个子句集中包含空子句,则这个子句集一定是不可满足的。鲁宾逊归结原理就是基于这个思想提出来的。其基本方法是:检查子句集S中是否包含空子句,若包含,则S不可满足;若不包含,就在子句集中选择合适的子句进行归结,一旦通过归结得到空子句,就说明子句集S是不可满足的。

三、实验过程记录

        以下为归结原理中归结过程的树形表示:

【人工智能】鲁滨逊归结原理-Python实现_第1张图片

        以下列题目为例,对归结原理进行应用。

【人工智能】鲁滨逊归结原理-Python实现_第2张图片

        下面我们用Python实现命题逻辑归结原理的演绎推理:

S = [] # 以列表形式存储子句集S

def readClauseSet(filePath):

    global S

    for line in open(filePath, mode = 'r', encoding = 'utf-8'):

        line = line.replace(' ', '').strip()

        line = line.split('∨')

        S.append(line)



#取反

def opposite(clause):

    if '~' in clause:

        return clause.replace('~', '')

    else:

        return '~' + clause



#归结

def resolution():

    global S

    end = False

    while True:

        if end: break

        father = S.pop()

        for i in father[:]:

            if end: break

            for mother in S[:]:

                if end: break

                j = list(filter(lambda x: x == opposite(i), mother))

                if j == []:

                    continue

                else:

                    print('\n亲本子句:' + ' ∨ '.join(father) + ' 和 ' + ' ∨ '.join(mother))

                    father.remove(i)

                    mother.remove(j[0])

                    if(father == [] and mother == []):

                        print('归结式:NIL')

                        end = True

                    elif father == []:

                        print('归结式:' + ' ∨ '.join(mother))

                    elif mother == []:

                        print('归结式:' + ' ∨ '.join(mother))

                    else:

                        print('归结式:' + ' ∨ '.join(father) + ' ∨ ' + ' ∨ '.join(mother))

                  



def main():

    filePath = r'./S.txt'

    readClauseSet(filePath)

    print('--------命题逻辑归结推理--------')

    resolution()



if __name__ == '__main__':

    main()

四、实验结果

        选取以下题目进行测试:已知命题公式集S,求证R

        首先需要手动将谓词公式化为子句集,并存储到S.txt文件中。过程如下:

【人工智能】鲁滨逊归结原理-Python实现_第3张图片

        在S.txt中存储的内容作为后续归结的子句集。

【人工智能】鲁滨逊归结原理-Python实现_第4张图片

        运行程序,得到如下归结过程。

【人工智能】鲁滨逊归结原理-Python实现_第5张图片

五、实验过程中存在的问题及解决方案

        该实验的理论部分以及手动进行归结过程并不复杂,只需要认真仔细即可完成。但利用Python进行归结的时候出现了不小的困难。通过上网查询资料和参考别人的代码,最后实现了对命题子句集进行归结的代码,后续还需要继续努力。

六、实验总结

        本次实验利用手动归结和Python编程分别对鲁宾逊归结原理进行了学习。归结原理在命题逻辑和谓词逻辑中的定义如下:

(1)命题逻辑中的归结原理

        设C1­与C2是子句集中的任意两个子句,如果C1中的文字L1与C2中的文字L2互补,那么从C1和C2中分别消去L1和L2,并将两个子句中余下的部分析取,构成一个新语句C12,这一过程称为归结。C12称为C1和C2的归结式,C1和C2称为C12的亲本子句。

(2)谓词逻辑中的归结原理

        子句C1­与C2的归结式是下列二元归结式之一:

               a)C1­与C2的二元归结式

               b)C1­的因子C1σ1与C2的二元归结式

               c)C1­与C2的因子C2σ2的二元归结式

你可能感兴趣的:(人工智能,python,人工智能,学习)