1. 程式人生 > >離散數學——邏輯推理系統

離散數學——邏輯推理系統

邏輯判斷-推理系統

  • 邏輯判斷系統

設計概要:

根據聯結詞的優先順序:¬∧∨→↔

輸入中綴邏輯式

將之轉化為字尾表示式

得到公式模板(字尾式)和變數名集合

構造<變數名,bool>的對映關係

根據字尾式和 構造好的<變數-bool> 對映 可計算其真值

類實現:

C++:(初次實現,無圖形介面)

class Logic {

public:

方法:

Logic();                                          //構造

void Load(string);                                

//input

int priority(char);                               //獲取運算子優先順序

string trans(string);                             //中綴式->字尾式

bool calculate(string P, map<string, bool> V);    //真值計算

void Creat_Table();        //建立真值表

void ADD_MDF(int);                                //構造主析取正規化

void ADD_MCF(

int);                                //構造主合取正規化

變數:

string M_exp;                            //中綴式

string P_exp;                            //字尾式

map<string, bool> variate;               //翻譯“字典”(變數->bool值)

vector<map<string, bool, cmp>> Table;    //真值表二維對映組

string MDF;                              

//主析取正規化

string MCF;                              //主合取正規化

};

Python:(以C++的類為基礎,新增圖形介面)

真值表儲存結構:<int,map<string,bool>> ,string-bool對映的動態陣列

以¬a^b→c為例

將行號轉化為二進位制數,每一位二進位制賦給對應變數,呼叫calculate函式計算結果,並將結果新增到真值表中。

以這些基本方法和資料為基礎就可以實現較複雜的功能。

  • 推理系統

以判斷系統為基礎,推理系統無非是增加判斷邏輯式為重言式

輸入前提:以逗號(,)分隔

輸入結論:

假設前提為 ¬a∨b, b∧c

 結論為 a

我所做的處理:前提兩側加”(“  ”)”,用”)∧(”替換逗號,再用”→”連線結論

比如此時樣例為 ((¬a∨b)∧( b∧c))→a,

可通過邏輯判斷系統,判斷這個式子為重言式(真值表result全為1)

  • 使用說明

優化:

  1. 限制鍵盤輸入,只能輸入字母和相應聯結詞
  2. 自動識別變數
  3. 當變數個數超過13,真值計算超過2^13次,排版會導致卡頓,修改:當變數個數超過13,不建立真值表,添加了一個查詢控制元件,可以輸入0/1序列查詢真值。

遺憾:

  1. 不能預先判斷邏輯式是否合法
  2. ¬為單目運算子,實在想不到辦法怎麼與其他聯結詞區分
  3. 第一次是用C++寫的程式碼,但在C++的圖形介面出了點問題,這是用Python-tkinter寫的,現學現賣,難免存在一些問題,程式碼很亂,可讀性不高。

推理系統,其實是以判斷系統的功能為基礎,做了一點點擴充套件。

程式: