离散数学实验

/*1.对给出的任意一个命题公式(不超过四个命题变元),
 * 使学生会利用编程软件表示出来,并且能够计算它在各组真值指派下所应有的真值,
 * 画出其真值表。
 * (1)﹁(﹁p∨q)∧q的真值表;
 * (2)(p∨q)→﹁r的真值表;
 */

/*2.输入命题公式(p→﹁q)→r
  *输出主析取范式、主合取范式
  *输出成真赋值、成假赋值
*/

实现思路:先求出命题公式变元由000~111的真值储存在数组中,循环遍历输出真值表;当命题公式真值为1时对应的变元值为成真赋值,此时若对应变元值为0输出对应变元的非,否则直接输出变元与变元之间用合取联结词连接,公式与公式之间用析取联结词连接(此时为主析取范式);当命题公式真值为0时对应变元值为成假赋值,此时若对应变元值为0输出对应变元的非,否则直接输出,变元与变元之间用析取联结词连接,公式与公式间用合取联结词连接(此时为主合取范式)。

命题公式的计算用后缀表达式(逆波兰表达式)求解,后缀表达式用栈来存储。

在思考解决主析取范式、主合取范式时走了很多的弯路,后来经过很久才发现真值表与范式之间的联系,其实想通了写起来非常的顺畅。写完也非常的有成就感。

打印真值表代码运行结果:

主析取范式、主合取范式、成真赋值、成假赋值代码运行结果:

package experiment;public class LogicalOperation {int disjunction(int x,int y){//析取∨if(x==1||y==1) {return 1;}else return 0;}int conjunction(int x,int y) {//合取∧if(x==y&&x==1) {return 1;}else return 0;}int nagation(int x) {//否定if(x==0) {return 1;}else return 0;}int implication(int x,int y) {//蕴涵if(x==1&&y==0) {return 0;}else return 1;}int equivalence(int x,int y) {//等价if(x==y) {return 1;}else return 0;}
}

NormalForm.java

包含求取真值表、主析取范式、主合取范式、成真赋值、成假赋值等的方法

package experiment;public class NormalForm {String form;int count=0;int count0=0;int count1=0;Proposition fo;Translation tr;NormalForm(String form){this.form=form;fo = new Proposition(form);tr = new Translation(form);tr.judge();}void calculate() {int [] x=new int[4];for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {for(int k=0;k<2;k++) {for(int l=0;l<2;l++) {fo.va1[count]=i;fo.va2[count]=j;fo.va3[count]=k;fo.va4[count]=l;x[0]=i;x[1]=j;x[2]=k;x[3]=l;fo.truth[count]=tr.operate(x);if(fo.truth[count]==0) {count0++;}elsecount1++;count++; }                   }}}}void table() {if(tr.judge()==2) {System.out.println(tr.va[0]+" "+tr.va[1]+" "+tr.pfr);for(int i=0;i<4;i++) {System.out.println(fo.va1[i*4]+" "+fo.va2[i*4]+"   "+fo.truth[i*4]);}}if(tr.judge()==3) {System.out.println(tr.va[0]+" "+tr.va[1]+" "+tr.va[2]+" "+tr.pfr);for(int i=0;i<8;i++) {System.out.println(fo.va1[i*2]+" "+fo.va2[i*2]+" "+fo.va3[i*2]+"   "+fo.truth[i*2]);}}if(tr.judge()==4) {System.out.println(tr.va[0]+" "+tr.va[1]+" "+tr.va[2]+" "+tr.va[3]+" "+tr.pfr);for(int i=0;i<16;i++) {System.out.println(fo.va1[i]+" "+fo.va2[i]+" "+fo.va3[i]+" "+fo.va4[i]+"   "+fo.truth[i]);}}}void pdnf() {//this.calculate();count1=count1/2;count1--;System.out.println("主析取范式为:");for(int i=0;i<8;i++) {if(fo.truth[i*2]==1) {System.out.print("(");if(fo.va1[i*2]==0) {System.out.print("﹁"+tr.va[0]);}else {System.out.print(tr.va[0]);}System.out.print("∧");if(fo.va2[i*2]==0) {System.out.print("﹁"+tr.va[1]);}else {System.out.print(tr.va[1]);}System.out.print("∧");if(fo.va3[i*2]==0) {System.out.print("﹁"+tr.va[2]);}else {System.out.print(tr.va[2]);}System.out.print(")");if(count1>0) {System.out.print("∨");count1--;}}}System.out.println();}void pcnf() {count0=count0/2;count0--;System.out.println("主合取范式为:");for(int i=0;i<8;i++) {if(fo.truth[i*2]==0) {System.out.print("(");if(fo.va1[i*2]==0) {System.out.print("﹁"+tr.va[0]);}else {System.out.print(tr.va[0]);}System.out.print("∨");if(fo.va2[i*2]==0) {System.out.print("﹁"+tr.va[1]);}else {System.out.print(tr.va[1]);}System.out.print("∨");if(fo.va3[i*2]==0) {System.out.print("﹁"+tr.va[2]);}else {System.out.print(tr.va[2]);}System.out.print(")");if(count0>0) {System.out.print("∧");count0--;}}}System.out.println();}void comeTrue() {System.out.println("成真赋值为:");for(int i=0;i<8;i++) {if(fo.truth[i*2]==1) {System.out.print(fo.va1[i*2]+" "+fo.va2[i*2]+" "+fo.va3[i*2]);System.out.print("   ");}}System.out.println();}void aFalse() {System.out.println("成假赋值为:");for(int i=0;i<8;i++) {if(fo.truth[i*2]==0) {System.out.print(fo.va1[i*2]+" "+fo.va2[i*2]+" "+fo.va3[i*2]);System.out.print("   ");}}System.out.println();}
}

Translation.java

包含命题公式后缀表达式的转换和求解,变元个数的判断

package experiment;public class Translation {String pfr;char[] op;//命题公式char[] op1;//后缀表达式char[] op2;//符号,中间数组char[] va=new char[4];//变量储存int[] variable=new int[4];                                                                                                                               int count1=-1;//op1计数器int count2=-1;//op2计数器int count3=0;//va计数器int x1,x2,x3,x;//x储存表达式的值LogicalOperation lg = new LogicalOperation();Translation(String pfr){this.pfr=pfr;op=pfr.toCharArray();op1=new char[op.length];op2=new char[op.length];for(int i=0;i<op.length;i++) {//转化为后缀表达式,遍历op数组;if(op[i]>='a'&&op[i]<='z') {count1++;op1[count1]=op[i];}else if(op[i]=='(') {count2++;op2[count2]=op[i];}else if(op[i]=='﹁') {if(count2==-1||op2[count2]=='∨'||op2[count2]=='∧'||op2[count2]=='→'||op2[count2]=='↔'||op2[count2]=='(') {count2++;op2[count2]=op[i];}else if(op2[count2]=='﹁') {count1++;op1[count1]='﹁';}}else if(op[i]=='∨'||op[i]=='∧'||op[i]=='→'||op[i]=='↔') {if(count2==-1||op2[count2]=='(') {count2++;op2[count2]=op[i];}else if(op2[count2]=='∨'||op2[count2]=='∧'||op2[count2]=='→'||op2[count2]=='﹁'||op2[count2]=='↔') {count1++;op1[count1]=op2[count2];op2[count2]=op[i];}}else if(op[i]==')') {while(op2[count2]!='(') {count1++;op1[count1]=op2[count2];count2--;}count2--;}}//循环结束while(count2>=0) {count1++;op1[count1]=op2[count2];count2--;}//后缀表达式完成}int judge() {//判断变量个数va[0]=op1[0];for(int i=1;i<=count1;i++) {if(op1[i]>='a'&&op1[i]<='z') {if(op1[i]!=va[0]&&op1[i]!=va[1]&&op1[i]!=va[2]) {if(va[1]==0) {va[1]=op1[i];count3=2;}else if(va[2]==0) {va[2]=op1[i];count3=3;}else {va[3]=op1[i];count3=4;}}}}return count3;}int operate(int []xi) {int num=-1;for(int i=0;i<=count1;i++) {if(op1[i]>='a'&&op1[i]<='z') {if(op1[i]==va[0]) {num++;variable[num]=xi[0];}else if(op1[i]==va[1]) {num++;variable[num]=xi[1];}else if(op1[i]==va[2]) {num++;variable[num]=xi[2];}else if(op1[i]==va[3]) {num++;variable[num]=xi[3];}}else if(op1[i]=='﹁') {variable[num]=lg.nagation(variable[num]);}else if(op1[i]=='∨') {variable[num-1]=lg.disjunction(variable[num-1], variable[num]);num--;}else if(op1[i]=='∧') {variable[num-1]=lg.conjunction(variable[num-1], variable[num]);num--;}else if(op1[i]=='→') {variable[num-1]=lg.implication(variable[num-1], variable[num]);num--;}else if(op1[i]=='↔') {variable[num-1]=lg.equivalence(variable[num-1], variable[num]);num--;}}return variable[num];}}

Proposition.java

命题公式类,包含命题公式所具有的成员变量

package experiment;public class Proposition {String formula;int[] va1 = new int[16];int[] va2 = new int[16];int[] va3 = new int[16];int[] va4 = new int[16];int[] truth = new int[16];Proposition(String formula) {this.formula=formula;}
}

experiment2.java

求真值表执行类

package experiment;
import java.util.*;
/*2.对给出的任意一个命题公式(不超过四个命题变元),* 使学生会利用编程软件表示出来,并且能够计算它在各组真值指派下所应有的真值,* 画出其真值表。* (1)﹁(﹁p∨q)∧q的真值表;* (2)(p∨q)→﹁r的真值表;*/
public class experiment2 {public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scanf=new Scanner(System.in);int[] w=new int[4];System.out.println("输入命题公式(不超过四个命题变元):");System.out.println("非为‘﹁’,析取为‘∨’,合取为‘∧’蕴涵为‘→’,等价为‘↔’");String prf = scanf.nextLine();NormalForm form = new NormalForm(prf);form.calculate();form.table();}
}

experiment3.java

求主析取范式主合取范式、成真赋值、成假赋值执行类

package experiment;
import java.util.*;
public class experiment3 {public static void main(String[] args) {/*输入命题公式(p→﹁q)→r*输出主析取范式、主合取范式*输出成真赋值、成假赋值* 非为‘﹁’,析取为‘∨’,合取为‘∧’蕴涵为‘→’,等价为‘↔’*/String form;Scanner scanf = new Scanner(System.in);System.out.println("请输入命题公式:(非为‘﹁’,析取为‘∨’,合取为‘∧’蕴涵为‘→’,等价为‘↔’)");form = scanf.nextLine();NormalForm normal = new NormalForm(form);normal.calculate();normal.pdnf();normal.pcnf();normal.comeTrue();normal.aFalse();}}

Java求取主析取范式、主合取范式、成真赋值、成假赋值、打印真值表相关推荐

  1. 【c++】[自动生成真值表/主析取范式/主合取范式的计算器]

    关于自动生成真值表/主析取范式/主合取范式的计算器 我用c++写了一个,需要的自取,如果好用请点赞 链接:https://pan.baidu.com/s/1Ji1zPDtjAc6-TDxovEzMVw ...

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

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

  3. 利用真值表法求取主析取范式以及主合取范式的实现(C++)

    代码如下: #include <iostream> #include <stack> #include <string> #include <vector&g ...

  4. 【数理逻辑】范式 ( 合取范式 | 析取范式 | 大项 | 小项 | 极大项 | 极小项 | 主合取范式 | 主析取范式 | 等值演算方法求主析/合取范式 | 真值表法求主析/合取范式 )

    文章目录 一. 相关概念 1. 简单 析取 合取 式 ( 1 ) 简单合取式 ( 2 ) 简单析取式 2. 极小项 ( 1 ) 极小项 简介 ( 2 ) 极小项 说明 ( 3 ) 两个命题变项 的 极 ...

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

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

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

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

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

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

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

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

  9. matlab析取范式求主析取范式用电脑,(p∧q)∨r 求其主析取范式 再用主析取范式求主合取范式...

    共回答了21个问题采纳率:90.5% 主合取范式:若干个极大项的合取. 主析取范式:若干个极小项的析取. 例, 求公式(p∧q)∨r的主析取范式及主合取范式. 主析取范式: (p∧q)∨r (p∧q∧ ...

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

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

最新文章

  1. 分布式存储 Ceph 的演进经验 · SOSP 2019
  2. linux进程接受信号,linux – 一个进程如何知道它已经收到一个信号
  3. ZipOutputStream 用法 小计
  4. Wireshark 在Windows下的安装
  5. 汇编语言(二十七)之身份证最后一位求和校验
  6. 阿里云天池 Python训练营Task1:从变量到异常处理
  7. java聊天软件课程设计_[计算机课程设计] JAVA课程设计-聊天室
  8. 来自Airbnb、Netflix等公司的代码评审最佳实践
  9. python全栈自动化测试工程师第11期柠檬班vip_因为Python,班主任最近都开始化妆了!...
  10. 行列式键盘+共阴极数码管显示
  11. Drools教程 —— 安装及eclipse项目创建
  12. python爬虫-斗鱼弹幕(asyncore仅供学习参考用)
  13. ASP.NET 超市管理系统
  14. substrate介绍
  15. 对于现在毕业之后,大部分找不到合适的工作,转行到软件开发(大部分是JAVA)的人来说,分享下自己的经验
  16. 2022年电力电缆操作证考试题模拟考试平台操作
  17. ubuntu 使用 OneNote
  18. 在ARM处理器架构下部署kettle etl工具注意事项
  19. 手电筒安卓_安利一款演唱会必备APP——随手电筒
  20. 杨辉三角+判断奇数并求和

热门文章

  1. 华为前线核心组织“铁三角”是如何运作的?营销LTC变革与“铁三角”啥关系?--LTC专家许浩明老师分享
  2. SCARA机械臂逆运动推导
  3. yylabel 加载html,YYLabel的简单使用
  4. 天线巴伦制作和原理_一种2.4GHz巴伦天线的制作方法
  5. 0204UNIFORM SIZE=10M?index?insert分裂
  6. 图片里的数学公式转换成word
  7. 开源 cocos2dx 五彩连珠.
  8. 航迹推演(Odometry)
  9. Ubuntu18 Cuda10升级Cuda11+Cudnn8+TensorRT7.1+Opencv3
  10. html问卷调查实验报告,网上问卷调查实验报告..doc