高等数理逻辑大作业

高等数理逻辑大作业

这明明就是一个披着数理逻辑外衣的编译器 :)

以 C 或 javascript 实现命题逻辑公式语法检查及公式求值.

一、要求

名词声明

  1. 命题变元

    • 字母及数字构成的字符串且首字符是字母
    • 字符串长度不超过 10
  2. 第一类逻辑联结词:

    • 0,1,¬,∧,∨,→,⊕,↔
  3. 第二类逻辑联结词(新定义逻辑联结词):

    • 字母及数字构成的字符串且首字符是字母
    • 给出逻辑联结词的元数及真值表的最后一列
    • 一共不超过 10 个新定义逻辑联结词
    • 新定义逻辑联结词元数不超过 10

任务

第一部分:

第二部分

二、测试用例:

测试 结果
(p1⊕r3)∧(q1⊕p3)∧(r1⊕p2)∧¬(p1∧q1)∧¬(p1∧r1)∧
¬(q1∧r1)∧¬(p3∧r3)∧¬(p1∧p2)∧¬(p1∧p3)∧¬(p2∧p3)∧¬(r1∧r3)
仅取011001成立
(p)⊕(q↔r) 10010110
f((p),g(q, r)) # f 2 0110 g 2 1001 10010110 不完全
(0∧0∨0∨0→0)⊕0↔0 永假
((q ⊕ r) ⊕s)↔(q ⊕ (r ⊕s)) 永真
f(p, f(q, r))↔f(f(p,q),r) #f 2 1001 永真,不完全
F(0,1,F(0,0,ff(0)))→0 #F 3 00000011 ff 1 01 永真,不完全
F(p, q, F(p, p, ff(p)))→p #F 3 00000011 ff 1 01 永真,不完全
F(p, q, F(p, p, g(q,f(p))))→p #F 3 00000011 f 1 01 g 2 0011 永真,不完全
F(p, q, F(p, p, g(q,f(p))))→p #F 3 10000011 f 1 10 g 2 1100 0111,完全
#f 2 0110 g 1 10 不完全
p→q↔f(f(q,f(q,p,p),p),p,p) #f 3 10010010 永真,完全
¬p↔f(p,p,p) #f 3 10010010 永真,完全
#f 2 0110 g 2 0111 h 2 0001 不完全
#f 2 0001 g 2 1001 h 2 0110 完全
#f 2 0111 g 2 1001 h 1 00 完全
#f 2 0111 g 2 0001 h 2 1101 i 2 1001 不完全
p→q↔f(f(q,q,p),f(p,p,p),p) #f 3 11000010 永真,完全
¬p↔f(p,p,p) #f 3 11000010 永真,完全
#f 2 0111 g 2 0001 h 2 1101 k 2 1001 不完全
p→q↔g(h(q,p),q) #f 2 0110 g 2 0111 h 2 1001 永真,完全
¬p↔f(h(p,p),p) #f 2 0110 g 2 0111 h 2 1001 永真,完全
#f 2 0110 不完全
p→q↔f(h(),f(p,q)) #f 2 0010 h 0 1 永真,完全
¬p↔f(h(),p) # f 2 0010 h 0 1 永真,完全

三、实现

1. 写个文法先

  • 因子
    • ¬ + 因子
    • ( + 五级项 + )
    • 标识符 + ( + 五级项 + [ ,五级项 ] + )
    • 标识符 + ()
    • 标识符
    • 0,1
  • 一级项
    • 因子
    • 因子 + + 因子 + [ + 因子 ]
  • 二级项
    • 一级项
    • 一级项 + + 一级项 + [ + 一级项 ]
  • 三级项
    • 二级项
    • 二级项 + + 二级项 + [ + 二级项 ]
  • 四级项
    • 三级项
    • 三级项 + + 三级项 + [ + 三级项 ]
  • 五级项
    • 四级项
    • 四级项 + + 四级项 + [ + 四级项 ]
  • 表达式
    • 五级项 + [ 联结词定义 ]
    • 联结词定义
  • 联结词定义
    • # + 标识符 + 因子个数 + 真值表最后一列 + [ 标识符 + 因子个数 + 真值表最后一列 ]

2. 跟编译差不多

3. 判断是否完全

一个很有用的链接:数字逻辑中的最小完全集

算法伪码:

初始集合为A = [0101,0011]
con = true;
while con
{
    con = false;
    for 联结词 in 联结词集合
    {
        //如果是n元联结词,且当前集合A中有m个元素
        //循环次数 k = m^n
        for(i = 0;i<k;i++)
        {
            //根据i选取这n个元素,将i看作是一个n位m进制数,求得i在m进制下的每一位,即对应所有可选情况
            //使用联结词计算,得到新的结果
            if 是新结果
                加入集合A
                con = true

        }
    }    
}

posted on 2018-11-08 01:40  ChildishChange  阅读(734)  评论(0编辑  收藏  举报

导航