自動定理證明算法設計(-)

由於本問題的難度,目前先降低實現目標。

初步定爲:

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.去括號時操作符優先級的考慮

具體程序設計下次再寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章