逻辑判断-推理系统
- 逻辑判断系统
设计概要:
根据联结词的优先级:¬∧∨→↔
输入中缀逻辑式
将之转化为后缀表达式
得到公式模板(后缀式)和变量名集合
构造<变量名,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++的类为基础,添加图形界面)
真值表存储结构:
以¬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写的,现学现卖,难免存在一些问题,代码很乱,可读性不高。
推理系统,其实是以判断系统的功能为基础,做了一点点扩展。
程序:
源码:https://pan.baidu.com/s/1LLH__dtWTpdLmSHwqxatcw