由于本问题的难度,目前先降低实现目标。
初步定为:
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.去括号时操作符优先级的考虑
具体程序设计下次再写。