- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
离散数学1命题逻辑
南京工程学院
实 验 报 告
课程名称 离散数学
实验项目名称 命题逻辑
实验学生班级 K网络工程121
实验学生姓名 王云峰
学 号 240121525
实验时间 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
#includemath.h
#includestring.h
typedef struct optrstack
{
char oper[30];
int loc;
}OPStack;
void initop(OPStack op)
{
int i;
op.loc=0;
for(i=0;i30;i++)op.oper[i]=\0;
}
void push(OPStack op,char c)
{
op.oper[op.loc++]=c;
}
char pop(OPStack op)
{
return(op.oper[--op.loc]);
}
typedef struct opndstack
{
int oper[60];
int loc;
}OPndStack;
void initopnd(OPndStack op)
{
int i;
op.loc=0 ;
for(i=0;i30;i++)op.oper[i]=\0;
}
void pushopnd(OPndStack op, int c)
{
op.oper[op.loc++]=c;
}
int popo
文档评论(0)