自动定理证明算法设计(-)

来源:互联网 发布:淘宝网官方网址是多少 编辑:程序博客网 时间:2024/05/02 02:53

由于本问题的难度,目前先降低实现目标。

初步定为:

1.支持基本运算 取反,括号处理

2.支持 蕴涵,交换律,结合律,摩根定律

3.支持复杂组合,只要仅通过上面规则就可以化简最后的合取式或析取式

基本想法是对于公式L1,L2,先将其二者化简到最简的合取式或最简的析取式,再通过交互律验证二者是否相等。

算法:

bool processing(L1,L2)

{

1执行L1所有蕴涵

2执行L2所有蕴涵

3执行L1所有取反

4执行L2所有取反

5去除L1所有多余括号

6去除L2所有多余括号

return prove(L1,L2);//按照交换律为依据证明L1,L2是否可相互推导

}

bool prove(L1,L2){

if(L1为原子式&&L2为原子式){

if((L1==L2))
 {
  return true;
 }
else retrun false;
}

if(L1,L2均有连接词){

将L1,L2分别按照连接词划分为子公式

取L1第一个子公式L1a,和第一个连接词后面的公式序列加连接词构成的序列L1b

for-each(对L2中每个子公式L2a,及其他子公式构成的序列L2b){

if(prove(L1a,L2a)&&prove(L1b,L2b)) 
   {
    return true;
   }

}//endfor

}

//其他情况

return false;

}

蕴涵操作,取反,去括号,都按照递归的方法

先看是否为原子公式,直接操作。

如果有连接词,则划分子公式,分别操作,再组合结果。

目前前面算法都已实现,运行良好。

几个技术点:

1.证明过程的记录与表示,可以加到证明函数中,递归记录

2.去括号时操作符优先级的考虑

具体程序设计下次再写。

原创粉丝点击