• 离散数学——逻辑推理系统


    逻辑判断-推理系统

    • 逻辑判断系统

    设计概要:

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

    输入中缀逻辑式

    将之转化为后缀表达式

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

    构造<变量名,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

  • 相关阅读:
    Git常用命令
    C++ 四种强制类型转换
    Linux系统日志及日志分析
    C/C++中的getline函数总结:
    标准C++中的string类的用法总结
    C++中map的基本操作和使用;
    一个C++类的注释:
    C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906
    c++ 的vector
    c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
  • 原文地址:https://www.cnblogs.com/F-itachi/p/9974341.html
Copyright © 2020-2023  润新知