练涛

逻辑判断-推理系统

  • 逻辑判断系统

设计概要:

根据联结词的优先级:¬∧∨→↔

输入中缀逻辑式

将之转化为后缀表达式

得到公式模板(后缀式)和变量名集合

构造<变量名,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写的,现学现卖,难免存在一些问题,代码很乱,可读性不高。

 

推理系统,其实是以判断系统的功能为基础,做了一点点扩展。

程序:

源码:https://pan.baidu.com/s/1LLH__dtWTpdLmSHwqxatcw

posted on 2018-10-27 19:33  氵丨  阅读(849)  评论(0编辑  收藏  举报