離散數學——邏輯推理系統
邏輯判斷-推理系統
- 邏輯判斷系統
設計概要:
根據聯結詞的優先順序:¬∧∨→↔
輸入中綴邏輯式
將之轉化為字尾表示式
得到公式模板(字尾式)和變數名集合
構造<變數名,bool>的對映關係
根據字尾式和 構造好的<變數-bool> 對映 可計算其真值
類實現:
C++:(初次實現,無圖形介面)
class Logic {
public:
方法:
Logic(); //構造
void Load(string);
int priority(char); //獲取運算子優先順序
string trans(string); //中綴式->字尾式
bool calculate(string P, map<string, bool> V); //真值計算
void Creat_Table(); //建立真值表
void ADD_MDF(int); //構造主析取正規化
void ADD_MCF(
變數:
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)
- 使用說明
優化:
- 限制鍵盤輸入,只能輸入字母和相應聯結詞
- 自動識別變數
- 當變數個數超過13,真值計算超過2^13次,排版會導致卡頓,修改:當變數個數超過13,不建立真值表,添加了一個查詢控制元件,可以輸入0/1序列查詢真值。
遺憾:
- 不能預先判斷邏輯式是否合法
- ¬為單目運算子,實在想不到辦法怎麼與其他聯結詞區分
- 第一次是用C++寫的程式碼,但在C++的圖形介面出了點問題,這是用Python-tkinter寫的,現學現賣,難免存在一些問題,程式碼很亂,可讀性不高。
推理系統,其實是以判斷系統的功能為基礎,做了一點點擴充套件。
程式: