离散数学1命题逻辑.docx
- 文档编号:4835459
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:10
- 大小:45.47KB
离散数学1命题逻辑.docx
《离散数学1命题逻辑.docx》由会员分享,可在线阅读,更多相关《离散数学1命题逻辑.docx(10页珍藏版)》请在冰豆网上搜索。
离散数学1命题逻辑
南京工程学院
实验报告
课程名称离散数学
实验项目名称命题逻辑
实验学生班级K网络工程121
实验学生姓名王云峰
学 号*********
实验时间11月1日
实验地点信息楼
实验成绩评定
指导教师签字 年 月 日
一、实验目的和要求
真值表是命题逻辑中的一个十分重要的概念,利用它几乎可以解决命题逻辑中的所有问题。
例如,利用命题公式的真值表,可以判断命题公式的类型、求命题公式的主范式、判断两命题公式是否等价,还可以进行推理等。
本实验通过编写一个程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式等。
目的是让学生更加深刻地理解真值表的概念,并掌握真值表的求解方法及其在解决命题逻辑中其他问题中的应用。
二、实验主要仪器和设备
计算机
三、实验方法与步骤(需求分析、算法设计思路、流程图等)
(1)求任意一个命题公式的真值表。
(2)利用真值表求任意一个命题公式的主范式。
(3)利用利用计算机求命题公式真值表的关键是:
①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下的真值。
真值表中命题变元的取值具有如下规律:
每列中0和1是交替出现的,且0和1连续出现的个数相同。
n个命题变元的每组赋值的生成算法可基于这种思想。
含有n个命题变元的命题公式的真值的计算采用的方法为“算符优先法”。
为了程序实现的方便,约定命题变元只用一个字母表示,非、合取、析取、条件和双条件联结词分别用!
、&、|、-、+来表示。
算符之间的优先关系如表1-32所示:
表1-32算符优先级
+-|&!
()@
+
-
|
&
!
(
)
@
><<<<<>>
>><<<<>>
>>><<<>>
>>>><<>>
>>>>><>>
<<<<<<=E
>>>>>E>>
<<<<<<E=
“〉”代表当前的优先级高于比较对象,可以进行运算
“<”代表当前的优先级低于比较对象,不可以进行运算,必须等待
“=”一般是一对刮号,可以一起消除
“E”代表表达式错误,一般不会出现
为实现算符优先算法,我们采用两个工作栈。
一个称作OPTR,用以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。
算法的基本思想是:
(1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素;
(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd(按字典序排列,同一个命题变元只出现一次);
(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。
真值表进行逻辑推理。
四、实验原始纪录(源程序、数据结构等)
#include"stdio.h"
#include
#include
typedefstructoptrstack
{
charoper[30];
intloc;
}OPStack;
voidinitop(OPStack&op)
{
inti;
op.loc=0;
for(i=0;i<30;i++)op.oper[i]='\0';
}
voidpush(OPStack&op,charc)
{
op.oper[op.loc++]=c;
}
charpop(OPStack&op)
{
return(op.oper[--op.loc]);
}
typedefstructopndstack
{
intoper[60];
intloc;
}OPndStack;
voidinitopnd(OPndStack&op)
{
inti;
op.loc=0;
for(i=0;i<30;i++)op.oper[i]='\0';
}
voidpushopnd(OPndStack&op,intc)
{
op.oper[op.loc++]=c;
}
intpopopnd(OPndStack&op)
{
return(op.oper[--op.loc]);
}
voidinit(chars[])
{intt;
printf("\n请输入任意一个命题公式(命题变元为一个字符)\n");
printf("非、析取、合取、条件、双条件词分别用符号!
、|、&、-、+表示\n");
gets(s);
t=strlen(s);
s[t]='@';
s[t+1]='\0';
}
intis_optr(charc)
{
charoptr_list[]="+-|&!
()@";
for(inti=0;i<(int)strlen(optr_list);i++)if(c==optr_list[i])return1;
return0;
}
charfirst(charop1,charop2)
{
chartab[8][9]={
"><<<<<>>",
">><<<<>>",
">>><<<>>",
">>>><<>>",
">>>>><>>",
"<<<<<<=E",
">>>>>E>>",
"<<<<< }; charoptr_list[]="+-|&! ()@";//双条件、条件、析取、合取、非 intop1_loc,op2_loc; for(op1_loc=0;op1_loc<(int)strlen(optr_list);op1_loc++)if(optr_list[op1_loc]==op1)break; for(op2_loc=0;op2_loc<(int)strlen(optr_list);op2_loc++)if(optr_list[op2_loc]==op2)break; returntab[op1_loc][op2_loc]; } intoperate(intx,charop,inty) { switch(op){ case'+': return(((! x)||y)&&(x||(! y)));break; case'-': return((! x)||y);break; case'|': returnx||y;break; case'&': returnx&&y;break; } return-1; } voiddivi(chars[],charc[]) { inti,j=0,t; for(i=0;s[i]! ='@';i++)if(! is_optr(s[i])){for(t=0;t c[j]='\0'; charaa; for(i=0;i for(t=i+1;t } intlocate(chars[],charc) { inti; for(i=0;i<(int)strlen(s);i++)if(s[i]==c)break; returni; } intcalc(chars[100],int*p) { charmyopnd[10],c; intsloc=0; OPStackoptr; initop(optr); push(optr,'@'); OPndStackopnd; initopnd(opnd); divi(s,myopnd); c=s[sloc++]; while(c! ='@'||optr.oper[optr.loc-1]! ='@'){ if(! is_optr(c)){intd1;d1=p[locate(myopnd,c)];pushopnd(opnd,d1);c=s[sloc++];} else{ switch(first(optr.oper[optr.loc-1],c)){ case'<': push(optr,c);c=s[sloc++];break; case'=': pop(optr);c=s[sloc++];break; case'>': charop;op=pop(optr); if(op=='! '){inta;a=! popopnd(opnd);pushopnd(opnd,a);} else{inta,b;a=popopnd(opnd);b=popopnd(opnd); intres;res=operate(b,op,a);pushopnd(opnd,res);} break; } } } returnopnd.oper[opnd.loc-1]; } voidmain() { charexp[100],myopnd[10]; inti,j,n,m,A[1024][10],flag,k; intF[1024]; init(exp); divi(exp,myopnd); n=(int)strlen(myopnd); m=(int)pow(2,n); for(j=0;j flag=1; k=(int)pow(2,n-j-1); for(i=0;i if(! (i%k))flag=! flag; if(flag)A[i][j]=1; elseA[i][j]=0; } } charss[100]; intt; strcpy(ss,exp); t=(int)strlen(ss); ss[t-1]='\0'; printf("命题公式%s的真值表如下: \n",ss); for(j=0;j printf("%s\n",ss); for(i=0;i for(j=0;j F[i]=calc(exp,A[i]); printf("%6d",F[i]); printf("\n"); } } 五、实验结果及分析(计算过程与结果、数据曲线、图表等) 求任意一个命题公式的真值表。 利用真值表求任意一个命题公式的主范式。 利用利用计算机求命题公式真值表的关键是: ①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下值。 六、实验总结与思考 利用计算机求命题公式真值表的关键是: ①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下的真值。 真值表中命题变元的取值具有如下规律: 每列中0和1是交替出现的,且0和1连续出现的个数相同。 n个命题变元的每组赋值的生成算法可基于这种思想。 “〉”代表当前的优先级高于比较对象,可以进行运算 “<”代表当前的优先级低于比较对象,不可以进行运算,必须等待 “=”一般是一对刮号,可以一起消除 “E”代表表达式错误,一般不会出现 为实现算符优先算法,我们采用两个工作栈。 一个称作OPTR,用以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。 算法的基本思想是: (1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素; (2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd(按字典序排列,同一个命题变元只出现一次); (3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。 含有n个命题变元的命题公式的真值的计算采用的方法为“算符优先法”。 为了程序实现的方便,约定命题变元只用一个字母表示,非、合取、析取、条件和双条件联结词分别用! 、&、|、-、+来表示。 真值表是命题逻辑中的一个十分重要的概念,利用它几乎可以解决命题逻辑中的所有问题。 例如,利用命题公式的真值表,可以判断命题公式的类型、求命题公式的主范式、判断两命题公式是否等价,还可以进行推理等。 本实验通过编写一个程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式等。 目的是让学生更加深刻地理解真值表的概念,并掌握真值表的求解方法及其在解决命题逻辑中其他问题中的应用。 此实验课程,能有效地锻炼我们的逻辑思维能力,使我们更系统,逻辑思考能力得到锻炼,分析例子更为简单,所以,此次实验,使我了解集合论的各种基础,受益匪浅。 教师评语:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 离散数学 命题逻辑
![提示](https://static.bdocx.com/images/bang_tan.gif)