由於本問題的難度,目前先降低實現目標。
初步定爲:
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.去括號時操作符優先級的考慮
具體程序設計下次再寫。