利用真值表法求取主析取范式以及主合取范式的实现-副本
利用真值表法求取主析取范式以及主合取范式的实现-副本.doc
1#include stdio.h #include stdlib.h #include string.h #include math.h #define N 50void pd(int b[N],int f);int H1 (char T1[N], char T2[N], int T3[N], int y); int H2 (char T1[N], char T2[N], int T3[N], int y); int main() {int i1,i2,d=1,T3[N],kh=0,jg,j=0,y; int w=0,hequ[N],h=0,x=0,xiqu[N]; charT1[N],T2[N],T10[N],s; hequ[0]=-1; xiqu[0]=-1;printf(#########################################\n); printf(##用!表示否定##\n); printf(## 用&表示合取##\n); printf(## 用|表示析取##\n); printf(##用^表示条件##\n); printf(## 用~表示双条件##\n); printf(#########################################\n\n);printf(请输入一个合法的命题公式:\n); gets(T1);strcpy(T10,T1);for(i1=0;i1<strlen(T1);i1++) {if(T1[i1]==')' || T1[i1]=='(') kh++;if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') {for(i2=0;i2<j;i2++) if(T2[i2]==T1[i1]) d=0;if(d==1) {T2[j]=T1[i1]; j++; }d=1; } }2printf(\n输出真值表如下:\n \n); for(i1=0;i1<y;i1++)printf( %c ,T2[i1]); printf( ); puts(T1); printf(\n);for(i1=0;i1<j;i1++) T3[i1]=0;for(i2=0;i2<j;i2++)printf( %d ,T3[i2]); jg=H1(T1,T2,T3,y); if(jg==0)hequ[h++]=w; elsexiqu[x++]=w;printf( %d\n,jg); strcpy(T1,T10);for(i1=0;i1<(int)pow(2,j)-1;i1++) {++w;pd(T3,j-1);jg=H1(T1,T2,T3,y); if(jg==0)hequ[h++]=w; elsexiqu[x++]=w; strcpy(T1,T10); for(i2=0;i2<j;i2++)printf( %d ,T3[i2]); printf( %d\n,jg); }if(hequ[0]==-1)printf(\n该命题公式不存在主合取范式。
离散实验——真值表法求主合取(析取范式)范式 最终版ppt课件
三、代码运行流程
11/20/2018
四、核心代码分析
paramCount用于存储表达式中的变量个数, assignCount用于存储具体有多少种赋值方式。 本代码主要通过对数据左移运算来实现。举个例 子,比如表达式中有变量P,Q,R,那么变量个数就是3 ,也就是paramCount等于3,十进制1转换为二进制为 0000 0001,通过左移运算符<<向左移动3位,为: 0000 1000,那么将此二进制转化为十进制为:=8,即3 个变量有8种赋值方式,再将8赋值给assignCount变 量,即可实现真值赋值功能。
11/20/重要的概念,利 用它几乎可以解决命题逻辑中的所有问题。例如,利 用命题公式的真值表,可以判断命题公式的类型、求 命题公式的主范式、判断两命题公式是否等价,还可 以进行推理等。 本实验是通过编写一个程序,让计算机给出命题 公式的真值表,并在此基础上进行命题公式类型的判 定、求命题公式的主范式等。目的是让我们更加深刻 地理解真值表的概念,并掌握真值表的求解方法及其 在解决命题逻辑中其他问题中的应用。
五、调试过程中的问题及解决方法
当输入公式RT^Q时,得到了错误的结果。
当输入公式 RT^Q时,得 到了错误的 结果。 左图加黑部 分为解决方 法
五、调试过程中的问题及解决方法
在添加了以上两段程序中加粗部分后,解决了在for循 环中,由于后缀表达式读取结束时,所有变量并不是都参与 了命题公式的运算,使处在栈的变量真值被忽略(就像例子 中的R一样),从而导致了错误的输出的问题。 由于for循环结束,R的真值0没有参与命题表达式的运 算,此时判断栈内元素所对应的数组下标是否大于1,如果 大于1,则证明栈内还有元素没有弹出。返回一个值-1,标记 为输入格式错误。在value即真值赋值时出现-1,报错,提 示需要修改输入的表达式。
2011离散数学作业9_命题逻辑
(2)(¬P∨R)→(P↔¬Q) ⇔¬(¬P∨R) ∨[(¬P∨¬Q)∧(P∨Q)] ⇔(P∧¬R)∨[(¬P∧P)∨(¬P∧Q)∨(¬Q∧P)∨(¬Q∧Q)] ⇔(P∧¬R)∨0∨(¬P∧Q)∨(¬Q∧P)∨0 ⇔(P∧¬R)∨(¬P∧Q)∨(¬Q∧P) ⇔(P∧¬R∧(Q∨¬Q))∨(¬P∧Q∧(R∨¬R))∨(¬Q∧P∧(R∨¬R)) ⇔( P∧Q∧¬R)∨(P∧¬Q∧¬R)∨(¬P∧Q∧R)∨(¬P∧Q∧¬R)∨(P∧¬Q∧ R)∨(P∧¬Q∧¬R) ⇔( P∧Q∧¬R)∨(P∧¬Q∧¬R)∨(¬P∧Q∧R)∨(¬P∧Q∧¬R)∨(P∧¬Q∧ R) ⇔m110∨m100∨m011∨m010∨m101 ⇔m6∨m4∨m3∨m2∨m5 ⇔∑(2,3,4,5,6) (主析取范式) (¬P∨R)→(P↔¬Q) ⇔∏(0,1,7) ⇔M000∧M010∧M111 ⇔(P∨Q∨R)∧(P∨¬Q∨R)∧(¬P∨¬Q∨¬R) (主合取范式) (3)P∨(¬P→(Q∨(¬Q→R))) ⇔P∨(P∨(Q∨(Q∨R))) ⇔P∨Q∨R⇔m111⇔m7 (主析取范式)
6
结论为:r。 下面证明结论的有效性。 (1)¬p P (2)¬p→q∨r P (3)q∨r (1),(2),假言推理 (4)¬s P (5)¬s→¬q P (6)¬q (4),(5), 假言推理 (7)r (3),(6), 析取三段论
离散数学作业 作业 9——范式、推理
1.利用真值表求下列公式的主析取范式和主合取范式。 (1) P∧(Q∨R) (2) (¬P∨R)→(P↔¬Q) (3) P∨(¬P→(Q∨(¬Q→R))); 解:(1)P∧(Q∨R)⇔(P∧Q)∨(P∧R) ⇔(P∧Q∧(¬R∨R))∨(P∧R∧(¬Q∨Q)) ⇔(P∧Q∧¬R) ∨(P∧Q∧R) ∨(P∧R∧¬Q) ∨(P∧R∧Q) ⇔(P∧Q∧¬R) ∨(P∧Q∧R)∨(P∧¬Q∧R) ⇔m110∨m111∨m101⇔m7∨m6∨m5⇔∑(5,6,7) (主析取范式) P∧(Q∨R) ⇔ (P∨(¬Q∧Q) ∨(¬R∧R))∧((¬P∧P)∨Q∨R) ⇔(P∨¬Q∨¬R)∧(P∨¬Q∨R)∧(P∨Q∨¬R)∧(P∨Q∨R) ∧(¬P∨Q∨R) ∧(P∨Q∨R) ⇔(P∨¬Q∨¬R)∧(P∨¬Q∨R)∧(P∨Q∨¬R)∧(P∨Q∨R) ∧(¬P∨Q∨R) ⇔M011∧M010∧M001∧M000∧M100 ⇔M3∧M2∧M1∧M0∧M4 ⇔∏(0,1,2,3,4) (主合取范式)
(完整版)利用真值表法求取主析取范式以及主合取范式的实现-副本
if(T1[i1]==')' || T1[i1]=='(')
kh++;
if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z')
{
for(i2=0;i2<j;i2++)
if(T2[i2]==T1[i1])
d=0;
if(d==1)
{
T2[j]=T1[i1];
{
if(T1[i-1]==T2[i1])
p1=T3[i1];
if(T1[i+1]==T2[i1])
p2=T3[i1];
}
for(i2=2;i2<j+2;i2++)
{
if(T1[i-1]==i2)
p1=dt[i2];
if(T1[i+1]==i2)
p2=dt[i2];}来自if(T1[i-1]==-2)
p1=0;
pd(b,--i);
}
}
int H1 (char T1[N],char T2[N],int T3[N],int y)
{
int i,j,h,s,kh=0,wz[N],a;
char xs1[N],ckh[N];
s=strlen(T1);
for(i=0;i<s;i++)
if(T1[i]=='(' || T1[i]==')')
printf("##用~表示双条件##\n");
主合取范式和主析取范式求法
主合取范式和主析取范式求法在我们日常生活中,逻辑就像是一根无形的线,把一切串联在一起。
你知道的,逻辑不仅仅是那些严肃的数学公式,也可以是我们日常交流中潜移默化的存在。
说到逻辑,就不得不提到主合取范式和主析取范式了。
听起来有点复杂,其实说白了就是把逻辑表达得更清晰。
别急,咱们慢慢聊聊。
主合取范式,嗯,这个名字一听就觉得有点拗口。
其实呢,就是把逻辑表达成“与”的形式。
想象一下,你在一场聚会上,大家都在聊着自己的事儿。
这时候,你决定说:“好吧,我们来聊聊谁最喜欢吃披萨、喝啤酒、看电影。
”这个时候,你就把几个条件结合起来了,听起来就像是一道很酷的逻辑公式。
在主合取范式中,你只要把这些条件都用“与”连接起来,比如“我喜欢披萨与我喜欢啤酒与我喜欢看电影”,这就是个典型的主合取范式。
主析取范式又是个啥呢?就像个派对上不同的人选择不同的食物一样,主析取范式强调的是“或”的关系。
比如说你在问大家:“你们想吃披萨还是汉堡,还是炸鸡?”这个时候,大家的选择就成了不同的选项。
每个选项都可以单独成一个句子,比如“我喜欢披萨或我喜欢汉堡或我喜欢炸鸡”。
听起来是不是很简单呢?这就是主析取范式,简单明了,直来直去。
怎么从一个复杂的逻辑表达转化成这两种形式呢?咱们可以把这些条件一个一个拆开,慢慢分析。
你得搞清楚逻辑中的每一个命题,像是在解一个拼图。
然后,把这些命题用“与”或者“或”连接起来。
别担心,这个过程就像在做美食,先把材料准备好,然后根据自己的喜好来搭配。
你可以把条件拿出来,像一个厨师一样,看看哪些可以一起炒,哪些可以单独炖。
假设你有几个命题,比如“天气很好”、“有时间去公园”、“带了零食”。
你想把它们转成主合取范式。
简单,直接把它们用“与”连起来,变成“天气很好与有时间去公园与带了零食”。
嘿,这样就完成了!换成主析取范式,只需把每个命题用“或”连接,就可以得到“天气很好或有时间去公园或带了零食”。
这样一来,逻辑就变得清晰又简单了。
主析取范式和主合取范式的求法
主析取范式和主合取范式的求法
主析取范式和主合取范式是布尔代数中的两个重要概念,主要用于将一个逻辑表达式转化为某些变量的与或组合形式。
本文将简要介绍主析取范式和主合取范式的求法。
一、主析取范式
主析取范式指将逻辑表达式转换为若干个变量的析取项的与式。
例如,对于逻辑表达式(A∨B)∧(C∨D∨E),它的主析取范式为(A∧C∧D∧E)∨(B∧C∧D∧E)∨(A∧C∧E)∨(B∧C∧E)∨
(A∧C∧D)∨(B∧C∧D)。
求解主析取范式的方法一般为:
1.先将逻辑表达式写成最简合取范式。
2.将最简合取范式中的每一项转化为主析取范式的一个子式。
3.将所有子式放在一起,用“∨”连接。
二、主合取范式
主合取范式指将逻辑表达式转换为若干个变量的合取项的或式。
例如,对于逻辑表达式(A∨B)∧(C∨D∨E),它的主合取范式为(A∨B)∨C)∨(A∨B)∨D)∨(A∨B)∨E)。
求解主合取范式的方法一般为:
1.先将逻辑表达式写成最简析取范式。
2.将最简析取范式中的每一项转化为主合取范式的一个子式。
3.将所有子式放在一起,用“∧”连接。
需要注意的是,主析取范式和主合取范式并非每个逻辑表达式都有。
当逻辑表达式已经是主析取范式或主合取范式时,无需再进行转化。
总之,主析取范式和主合取范式的求法是布尔代数中的基础知识,掌握这两个概念对于理解和应用逻辑表达式非常重要。
利用真值表求主合取范式
利用真值表求主合取范式在逻辑学中,主合取范式是一个命题逻辑式的合式范式,它由多个合取式组成,每个合取式中包含了命题变量或它们的否定形式。
利用真值表求一个命题逻辑式的主合取范式可以通过以下步骤完成:1. 构造命题变量在真值表中的全部可能取值组合。
2. 对于每一组取值,计算命题逻辑式的真值。
3. 将所有真值为真的组合找出来,把它们表示成合取式的形式。
4. 把所有的合取式用“或”连接起来,就得到了主合取范式。
例如,假设要求命题逻辑式P∨(Q∧R)的主合取范式,可以按照以下步骤进行:1. 构造真值表,列出P、Q、R的所有可能取值组合:| P | Q | R | P∨(Q∧R) ||---|---|---|---------|| T | T | T | T || T | T | F | T || T | F | T | T || T | F | F | T || F | T | T | T || F | T | F | F || F | F | T | F || F | F | F | F |2. 对于每一组取值,计算命题逻辑式的真值:| P | Q | R | P∨(Q∧R) ||---|---|---|---------|| T | T | T | T || T | T | F | T || T | F | T | T || T | F | F | T || F | T | T | T || F | T | F | F || F | F | T | F || F | F | F | F |3. 找出所有真值为真的组合:P∨(Q∧R) =(T∧T∧T)∨(T∧F∧F)∨(T∧F∧T)∨(T∧F∧F)∨(F∧T∧T) =T∨F∨T∨F∨F4. 把所有的合取式用“或”连接起来,就得到了主合取范式:P∨(Q∧R)的主合取范式为(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)。
利用真值表求主范式的方法
利用真值表求主范式的方法
利用真值表求主范式的方法是一种计算布尔函数的有效方法。
真值表是一个表格,其中列出了布尔函数的所有可能输入和对应输出值。
从真值表中,我们可以确定函数的主范式,即包含所有输入和输出组合的最小项或最大项。
这些主范式可以帮助我们简化函数并找出其逻辑特性。
以下是利用真值表求主范式的具体步骤:
1. 给定一个布尔函数,列出其真值表,其中包括所有可能的输入和相应的输出值。
2. 找出真值表中所有输出为1的每个组合,并将它们称为最小项。
例如,如果布尔函数有4个输入变量,则真值表将包含16个可能的组合。
如果输出为1的组合有3个,则有3个最小项。
3. 将这些最小项组合成一个包含所有最小项的主范式。
这可以通过使用布尔代数规则来完成,例如使用与操作符和或操作符。
4. 如果存在多个主范式,则可以使用其中任何一个来简化布尔函数。
但是,一般情况下,我们会选择包含最少项的主范式,因为这意味着最简单的逻辑表达式。
5. 如果需要,可以使用主范式来创建逻辑电路或编写计算机程序,以实现相应的布尔函数。
通过这些步骤,我们可以快速、准确地确定布尔函数的主范式,从而简化其逻辑表达式并实现相应的功能。
- 1 -。
利用真值表求主合取范式
利用真值表求主合取范式
1、把变量的各种可能取值与想对应的函数值,用表格的形式一一列举出来,这种表格就叫做真值表。
2、设一个变量均有0、1两种可能取值,n个变量共有2n种可能,将它们按顺序(一般按二进制数递增规律)排列起来,同时在相应位置上写上逻辑函数的值,便可得到该逻辑函数的真值表。
3、例如:逻辑函数的Y=AB+BC+CA的真值表如下:真值表以表格的形式表示逻辑函数,其优点是直观明了。
4、输入变量取值一旦确定,即可以从表中查出相应的函数值。
5、所以,在许多数字集成电路手册中,常常以不同形式的真值表,给出器件的逻辑功能。
6、另外,在把一个实际逻辑问题,抽象成为数学表达形式时,使用真值表是最方便的。
7、所以,在数字电路逻辑设计过程中,第一步就是要列出真值表;在分析数字电路逻辑功能时,最后也要列出真值表。
8、但是,真值表也有一些缺点:首先,难以对其使用逻辑代数的公式和定理进行运算和变换;其次,当变量比较多时,列真值表会十分繁琐。
(完整版)利用真值表法求取主析取范式以及主合取范式的实现-副本
{
if (i1>0)
printf("\\/");
printf("m(%d)",xiqu[i1]);
}
}
printf("\n");
getch();
}
void pd(int b[N],int f)
{
int i;
i=f;
if(b[f]==0)
b[f]=1;
else
{
b[f]=0;
pd(b,--i);
}
}
int H1 (char T1[N],char T2[N],int T3[N],int y)
{
int i,j,h,s,kh=0,wz[N],a;
char xs1[N],ckh[N];
s=strlen(T1);
for(i=0;i<s;i++)
if(T1[i]=='(' || T1[i]==')')
{
wz[kh]=i;
ckh[kh]=T1[i];
kh++;
}
if(kh==0)
return H2(T1,T2,T3,y);
else
{
for(i=0;i<kh;i++)
if(ckh[i]==')')
break;
for(j=wz[i-1]+1,h=0;j<wz[i];j++,h++)
xs1[h]=T1[j];
hequ[0]=-1;
xiqu[0]=-1;
实验一.利用真值表法求取主析取范式以及主合取范式的实现(精)
实验内容
编程实现用真值表法求取含三个以内变量的
合式公式的主析取范式和主合取范式
要求:
从屏幕输入含三个以内变量的合式公式(其中
联结词按照从高到底的顺序出现)
规范列出所输合式公式的真值表 给出相应主析取和主合取范式
基本思路参考
可用字符数组a记录输入的合式公式(!表示;&
表示;|表示;>表示;-表示)
基本思路参考
!: b[s+1]=!b[s]
&: b[s+1]=b[s-1]&b[s+1]
…
若下标s+2 超出表达式长,则返回b[s+1],
否则返回cal(b, s+2)
?从屏幕输入含三个以内变量的合式公式其中从屏幕输入含三个以内变量的合式公式其中联结词按照从高到底的顺序出现联结词按照从高到底的顺序出现?规范列出所输合式公式的真值表规范列出所输合式公式的真值表?给出相应主析取和主合取范式给出相应主析取和主合取范式基本思路参考基本思路参考?可用字符数组可用字符数组a记录输入的合式公式
实
验
一
利用真值表法求取主析取范式 以及主合取范式的实现
9月23日值表法求取主析取范式以及 主合取范式的实现
实验目的:通过编程实现主析取范式以及主合
取范式的真值表求法以巩固相关理论的掌握
实验类型:验证
实验学时:4
实验环境:Windows+VC
多重循环显示真值表(1表示T,0表示F,先1后0)
并对公式进行相应赋值得数组b
assign(a, i, j, k): switch a[s] case…(!&|>-: b[s]=a[s]; ‘P’-i; ‘Q’-j; ‘R’-k)
利用真值表法求主析取范式及主合取范式地实现
( / 学年 第 一 学期)
课程名称
离散数学
实验名称
利用真值表法求主析取范式及主合取范式的实现
实验时间
年
月
日
指导单位
指导教师
学生姓名
班级学号
学院(系)
专 业
实 验 报 告
实验名称
利用真值表法求主析取范式及主合取范式的实现
指导教师
实验类型
上机
实验学时
4
实验时间
一、实验目的和要求
能够列出合式公式的真值表并给出相应主析取范式和主合取范式。
{
case '-':Doubleif(); break;
case '>':If(); break;
case '|':Or(); break;
case '&':And(); break;
case '!':Not(); break;
}
}
}
}
void Print()
{
if(number == 3)
{
cout << "P\t" <<"Q\t" << "R\t" << "Z" << endl;
}
int p, q, r, s, t, u;
int a, b, result;
int v =0;
int number;//用number表示变元的个数
SeqStack stack(200);
void Not() //否定
{
离散数学求命题公式的主析取范式和主合取范式
离散数学求命题公式的主析取范式和主合取范式Description输⼊命题公式的合式公式,求出公式的真值表,并输出该公式的主合取范式和主析取范式。
Input命题公式的合式公式Output公式的主析取范式和主合取范式,输出形式为:“ mi ∨ mj ; Mi ∧ Mj” ,极⼩项和∨符号之间有⼀个空格,极⼤项和∧符号之间有⼀个空格;主析取范式和主合取范式之间⽤“ ; ”隔开,“ ; ”前后各有⼀个空格。
永真式的主合取范式为 1 ,永假式的主析取范式为 0 。
输⼊公式的符号说明:! ⾮,相当于书⾯符号中的 “ ¬ ”& 与,相当于书⾯符号中的 “ ∧ ”| 或,相当于书⾯符号中的 “ ∨ ”蕴含联结词,相当于书⾯符号中的 “ → ”等价联结词,相当于书⾯符号中的 “ ↔ ”( 前括号) 后括号Code#include <cstdio>#include <cstring>#include <cmath>#define N 1000#define MAX 10000000char 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;}。
用真值表求主合取范式
用真值表求主合取范式在逻辑学和计算机科学中,主合取范式(MDNF)和主析取范式(MKNF)是重要概念。
其中MDNF是布尔函数的一种标准形式。
本文将讨论如何用真值表来求主合取范式。
先回忆一下布尔函数:布尔函数指的是仅由0和1两个值组成的函数,比如AND、OR和NOT函数。
布尔函数通常用真值表来表示。
真值表列出了所有可能的输入以及对应的输出。
举个例子,假设我们想要求解一个布尔函数f(x, y),其中x和y为输入变量,f(x,y)的输出值为1当且仅当x和y均为1。
我们可以通过真值表来表示这个布尔函数:|x|y|f(x,y)| |-|-|------| |0|0| 0 | |0|1| 0 | |1|0| 0 | |1|1| 1 |这个真值表说明了当x和y都为1时,f(x,y)取值为1;而在其他情况下,f(x,y)都取值为0。
要求布尔函数的主合取范式,我们需要先将真值表中所有输出为1的行合并起来,然后将它们组合在一起。
这样就组成了主合取范式。
再看上面的例子,我们可以发现当f(x,y)=1时有一行符合要求,即x=1且y=1。
这样我们就可以得到主合取范式为(x AND y)。
另一个例子是考虑一个三元函数的真值表:|x|y|z|f(x,y,z)| |-|-|-|--------| |0|0|0| 1| |0|0|1| 0| |0|1|0| 1| |0|1|1| 1| |1|0|0| 0| |1|0|1| 1| |1|1|0| 0| |1|1|1| 0|从这张真值表中我们可以看出f(x,y,z)的主合取范式为(x AND NOT y AND z) OR (NOT x AND y AND z) OR (x AND y AND NOT z)。
对于比较复杂的布尔函数,用真值表来求主合取范式可能不是最有效的方法。
但对于简单的函数,采用这种方法很方便。
此外,这种方法也提供了一种验证主合取范式是否正确的方法。
同时,需要注意的是MDNF不一定是唯一的。
真值表求主析取范式
真值表求主析取范式
真值表求主析取范式:一种实用模板
真值表求主析取范式是一种受益于中国国内外商业实践以及技术开发中应用广泛的模板。
这种模式可以帮助企业更好地找到正确的解决方案,解决现实中的问题。
作为一家企业,要想更有效地进行决策,应当在做出决策的前提下,对决策结
果进行解析与分析,使决策结果更加精准。
真值表求主析取范式可以帮助企业实现这一点。
它可以帮助企业成功识别出决策中各模块之间关联与差异,从而找到最佳策略。
通过该模式,企业可以清晰地表达出哪些决策会产生怎样的结果,从而清晰地
给出不同决策的结果可比性。
这样,无论是在做出新决策前还是在改变既有决策中,都可以把握决策的均衡性。
此外,真值表还可以为企业提供一种可利用的、不偏倚性的分析依据,帮助企
业发现其决策中存在的冲突和风险,以及其与他人形成良好社会关系的可能性。
因此,真值表求主析取范式是解决中国企业在分析与决策方面所面临的不少问
题的有利乃至必要的实用模板。
此模板可以显著改善企业的分析和决策能力,进而使其取得更多成功。
主析取范式
主析取范式
求解主析取范式、主合取范式方法
1、真值表法
①在表中列出变元值的全部可能
②查表判断命题
命题结果真,变元值对应主析取范式
命题结果假,变元值对应主合取范式
2、等值演算法
①命题化简
蕴涵等值式:A→B↔¬A∨B(作用:去→)
矛盾律:A↔∧¬A(作用:补齐变元)
分配律:(A∧B)∨C↔(A∨C)∧(B∨C)、(A∨B)∧C↔(A∧C)∨(B∧C)
②判断命题
命题结果真,变元值对应主析取范式
命题结果假,变元值对应主合取范式。
例题
求公式(p→q)∧(q→r)的主析取范式和主合取范式、成真赋值。
解:
1、真值表法
查表可得
成真赋值:000、001、011、111
主析取范式:∑(0,1,3,7)
成假赋值:010、100、101、110
主合取范式:∏(2,4,5,6)
2、等值演算法
(p→q)∧(q→r)
=(¬p∨q)∧(¬q∨r)-----------------------------(蕴涵等值式:
化简→)
=((¬p∨q)∨(¬r∧r)))∧((¬q∨r)∨(¬p∧p))----(矛盾律:补齐变元)
=(¬p∨q∨¬r)∧(¬p∨q∨r)∧(¬p∨¬q∨r)∧(p∨¬q∨r)—(分配律:化简)
↔M5M4M6M2。
离散数学简答题
简答题1.用真值表法判断下列公式的类型.(1)⌝(P∧Q)↔(⌝P∧⌝Q)(2)(P∧⌝Q)→R(3)(P→(P∨Q))∨R(4)⌝(P→Q)∧Q解:(1)⌝(P∧Q)↔(⌝P∧⌝Q)的真值表为:(2)(P∧⌝Q)→R的真值表为:(3)(P→(P∨Q))∨R的真值表为:(4)⌝(P →Q )∧Q 的真值表为:2.用真值表的方法求(P ∨Q )→(Q ↔R )的主析取范式和主合取范式。
解:(P ∨Q )→(Q ↔R )的真值表(P ∨Q )→(Q ↔R )⇔ 0147m m m m ∨∨∨ 主合取范式为:(P ∨Q )→(Q ↔R )⇔2356M M M M ∧∧∧3.用等值演算法求((P ∨Q )→R )→P 的主析取范式和主合取范式。
解:((P ∨Q )→R )→P ⇔⌝(⌝(P ∨Q )∨R )∨P ⇔((P ∨Q )∧⌝R )∨P⇔(P ∧⌝R )∨(Q ∧⌝R )∨P (析取范式) ⇔P ∨(Q ∧⌝R )(析取范式)⇔(P ∧(Q ∨⌝Q )∧(R ∨⌝R ))∨((Q ∧⌝R )∧( P ∨⌝P )) ⇔(P ∧Q ∧R )∨(P ∧Q ∧⌝R )∨(P ∧⌝Q ∧R )∨(P ∧⌝Q ∧⌝R ) ∨(P ∧Q ∧⌝R )∨(⌝P ∧Q ∧⌝R )(六个极小项,其中重复了一个) ⇔(P ∧Q ∧R )∨(P ∧Q ∧⌝R )∨(P ∧⌝Q ∧R )∨(P ∧⌝Q ∧⌝R )∨(⌝P ∧Q ∧⌝R ) ⇔24567m m m m m ∨∨∨∨ (主析取范式) 由主合取范式与主析取范式的关系得:((P ∨Q )→R )→P ⇔013M M M ∧∧ (主合取范式) 4.求下列公式的主析取和合取范式。
(1)(┐P → Q)∧(P → R) (2)(P → Q)∨(P∧R) (3) P ∧Q ∨R解:(1)(┐P → Q)∧(P → R)⇔(P∨Q)∧(┐P∨R) (合取范式) ⇔((P∨Q)∨(R∧┐R ))∧((┐P∨R)∨(Q ∧┐Q ))⇔((P∨Q∨R)∧(P∨Q∨┐R ))∧((┐P ∨Q∨R)∧(┐P ∨┐Q∨R)) ⇔(P∨Q∨R)∧(P∨Q∨┐R)∧(┐P ∨Q∨R)∧(┐P ∨┐Q∨R) (主合取范式) ⇔0146M M M M ∧∧∧由主合取范式与主析取范式的关系得:(┐P → Q)∧(P → R)⇔2567m m m m ∨∨∨(主析取范式) (2)(P → Q)∨(P∧R)⇔(┐P∨Q)∨(P∧R ) ⇔(P∨┐P∨Q )∧(┐P∨Q ∨R) (合取范式)⇔(1∨Q )∧(┐P∨R∨Q )⇔┐P ∨Q∨R (主合取范式) ⇔4M由主合取范式与主析取范式的关系得: (P →Q)∨(P∧R)⇔0123567m m m m m m m ∨∨∨∨∨∨ (3) P ∧Q ∨R ⇔(P ∨R)∧(Q∨R)⇔(P ∨(Q ∧┐Q)∨R)∧((P∧┐P)∨Q∨R )⇔(P ∨Q ∨R)∧(P∨┐Q ∨R)∧(P∨Q ∨R)∧(┐P ∨Q ∨R) ⇔(P ∨Q ∨R)∧(P∨┐Q ∨R)∧(┐P ∨Q ∨R) ⇔024M M M ∧∧ (合取范式) 由主合取范式与主析取范式的关系得:P ∧Q ∨R ⇔13567m m m m m ∨∨∨∨ (主析取范式)5.给定解释I如下:(1)D={2,3};I(2)D中的特定元素a=2;I(3)D上的函数f(x)为f(2)=3,f(3)=2;I(4)D上的谓词F(x)为F(2)=0,F(3)=1;.IG(x,y)为G(2,2)= G(2,3)= G(3,2)=1, G(3,3)=0;L(x,y)为L(2,2)=L(3,3)=1,L(2,3)= L(3,2)= 0;在这个解释下,求下列各式的值:(1)∀x(F(x)∧G(x,a));(2) ∃x(F(f(x))∧G(x,f(x))) ;(3) ∀x∃yL(x,y);(4)∃y∀xL(x,y);(5)∀x∀y( L(x,y) →L(f(x),f(y)))解:(1) ∀x(F(x)∧G(x,a))⇔(F(2)∧G(2,2))∧(F(3)∧G(3,2))⇔(0∧1)∧(1∧1)⇔ 0(2)∃x(F(f(x))∧G(x,f(x)))⇔(F(f(2))∧G(2,f(2))) ∨ (F(f(3))∧G(3,f(3)))⇔ (F(3)∧G(2,3)) ∨ (F(3)∧G(3,3))⇔(1∧1) ∨(0∧1)⇔1(3)∀x∃yL(x,y)⇔∃yL(2,y)∧∃yL(3,y)⇔(L(2,2)∨L(2,3))∧(L(3,2)∨L(3,3))⇔1∧1⇔1(4)∃y∀xL(x,y)⇔∃y(L(2,y)∧L(3,y))⇔(L(2,2)∧L(3,2))∨ (L(2,3)∧L(3,3))⇔0 ∨ 0⇔0(5)∀x∀y( L(x,y) →L(f(x),f(y)))⇔∀y(L(2,y)→L(f(2),f(y)))∧∀y(L(3,y)→L(f(3),f(y)))⇔(L(2,2)→L(f(2),f(2)))∧(L(2,3)→L(f(2),f(3)))∧(L(3,2)→L(f(3),f(2)))∧(L(3,3)→L(f(3),f(3)))⇔(1→L(3,3))∧(0→L(3,2))∧(0→L(2,3))∧(1→L(2,2))⇔(1→1)∧(0→0)∧(0→0)(1→1)⇔06.给定解释I如下:D为实数集合R;(a)个体域I(b)D中的特定元素a=0;ID上的特定函数f(x,y)=x-y;(c)ID上的特定谓词F(x,y):x=y,G(x,y):x<y(d)I说明下列公式在I下的含义,并指出其真值。
离散数学 主析取范式主合取范式
实验二实验题目:生成主析取范式和主合取范式实验目的:1.熟悉地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
2.掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
实验内容:利用计算机构造真值表来建立主析取范式和主合取范式实验原理:1.合取:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P ∧Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P 为真, Q为真时方可P∧Q为真, 而P、Q只要有一为假则P∧Q 为假。
2.析取:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P ∨Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P为假, Q为假时方可P∨Q为假, 而P、Q只要有一为真则P∨Q为真。
3.真值表:表征逻辑事件输入和输出之间全部可能状态的表格。
列出命题公式真假值的表。
通常以1表示真,0 表示假。
命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。
真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
4.主析取范式:在含有n个命题变元的简单合取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项。
由若干个不同的小项组成的析取式称为主析取范式;与A等价的主析取范式称为A的主析取范式。
任意含n个命题变元的非永假命题公式A都存在与其等价的主析取范式,并且是惟一的。
5.主合取范式:在含有n个命题变元的简单析取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项。
由若干个不同的大项组成的合取式称为主合取范式;与A等价的主合取范式称为A 的主合取范式。
任意含n个命题变元的非永真命题公式A都存在与其等价的主合取范式,并且是惟一的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include ""#include ""#include ""#include ""#define N 50void pd(int b[N],int f);int H1 (char T1[N], char T2[N], int T3[N], int y);int H2 (char T1[N], char T2[N], int T3[N], int y);int main(){int i1,i2,d=1,T3[N],kh=0,jg,j=0,y;int w=0,hequ[N],h=0,x=0,xiqu[N];char T1[N],T2[N],T10[N],s;hequ[0]=-1;xiqu[0]=-1;printf("#########################################\n");printf("## 用!表示否定 ##\n");printf("## 用&表示合取 ##\n");printf("## 用|表示析取 ##\n");printf("## 用^表示条件 ##\n");printf("## 用~表示双条件 ##\n");printf("#########################################\n\n");printf("请输入一个合法的命题公式:\n");gets(T1);strcpy(T10,T1);for(i1=0;i1<strlen(T1);i1++){if(T1[i1]==')' || T1[i1]=='(')kh++;if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') {for(i2=0;i2<j;i2++)if(T2[i2]==T1[i1])d=0;if(d==1){T2[j]=T1[i1];j++;}d=1;}}printf("\n输出真值表如下:\n \n");for(i1=0;i1<y;i1++)printf(" %c ",T2[i1]);printf(" ");puts(T1);printf("\n");for(i1=0;i1<j;i1++)T3[i1]=0;for(i2=0;i2<j;i2++)printf(" %d ",T3[i2]);jg=H1(T1,T2,T3,y);if(jg==0)hequ[h++]=w;elsexiqu[x++]=w;printf(" %d\n",jg);strcpy(T1,T10);for(i1=0;i1<(int)pow(2,j)-1;i1++){++w;pd(T3,j-1);jg=H1(T1,T2,T3,y);if(jg==0)hequ[h++]=w;elsexiqu[x++]=w;strcpy(T1,T10);for(i2=0;i2<j;i2++)printf(" %d ",T3[i2]);printf(" %d\n",jg);}if(hequ[0]==-1)printf("\n该命题公式不存在主合取范式。
\n"); else{printf("\n主合取范式:\n\t");for(i1=0;i1<h;i1++){if (i1>0)printf("/\\");printf("M(%d)",hequ[i1]);}}if(xiqu[0]==-1)printf("\n该命题公式不存在主析取范式。
\n"); else{printf("\n\n主析取范式:\n\t");for(i1=0;i1<x;i1++){if (i1>0)printf("\\/");printf("m(%d)",xiqu[i1]);}}printf("\n");getch();}void pd(int b[N],int f){int i;i=f;if(b[f]==0)b[f]=1;else{b[f]=0;pd(b,--i);}}int H1 (char T1[N],char T2[N],int T3[N],int y){int i,j,h,s,kh=0,wz[N],a;char xs1[N],ckh[N];s=strlen(T1);for(i=0;i<s;i++)if(T1[i]=='(' || T1[i]==')'){wz[kh]=i;ckh[kh]=T1[i];kh++;}if(kh==0)return H2(T1,T2,T3,y);else{for(i=0;i<kh;i++)if(ckh[i]==')')for(j=wz[i-1]+1,h=0;j<wz[i];j++,h++)xs1[h]=T1[j];xs1[h]='\0';a=H2(xs1,T2,T3,y);if(a==1)T1[wz[i-1]]=1;elseT1[wz[i-1]]=-2;for(j=wz[i-1]+1;j<s+wz[i-1]-wz[i];j++)T1[j]=T1[j+wz[i]-wz[i-1]];T1[j]='\0';return H1(T1,T2,T3,y);}}int H2(char T1[N],char T2[N],int T3[N],int y){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(T1);if(s==1)if(T1[0]==-2)return 0;elsereturn 1;else{for(i=0;i<s-j;i++)if(T1[i]=='!'){for(i1=0;i1<y;i1++)if(T1[i+1]==T2[i1])p1=T3[i1];if(T1[i+1]==-2)p1=0;if(p1==-1)p1=T1[i+1];dt[j+2]=!p1;T1[i]=j+2;j++;p1=0;for(i1=i+1;i1<s-j;i1++)T1[i1]=T1[i1+1];}j1=j;for(i=0;i<s-j1-2*j2;i++)if(T1[i]=='&'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])p1=T3[i1];if(T1[i+1]==T2[i1])p2=T3[i1];}for(i2=2;i2<j+2;i2++) {if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}if(T1[i-1]==-2)p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=(int)(T1[i-1]);if(p2==-1)p2=(int)(T1[i+1]);dt[j+2]=p1 && p2;T1[i-1]=j+2;j++;j2++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2;i1++) T1[i1]=T1[i1+2];i=i-1;}for(i=0;i<s-j1-2*j2-2*j3;i++) if(T1[i]=='|'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])if(T1[i+1]==T2[i1])}for(i2=2;i2<j+2;i2++){if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}if(T1[i-1]==-2)p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=T1[i-1];if(p2==-1)p2=T1[i+1];dt[j+2]=p1 || p2;T1[i-1]=j+2;j++;j3++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2-2*j3;i1++) T1[i1]=T1[i1+2];i--;}for(i=0;i<s-j1-2*j2-2*j3-2*j4;i++) if(T1[i]=='^'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])p1=T3[i1];if(T1[i+1]==T2[i1])p2=T3[i1];}for(i2=2;i2<j+2;i2++){if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=T1[i-1];if(p2==-1)p2=T1[i+1];dt[j+2]=!p1 || p2;T1[i-1]=j+2;j++;j4++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2-2*j3-2*j4;i1++)T1[i1]=T1[i1+2];i--;}for(i=0;i<s-j1-2*j2-2*j3-2*j4-2*j5;i++)if(T1[i]=='~'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])p1=T3[i1];if(T1[i+1]==T2[i1])p2=T3[i1];}for(i2=2;i2<j+2;i2++){if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}if(T1[i-1]==-2)p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=T1[i-1];if(p2==-1)p2=T1[i+1];dt[j+2]=(!p1 || p2)&&(!p2 || p1);T1[i-1]=j+2;j++;j5++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2-2*j3-2*j4-2*j5;i1++) T1[i1]=T1[i1+2];i--;}return dt[j+1];}}。