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

发布时间 : 星期三 文章离散数学,逻辑学,命题公式求真值表更新完毕开始阅读

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

离散逻辑学实验

班级: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

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

#include \、h\#include \、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);//主运算函数 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;i10)//判断并添加符号 printf(\

printf(\输出主合取范式

联系合同范文客服:xxxxx#qq.com(#替换为@)