利用真值表法求取主析取范式以及主合取范式的实现-副本

合集下载

利用真值表法求取主析取范式以及主合取范式的实现-副本.doc

利用真值表法求取主析取范式以及主合取范式的实现-副本.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课件

离散实验——真值表法求主合取(析取范式)范式    最终版ppt课件
11/20/2018
三、代码运行流程
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_命题逻辑

2011离散数学作业9_命题逻辑
1
(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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];}}。

相关文档
最新文档