离散数学:验证P,Q两个逻辑表达式是否逻辑等价(C语言实现)

一、程序通过编译,并实现两个命题的各种逻辑运算

二、任意输入字符串P和Q逻辑表达式的合法性检查

三、利用真值表方法验证他们的等价性

一、算法分析

①    求任意一个命题公式的真值表,,根据真值表验证他们的等价性

C语言算法:

首先是输入一个合理的式子,然后从式子中查找出变量的个数,开辟一个二进制函数,用来生成真值表,然后用函数运算,输出结果,并根据结果归类给范式,再根据范式验证等价性。

函数部分,主要是3个函数,一个为真值表递加函数,通过二进制的加法原理递进产生,一个为分级运算函数,这个函数是通过判断括号,选出最内级括号的内容执行运算函数,这样一级一级向外运算,最后得出最终结果,剩下一个为主运算函数,按照运算符号的优先级按顺序进行运算,如先将所有非运算运算完,再执行与运算。如此运算。

②    

/**主运算函数**/
intMAP(char sz[N],char ccu[N],int icu[N],int h0)
{
  int i, h = 0, j = 0, j1 = 0, j2 = 0, j3 = 0,j4 = 0, j5 = 0, i1, i2, p1 = -1, p2 = -1, s;
  char dt[N];
  s = strlen(sz);
  if(s == 1)
       if(sz[0] == -2)              //判断是否是最后一项
              return0;
       else
              return1;         //1就是sz[0]的值、
  else{
    for(i = 0; i < s-j; i++) //先处理非
              if(sz[i]== '!'){
                     for(i1 = 0; i1 < h0; i1++)
                            if(sz[i+1]== ccu[i1])//将变量赋值并给P1
                                   p1 = icu[i1];
                     if(sz[i+1] == -2)//如果是前运算结果的0,则P1等于0
                            p1= 0;
                     if(p1 == -1)//如果是数字,直接给P1
                            p1= sz[i+1];
                     dt[j+2] = !p1;//非运算
                     sz[i] = j+2;
                     j++;
                     p1 = 0;
                     for(i1 = i+1; i1 < s-j; i1++)
                            sz[i1]= sz[i1+1];//将后续式子前移一项
              }
              p1= -1;
              j1= j;
    for(i = 0; i < s-j1-2*j2; i++) // 处理与
              if(sz[i]== '&'){
                     for(i1 = 0; i1 < h0; i1++){
                            if(sz[i-1]== ccu[i1])//将变量赋值并给P1
                                   p1 = icu[i1];
                            if(sz[i+1]== ccu[i1])//将变量赋值并给P2
                                   p2 = icu[i1];
                     }
      for(i2 = 2; i2 < j+2; i2++) {
        if(sz[i-1] == i2) //如果为前计算结果,将结果赋值并给P1
          p1 = dt[i2];
        if(sz[i+1] == i2) //如果为前计算结果,将结果赋值并给P2
          p2 = dt[i2];
         }
      if(sz[i-1] == -2)//如果是前运算结果的0,则P1等于0
        p1 = 0;
      if(sz[i+1] == -2)//如果是前运算结果的0,则P2等于0
        p2 = 0;
      if(p1 == -1) //如果是数字,直接给P1
        p1 = (int)(sz[i-1]);
      if(p2 ==-1)//如果是数字,直接给P2
        p2 = (int)(sz[i+1]);
      dt[j+2] = p1 && p2;//与运算
      sz[i-1] = j+2;
      j++;
      j2++;
      p1 = -1;
      p2 = -1;
      for(i1 = i; i1 < s-j1-2*j2; i1++)//将后续式子前移两项
        sz[i1] = sz[i1+2];
      i = i-1;
       }
    for(i = 0; i < s-j1-2*j2-2*j3; i++) // 处理或。
      if(sz[i] == '|'){
        for(i1 = 0; i1 < h0; i1++){
          if(sz[i-1] == ccu[i1])//将变量赋值并给P1
            p1 = icu[i1];
          if(sz[i+1] == ccu[i1])//将变量赋值并给P2
            p2 = icu[i1];
              }
        for(i2=2;i2<j+2;i2++) {
          if(sz[i-1] == i2)  //如果为前计算结果,将结果赋值并给P1
            p1 = dt[i2];
          if(sz[i+1] == i2)//如果为前计算结果,将结果赋值并给P2
            p2 = dt[i2];
              }
        if(sz[i-1] == -2)//如果是前运算结果的0,则P1等于0
          p1 = 0;
        if(sz[i+1] == -2)//如果是前运算结果的0,则P2等于0
          p2 = 0;
        if(p1 == -1)//如果是数字,直接给P1
          p1 = sz[i-1];
        if(p2 == -1)//如果是数字,直接给P2
          p2 = sz[i+1];
        dt[j+2] = p1 || p2;//或运算
        sz[i-1] = j+2;
        j++;
        j3++;
        p1 = -1;
        p2 = -1;
        for(i1 = i; i1 < s-j1-2*j2-2*j3;i1++)//将后续式子前移两项
          sz[i1]=sz[i1+2];
        i--;
         }
      for(i = 0; i < s-j1-2*j2-2*j3-2*j4;i++) // 处理蕴含。
      if(sz[i] == '^'){
        for(i1 = 0; i1 < h0; i1++){
          if(sz[i-1] == ccu[i1])//将变量赋值并给P1
            p1 = icu[i1];
          if(sz[i+1] == ccu[i1])//将变量赋值并给P2
            p2 = icu[i1];
              }
        for(i2 = 2; i2 < j+2; i2++) {
          if(sz[i-1] == i2) //如果为前计算结果,将结果赋值并给P1
            p1 = dt[i2];
   
  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值