Description

输入命题公式的合式公式,求出公式的真值表,并输出该公式的主合取范式和主析取范式。

Input

命题公式的合式公式

Output

公式的主析取范式和主合取范式,输出形式为:“ mi ∨ mj ; Mi ∧ Mj” ,极小项和 ∨ 符号之间有一个空格,极大项和 ∧ 符号之间有一个空格;主析取范式和主合取范式之间用“ ; ”隔开,“ ; ”前后各有一个空格。 永真式的主合取范式为 1 ,永假式的主析取范式为 0 。

输入公式的符号说明:
! 非,相当于书面符号中的 “ ¬ ”
& 与,相当于书面符号中的 “ ∧ ”
| 或,相当于书面符号中的 “ ∨ ”

  • 蕴含联结词,相当于书面符号中的 “ → ”
  • 等价联结词,相当于书面符号中的 “ ↔ ”
    ( 前括号
    ) 后括号

Code

#include <cstdio>
#include <cstring>
#include <cmath>
#define N 1000
#define MAX 10000000
char s[N];
bool table[30];
int explain[30];
int value[MAX];
int sum = 0;
int priority(char c)
{switch (c){case '#': return -1;case '!': return 5;case '&': return 4;case '|': return 3;case '-': return 2;case '+': return 1;case '(': return 0;default: return 0;}
}
void postfix()
{char post[N] = { '\0' };int pp = -1;char stack[N] = { '#' };int ps = 0;int len = strlen(s);for (int i = 0; i < len; i++){if (s[i] >= 'a' && s[i] <= 'z'){post[++pp] = s[i];continue;}if (s[i] == '!' || s[i] == '&' || s[i] == '|' || s[i] == '-' || s[i] == '+'){while (priority(s[i]) <= priority(stack[ps]))post[++pp] = stack[ps--];stack[++ps] = s[i];continue;}if (s[i] == '('){stack[++ps] = s[i];continue;}if (s[i] == ')'){while (stack[ps] != '(') post[++pp] = stack[ps--];ps--;continue;}}while (ps) post[++pp] = stack[ps--];strcpy(s, post);int l = strlen(s);
}
void settable()
{memset(table, 0, sizeof(table));int len = strlen(s);for (int i = 0; i < len; i++){if (s[i] >= 'a' && s[i] < 'z')table[s[i] - 'a'] = true;}for (int i = 0; i < 26; i++)if (table[i]) sum++;sum = pow(2, sum);
}
int btoi()
{int sum = 0, weight = 1;for (int i = 25; i >= 0; i--)if (table[i]){if (explain[i]) sum += weight;weight *= 2;}return sum;
}
int calc(int a, int b, char c)
{switch (c){case '&': return a * b;case '|': if (a + b) return 1; else return 0;case '-': if (a == 1 && b == 0) return 0; else return 1;case '+': return !((a + b) & 1);}
}
int work()
{int stack[N], ps = -1;int len = strlen(s);for (int i = 0; i < len; i++){if (s[i] >= 'a' && s[i] <= 'z'){stack[++ps] = explain[s[i] - 'a'];continue;}if (s[i] == '!'){stack[ps] = (stack[ps] + 1) & 1;continue;}int ans = calc(stack[ps - 1], stack[ps], s[i]);stack[--ps] = ans;}return stack[0];
}
void assign()
{int x = btoi();int ans = work();value[x] = ans;
}
void generate(char c)
{while (c <= 'z' && table[c - 'a'] == false) c++;if (c > 'z'){assign();return;}explain[c - 'a'] = 0;generate(c + 1);explain[c - 'a'] = 1;generate(c + 1);
}
void output1()
{int i = 0;while (i < sum && !value[i]) i++;if (i >= sum){printf("0 ; ");return;}printf("m%d", i);for (i++; i < sum; i++)if (value[i]) printf(" ∨ m%d", i);printf(" ; ");
}
void output2()
{int i = 0;while (i < sum && value[i]) i++;if (i >= sum){printf("1\n");return;}printf("M%d", i);for (i++; i < sum; i++)if (!value[i]) printf(" ∧ M%d", i);printf("\n");
}
int main()
{scanf("%s", s);postfix();settable();memset(value, 0, sizeof(value));memset(explain, 0, sizeof(explain));generate('a');output1();output2();return 0;
}

转载于:https://www.cnblogs.com/dadamrx/p/7294633.html

离散数学 求命题公式的主析取范式和主合取范式相关推荐

  1. 离散数学——用c/c++求命题公式的主范式

    本文借鉴了这篇文章https://blog.csdn.net/DaDaMr_X/article/details/51265230 离散数学又被称为计算机数学,本篇文章就介绍了如何用C++实现求离散数学 ...

  2. 使用C++求命题公式的主析取范式与主合取范式

    最近的离散数学的一个上机作业,要求任意输入一个命题公式,求它的真值表与主析取范式和主合取范式.其中的命题连接词都是用特殊符号来表示(怕麻烦--),并最终选择使用C++来编写程序. 先贴代码: // 五 ...

  3. 【离散数学】Java语言实现利用真值表法求主析取范式和主合取范式

    C++版本的看这个链接: [离散数学]C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/ ...

  4. 【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式

    Java版本的如下链接所示: Java语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/art ...

  5. 离散数学范式c语言实验报告,离散数学实验报告-利用真值表法求主析取范式及主合取范式的实现...

    1.实 验 报 告( / 学年 第 一 学期)课程名称离散数学实验名称利用真值表法求主析取范式及主合取范式的实现实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专 业 实 验 报 告实验名称利 ...

  6. 离散数学实践一编程判断主析取范式和主合取范式【java实现】

    文章目录 实验要求 二 编程思路分析 困难所在 二 完整代码 实验要求 实验类型:设计性 实验目的 通过算法设计并编程实现,使学生掌握利用计算机语言判别合式公式主范式的基本方法. 实验内容 给定合式公 ...

  7. 求主析取范式与主合取范式

    定义设A为恰含命题变元p1,-,pn的公式.公式A称为A的主析(合)取范式(majordisjunctive(conjunctive)normal form),如果A是A的析(合)取范式,并且其每个合 ...

  8. 离散实验 真值表求主析取范式、主合取范式的计算机语言实现

    离散数学 实验一 标题:真值表求主析取范式.主合取范式的计算机语言实现 其他课程的一些其他实验源码也可在本人github主页找到哦 链接如下:https://github.com/Schiz0mani ...

  9. 求命题公式的真值表及主范式(栈实现)

    设计思路 首先用一个串来储存使用者所输入的命题表达式,依据人类的思维,会对输入的命题公式进行分析和计算,但计算机可不会,这时我们就要写入相关代码把使用者输入的命题表达式转换为计算机所能进行计算的后缀表 ...

最新文章

  1. Virtual Machine--Vmware(2)
  2. EXTJS学习系列提高篇:第二十五篇(转载)作者殷良胜,ext2.2打造全新功能grid系列--右键菜单篇...
  3. 【数据库中间件】MyCat分表分库规则实现
  4. C#通用类库--数字转为人民币汉字大写表示
  5. 浪潮信息服务器拆解,浪潮英信服务器NP3020M2拆解
  6. 最短路径(dijistra和floyd算法)
  7. 如何制作纯文字视频快闪视频
  8. 什么是双线双IP和双线单IP
  9. 【html】理工男李峋的极致浪漫:爱心代码|和你的心跳同频共振
  10. 一地鸡毛——软件项目中的人际困局
  11. 给力的国外地质网站在线查看
  12. 用openlayers3绘图(点、线、圆、正方形....)
  13. TED如何度过人生中的艰难岁月
  14. 中国各省份名字的由来
  15. 灰色预测模型python_python实现灰色预测模型(GM11)——以预测股票收盘价为例
  16. 中国石油大学计算机科学与技术在哪个校区,庞善臣 - 中国石油大学 - 计算机科学与技术学院...
  17. 计算机丢失CH375DLL怎么办,CH375DLL.DLL
  18. 如何让百度搜索到我的博客或者网站
  19. 用华为手机助手备份恢复的问题解决
  20. qt中mysql怎么支持事务_Qt踩坑之mysql数据库不支持事务操作?

热门文章

  1. 工作了4年的JAVA程序员应该具备什么技能?
  2. UESTC 1265
  3. CentOS7安装Stegsolve不报错
  4. Sigmoid Function
  5. 怎么看曲线有没有斜渐近线_关于曲线的斜渐近线
  6. SSM三大框架整合(Spring+SpringMVC+MyBatis)
  7. [论文翻译]A SURVEY ON DEEP LEARNING METHODS FOR SEMANTIC IMAGE SEGMENTATION IN REAL-TIME
  8. KT1025A蓝牙芯片模块关于录音功能的一些常见问题_以及解答
  9. 唇语识别技术的开源教程,听不见声音我也能知道你说什么!
  10. 如何使用overleafLaTeX