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

合集下载

实验一利用真值表法求取主析取范式以及主合取范式的实现

实验一利用真值表法求取主析取范式以及主合取范式的实现
函数递归计算各种赋值情况下b的取值
联接词运算符定义
cal(b, s): switch b[s] case…(!...&…|…>…-…)
基本思路参考
!: b[s+1]=!b[s] &: b[s+1]=b[s-1]&b[s+1] … 若下标s+2 超出表达式长,则返回b[s+1],
规范列出所输合式公式的真值表 给出相应主析取和主合取范式
基本思路参考
可用字符数组a记录输入的合式公式(!表示;& 表示;|表示;>表示;-表示)
多重循环显示真值表(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 实验环境:Windows+VC
实验内容
编程实现用真值表法求取含三个以内变量的 合式公式的主析取范式和主合取范式
要求:
从屏幕输入含三个以内变量的合式公式(其中 联结词按照从高到底的顺序出现)
否则返回cal(b, s+2)

?从屏幕输入含三个以内变量的合式公式其中联结词按照从高到底的顺序出现?规范列出所输合式公式的真值表?给出相应主析取和主合取范式基本思路参考?可用字符数组a记录输入的合式公式
实验一
利用真值表法求取主析取范式 以及主合取范式的实现
9月23日周一晚10-12 教2-216

离散数学总结

离散数学总结
反例 设个体域为实数集合,A(x, y): x-y=1. 则 (x)(y)A(x, y)为真, 而(y)(x)A(x, y)为假, 所以(6)式反过来不成立.
总结下就是任意可以改成存在,存在不能变成 任意所以先做存在。 任意(推出ห้องสมุดไป่ตู้则先用德摩根律把推出给换了, 在把量词放进去! 有限集合中元素的个数称为集合的基数 (cardinality). 集合A的基数表示为|A|(或card(A)=n). n card(P(A)=2 )幂集 设A, B为两个集合,A=B当且仅当AB且B A. 即A=B(AB) (B A)
个人. 则命题符号化为:
(x)(y)(F(x) F(y) H(x, y) L(x, y))
(8) 每个自然数都有后继数.
解: 引入特性谓词 F(x) : x是自然数.并设 H(x, y):y是x的后继数. 则命题符号化为: (x)(F(x) (y) (F(y) H(x, y))
证: 任取x,则
xA∩ (B∪C) xA xB∪C xA (xB x C) (xA xB) (xA xC) x A∩B x A∩C
x (A∩B)∪(A∩C)
推广
三、集合中元素的计数
|A∪B∪C |A||B|| |A∩B ||A∩C||B∩C| |A∩B∩C | C| |
(x)A(x) (x)B(x)
量词转化律
E20
三、谓词演算的等价式与蕴含式
(三) 谓词演算中常见的蕴含式: (1)(x)A(x)(x)B(x) (x)(A(x)B(x)) (2)(x)(A(x)B(x)) (x)A(x)(x)B(x) (1), (2)两式反过来均不成立. 反例 设个体域为自然数集合, A(x): x为奇数. B(x): x为偶数.则 (1)(x)(A(x)B(x))为真, 而(x)A(x)为假, (x)B(x)为假, 故(x)A(x)(x)B(x)为假, 所以(1)式反过来不成立; (2)(x)A(x)为真,(x)B(x)为真, 故(x)A(x)(x)B(x)为真, 但(x)(A(x)B(x))为假, 所以(2)式反过来也不成立.

主析取范式

主析取范式

主析取范式
求解主析取范式、主合取范式方法
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。

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

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

#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];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;}}1printf("\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该命题公式不存在主合取范式。

离散数学简答题

离散数学简答题

简答题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下的含义,并指出其真值。

求主析取范式的方法

求主析取范式的方法

求主析取范式的方法求主析取范式是一种用于逻辑推理和逻辑问题求解的方法。

在计算机科学和数学领域,求主析取范式被广泛应用于逻辑电路设计、自动推理、人工智能等领域。

本文将介绍求主析取范式的基本概念、求解方法以及应用。

一、求主析取范式的基本概念求主析取范式是一种用于描述逻辑表达式的标准化形式。

它由主合取范式和主析取范式组成,其中主合取范式是逻辑表达式的合取范式中最简单的形式,主析取范式是逻辑表达式的析取范式中最简单的形式。

主合取范式是由若干个子句通过逻辑与运算符连接而成的合取范式,其中每个子句由若干个文字通过逻辑或运算符连接而成。

主合取范式的形式如下:C1 ∧ C2 ∧ ... ∧ Cn其中Ci表示第i个子句,每个子句由若干个文字通过逻辑或运算符连接而成。

主析取范式是由若干个子句通过逻辑或运算符连接而成的析取范式,其中每个子句由若干个文字通过逻辑与运算符连接而成。

主析取范式的形式如下:C1 ∨ C2 ∨ ... ∨ Cn其中Ci表示第i个子句,每个子句由若干个文字通过逻辑与运算符连接而成。

二、求主析取范式的求解方法求主析取范式的方法主要有两种:真值表法和奎宁-麦克劳斯基算法。

真值表法是一种基于逻辑运算的方法。

它通过构造逻辑表达式的真值表,逐行比较真值表中的值,将真值为真的行转换为主合取范式或主析取范式。

真值表法的优点是简单直观,但当逻辑表达式的字母变量较多时,真值表的大小会呈指数级增长,计算量较大。

奎宁-麦克劳斯基算法是一种基于逻辑运算和逻辑等价转换的方法。

它通过逻辑等价转换将逻辑表达式逐步转化为主合取范式或主析取范式。

奎宁-麦克劳斯基算法的优点是计算量相对较小,但需要一定的逻辑推理能力。

三、求主析取范式的应用求主析取范式在逻辑电路设计中具有重要的应用。

逻辑电路可以通过主析取范式表示为若干个子电路的并联,每个子电路由若干个逻辑门组成。

通过将逻辑门的输出连接到主析取范式的输入端,可以实现逻辑电路的功能。

求主析取范式在自动推理中也有广泛的应用。

求给定命题公式的真值表并根据真值表求公式的主范式

求给定命题公式的真值表并根据真值表求公式的主范式

求给定命题公式的真值表并根据真值表求公式的主范式(求给定命题公式的真值表并根据真值表求公式的主范式)专业网络工程班级 1202班学号 12407442姓名张敏慧2013.12.14目录一.实验目的 .......................................................3二.实验内容 (3)求任意一个命题公式的真值表 ..................................................................... ..... 3 三.实验环境 (3)四. 实验原理和实现过程(算法描述) (3)1.实验原理 ..................................................................... ...................................... 3 2.实验流程图 ..................................................................... .................................. 5 五.实验代码 (6)六. 实验结果 (14)七. 实验总结 (19)- 1 -一.实验目的本实验课程是网络工程专业学生的一门专业基础课程,通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。

熟悉掌握命题逻辑中的真值表、主范式等,进一步能用它们来解决实际问题。

二.实验内容求任意一个命题公式的真值表,并根据真值表求主范式详细说明:求任意一个命题公式的真值表本实验要求大家利用C/C,,语言,实现任意输入公式的真值表计算。

一般我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。

(完整word版)离散数学习题解答(耿素云屈婉玲)北京大学出版社

(完整word版)离散数学习题解答(耿素云屈婉玲)北京大学出版社

习题一1。

下列句子中,哪些是命题?在是命题的句子中,哪些是简单命题?哪些是真命题?哪些命题的真值现在还不知道?(1)中国有四大发明。

答:此命题是简单命题,其真值为1。

(2答:此命题是简单命题,其真值为1。

(3)3是素数或4是素数.答:是命题,但不是简单命题,其真值为1.x+<(4)235答:不是命题.(5)你去图书馆吗?答:不是命题。

(6)2与3是偶数.答:是命题,但不是简单命题,其真值为0.(7)刘红与魏新是同学.答:此命题是简单命题,其真值还不知道。

(8)这朵玫瑰花多美丽呀!答:不是命题。

(9)吸烟请到吸烟室去!答:不是命题。

(10)圆的面积等于半径的平方乘以π.答:此命题是简单命题,其真值为1。

(11)只有6是偶数,3才能是2的倍数.答:是命题,但不是简单命题,其真值为0。

(12)8是偶数的充分必要条件是8能被3整除.答:是命题,但不是简单命题,其真值为0。

(13)2008年元旦下大雪.答:此命题是简单命题,其真值还不知道。

2。

将上题中是简单命题的命题符号化。

解:(1)p:中国有四大发明.(2)p:是无理数.(7)p:刘红与魏新是同学。

(10)p:圆的面积等于半径的平方乘以π.(13)p:2008年元旦下大雪。

3。

写出下列各命题的否定式,并将原命题及其否定式都符号化,最后指出各否定式的真值.(15.答:否定式5. p5q5.其否定式q的真值为1。

25不是无理数.答:25p25不是无理数。

q25是有理数. 其否定式q的真值为1.(3)2.5是自然数。

答:否定式:2.5不是自然数。

p:2。

5是自然数。

q:2.5不是自然数. 其否定式q的真值为1.(4)ln1是整数。

答:否定式:ln1不是整数. p:ln1是整数。

q:ln1不是整数. 其否定式q的真值为1。

4。

将下列命题符号化,并指出真值.(1)2与5都是素数答:p:2是素数,q:5是素数,符号化为p q∧,其真值为1。

(2)不但π是无理数,而且自然对数的底e也是无理数.答:p:π是无理数,q:自然对数的底e是无理数,符号化为p q∧,其真值为1。

利用真值表求主合取范式

利用真值表求主合取范式

利用真值表求主合取范式在逻辑学中,主合取范式是一个命题逻辑式的合式范式,它由多个合取式组成,每个合取式中包含了命题变量或它们的否定形式。

利用真值表求一个命题逻辑式的主合取范式可以通过以下步骤完成: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)。

离散实验——真值表法求主合取(析取范式)范式 最终版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,报错,提 示需要修改输入的表达式。

利用等值演算求公式的主析取范式和主合取范式

利用等值演算求公式的主析取范式和主合取范式

等值演算是一种逻辑代数的方法,可用于简化布尔代数的表达式。

在逻辑电路设计和计算机科学领域,利用等值演算可以帮助我们求解复杂的布尔函数的主析取范式和主合取范式。

在布尔代数中,一个布尔函数可以表示为一系列输入变量和输出变量的逻辑关系式。

通过布尔代数的运算规则,我们可以对这些逻辑关系式进行等值变换,将其简化为更加简洁的形式。

其中,最重要的简化形式包括主析取范式和主合取范式。

主析取范式是指一个布尔函数的各项按照与或关系相连的形式,其中每一项都是不可简化的极小项。

主析取范式的求解可以帮助我们理解布尔函数的逻辑结构,并为电路的设计提供参考。

主合取范式则是指一个布尔函数的各项按照或与关系相连的形式,其中每一项都是不可简化的极大项。

主合取范式的求解同样可以帮助我们理解布尔函数的逻辑结构,并为电路的设计提供参考。

接下来,我们将通过等值演算的方法,来求解一个布尔函数的主析取范式和主合取范式。

1. 我们需要将布尔函数转换为真值表的形式。

真值表可以清晰地展现出布尔函数在各个输入变量组合下的输出取值情况。

通过真值表的分析,我们可以对布尔函数进行等值变换和化简。

2. 我们利用等值演算的定理和法则,对布尔函数进行等值变换。

其中,包括重要的等值演算定理,如恒等律、吸收律、对偶律等。

通过运用这些定理和法则,我们可以将布尔函数逐步化简为主析取范式和主合取范式的形式。

3. 我们将化简后的布尔函数表示为主析取范式和主合取范式的形式。

主析取范式和主合取范式的求解过程中,需要格外注意每一步等值变换的正确性和合理性,以确保最终得到的主析取范式和主合取范式是布尔函数的最简形式。

通过以上等值演算的步骤和方法,我们可以成功地求解出一个复杂布尔函数的主析取范式和主合取范式。

这些简化后的形式将极大地方便我们对布尔函数的理解和分析,为逻辑电路的设计和优化提供重要的参考依据。

等值演算作为一种重要的逻辑代数方法,在计算机科学和信息技术领域也有着广泛的应用和意义。

用真值表求主合取范式

用真值表求主合取范式

用真值表求主合取范式在逻辑学和计算机科学中,主合取范式(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不一定是唯一的。

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) (主合取范式)

主析取范式与主合取范式

主析取范式与主合取范式

第四节 主析取范式与主合取范式n 个命题变项虽然可以构成无穷多个形式各异的命题公式,但就其真值而言,只有22n种。

对应每种真值情况虽然又有无穷多个等值的公式,但这些公式却有相同的标准形式。

本节将给出规范公式的概念,这种规范的公式能表达真值表所能给出的一切信息。

定义4.1 命题变项及其否定统称为文字。

如p ,q ,¬p ,¬q ,L 都是文字,即每个命题变项产生两个文字。

(1)仅由有限个文字构成的合取式称为简单合取式。

(2)仅由有限个文字构成的析取式称为简单析取式。

例如,p ∧q ,p ∧¬q ∧r ,L 都是简单合取式。

p ∨q , ¬p ∨q ∨r ,L 都是简单析取式。

单个文字既是简单析取式,又是简单合取式。

定义4.2 (1)仅由有限个简单合取式构成的析取式称为析取范式; (2)仅由有限个简单析取式构成的合取式称为合取式。

例如,p ,¬q ,p ∧q ,(p ∧¬q )∨(p ∧q ),L 都是析取范式。

p ,¬r ,p ∨q ,(p ∨q )∧(q ∨¬r ),L 都是合取范式。

注意,两个文字构成的简单合取式与析取式都既是析取范式又是合取范式。

例如,p ∨q 是析取范式,它是由两个简单的合取式p 与q 析取而成。

同时它也是合取范式,看成是一个简单析取式构成的合取范式。

定义 4.3 (1)n 个命题变项1p ,2p ,L ,n p (1n ≥)构成的简单合取式中,若每个i p (1,2,,i n =L )都以文字的形式出现一次且仅出现一次,而且出现在左起的第i 位上,则称它为极小项。

(2)n 个命题变项1p ,2p ,L ,n p (1n ≥)构成的简单析取式中,若每个ip (1,2,,i n =L )以文字的形式出现一次且仅出现一次,而且出现在左起的第i 位上,则称它为极大项。

两个命题变项p ,q 共可形成4个极小项:¬p ∧¬q ,¬p ∧q ,p ∧¬q ,p ∧q 。

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

(完整版)利用真值表法求取主析取范式以及主合取范式的实现-副本
{
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");

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

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

离散数学求命题公式的主析取范式和主合取范式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;}。

离散数学习题答案(耿素云屈婉玲)

离散数学习题答案(耿素云屈婉玲)

离散数学习题答案(耿素云屈婉玲)离散数学习题答案习题⼆及答案:(P38)5、求下列公式的主析取范式,并求成真赋值:(2)()()p q q r ?→∧∧解:原式()p q q r ?∨∧∧q r ?∧()p p q r ??∨∧∧()()p q r p q r ??∧∧∨∧∧37m m ?∨,此即公式的主析取范式,所以成真赋值为011,111。

6、求下列公式的主合取范式,并求成假赋值:(2)()()p q p r ∧∨?∨解:原式()()p p r p q r ?∨?∨∧?∨∨()p q r ??∨∨4M ?,此即公式的主合取范式,所以成假赋值为100。

7、求下列公式的主析取范式,再⽤主析取范式求主合取范式:(1)()p q r ∧∨解:原式()(()())p q r r p p q 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∧?∧∨?∧∧∨∧?∧∨∧∧?∨∧∧13567m m m m m ?∨∨∨∨,此即主析取范式。

主析取范式中没出现的极⼩项为0m ,2m ,4m ,所以主合取范式中含有三个极⼤项0M ,2M ,4M ,故原式的主合取范式024M M M ?∧∧。

9、⽤真值表法求下⾯公式的主析取范式:(1)()()p q p r ∨∨?∧解:公式的真值表如下:由真值表可以看出成真赋值的情况有7种,此7种成真赋值所对应的极⼩项的析取即为主析取范式,故主析取范式1234567m m m m m m m ?∨∨∨∨∨∨习题三及答案:(P52-54)11、填充下⾯推理证明中没有写出的推理规则。

前提:,,,p q q r r s p ?∨?∨→结论:s 证明:① p 前提引⼊② p q ?∨前提引⼊③ q ①②析取三段论④ q r ?∨前提引⼊⑤ r ③④析取三段论⑥ r s →前提引⼊⑦ s ⑤⑥假⾔推理15、在⾃然推理系统P 中⽤附加前提法证明下⾯推理:(2)前提:()(),()p q r s s t u ∨→∧∨→结论:p u →证明:⽤附加前提证明法。

离散数学主析取范式主合取范式

离散数学主析取范式主合取范式

离散数学主析取范式主合取范式主析取范式和主合取范式是离散数学中逻辑表达式的两种常见形式。

它们在逻辑推理、计算机科学和人工智能等领域具有重要的应用价值。

本文将介绍主析取范式和主合取范式的概念、特性以及如何通过布尔运算将任意逻辑表达式转化为主析取范式或主合取范式。

一、主析取范式(DNF)主析取范式是一个逻辑表达式的标准形式,它由多个子句的析取组成。

每个子句由多个文字的合取构成。

主析取范式的最简形式是由至少一个子句组成的合取。

例如,逻辑表达式(A ∧ B) ∨ (C ∧ D ∧ E)就是一个主析取范式。

其中,(A ∧ B) 和 (C ∧ D ∧ E) 是两个子句,分别由 A、B 和 C、D、E 构成。

主析取范式的特性:1. 每个子句中的文字可以是变量或其否定形式。

2. 主析取范式中的每个文字都是变量的析取或否定析取。

3. 主析取范式可以使用布尔运算来简化和优化。

如何得到主析取范式?可以通过真值表法或布尔代数的演算法来将任意逻辑表达式转化为主析取范式。

方法如下:2. 找到真值表中使得逻辑表达式为真的行。

3. 对每一行,在真值为真的列上取出对应的文字,并将它们合取起来构成一个子句。

4. 将所有子句析取起来得到主析取范式。

二、主合取范式(CNF)主合取范式是一个逻辑表达式的标准形式,它由多个子句的合取组成。

每个子句由多个文字的析取构成。

主合取范式的最简形式是由至少一个子句组成的析取。

例如,逻辑表达式(A ∨ B) ∧ (C ∨ D ∨ E)就是一个主合取范式。

其中,(A ∨ B) 和 (C ∨ D ∨ E) 是两个子句,分别由 A、B 和 C、D、E 构成。

主合取范式的特性:1. 每个子句中的文字可以是变量或其否定形式。

2. 主合取范式中的每个文字都是变量的合取或否定合取。

3. 主合取范式可以使用布尔运算来简化和优化。

如何得到主合取范式?可以通过真值表法或布尔代数的演算法来将任意逻辑表达式转化为主合取范式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
if(OriginalForm[i] == 'P' || OriginalForm[i] == 'Q'|| OriginalForm[i] == 'R')
{
v = OriginalForm[i] == 'P' ? p : OriginalForm[i]== 'Q' ? q : r;
stack.Push(v);
{
string tmp = "";
stack.Push('#');
for(int i = 0; (unsigned)i <OriginalForm.length(); i++)
{
if(OriginalForm[i] == 'P' || OriginalForm[i] == 'Q' ||OriginalForm[i] == 'R' || OriginalForm[i] == 'S' || OriginalForm[i] == 'T' || OriginalForm[i] == 'U')
for(p = 1; p >= 0; p--)
{
for(q = 1; q >= 0; q--)
{
for(r = 1; r >= 0; r--)
{
Calculate();
if(result == 1)
Xiqu =Xiqu +"(" + (p == 1 ? "P" : "!P") + "&" +(q == 1 ? "Q" : "!Q") + "&"
(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
|FOREGROUND_GREEN|FOREGROUND_BLUE);
//设置绿色和蓝色相加(即青色)
system("cls");//清屏
cout<<"-----------------"<<endl;
cout <<"欢迎使用!"<<endl<<endl;
};
SeqStack::SeqStack(int mSize)
{
maxtop = mSize - 1;
top = -1;
st = new char[mSize];
}
SeqStack::~SeqStack()
{
delete[]st;
}
char SeqStack::Top()
{
return st[top];
二、实验环境(实验设备)
硬件:PC机。
软件:Code::Blocks(C++)
三、实验原理及内容
内容:编程实现用真值表法求任意含三个以内变量的合式公式的主析取范式和主合取范式。
原理:首先读入变元个数,然后读入合式公式,用堆栈的知识将中缀表达式转化为后缀表达式,调用否定、析取、合取、条件、双条件的函数计算P、Q、R取不同真值时合式公式的真值,然后输出真值表,调用计算主析取范式和主合取范式的函数并输出。
cout << " !表示否定" << endl<<endl;
cout << " |表示析取" << endl<<endl;
cout << " &表示合取" << endl<<endl;
cout << " >表示条件" << endl<<endl;
cout << " -表示双条件" << endl;
cout << "主析取范式:"<<Xiqu << endl << endl;
cout << "主合取范式:" << Hequ << endl << endl;
}
int main()
{
int flag=1;
while(flag==1)
{
SetConsoleTextAttribute(GetStdHandle
case '&':i = 9; break;
case '!':i = 11; break;
case ')':i = 12; break;
}
switch(out)
{
case '#':o = 0; break;
case '(':o = 12; break;
case '-':o = 2; break;
case '>':o = 4; break;
stack.Pop();
}
stack.Pop();
}
else
{
do
{
tmp = tmp + stack.Top();
stack.Pop();
} while(!CanIn(OriginalForm[i]));
stack.Push(OriginalForm[i]);
}
}
while(stack.Top() != '#')
}
bool SeqStack::Push(char x)
{
if(top == maxtop)
return false;
st[++top] = x;
return true;
}
bool SeqStack::Pop()
{
if(top == -1)
return false;
top--;
return true;
}
void If() //条件,b->a
{
result = (b == 1 && a == 0) ? 0 : 1;
stack.Push(result);
}
void Doubleif() //双条件
{
result = (b == a) ? 1 : 0;
stack.Push(result);
}
bool CanIn(char out)//优先级的判断
}
int p, q, r, s, t, u;
int a, b, result;
int v =0;
int number;//用number表示变元的个数
SeqStack stack(200);
void Not() //否定
{
a = stack.Top();
stack.Pop();
result = a == 1 ? 0 : 1;
{
Calculate();
if(result == 1)
Xiqu =Xiqu + "("+ (p == 1 ? "P" : "!P") + "&" + (q == 1 ?"Q" : "!Q") + ")" + " | ";
else
Hequ = Hequ + "(" + (p ==0 ? "P" : "!P") + "|" + (q == 0 ? "Q" :"!Q") + ")" + " & ";
case '|':Or(); break;
case '&':And(); break;
case '!':Not(); break;
}
}
}
if(number == 2)
{
for(int i = 0; (unsigned)i <OriginalForm.length(); i++)
{
if(OriginalForm[i] == 'P' || OriginalForm[i] == 'Q')
{
tmp=tmp+OriginalForm[i];
continue;
}
if(CanIn(OriginalForm[i]))
stack.Push(OriginalForm[i]);
else if(OriginalForm[i] == ')')
{
while(stack.Top() != '(')
{
tmp = tmp + stack.Top();
class SeqStack//建立一个堆栈,利用将中缀表达式转为后缀表达式
{
public:
SeqStack(int mSize);
~SeqStack();
char Top();
bool Push(char x);
bool Pop();
private:
char *st;
int top;
相关文档
最新文档