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

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

“离散数学”实验报告(求给定命题公式地真值表并根据真值表求公式地主范式)

专业网络工程

班级 1202班

学号 12407442

姓名张敏慧

2013.12.14

目录

一.实验目地 3

二.实验内容 (3)

求任意一个命题公式地真值表 (3)

三.实验环境 3

四. 实验原理和实现过程(算法描述)3

1.实验原理 (3)

2.实验流程图 (5)

五.实验代码 6

六. 实验结果14

七. 实验总结19

一.实验目地

本实验课程是网络工程专业学生地一门专业基础课程,通过实验,帮助学生更好地掌握计算机科学技术常用地离散数学中地概念.性质和运算;通过实验提高学生编写实验报告.总结实验结果地能力;使学生具备程序设计地思想,能够独立完成简单地算法设计和分析.

熟悉掌握命题逻辑中地真值表.主范式等,进一步能用它们来解

决实际问题.

二.实验内容

求任意一个命题公式地真值表,并根据真值表求主范式

详细说明:

求任意一个命题公式地真值表

本实验要求大家利用C/C++语言,实现任意输入公式地真值表计算.一般我们将公式中地命题变元放在真值表地左边,将公式地结果放在真值表地右边.命题变元可用数值变量表示,合适公式地表示及求真值表转化为逻辑运算结果;可用一维数表示合式公式中所出现地n个命题变元,同时它也是一个二进制加法器地模拟器,每当在这个模拟器中产生一个二进制数时,就相当于给各个命题变元产生了一组真值指派.算法逻辑如下:

(1)将二进制加法模拟器赋初值0

(2)计算模拟器中所对应地一组真值指派下合式公式地真值.

(3)输出真值表中对应于模拟器所给出地一组真值指派及这组真值指派所对应地一行真值.

(4)产生下一个二进制数值,若该数值等于2n-1,则结束,否则转(2).

三.实验环境;

使用visual C++6.0为编程软件,采用C语言为编程语言实现.

四. 实验原理和实现过程(算法描述);

1.实验原理

(1)真值表:表征逻辑事件输入和输出之间全部可能状态地表格.列出命题公式真假值地表.通常以1表示真,0 表示假.命题公式地取值由组成命题公式地命题变元地取值和命题联结词决定,命题联结词地真值表给出了真假值地算法. 真值表是在逻辑中使用地一类数学表,用来确定一个表达式是否为真或有效.

(2)主范式:

主析取范式:在含有n个命题变元地简单合取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项.由若干个不同地小项组成地析取式称为主析取范式;与A等价地主析取范式称为A地主析取范式.任意含n个命题变元地非永假命题公式A都存在与其等价地主析取范式,并且是惟一地.

主合取范式:在含有n个命题变元地简单析取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项.由若干个不同地大项组成地合取式称为主合取范式;与A等价地主合取范式称为A地主合取范式.任意含n个命题变元地非永真命题公式A都存在与其等价地主合取范式,并且是惟一地.

(2)首先是输入一个合理地式子,然后从式子中查找出变量地个数,开辟一个二进制函数,用来生成真值表,然后用函数运算,输出结果,并根据结果归类给范式,最后输出范式.

函数部分,主要是3个函数,一个为真值表递加函数,通过二进制地加法原理递进产生,一个为分级运算函数,这个函数是通过判断括号,选出最内级括号地内容执行运算函数,这样一级一级向外运算,最后得出最终结果,剩下一个为主运算函数,按照运算符号地优先级按顺序进行运算,如先将所有非运算运算完,再执行与运算.如此运算.

2.实验流程图如下:

五.实验代码

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "conio.h"

#include "math.h"

#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);//主运算函数

main()

{

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("***************************************\n");//标语

printf("** **\n");

printf("** 欢迎进入逻辑运算软件 **\n");

printf("** (可运算真值表,主范式,支持括号) **\n");

printf("** **\n");

printf("** 用!表示非 **\n");

printf("** 用&表示与 **\n");

printf("** 用|表示或 **\n");

printf("** 用^表示蕴含 **\n");

printf("** 用~表示等值 **\n");

printf("** **\n");

printf("***************************************\n\n");

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

if(ccu[i2]==sz[i1])//去除重复变量

d=0;

if(d==1)

{

ccu[j]=sz[i1];

j++;

}

d=1;

}

}

printf("\nd该式子中地变量个数为:%d\n",j);//输出变量个数 h0=j;

printf("\n输出真值表如下:\n \n"); //输出真值表表头

for(i1=0;i1

printf(" %c ",ccu[i1]);

printf(" ");

puts(sz);

printf("\n");

for(i1=0;i1

icu[i1]=0;

for(i2=0;i2

printf(" %d ",icu[i2]);

jg=tkh(sz,ccu,icu,h0); //用函数求结果

if(jg==0)//结果为0,合取加1

hq[h++]=bj;

else //否则,析取加1

xq[x++]=bj;

printf(" %d\n",jg);//输出运算结果

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(" %d ",icu[i2]);//输出真值表前项 printf(" %d\n",jg);//输出运算结果

}

if(hq[0]==-1)//不存在合取范式时

printf("\n该命题公式不存在主合取范式.\n"); else

{

printf("\n该命题公式地主合取范式:\n\t"); for(i1=0;i1

{

if (i1>0)//判断并添加符号

printf("\\/");

printf("M(%d)",hq[i1]); //输出主合取范式}

}

if(xq[0]==-1)//不存在析取范式时

printf("\n该命题公式不存在主析取范式.\n"); else

{

printf("\n\n该命题公式地主析取范式:\n\t"); for(i1=0;i1

{

if (i1>0)//判断并添加符号

printf("/\\");

printf("m(%d)",xq[i1]);//输出主析取范式

}

}

printf("\n");

printf("\n欢迎下次再次使用!\n ");//结束

getch();

}

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

xs1[h]=sz[j];

xs1[h]='\0';

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

sz[j]=sz[j+wz[i]-wz[i-1]];

sz[j]='\0';

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

if(sz[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];//将后续式子前移一项}

j1=j;

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

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

i=i-1;

}

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

sz[i1]=sz[i1+2];

i--;

}

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) //如果为前计算结果,将结果赋值并给

离散数学自学笔记命题公式及其真值表

离散数学自学笔记命题公式及其真值表 我们把表示具体命题及表示常命题的p,q,r,s等与f,t统称为命题常元(proposition constant)。深入的讨论还需要引入命题变元(proposition variable)的概念,它们是以“真、假”或“1,0”为取值范围的变元,为简单计,命题变元仍用p,q,r,s等表示。相同符号的不同意义,容易从上下文来区别,在未指出符号所表示的具体命题时,它们常被看作变元。 命题常元、变元及联结词是形式描述命题及其推理的基本语言成分,用它们可以形式地描述更为复杂的命题。下面我们引入高一级的语言成分——命题公式。 定义1.1 以下三条款规定了命题公式(proposition formula)的意义: (1)命题常元和命题变元是命题公式,也称为原子公式或原子。 (2)如果A,B是命题公式,那么(┐A),(A∧B),(A∨B),(A→B),(A?B)也是命题公式。 (3)只有有限步引用条款(1),(2)所组成的符号串是命题公式。 命题公式简称公式,常用大写拉丁字母A,B,C等表示。公式的上述定义方式称为归纳定义,第四章将对此定义方式进行讨论。 例1.8 (┐(p→(q∧r)))是命题公式,但(qp),p→r,p1∨p2∨…均非公式。 为使公式的表示更为简练,我们作如下约定: (1)公式最外层括号一律可省略。 (2)联结词的结合能力强弱依次为┐,(∧,∨),→,?,(∧,∨)表示∧与∨平等。 (3)结合能力平等的联结词在没有括号表示其结合状况时,采用左结合约定。湖南省自考网:https://www.360docs.net/doc/3e11827986.html,/整理 例如,┐p→q∨(r∧q∨s)所表示的公式是((┐p)→(q∨((r∧q)∨s))) 设A是命题公式,A1是A 的一部分,且A1也是公式,则A1称为公式A的子公式。

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

#include "" #include "" #include "" #include "" #define N 50 void 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='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') { for(i2=0;i2

八种常用逻辑门的实用知识(逻辑表达式、逻辑符号、真值表、逻辑运算规则)

名 称 逻 辑 表 达 式 逻 辑 符 号 真 值 表 逻辑运算规则 与 门 AB F = A 0 0 1 1 0 1 0 1 有0得0 全1得1 B F 0 0 0 1 或 门 B A F += A 0 0 1 1 0 1 0 1 有1得1 全0得0 B F 0 1 1 1 非 门 A F = A 0 1 有0得1 有1得0 F 1 0 与 非 门 AB F = A 0 0 1 1 0 1 0 1 有0得1 全1得0 B F 1 1 1 0

或 非 门 B A F += A 0 0 1 1 0 1 0 1 有1得0 全0得1 B F 1 0 0 0 与 或 非 门 CD AB F += A 0 0 (1) 0 0 (1) 0 0 … 1 0 1 (1) AB 或CD 有一组或两组全是 1结果得0 其余输出全得1 B C D F 1 1 0 异 或 门 B A F ⊕= B A B A += A 0 0 1 1 0 1 0 1 不同得1 相同得0 B F 0 1 1 0

同或门A F=⊙B AB B A+ =A0 0 1 1 0 1 0 1 不同得0 相同得1 B F 1 0 0 1 色环电阻的表示 颜 色 黑棕红橙黄绿蓝紫灰白金银无 有 效 数 字 0123456789-1-2-3 乘 数 10010110210310410510610710810910-110-2 精确度±1 ﹪ ±2 ﹪ ±﹪± ﹪ ± ﹪ ±5 ﹪ ± 10 ﹪ ± 20 ﹪ 注:四色环电阻:1、2环表示是有效数照写,3环表示是乘数(就是要乘与这个乘数),4环表示是精确度。五色环电阻:1、2、3环表示是有效数照写,4环表示是乘数(就是要乘与这个乘数),5环表示是精确度。

逻辑判断推理中常用的逻辑公式

逻辑命题与推理 必然性推理(演绎推理):对当关系推理、三段论、复合命题推理、关系推理和模态推理 可能性推理:归纳推理(枚举归纳、科学归纳)、类比推理 命题 直言命题的种类:(AEIOae) ⑴全称肯定命题:所有S是P(SAP) ⑵全称否定命题:所有S不是P(SEP) ⑶特称肯定命题:有的S是P(SIP) ⑷特称否定命题:有的S不是P(SOP) ⑸单称肯定命题:某个S是P(SaP) ⑹单称否定命题:某个S不是P(SeP) 直言命题间的真假对当关系: 矛盾关系、(上)反对关系、(下)反对关系、从属关系 矛盾关系:具有矛盾关系的两个命题之间不能同真同假。主要有三组: SAP与SOP之间。“所有同学考试都及格了”与“有些同学考试不及格” SEP与SIP之间。“所有同学考试不及格”与“有些同学考试及格” SaP与SeP之间。“张三考试及格”与“张三考试不及格” 上反对关系:具有上反对关系的两个命题不能同真(必有一假),但是可以同假。即要么一个是假的,要么都是假的。存在于SAP与SEP、SAP与SeP、SEP与SaP之间。 下反对关系:具有下反对关系的两个命题不能同假(必有一真),但是可以同真。即要么一个是真的,要么两个都是真的。存在于SIP与SOP、SeP与SIP、SaP与SOP之间。 从属关系(可推出关系):存在于SAP与SIP、SEP与SOP、SAP与SaP、SEP与SeP、SaP与SIP、SeP与SOP 六种直言命题之间存在的对当关系可以用一个六角图形来表示,“逻辑方阵图” SAP SEP SaP SeP

SIP SOP 直言命题的真假包含关系 全同关系、真包含于关系、真包含关系、交叉关系、全异关系 复合命题:负命题、联言命题、选言命题、假言命题 负命题的一般公式:并非P 联言命题公式:p并且q “并且、…和…、既…又…、不但…而且、虽然…但是…” 选言命题:相容的选言命题、不相容的选言命题 相容的选言命题公式:p或者q“或、或者…或者…、也许…也许…、可能…可能…” 【一个相容的选言命题是真的,只有一个选言支是真的即可。只有当全部选言支都假时,相容的选言命题才是假的】不相容选言命题公式:要么p要么q “要么…要么…、不是…就是…、或者…或者…二者必居其一、或者…或者…二者不可兼得” 【一个不相容的选言命题是真的,有且只有一个选言支是真的。当选言支全真或全假时,此命题为假】 假言命题:充分条件假言命题、必要条件假言命题、充要条件假言命题 充分条件假言命题公式:如果p,那么q“如果…就…、有…就有…、倘若…就…、哪里有…哪里有…、一旦…就…、假若…、只要…就…” 【有前件必然有后件。如果有前件却没有后件,这个充分条件假言命题就是假的。因此,对于一个充分条件的假言命题来说,只有当其前件真而后件假时,命题才假。】 必要条件假言命题公式:只有p,才q “没有…就没有…、不…不…、除非…不…、除非…才…” 【没有前件必然没有后件。如果没有前件也有后件,这个必要假言命题为假。对于一个必要条件的假言命题来说,只有当其前件假而后件真时,命题才假。】 充要条件假言命题公式:当且仅当p,才q 【有前件必然有后件,没有前件必然没有后件。充要条件假言命题在前件与后件等值即前件真并且后件真,或者前件假并且后件假时,命题为真,在前件与后件不等值即前真后假,或前假后真时,命题为假】 充分条件与必要条件之间可以相互转化:

2 离散数学-命题公式,真值表

2 命题公式,真值表 (1) 数理逻辑是通过引入表意符号研究人类思维中的推理过程及推理正确与否的数学分支. 数学------??? 符号运算 推理---思维过程:前提 结论 命题逻辑---研究由命题为基本单位构成的前提和结论之间的可推导关系.(逻辑演算) 即将推理(不涉及内函)形式化. 例1 (a) 4是偶数. 张林学习优秀. 太阳系以外的星球上有生物. (b) 这朵花真美丽! 现在开会吗? (c) 3 5.x +> 我正在说慌. 特征分析(a) 陈述句,非真即假. (b) 感叹句,疑问句. (c) 悖论. 定义1 能辩真假的陈述句,称为命题,用,,,P Q Z 表示.其判断结果称为命题的真值. 成真的命题称为真命题,其真值为真,记为,T 或为1.成假的命题称假命题,其真值为假,记为,F 或为0. 例2 (1) 2008年奥运会在北京举行. (2) 22 5.?= (3) 计算机程序的发明者是诗人拜伦. 用符号表是上述命题,并求真值. 解 (1) :P 2008年奥运会在北京举行. .T (2) :Q 22 5.?= .F (3) :R 计算机程序的发明者是诗人拜伦. .F (2) 3, 35,+ 3(4 1).+- 例3 (1) 今天没有数学考试. (2) 下午,我写信或做练习. (3) 王芳不但用功,而且成绩优秀. (4) 如果太阳从西边出来了,那么地球停止转动.

(5) 2是素数,当且仅当三角形有三条边. 特征分析(a)存在自然语言中的虚词. (b)语句可以分解,细化. 定义2 称下列符号为逻辑联结词 否定 ? 非 P ? 析取 ∨ 或者 P Q ∨ 合取 ∧ 且 P Q ∧ 蕴涵 → 若----,则----- P Q → 等价 ? 当且仅当 P Q ? 逻辑联结词真值的规定 例4 将下列命题符号化. (1) 小李聪明,但不用功. ()P Q ∧? (2) 单位派小王或小苏出差. P Q ∨ (3) 如果椅子是紫色的,且是园的,那么地是平的. ()P Q R ∧→ (4) n 是偶数当且仅当它能被2整除. P Q ? 注 1 逻辑联结词:运算符.顺序 ,,,,.?∧∨→? 2 自然语言中 虽然---,但是----; 不但---,而且----; ∧ 只有----,才----; 除非----,才-----; → 3 ∨ 可兼或(相容) ∨ 不可兼或(排斥) 小王是山东人或是河北人. ()()P Q P Q P Q ∨?∧?∨?∧ 4 ,P Q -----------------------简单命题

主范式的求法及应用

分类号O158 单位代码 11395 密级学号 1204210135 学生毕业论文 题目主范式的求法及应用 作者王定超 院 (系) 数学与统计学院 专业数学与应用数学 指导教师祁兰 答辩日期 2016年5月21日

榆林学院 毕业论文诚信责任书 本人郑重声明:所呈交的毕业论文,是本人在导师的指导下独立进行研究所取得的成果。毕业论文中凡引用他人已经发表或未发表的成果、数据、观点等,均已明确注明出处。尽我所知,除文中已经注明引用的内容外,本论文不包含任何其他个人或集体已经公开发表或撰写过的研究成果.对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明. 本人毕业论文与资料若有不实,愿意承担一切相关的法律责任。 论文作者签名: 年月日

摘要 主范式即主合取范式与主析取范式,它是数理逻辑中重要的基石也是推动计算机科学发展的动力,其方法与应用颇有价值.本文通过介绍主范式的相关定理、定义并作出相应解释,以及由范式的不唯一性引出主范式的唯一性,得到求主范式的三种方法:真值表法、真值指派法、等值演算法,并给出主范式的四种应用:判断几个命题公式是否等价、命题公式的类型、求公式的成真成假赋、解决实际问题. 关键词:主范式;真值表;真值指派法;等值演算法

ABSTRACT The method and application of p rincipal normal form ABSTRACT Principal normal form are the host conjunctive normal form and the host disjunctive normal form. It is an important cornerstone in the mathematical logic and the power of impelling the computer science development. The method and the application is of great value. In this paper, we make corresponding explanation and the non-uniqueness of the paradigm leads to the uniqueness of principal normal form by the introduction of related theorem of principal normal form and definition. We get the methods of principal normal form: truth table method, true value assignment method, and equivalent calculating method, and then give the applications of principal normal form: judging several propositional formulas whether equivalent or not, the type of propositional formula, seeking the formula of becoming true or false, and solve practical problems. Keywords:principal normal form; truth table; true value assignment method; equivalent calculating method

真值表化简法

在设计逻辑电路图时,由真值表直接得到的函数往往比较复杂。代数法和卡诺图法等方法对于变量数目较多的逻辑函数则效果不佳,本文介绍一种可以化简复杂逻辑函数的方法──表格法,该方法可以对变量数目较多的逻辑函数也可以进行化简。 2、原理 在介绍化减法之前,先说明三个概念: 蕴涵项──在函数的任何积之和式中,每个乘积项称为该函数的蕴涵项。对应于卡诺图中的任一标1单元(最小项)以及2m个相邻单元所形成的圈都是函数的蕴涵项。 素项──若函数的一个蕴涵项不是该函数中其它蕴涵项的一个子集,则此蕴涵项称为素蕴涵项,简称素项。 实质素项──若函数的一个素项所包含的某一最小项,不包括在该函数的其它任何素项中则此素项称为实质素蕴涵项,简称实质素项。 列表化简法的基本原理是利用逻辑函数的最小项,通过对相邻最小项的合并,消去多余变量因子,获得逻辑函数的最简式的。列表化简法的思路是先找出给定函数F的全部素项,然后找出其中的实质素项;若实质素项不能覆盖F的所有最小项,则进一步找出所需素项,以构成F的最简素项集。 下面用列表化简法将下列函数化简为最简与或表达式。 F(A,B,C,D)=Σ(0,3,4,5,6,7,8,10,11) 3、建立素项表 首先,找出给定函数的全部素项。 (1)先将每个最小项所对应的二进制数按其“1”的个数分组得表1; 表1 最小项

(2)将表1中的相邻两个组之间二进制数进行比较、合并得到一次化简结果,称为一次乘积项,其项号记为i(j-i),其中i为最小项中的小项号,j为最小项中的大项号,得表2; 表2 一次乘积项

(3)再将表2中的相邻两组内的二进制数进行比较、合并、便得到第二次化简结果,称为二次乘积项,其项号记为i(n,m),其中i为两个一次乘积项中的小项号,n为原最小项的项号差,m为一次乘积项的项号差,得表3; 表3 二次乘积项 不能与其它一次乘积项合并的一次乘积项是素项,分别以a,b,c,d,e,f记之,不能合并的二次乘积项也是素项,以g记之。

离散数学自学笔记命题公式及其真值表

我们把表示具体命题及表示常命题的p,q,r,s等与f,t统称为命题常元(proposition constant)。深入的讨论还需要引入命题变元(proposition variable)的概念,它们是以“真、假”或“1,0”为取值范围的变元,为简单计,命题变元仍用p,q,r,s等表示。相同符号的不同意义,容易从上下文来区别,在未指出符号所表示的具体命题时,它们常被看作变元。 命题常元、变元及联结词是形式描述命题及其推理的基本语言成分,用它们可以形式地描述更为复杂的命题。下面我们引入高一级的语言成分——命题公式。 定义1.1 以下三条款规定了命题公式(proposition formula)的意义: (1)命题常元和命题变元是命题公式,也称为原子公式或原子。 (2)如果A,B是命题公式,那么(┐A),(A∧B),(A∨B),(A→B),(A?B)也是命题公式。 (3)只有有限步引用条款(1),(2)所组成的符号串是命题公式。 命题公式简称公式,常用大写拉丁字母A,B,C等表示。公式的上述定义方式称为归纳定义,第四章将对此定义方式进行讨论。 例1.8 (┐(p→(q∧r)))是命题公式,但(qp),p→r,p1∨p2∨…均非公式。 为使公式的表示更为简练,我们作如下约定: (1)公式最外层括号一律可省略。 (2)联结词的结合能力强弱依次为┐,(∧,∨),→,?,(∧,∨)表示∧与∨平等。 (3)结合能力平等的联结词在没有括号表示其结合状况时,采用左结合约定。 例如,┐p→q∨(r∧q∨s)所表示的公式是((┐p)→(q∨((r∧q)∨s))) 设A是命题公式,A1是A 的一部分,且A1也是公式,则A1称为公式A的子公式。 如对公式A:┐p→q∨(r∧q∨s),则p,┐p ,q ,(r∧q∨s)及q∨(r∧q∨s)都是公式A的子公式,而┐q,┐p→q,虽然是公式,但确不是A的一部分,因此不是A 的子公式;q∨(r∧虽然是公式A的一部分,但不是公式,因而也不是A的子公式。 如果公式A含有命题变元p1,p2,…,pn,记为A(p1,…,pn),并把联结词看作真值运算符,那么公式A可以看作是p1,…,pn的真值函数。对任意给定的p1,…,pn 的一种取值状况,称为指派(assignments),用希腊字母a,b等表示,A均有一个确定的真值。当A对取值状况a 为真时,称指派a弄真A,或a是A的成真赋值,记为a (A)= 1;反之称指派a弄假A,或a是A的成假赋值,记为a (A)= 0.对一切可能的指派,

八种常用逻辑门的实用知识(逻辑表达式逻辑符号真值表逻辑运算规则)

本文档如对你有帮助,请帮忙下载支持!名称逻辑表达式逻辑符号真值表逻辑运算规则 与门A 0 0 1 1 0 1 0 1 有0得0 全1得1 B F 0 0 0 1 或门A 0 0 1 1 0 1 0 1 有1得1 全0得0 B F 0 1 1 1 非门A 0 1 有0得1 有1得0 F 1 0 与非门A 0 0 1 1 0 1 0 1 有0得1 全1得0 B F 1 1 1 0 或非门A 0 0 1 1 0 1 0 1 有1得0 全0得1 B F 1 0 0 0 与或非门A 0 0 (1) 0 0 (1) 0 0 (1) 0 1 (1) AB或CD有一组或 两组全是1结果得0 其余输出全得1 B C D F 1 1 0 异或门A 0 0 1 1 0 1 0 1 不同得1 相同得0 B F 0 1 1 0 同或门 A F ⊙B A 0 0 1 1 0 1 0 1 不同得0 相同得1 B F 1 0 0 1 色环电阻的表示 颜色黑棕红橙黄绿蓝紫灰白金银无有效 数字 0 1 2 3 4 5 6 7 8 9 -1 -2 -3 乘数10010110210310410510610710810910-110-2 精确度±1﹪±2 ﹪ ±0.5 ﹪ ±0.25 ﹪ ±0.1 ﹪ ±5 ﹪ ±10 ﹪ ±20 ﹪ 注:四色环电阻:1、2环表示是有效数照写,3环表示是乘数(就是要乘与这个乘数),4环表示是精确度。五色环电阻:1、2、3环表示是有效数照写,4环表示是乘数(就是要乘与这个乘数),5环表示是精确度。 例:四色环电阻五色环电阻 1 2 103±10﹪ 2 0 3 101±5﹪ 式子:12x103=12x1000=12000Ω=12KΩ±10﹪式子:203X101=203X10=2030Ω=2.03KΩ±5﹪

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

“离散数学”实验报告(求给定命题公式地真值表并根据真值表求公式地主范式) 专业网络工程 班级 1202班 学号 12407442 姓名张敏慧 2013.12.14

目录 一.实验目地 3 二.实验内容 (3) 求任意一个命题公式地真值表 (3) 三.实验环境 3 四. 实验原理和实现过程(算法描述)3 1.实验原理 (3) 2.实验流程图 (5) 五.实验代码 6 六. 实验结果14 七. 实验总结19

一.实验目地 本实验课程是网络工程专业学生地一门专业基础课程,通过实验,帮助学生更好地掌握计算机科学技术常用地离散数学中地概念.性质和运算;通过实验提高学生编写实验报告.总结实验结果地能力;使学生具备程序设计地思想,能够独立完成简单地算法设计和分析. 熟悉掌握命题逻辑中地真值表.主范式等,进一步能用它们来解 决实际问题. 二.实验内容 求任意一个命题公式地真值表,并根据真值表求主范式 详细说明: 求任意一个命题公式地真值表 本实验要求大家利用C/C++语言,实现任意输入公式地真值表计算.一般我们将公式中地命题变元放在真值表地左边,将公式地结果放在真值表地右边.命题变元可用数值变量表示,合适公式地表示及求真值表转化为逻辑运算结果;可用一维数表示合式公式中所出现地n个命题变元,同时它也是一个二进制加法器地模拟器,每当在这个模拟器中产生一个二进制数时,就相当于给各个命题变元产生了一组真值指派.算法逻辑如下: (1)将二进制加法模拟器赋初值0 (2)计算模拟器中所对应地一组真值指派下合式公式地真值. (3)输出真值表中对应于模拟器所给出地一组真值指派及这组真值指派所对应地一行真值. (4)产生下一个二进制数值,若该数值等于2n-1,则结束,否则转(2). 三.实验环境;

任意命题公式的真值表

实验报告 实验名称:任意命题公式的真值表 实验目的与要求:通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,包括联结词、真值表、运算的优先级等,提高学生编写实验报告、总结实验结果的能力,培养学生的逻辑思维能力和算法设计的思想,能够独立完成简单的算法设计和分析,进一步用它们来解决实际问题,帮助学生学习掌握C/C++语言程序设计的基本方法和各种调试手段,使学生具备程序设计的能力。 实验内容提要:求任意一个命题公式的真值表 实验步骤:(一)、关于命题公式的形式和运算符(即联结词)的运算 首先根据离散数学的相关知识,命题公式由命题变元和运算符(即联结词)组成,命题变元用大写字母英文表示(本次试验没有定义命题常元T和F,即T、F都表示命题变元),每个命题变元都有两种真值指派0和1,对应于一种真值指派,命题公式有一个真值,由所有可能的指派和命题公式相应的真值按照一定的规范构成的表格称为真值表。 目前离散数学里用到的包括扩充联结词总共有九种,即析取(或)、合取(与)、非、蕴含、等值、与非、或非、异或、蕴含否定,常用的为前五种,其中除了非运算为一元运算以外,其它四种为二元运算。所以本次实验设计时只定义了前五种运算符,同时用“/”表示非,用“*”表示合取,用“+”表示析取,用“>”表示蕴含,用“:”表示等值,且这五种运算符的优先级依次降低,如果需用括号改变运算优先级,则用小括号()改变。 以下为上述五种运算符运算时的一般真值表,用P和Q表示命题变元:1.非,用“/”表示 2.合取(与),用“*”表示

3.析取(或),用“+”表示 4.蕴含,用“>”表示 5.等值,用“:”表示 (二)、命题公式真值的计算 对于人来说,计算数学表达式时习惯于中缀表达式,例如a*b+c,a*(b+c)等等,而对于计算机来说,计算a*b+c还好,计算a*(b+c)则困难,因为括号的作用改变了运算的顺序,让计算机识别括号而改变计算顺序显得麻烦。经理论和实践研究,用一种称之为后缀表达式(逆波兰式)的公式形式能让计算机更容易计算表达式的真值。例如上面的a*(b+c),其后缀表达式为abc+*,计算时从左边开始寻找运算符,然后按照运算符的运算规则将与其相邻的前面的一个(非运算时为一个)或两个(其它四种运算为两个)操作数运算,运算结果取代原来的运算符和操作数的位置,然后重新从左边开始寻找运算符,开始下一次计算,比如上式,从左边开始寻找运算符,先找到+,则计算b+c,结果用d表示,这时后缀表达式变为ad*,又重新开始从左边开始寻找运算符,找到*,则计算a*d,

逻辑代数的基本公式和常用公式

逻辑代数的基本公式和常用公式 一.基本定义与运算 代数是以字母代替数,称因变量为自变量的函数,函数有定义域和值域。——这些都是大家耳熟能详的概念。如 或; 当自变量的取值(定义域)只有0和1(非0即1)函数的取值也只有0和1(非0即1)两个数——这种代数就是逻辑代数,这种变量就是逻辑变量,这种函数就是逻辑函数。 逻辑代数,亦称布尔代数,是英国数学家乔治布尔(George Boole)于1849年创立的。在当时,这种代数纯粹是一种数学游戏,自然没有物理意义,也没有现实意义。在其诞生100多年后才发现其应用和价值。其规定: 1.所有可能出现的数只有0和1两个。 2.基本运算只有“与”、“或”、“非”三种。 与运算(逻辑与、逻辑乘)定义为(为与运算符,后用代替) 00=0 01=0 10=0 11=1 或 00=0 01=0 10=0 11=1 或运算(逻辑或、逻辑加)定义为(为或运算符,后用+代替) 00=0 01=1 10=1 11=1 或 0+0=0 0+1=1 1+0=1 1+1=1 非运算(取反)定义为:

至此布尔代数宣告诞生。 二、基本公式 如果用字母来代替数(字母的取值非0即1),根据布尔定义的三种基本运算,我们马上可推出下列基本公式: A A=A A+A=A A0=0 A+0=A A1=A A+1=1 =+= 上述公式的证明可用穷举法。如果对字母变量所有可能的取值,等式两边始终相等,该公 式即告成立。现以=+为例进行证明。对A、B两个逻辑变量,其所有可能的取值为00、01、10、11四种(不可能有第五种情况)列表如下:

由此可知: =+ 成立。 用上述方法读者很容易证明: 三、常用公式 1. 左边==右边 2. 左边==右边 例题:将下列函数化为最简与或表达式。 (公式1:) = (公式2:) ()

逻辑命题公式计算

题号:第一题 题目:电梯模拟 1,需求分析: 计算命题演算公式的真值 所谓命题演算公式是指由逻辑变量(其值为TRUE或FALSE )和逻辑运算符人(AND )、 V( OR)和「( NOT )按一定规则所组成的公式(蕴含之类的运算可以用A、V和「来表示)。公式运算的先后顺序为「、人、V,而括号()可以改变优先次序。已知一个命题演算公式及各变量的值,要求设计一个程序来计算公式的真值。 要求: ( 1)利用二叉树来计算公式的真值。首先利用堆栈将中缀形式的公式变为后缀形式;然后根据后缀形式, 从 叶结点开始构造相应的二叉树;最后按后序遍历该树, 求各子树之值, 即每到达一个结点, 其子树之值已经计算出来, 当到达根结点时, 求得的值就是公式之真值。 ( 2)逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。 ( 3)根据用户的要求显示表达式的真值表。 2,设计: 2.1 设计思想: <1> ,数据结构设计: (1) 线性堆栈1 的数据结构定义 typedef struct { DataType stack [MaxStackSize]; int top; /* 当前栈的表长*/ } SeqStack; 用线性堆栈主要是用来存储输入的字符, 它的作用就是将中缀表达式变成后缀表达式。 (2) 线性堆栈2 的数据结构定义 typedef struct { BiTreeNode *stack [MaxStackSize]; int top; /* 当前栈的表长*/ } TreeStack; 这个堆栈和上面的堆栈的唯一不同就是它们存储的数据的类型不同, 此堆栈存储的是树节点,它的作用是将后缀表达式构成一棵二叉树。 (3)树节点数据结构定义typedef struct Node { DataType data; struct Node *leftChild; struct Node *rightChild; }BiTreeNode; <2>算法设计详细思路如下:首先实现将中缀表达式变成后缀表达式:在将中缀表达式变成后缀表达式的

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

#include #include #include #include using namespace std; char str[100]; //输入的命题公式 int tv[20] = {0}; //真值指派的数组 int length; //命题公式长度 char expression[100]; //将命题公式中的命题变元变为真值后的数组 int icp(const char c) //联结词的栈外优先级 { int result = -1; switch(c) { case '#': result = 0; break; case '(': result = 10; break; case '!': result = 9; break; case '&': result = 6; break; case '|': result = 4; break; case '>': result = 2; break; case ')': result = 1; } return result; } int isp(const char c) //联结词的栈内优先级 { int result = -1; switch(c) { case '#': result = 0; break; case '(': result = 1; break; case '!': result = 8; break; case '&': result = 7; break; case '|': result = 5; break; case '>': result = 3; break; case ')': result = 10; } return result; } void Plus(int a[],int q) //二进制加法指派真值

离散数学命题公式真值表C++或C语言实验报告

离散数学实验报告 专业班级:12级计算机本部一班姓名:鲍佳珍 学号:201212201401016 实验成绩: 1.【实验题目】 命题逻辑实验二 2.【实验目的】 熟悉掌握命题逻辑中真值表,进一步能用它们来解决实际问题。 3.【实验内容】 求任意一个命题公式的真值表 4、【实验要求】 C或C++语言编程实现 5. 【算法描述】 1.实验原理 真值表:表征逻辑事件输入和输出之间全部可能状态的表格。列出命题公式真假值的表。通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。 2.实验过程 首先是输入一个合理的式子,生成相应真值表,然后用函数运算,输出结果:要求可生成逻辑非、合取、析取、蕴含、双条件表达式的真值表,例如:输入 !a 输出真值表如下: a !a 0 1 10 输入a&&b 输出真值表如下: a b a&&b 0 0 0 0 1 0 1 0 0 1 1 1 输入a||b 输出真值表如下:

a b a||b 0 0 0 0 1 1 1 0 1 1 1 1 输入a->b 输出真值表如下: a b a->b 0 0 1 0 1 1 1 0 0 1 1 1 输入a<>b (其中<>表示双条件) 输出真值表如下: a b a<>b 0 0 1 0 1 0 1 0 0 1 1 1 6.【源程序(带注释)】 #include #include void hequ(); void yunhan(); void xiqu(); void shuang(); void fei();//声明五个函数 int main() { int ch; char s[10];

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

#include "stdio.h" #include "stdlib.h" #include "string.h" #include "math.h" #define N 50 void 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='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') { for(i2=0;i2

离散数学之逻辑运算和命题公式真值表

1、逻辑联接词的运算 从键盘输入两个命题变元P和Q的真值,输出它们的合取、析取、条件、双条件和P的否定的真值。 #include int main() { int a,b; int hequ(int P,int Q); int xiqu(int P,int Q); int tiaojian(int P,int Q); int shuangtiaojian(int P,int Q); int Pfaoding(int P); int show(int a,int b); cout<<"请输入P和Q的真值:\n"; cin>>a>>b; show(a,b); return 0; } int hequ(int P,int Q) { if(P==0) P=P; else P=1; if(Q==0) Q=Q; else Q=1; return(P&Q); } int xiqu(int P,int Q) { if(P==0) P=P; else P=1; if(Q==0) Q=Q; else Q=1; return(P|Q); } int tiaojian(int P,int Q)

{ if(P==0) P=P; else P=1; if(Q==0) Q=Q; else Q=1; if(P==1&&Q==0) return(0); else return(1); } int shuangtiaojian(int P,int Q) { if(P==0) P=P; else P=1; if(Q==0) Q=Q; else Q=1; return(!P^Q); } int Pfaoding(int P) { if(P==0) P=P; else P=1; return(!P); } int show(int a,int b) { cout<<"P Q P∧Q P∨Q P→Q P←→Q ┐P"<

离散数学,逻辑学,命题公式求真值表

离散逻辑学实验 班级:10电信实验班学号:Q 姓名:王彬彬 一、实验目的 熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。 二、实验内容 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 "stdio.h" #include "stdlib.h" #include "string.h" #include "math.h" #define N 50 void 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='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') { for(i2=0;i2

相关文档
最新文档