离散数学,逻辑学,命题公式求真值表
更新时间:2023-03-17 20:18:01 阅读量: 综合文库 文档下载
- 离散数学命题公式的类型推荐度:
- 相关推荐
离散逻辑学实验
班级:10电信实验班 学号:Q10600132 姓名:王彬彬 一、实验目的
熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二、实验内容
1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。(A)
2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))
三、实验环境
C或C++语言编程环境实现。
四、实验原理和实现过程(算法描述)
1.实验原理
(1)合取:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P∧Q, 读作P、Q的合取, 也可读作P与Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = T时方可P∧Q =T, 而P、Q只要有一为F则P∧Q = F。这样看来,P∧Q可用来表示日常用语P与Q, 或P并且Q。
(2)析取:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P∨Q, 读作P、Q的析取, 也可读作P或Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = F, Q = F时方可P∨Q =F, 而P、Q只要有一为T则P∨Q = T。这样看来,P∨Q可用来表示日常用语P或者Q。
(3)条件:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P→Q, 读作P条件Q, 也可读作如果P,那么Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = F时方可P→Q =F, 其余均为T。
(4)双条件:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题P←→Q, 读作P双条件于Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为当两个命题变项P = T, Q =T时方可P←→Q =T, 其余均为F。
(5)真值表:表征逻辑事件输入和输出之间全部可能状态的表格。列出命题公式真假值的表。通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。 真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
(6)主范式:
主析取范式:在含有n个命题变元的简单合取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项。由若
干个不同的小项组成的析取式称为主析取范式;与A等价的主析取范式称为A的主析取范式。任意含n个命题变元的非永假命题公式A都存在与其等价的主析取范式,并且是惟一的。
主合取范式:在含有n个命题变元的简单析取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项。由若干个不同的大项组成的合取式称为主合取范式;与A等价的主合取范式称为A的主合取范式。任意含n个命题变元的非永真命题公式A都存在与其等价的主合取范式,并且是惟一的。
五、代码设计结果:
六、代码:
#include
#include \#include \#define N 50
void panduan(int b[N],int f);//赋值函数
int tkh (char sz[N], char ccu[N], int icu[N], int h0);//分级运算函数 int fkh (char sz[N], char ccu[N], int icu[N], int h0);//主运算函数
void zhumain() {
int i1,i2,d=1,icu[N],kh=0,jg,j=0,h0;//icu[N]用于存放变量值,kh括号计数,jg存放结果 int bj=0,hq[N],h=0,x=0,xq[N];//hq[N]存放合取结果xq[N]存放析取结果
char sz[N],ccu[N],sz0[N],s;//sz[N]存放式子,ccu[N]存放变量,sz0[N]也是用于存放式子 hq[0]=-1; xq[0]=-1;
printf(\标语 printf(\ **\\n\ printf(\ 欢迎进入逻辑运算软件 **\\n\ printf(\ (可运算真值表,主范式,支持括号) **\\n\ printf(\ **\\n\ printf(\ 用!表示非 **\\n\ printf(\ 用&表示与 **\\n\ printf(\ 用|表示或 **\\n\ printf(\ 用^表示蕴含 **\\n\ printf(\ 用~表示等值 **\\n\ printf(\ **\\n\ printf(\ printf(\请输入一个合法的命题公式:\\n\输入式子 gets(sz);//读取式子
strcpy(sz0,sz);//复制式子 for(i1=0;i1 if(sz[i1]==')' || sz[i1]=='(')//存储括号数量 kh++; if(sz[i1]>='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z') { for(i2=0;i2 ccu[j]=sz[i1]; j++; } d=1; } } printf(\该式子中的变量个数为:%d\\n\输出变量个数 h0=j; printf(\输出真值表如下:\\n \\n\输出真值表表头 for(i1=0;i1 for(i1=0;i1 for(i2=0;i2 jg=tkh(sz,ccu,icu,h0); //用函数求结果 if(jg==0)//结果为0,合取加1 hq[h++]=bj; else //否则,析取加1 xq[x++]=bj; printf(\ %d\\n\输出运算结果 strcpy(sz,sz0); for(i1=0;i1<(int)pow(2,j)-1;i1++) { ++bj; panduan(icu,j-1); //赋值变量 jg=tkh(sz,ccu,icu,h0); if(jg==0)//结果为0,合取加1 hq[h++]=bj; else //否则,析取加1 xq[x++]=bj; strcpy(sz,sz0); //恢复被修改的数组。 for(i2=0;i2 printf(\输出真值表前项 printf(\ %d\\n\输出运算结果 } if(hq[0]==-1)//不存在合取范式时 printf(\该命题公式不存在主合取范式。\\n\ else { printf(\该命题公式的主合取范式:\\n\\t\ for(i1=0;i1 printf(\输出主合取范式 } } if(xq[0]==-1)//不存在析取范式时 printf(\该命题公式不存在主析取范式。\\n\ else { printf(\该命题公式的主析取范式:\\n\\t\ for(i1=0;i1 printf(\输出主析取范式 } } printf(\} void panduan(int b[N],int f) // 二进制赋值。 { int i; i=f; if(b[f]==0)//加1 b[f]=1; else//进位 { b[f]=0; panduan(b,--i); } } int tkh (char sz[N],char ccu[N],int icu[N],int h0)//分级运算函数 { int i,j,h,s,kh=0,wz[N],a; char xs1[N],ckh[N]; //xs1用来保存括号内的字符 ckh用来保存括号。 s=strlen(sz); for(i=0;i if(sz[i]=='(' || sz[i]==')')//判断括号 { wz[kh]=i;//存储括号位置 ckh[kh]=sz[i];//存储括号类型 kh++; } if(kh==0) return fkh(sz,ccu,icu,h0);//如果无括号,直接运行 else { for(i=0;i if(ckh[i]==')')//找到第一个) break; for(j=wz[i-1]+1,h=0;j a=fkh(xs1,ccu,icu,h0);//运行最内级括号的式子,得到结果 if(a==1)//判断并存储结果 sz[wz[i-1]]=1; else sz[wz[i-1]]=-2; for(j=wz[i-1]+1;j return tkh(sz,ccu,icu,h0);//循环执行 } } int fkh(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)//判断是否是最后一项 return 0; else return 1; //1 就是sz[0]的值、 else { for(i=0;i for(i1=0;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 sz[i1]=sz[i1+1];//将后续式子前移一项 } p1=-1; j1=j; for(i=0;i for(i1=0;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 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 for(i=0;i if(sz[i]=='|') { for(i1=0;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 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 for(i=0;i for(i1=0;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 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++; j4++; p1=-1; p2=-1; for(i1=i;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 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)&&(!p2 || p1);//等值运算 sz[i-1]=j+2; j++; j5++; p1=-1; p2=-1; for(i1=i;i1 return dt[j+1];//返回结果 } } void sel() { //合取、析取、条件、双条件的输出 int p,q; printf(\输入两个字符的真值:\ scanf(\ printf(\输出合取结果:\ printf(\ printf(\输出析取结果:\ printf(\ printf(\输出条件结果:\ printf(\ printf(\输出双条件结果:\ printf(\ } int main() { printf(\班级:10电信实验班*****学号:Q10600132****姓名:王彬彬\\n\ printf(\ 1.求取命题公式的真值表,主合取和主析取\\n\\n\ zhumain(); printf(\ 2.求取合取析取等真值\\n\\n\ sel(); return 0; } 七、实验心得: 从这次实验中了解到如何通过程序,把字符串的逻辑公式,实现运算 的功能。这是关键,同时对括号等的处理,这也很重要。
正在阅读:
离散数学,逻辑学,命题公式求真值表03-17
CellAVision DM96 自动化数字图像分析系统进行白细胞分类的临床应用08-14
汽车前挡风玻璃修复视频_防火玻璃修复视频7316309-02
中学食堂-创建放心食堂07-09
教育法规基础知识10-17
现代电力系统分析 总计05-22
江苏省计算机二级C语言试题笔试(8份)06-17
09电力电子期末总结05-28
电力相关范文02-19
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 真值
- 逻辑学
- 离散
- 命题
- 公式
- 数学
- 山东大学公共管理硕士(MPA)学位论文的选题与写作规范
- Sqlserver2008学习笔记(李天生)
- 《安全生产事故案例分析》-伤亡事故的分类
- 2.6《表示物质的符号》教学设计 - 图文
- 吉大17春学期《管理会计》在线作业二
- 计算机软件的几种知识产权保护手段的优缺点分析
- 2017年对口高考建筑试卷 - 图文
- 2016届甘肃省张掖市高三上学期第一次诊断考试文科综合试题 - 图文
- 汉源梨花节知识题
- 浅谈如何让应用电子白板提高思想品德课堂效果
- 东北师大附中2007—2008学年度高三第四次摸底考试数学试题(理科)
- 在全市质量技术监督工作会议上的讲话
- 唯识与中观
- 驾考易错考题分析06科目四信号灯路旁标志包括高速公路标志路面标记交警手势215个 - 图文
- 端盖加工复合模设计
- 中山大学汉语史与古文字专业03及04年博士生入学古汉语试题
- CB33附表3 合同分类分项项目进度付款明细表
- 新房送礼送什么好 国画山水画用“心”促交流 - 图文
- 关于加强乡镇卫生院干部队伍建设的调研报告
- 2018年中考英语专题复习-冠词(附练习答案)