离散数学实验报告命题逻辑—构造命题公式的真值表

合集下载

离散数学实验——求真值表.docx

离散数学实验——求真值表.docx

一实验目的 (1)二实验内容 (1)三实验环境 (1)四实验原理和实现过程(算法描述) (1)五实验数据及结果分析; (3)六源程序清单; (5)七其他收获和体会。

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

二实验内容1.从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

(A)2.求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三实验环境C或C++语言编程环境实现。

四实验原理和实现过程(算法描述)A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。

最后提示按#键退出, 否则继续循环求真值。

B:主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi ()每次调用zzhi ()时都使数组zhi □中的真值加1, (利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi ()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhiO将真值指派的数组加1, 最后外围利用while 语句循环输出每个不同的真值指派和该指派下表达式的值。

将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2 个栈,一个作为临时存储运算符的栈fu[], —个作为输入逆波兰式的栈nibol:],从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是字母,则该字母直接送入nibol[]栈。

同时为了找出所有变量,将该变量名与数组bianl[]中已有的元素比较, 如果bianl □中还没有该字母,则该字母是新出现的变量,将其录入数组bianl []中。

离散数学上机实验指导

离散数学上机实验指导

离散数学上机实验指导徐凤生如果你需要索取源程序,请发邮件至xfs@。

实验11实验内容(1)求任意一个命题公式的真值表。

(2)利用真值表求任意一个命题公式的主范式。

(3)利用真值表进行逻辑推理。

注:(2)和(3)可在(1)的基础上完成。

2实验目的真值表是命题逻辑中的一个十分重要的概念,利用它几乎可以解决命题逻辑中的所有问题。

例如,利用命题公式的真值表,可以判断命题公式的类型、求命题公式的主范式、判断两命题公式是否等价,还可以进行推理等。

本实验通过编写一个程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式等。

目的是让学生更加深刻地理解真值表的概念,并掌握真值表的求解方法及其在解决命题逻辑中其他问题中的应用。

3算法的主要思想利用计算机求命题公式真值表的关键是:①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下的真值。

真值表中命题变元的取值具有如下规律:每列中0和1是交替出现的,且0和1连续出现的个数相同。

n个命题变元的每组赋值的生成算法可基于这种思想。

含有n个命题变元的命题公式的真值的计算采用的方法为“算符优先法”。

为了程序实现的方便,约定命题变元只用一个字母表示,非、合取、析取、条件和双条件联结词分别用!、&、|、-、+来表示。

算符之间的优先关系如表1-32所示:为实现算符优先算法,另一个称作OPND,用以寄存操作数或运算结果。

算法的基本思想是:(1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素;(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd(按字典序排列,同一个命题变元只出现一次);(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。

实验21实验内容(1)求任意两个集合的交集、并集、差集。

(2)求任意一个集合的幂集。

《离散数学》双语教学 第一章 真值表,逻辑和证明

《离散数学》双语教学 第一章   真值表,逻辑和证明

《离散数学》双语教学第一章真值表,逻辑和证明《离散数学》双语教学第一章真值表,逻辑和证明CHAPTER 1TRUTH TABLES, LOGIC, AND PROOFSGlossarystatement, proposition:命题 logical connective:命题联结词compound statement:复合命题 propositional variable:命题变元negation:否定(式)truth table:真值表conjunction:合取 disjunction:析取 propositional function:命题公式fallacy: 谬误syllogism:三段论universal quantification:全称量词化 existential quantification:存在量词化 hypothesis(premise): 假设~前提~前件 conditional statement, implication:条件式~蕴涵式 consequent, conclusion:结论~后件 converse:逆命题contrapositive:逆否命题biconditional, equivalence:双条件式~等价(逻辑)等价的 logically equivalent:contingency:可满足式tautology:永真式(重言式)contradiction, absurdity:永假(矛盾)式 logically follow:是…的逻辑结论 argument:论证axioms:公理第 1 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明 postulate:公设rules of reference:推理规则modus ponens:肯定律 modus tollens:否定律reductio ad absurdum:归谬律proof by contradiction:反证法counterexample:反例 minterm:极小项disjunctive normal form:主析取范式maxterm:极大项conjunctive normal form:主合取范式第 2 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明本章内容及教学要点:1.1 Statements and Connectives教学内容:statements(propositions)~compound statement~connectives:negation~conjunction~disjunction~truth tables 1.2 Conditional Statements教学内容:implications(conditional statements)~biconditional~equivalent~and quantifications1.3 Equivalent Statements教学内容:logical equivalence~converse~inverse~contrapositive~tautology~contradiction(absurdity)~contingency~properties of logical connectives1.4 Axiomatic Systems: Arguments and Proofs教学内容:rules of reference~augument~valid argument~hypotheses~premises~law of detachment(modus ponens)~syllogism~modus tollens~addition~proof by contradiction 1.5 Normal Forms教学内容:minterm~disjunctive normal form~maxterm~conjunctive normal form定理证明及例题解答第 3 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明Logic, developed by Aristotle, has been used through the centuries in the development of many areas of learning including theology, philosophy, and mathematics. It is the foundation on which the whole structure of mathematics is built. Basically it is the science of reasoning, which may allow us to determine statements about mathematics whether are true or false based on a set of basic assumptions called axioms. Logic is also used in computer science to construct computer programs and to show that programs do what they are designed to do.逻辑学是研究人的思维形式的科学. 而数理逻辑是逻辑学的一个重要分支~是用数学形式化的方法研究思维规律的一门学科. 由于它使用了一套符号来简洁地表达出各种推理的逻辑关系~故它又称符号逻辑.数理逻辑用数学方法研究推理、利用符号体系研究推理过程中前提和结论之间的关系. 数理逻辑的主要内容:逻辑演算(L和L)、公理化集合论、模型论、S p构造主义与证明论. 数理逻辑在电子线路、机器证明、自动化系统、编译理论、算法设计方法方面有广泛的应用.The rules of logic specify the meaning of mathematicalstatements. Logic is the basis of all mathematical reasoning, and it has practical applications to the design of computing machines, to system specifications, to artificial intelligence(AI), to computer programming, to programming languages, and to other areas of computer science, as well as to many other fields of study.第 4 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明1.1 Statements and Connectivess(命题和联结词)命题逻辑研究的对象是命题及命题之间的逻辑关系.Propositions are the basic building blocks of logic. Many mathematical statements are constructed by combining one or more propositions.定义1.1.1 A proposition is a statement or declarative sentence that is either true or false, but not both,命题是一个非真即假的陈述句,.因此不能判断真假的陈述句、疑问句、祈使句和感叹句都不是命题.,1, The true or false value assigned to a statement is called its truth value; (一个命题的真或假称为命题的真值. 真用T或1表示~假用F或0表示),2, 一个陈述句有真值与是否知道它的真假是两回事.例1.1.1 判断下列语句是不是命题,若是~给出命题的真值: (1) 陕西师大不是一座工厂.(2) 你喜欢唱歌吗,(3) 给我一块钱吧:(4) 我不是陕西师大的学生.(5) 我正在说谎.Logical connectives(命题联结词)数理逻辑的特点是并不关心具体某个命题的真假~而是将逻辑推理变成类似数学演算的形式化过程, 关心的是命题之间的关联性. 因此需要进行命题符号化.命题联结词的作用是为了将简单命题组合成复合命题.We will now introduce the logical connectives that are used to form new propositions from existing propositions. And once truth values have been assigned to simple propositions, we can progress to more complicated compound statements.A statement that contains no connectives is called a simple第 5 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明statement. We will use p,q,r…to represent simple statements(简单命题就是简单陈述句~用字母p,q,r…(或带下标)表示),Sometimes, the letters p,q,r,s,…are used to denote propositional variables that can be replacedby statements(命题变元:可以用命题代替的变元).A statement that contains logical connectives(命题联结词) is called compound statements(复合命题). In general, a compound statement may have many component parts, each of which is itself a statement, represented by some propositional variable. The truth of a compound proposition is determined by the truth or falsity of the component parts.propositional constant(命题常元):T(1)或F(0)~或者表示一个确定的命题,propositional variable(命题变元):可用一个特定的命题取代。

离散数学逻辑推理

离散数学逻辑推理

Proof:
(1) D
P
(2) D ∨ A
P
(3) A
T(1),(2)I
(4) A→ (B→C)
P
(5) B→C
T(3),(4)I
(6) B
P
(7) C
T(5),(6)I
(8) D → C
CP
反证法
反证法的主要思想是:假设结论不成立,可以推出矛盾式。 下面先介绍有关概念和定理。
反证法定义:设有前提集合{H1,H2 ,...,Hn} ,H1,H2 ,...,Hn是相容的,H1 ∧ H2 ∧...∧ Hn C ,当且仅当H1
R ∨ (P ∧ ¬P) R R ∧ (P ∨ ¬P) R R ∨ (P ∨ ¬P) T R ∧ (P ∧ ¬P) F P → Q ¬P ∨ Q ¬(P → Q ) P ∧ ¬Q P → Q ¬Q → ¬P P →(Q → R) (P∧Q ) → R P↔Q (P → Q ) ∧ (Q → P ) P↔Q (P∧Q ) ∨(¬P ∧ ¬Q ) ¬(P↔Q ) P↔¬Q
,H2 ,...,Hn, C是不相容的。
或说H1 ∧ H2 ∧...∧ Hn ∧ C F(永假式)。
【example】 P→Q, (Q∨R)∧R, (P∧S) S
Proof:
(1) S
P(假设前提)
(2) S
T (1)E
(3) (P∧S) P
(4) P∨S
T (3)E
我们可把不相容的概念应用于命题公式的证明。
设有一组前提H1, H2,…, Hm 要推出结论C,即证 H1∧H2∧....∧Hm C,记作SC,即 C → S为永真,或 C ∨ S为永真,故 C ∧ S为永假。

离散数学实验报告

离散数学实验报告

“离散数学”实验报告目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)1、实验原理........................................................................................................2、实验过程.......................................................................................................五、实验数据及结果分析 (13)六、源程序清单 (24)源代码 (24)七、其他收获及体会 (45)一、实验目的实验一:熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。

实验二:掌握关系的概念与性质,基本的关系运算,关系的各种闭包的求法。

理解等价类的概念,掌握等价类的求解方法。

实验三:理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。

二、实验内容实验一:1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))实验二:1.求有限集上给定关系的自反、对称和传递闭包。

(有两种求解方法,只做一种为A,两种都做为B)2. 求有限集上等价关系的数目。

(有两种求解方法,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。

(C)实验三:以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A)。

并计算任意两个结点间的距离(B)。

对不连通的图输出其各个连通支(C)。

三、实验环境C或C++语言编程环境实现。

四、实验原理和实现过程(算法描述)实验一:1.实验原理(1)合取:二元命题联结词。

离散数学实验报告真值

离散数学实验报告真值

离散数学实验报告真值四川⼤学计算机学院实验报告实验名称:求合适公式的真值指导教师:姓名:学号:班级:⽇期:⼀.实验⽬的设计⼀个程序,来达到输⼊⼀个正确的合式公式,求它的真值表。

通过实验,更好地掌握离散数学中的概念、性质和运算。

⼆.功能设计任意输⼊的合适公式计算其真值表并输出三.界⾯设计四.实现步骤算法逻辑如下:(1)任意设计⼀个真值判断表达式,并使其赋值计算(2)计算模拟器中所对应的⼀组真值指派下合式公式的真值(3)输出真值表中对应于模拟器所给出的⼀组真值指派及这组真值指派所对应的⼀⾏真值。

五.运⾏结果六.源代码#include#include#includeusing namespace std;string calcValue(string value1);string calcValueNop(string value1);string caclAnd(string x,string y);string caclOr(string x,string y);string caclNot(string x);int main(){string in,varList="";//="!a+b^c"cout<<"*****************************************\n"<cout<<"** 欢迎进⼊逻辑运算软件**\n"<cout<<"** (可运算真值表,⽀持括号) **\n"<cout<<"** ⽤!表⽰否定**\n"<cout<<"** ⽤^表⽰合取**\n"<cout<<"** ⽤+表⽰析取**\n"<cout<<"*****************************************\n\n"<cout<<"请输⼊命题公式:注意: !,^,+,(,),字母为合法,不要有数字、空格,括号也要匹配!"< cout<<"⽰例:!a+b^c"<cin>>in;cout<<"输⼊命题公式"<int length=in.length();int i=0,j=0;for(i=0;ichar code=in[i];if( ((code>=97)&&(code<123)||((code>=65))&&(code<81))&&varList.find(code, 0)==-1 ) varList+=code;}int n=varList.length();for(i=0;icout<int flag;char *trow=new char[n];for(i=0;ifor(i=0;ifor(j=0;jcout<string value1=in;for(j=0;jchar x=varList[j];for(int k=0;kif(value1[k]==x)value1[k]=trow[j];}cout<flag=1;for(j=n-1;j>-1;j--) {int temp;temp=int(trow[j])-48;flag=flag+temp;if(flag==2) {trow[j]='0';flag=1;}else{trow[j]='1';flag=0;break;}}}delete trow;system("pause");return 0;}string calcValue(string value1){int nlp=value1.find('(',0);int nrp=value1.length();string x="",v="";int i=nlp+1;while(nlp>=0) {x=value1.substr(i,1);if(x=="("){nlp=i;i++;}else{if(x==")"){nrp=i;v=calcValueNop(value1.substr(nlp+1,nrp-nlp-1));value1=(nlp>0?value1.substr(0,nlp):"")+v+((nrp+1)<=value1.length()?value1.substr(n rp+1):"");nlp=value1.find('(',0);i=nlp+1;}else{i=i+1;}}if(i>=value1.length()){nlp=value1.find('(',0);i=nlp+1;}}return calcValueNop(value1);}string calcValueNop(string value1){int nnot=value1.find('!',0);while(nnot>=0) {value1=(nnot>0?value1.substr(0,nnot):"")+caclNot(value1.substr(nnot+1,1))+((nnot+ 2)<=value1.length()?value1.substr(nnot+2):"");nnot=value1.find('!',0);}int nand=value1.find('^',0);while (nand>0){value1=((nand-1)>0?value1.substr(0,nand-1):"")+caclAnd(value1.substr(nand-1,1),va lue1.substr(nand+1,1))+((nand+2) <=value1.length()?value1.substr(nand+2):"");nand=value1.find('^',0);}int nOr=value1.find('+',0);while (nOr>0){value1=((nOr-1)>0?value1.substr(0,nOr-1):"")+caclOr(value1.substr(nOr-1,1),value1. substr(nOr+1,1))+((nOr+2)<=value1.length()?value1.substr(nOr+2):"");nOr=value1.find('+',0);}return value1;}string caclAnd(string x,string y){if ((x=="1") && (y=="1")){return "1";}else {return "0";}}string caclOr(string x,string y){if ((x=="0") && (y=="0")){return "0";}else {return "1";}}string caclNot(string x){if (x=="1") {return "0";}else {return "1";}}七.⼼得体会离散数学课程在各学科领域,特别在计算机科学与技术领域有着⼴泛的应⽤,同时离散数学也是计算机专业的许多专业课程,如程序设计语⾔编译技术、⼈⼯智能、算法设计与分析等必不可少的先⾏课程。

离散数学(1.4真值表与等价公式)

离散数学(1.4真值表与等价公式)
离散数学(Discrete Mathematics)
1
第一章 命题逻辑(Propositional Logic) 1.4真值 表与等价公式
1.4.1 真值表(Truth Table) 1.4.2 等价公式(Propositional Equivalences) 1.4.1 真值表 前面在定义联结词时,曾经使用过真值表,下面给出 真值表的定义. 定义1.4.1 (对公式的赋值或解释)设P1 , P2 ,…,Pn是出 现在公式A中的全部的命题变元, 给P1 , P2 ,…,Pn各指 定一个真值,称为对A的一个赋值或解释。若指定的 一组值使A的真值为真(假), 称这组值为A的成真(假)赋值.
练习2:构造公式 (P Q ∧Q 真值表。
P
F F T T
Q
F T F T
(P Q )
(P Q)
(P Q) ∧ Q
11
第一章 命题逻辑(Propositional Logic) 1.4真值 表与等价公式
练习2:构造公式 (P Q ∧Q 真值表。
P
F F T T
Q
F T F T
F F F F F
Q R P (Q R) (P ∧ Q R
T T F T T T T T T T T T T T T
T F T
T T F
F
T
T
F
T
F
T
F
Байду номын сангаас
T T T
T
T
T
T
17
第一章 命题逻辑(Propositional Logic) 1.4真值 表与等价公式
由真值表可知,两个公式为等价式。
F F T T
F T F T

离散数学-1-4 真值表与等价公式

离散数学-1-4 真值表与等价公式

5
二、命题公式分量指派
不难看出,含n(n≥1)个命题变元的公式共 有2n个不同的指派(赋值)。 下面的问题是,指定P,Q,R的真值为何值 时,(P∨Q)→R的真值为1;指定P,Q,R的 真值为何值时,(P∨Q)→R的真值为0。 为看清命题公式在各种指派下的取值情况, 通常构造下面的“真值表”。
6
三、真值表
25
六、等值演算
例2.4 证明:(P→Q)→R P→(Q→R) 证 方法一:真值表法,可自己证明。 方法二 :设A=(P→Q)→R,B=P→(Q→R)
先将A,B通过等值演算化成容易观察真值的情况,再进行判断。
A=(P→Q)→R (┐P∨Q)→R (蕴涵等值式) ┐(┐P∨Q)∨R (蕴涵等值式) (P∧┐Q)∨R (德摩根律) B=P→(Q→R) ┐P∨(┐Q∨R) (蕴涵等值式) ┐P∨┐Q∨R (结合律) 容易观察到,000,010是A的成假赋值,而它们是 B的成真赋值
17
六、等值演算
虽然用真值法可以判断任何两个命题公式 是否等值,但当命题变元较多时,工作量 是很大的。可以先用真值表验证一组基本 的又是重要的等价公式,以它们为基础进 行公式之间的演算,来判断公式之间的是 否等值。下面给出 15 组(共 24 个)重要的 等值式,希望同学们牢牢记住它们。在下 面公式中出现的P,Q,R仍然是元语言符号, 它们代表任意的命题公式。P15 表1-4.8
7
三、真值表
(2) 按从低到高的顺序写出公式的各个层次。 (3) 对应各个赋值计算出各层次的真值,直到最后计 算出公式的真值。 例 求下列公式的真值表,并求成真赋值和成假赋 值。 (1)(┐P∧Q)→┐R (2)(P∧┐P)(Q∧┐Q)
(3) ┐(P→Q)∧Q∧R

离散数学实验 命题逻辑(2)浙江中医药大学

离散数学实验 命题逻辑(2)浙江中医药大学

离散数学实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】命题逻辑(2)2.【实验目的】熟悉掌握命题逻辑中真值表,进一步能用它们来解决实际问题。

3.【实验内容】求任意一个命题公式的真值表4. 【实验要求】通过以下界面提示实现相应逻辑运算,列出其真值表****************************************************************请选择(1—6)要进行的真值表运算:1.逻辑非(┌ P)2.合取(P∧Q)3.析取(P∨Q)4.条件(P→Q)5.双条件(P←→Q)6.继续/退出(y/n)****************************************************************5. 【算法描述】1.实验原理真值表:列出命题公式真假值的表,通常以1表示真,0 表示假。

命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。

2.实验过程对于给定的命题公式,生成相应真值表,然后用函数运算,输出结果:如生成逻辑非、合取、析取、条件、双条件表达式的真值表,例如:输入 !a输出真值表如下:a !a0 110输入a&&b输出真值表如下:a b a∧b0 0 00 1 01 0 01 1 1输入a||b输出真值表如下:a b a∨b0 0 00 1 11 0 11 1 1输入a->b输出真值表如下:a b a→b0 0 10 1 11 0 01 1 1输入a<>b (其中<>表示双条件) 输出真值表如下:a b a←→b0 0 10 1 01 0 01 1 16. 【源程序(带注释)】#include <stdio.h>#include <stdlib.h>#include <string.h>static int a[2];//定义全局数组a[2]void main(){int luojifei();//声明逻辑非函数int hequ();// 声明合取函数int xiqu();//声明析取函数int tiaojian();//声明条件函数int shuangtiaojian();//声明双条件函数void print();//声明打印星号函数char n[10];char c;print();//打印星号loop: //loop循环开始标记do{fflush(stdin);//清空输入缓存区,以免对后面的数据输入造成干扰printf("请选择(1-6)要进行的真值表运算:\n\n");printf("\t1.逻辑非(┌P)\n\t2.合取(P∧Q)\n\t3.析取(P∨Q)\n\t4.条件(P→Q)\n\t5.双条件(P←→Q)\n\t6.继续/退出(y/n)\n");print();printf("\t提示:若想查看真值表,按提示输入:\n\t!a 查看逻辑非真值表\n\ta&&b 查看合取真值表\n\ta||b 查看析取真值表\n\ta->b 查看条件真值表\n\ta<>b 查看双条件真值表\n");print();scanf("%s",n);//接收用户输入的功能序号if (strcmp("1",n)==0) //若输入为1,进行逻辑非运算{print();printf("\n逻辑非结果┌P=%d\n",luojifei());//逻辑非运算结果来自luojifei子函数的返回值print();fflush(stdin);system("pause");}if (strcmp("2",n)==0) //若输入为2,进行合取运算{print();printf("\n合取结果(P∧Q)=%d\n",hequ());//合取运算结果来自hequ子函数的返回值print();fflush(stdin);system("pause");}if (strcmp("3",n)==0) //若输入为3,进行析取运算{print();printf("\n析取结果(P∨Q)=%d\n",xiqu());//析取运算结果来自xiqu子函数的返回值print();fflush(stdin);system("pause");}if (strcmp("4",n)==0) //若输入为4,进行条件运算{print();printf("\n条件运算结果(P→Q)=%d\n",tiaojian());//条件运算结果来自tiaojian子函数的返回值print();fflush(stdin);system("pause");}if (strcmp("5",n)==0) //若输入为5,进行双条件运算{print();printf("\n双条件运算结果(P→Q)=%d\n",shuangtiaojian());//双条件运算结果来自shuangtiaojian子函数的返回值print();fflush(stdin);system("pause");}if (strcmp("6",n)==0) break;//若输入为6,跳出while循环if (strcmp("!a",n)==0) {printf("逻辑非真值表为:\n\ta !a\n\t0 1\n\t1 0\n") ; print();fflush(stdin);system("pause");}if (strcmp("a&&b",n)==0) {printf("合取真值表为:\n\ta b a∧b\n\t0 0 0\n\t0 1 0\n\t1 0 0\n\t1 1 1\n"); print();fflush(stdin);system("pause");}if (strcmp("a||b",n)==0) {printf("析取真值表为:\n\ta b a∨b\n\t0 0 0\n\t0 1 1\n\t1 0 1\n\t1 1 1\n"); print();fflush(stdin);system("pause");}if (strcmp("a->b",n)==0) {printf("条件真值表为:\n\ta b a→b\n\t0 0 1\n\t0 1 1\n\t1 0 0\n\t1 1 1\n"); print();fflush(stdin);system("pause");}if (strcmp("a<>b",n)==0) {printf("双条件真值表为:\n\ta b a←→b\n\t0 0 1\n\t0 1 0\n\t1 0 0\n\t1 1 1\n"); print();fflush(stdin);system("pause");}}while((c==getchar())!=EOF);//一直执行while循环,直到无更多的数据可读取档案结束fflush(stdin);//清空输入缓存区,以免对后面的数据输入造成干扰printf("\n确认退出(y/n)?");scanf("%c",&c);//接收用户输入的字符if(c=='y') exit(1);//字符为y,则退出程序else{print();fflush(stdin);goto loop;//返回loop循环起始标签}}void print()//定义print函数{printf("****************************************************************\n");}int panduanp(int p)//定义判断p的值是否有效的panduanp函数{while(p!=0 && p!=1)//当p不为0,且p不为1的时候进入while循环{printf("\n输入有误,请重新输入P的值(0或1):\nP=");//提示用户输错数据fflush(stdin);scanf("%d",&p);//重新接收p的值,再进行while循环判断}return p;}void panduanpq(int p,int q)//定义判断p和q的值是否有效的panduanpq函数{while((p!=0 && p!=1) || (q!=0 && q!=1))//当p不为0也不为1,q不为0也不为1的时候进入循环{fflush(stdin);printf("输入错误,请重新输入:\nP=");scanf("%d",&p);printf("\nQ=");scanf("%d",&q);//重新接收p和q的值,再进行while循环判断}a[0]=p;a[1]=q;//将正确的p和q的值分别存储到全局数组变量a[0],a[1]中}int luojifei()//定义逻辑非函数{int panduanp(int p);//子函数里声明panduanp函数int p;printf("\n您要进行逻辑非运算,请输入P的值:\nP=");scanf("%d",&p);if(panduanp(p)==1) return 0;//调用判断p函数来确保输入的数据有效,并传送回p的值,再对p的值进行逻辑非判断else return 1;}int hequ()//定义合取函数{void panduanpq(int p,int q);//子函数里声明panduanpq函数int p,q;printf("\n您要进行合取运算,请输入P与Q的值(0或1):\nP=");scanf("%d",&p);printf("Q=");scanf("%d",&q);panduanpq(p,q);//调用判断pq函数来确保输入的p,q数据有效,有效数据在判断pq函数中已经储存到了全局变量a[0],a[1]中if(a[0]==1 && a[1]==1) return 1;//合取时,只有在p,q均为1的时候,才返回1的值else return 0;}int xiqu()//定义析取函数{void panduanpq(int p,int q);//子函数里声明panduanpq函数int p,q;printf("\n您要进行析取运算,请输入P与Q的值(0或1):\nP=");scanf("%d",&p);printf("Q=");scanf("%d",&q);panduanpq(p,q);//调用判断pq函数来确保输入的p,q数据有效,有效数据在判断pq函数中已经储存到了全局变量a[0],a[1]中if(a[0]==1 || a[1]==1) return 1;//析取时,只要有一个为1,即返回1的值else return 0;}int tiaojian()//定义条件运算函数{void panduanpq(int p,int q);//子函数里声明panduanpq函数int p,q;printf("\n您要进行条件运算,请输入P与Q的值(0或1):\nP=");scanf("%d",&p);printf("Q=");scanf("%d",&q);panduanpq(p,q);//调用判断pq函数来确保输入的p,q数据有效,有效数据在判断pq函数中已经储存到了全局变量a[0],a[1]中if(a[0]==1 && a[1]==0 ) return 0;//蕴含时,只有在p为1,q为0的情况下返回0的值else return 1;}int shuangtiaojian()//定义双条件函数{void panduanpq(int p,int q);//子函数里声明panduanpq函数int p,q;printf("\n您要进行双条件运算,请输入P与Q的值(0或1):\nP=");scanf("%d",&p);printf("Q=");scanf("%d",&q);panduanpq(p,q);//调用判断pq函数来确保输入的p,q数据有效,有效数据在判断pq函数中已经储存到了全局变量a[0],a[1]中if(a[0]==a[1] ) return 1;//等价时,只有在p=q的情况下,返回1的值else return 0;}7.【实验结果与分析总结(含运行结果截图)】测试输出真值表:测试逻辑非运算:测试合取运算:测试析取运算:测试条件运算:测试双条件运算:测试继续功能:分析总结实验二大体来说是在实验一的基础上进行修改而成,由于首先需要让用户选择6个功能中的其中一个功能,在执行功能运算的时候,需要多次对P和Q的值进行有效判断。

离散实验——真值表法求主合取(析取范式)范式 最终版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.【实验题目】命题逻辑(3)2.【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。

3.【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。

4. 【实验要求】通过以下界面提示实现相应逻辑运算,给出具体逻辑值**************************************************************** 请输入5位董事(分别用A、B、C、D、E表示)的表决值(1或0):A董事表决值(1或0):B董事表决值(1或0):C董事表决值(1或0):D董事表决值(1或0):E董事表决值(1或0):出结果/继续/结束(y/c/exit):****************************************************************5. 【算法描述】①某公司董事会由5个董事组成,公司要对某项决策进行投票表决,只要半数(3位董事)以上都同意(用1表示同意,用0表示不同意)决策通过,否则不通过。

试写出5位董事表决的命题公式(提示:列出表决开关电路真值表,从真值表得出5人表决开关电路的主合取公式(或主析取公式),将公式化简成尽可能含五个基本联结词最少的等价公式)。

②上面公式中的每一个联结词是一个开关元件,将它们定义成C语言中的函数。

③输入5人表决值(同意为1,不同意为0),调用上面定义的函数,将5人表决开关电路真值表的等价公式写成一个函数表达式。

④输出函数表达式的结果,如果是1,则表明表决通过,否则表决不通过。

6. 【源程序(带注释)】#include <iostream>#include <cstdlib>#include <string.h>using namespace std;int main(){char a[100],b[100],c[100],d[100],e[100]; //定义5个字符型数组,用来储存ABCDE5个董事的表决值char f[100]; //f数组为接收出结果/继续/结束的字符void print(); //声明打****的函数for(;;){print();cout<<"\n\t请输入5位董事(分别用A、B、C、D、E表示)的表决值(1或0):\n\n";cout<<"\tA董事表决值(1或0):\n\tB董事表决值(1或0):\n\tC董事表决值(1或0):\n\tD董事表决值(1或0):\n\tE董事表决值(1或0):";cout<<"\n\n\t出结果/继续/结束(y/c/exit):\n";print();cout<<"请输入A董事表决值(1或0):";cin>>a;while(strcmp(a,"0")!=0 && strcmp(a,"1")!=0)//利用strcmp判断字符串,排除其他错误{print();cout<<"A董事表决值输入有误,请重新输入!\n";print();cout<<"请输入A董事表决值(1或0):";cin>>a;}print();cout<<"请输入B董事表决值(1或0):";cin>>b;while(strcmp(b,"0")!=0 && strcmp(b,"1")!=0){print();cout<<"B董事表决值输入有误,请重新输入!\n";print();cout<<"请输入B董事表决值(1或0):";cin>>b;print();cout<<"请输入C董事表决值(1或0):";cin>>c;while(strcmp(c,"0")!=0 && strcmp(c,"1")!=0){print();cout<<"C董事表决值输入有误,请重新输入!\n";print();cout<<"请输入C董事表决值(1或0):";cin>>c;}print();cout<<"请输入D董事表决值(1或0):";cin>>d;while(strcmp(d,"0")!=0 && strcmp(d,"1")!=0){print();cout<<"D董事表决值输入有误,请重新输入!\n";print();cout<<"请输入D董事表决值(1或0):";cin>>d;}print();cout<<"请输入E董事表决值(1或0):";cin>>e;while(strcmp(e,"0")!=0 && strcmp(e,"1")!=0){print();cout<<"E董事表决值输入有误,请重新输入!\n";print();cout<<"请输入E董事表决值(1或0):";cin>>e;}print();cout<<"您输入的董事会表决值为:\n";cout<<"\tA董事表决值:"<<a<<"\n\tB董事表决值:"<<b<<"\n\tC董事表决值:"<<c<<"\n\tD董事表决值:"<<d<<"\n\tE董事表决值:"<<e<<endl;print();for(;;){cout<<"\t出结果/继续/结束(y/c/exit):";cin>>f;if(strcmp(f,"y")==0)if((a[0]+b[0]+c[0]+d[0]+e[0])>242) {print();cout<<"表决通过!\n";print();}//利用ASC II码判断表决值是否大于242(10进制为3)else{print();cout <<"表决不通过。

离散数学实验——真值表

离散数学实验——真值表

#include<iostream.h>void main(){ int m,s;char a,b,c,d,e;do{cout<<"\n ********欢迎进入该系统******** "<<"\n";cout<<" 1.与运算p&&q "<<"\n";cout<<"2.或运算p||q "<<"\n";cout<<"3.非运算!q "<<"\n";cout<<" 4.则运算p->q "<<"\n";cout<<”5.蕴涵运算p<->q "<<"\n\n";cout<<"请选择你需要的操作序号: ";cin>>m;switch (m) {case 1:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"&&"<<b<<"\n";for(int i=0;i<2;i++)for(int k=0;k<2;k++){ c out<<i<<"\t"<<k<<"\t";if(i+k==2) cout<<"1"<<"\n";elsecout<<"0"<<"\n";}break; }case 2:{cout<<"\n请输入两个字母:";cin>>c>>d;cout<<c<<"\t"<<d<<"\t"<<c<<"||"<<d<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j+k>0)cout<<1<<"\n";else cout<<0<<"\n";}break; }case 3:{cout<<"\n请输入一个字母:";cin>>e;cout<<e<<"\t"<<"!"<<e<<"\n";for(int j=0;j<2;j++){ cout<<j<<"\t";if(j==0)cout<<1<<"\n";elsecout<<0<<"\n";}break; }case 4:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"->"<<b<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j==0)cout<<1<<"\n";else{if(k==1)cout<<1<<"\n";elsecout<<0<<"\n";} }break;}case 5:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"<->"<<b<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j==k)cout<<1<<"\n";elsecout<<0<<"\n";}break;}}cout<<"\n 你还需要继续操作吗?(YES=1,NO=0): ";cin>>s;}while(s);}1运算:a&&b2运算:p->q3运算:c<—>d。

离散数学实验报告

离散数学实验报告

实验一一实验内容(选作AB类)1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))二实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。

三实验环境C语言编程环境实现。

四 1、实现A类算法原理根据析取、合取的定义可用简单的算术运算求出结果,并将结果转换成逻辑值。

同样根据等价关系可将条件式及双条件式转换成析取和合取的运算。

此题较简单2、实现BC类算法原理算法逻辑如下:(1)将二进制加法模拟器赋初值0(2)计算模拟器中所对应的一组真值指派下合式公式的真值。

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

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

(5)在进行表达式求值的时候,可先将带括号的中缀表达式利用栈结构转换为不带括号的后缀表达式(逆波兰式),然后进行计算。

具体方法请参考数据结构中有关“栈”的知识。

五实验数据及结果分析1(A类)2(B类)从实验结果可以看到:当输入的数据不是逻辑值时须重新输入,当输入符合逻辑值才能继续下去。

从结果来看完全正确,由于界面有限没有把所有结果都贴上,根据运行情况来看没有错误六源程序清单1(A类)#include<stdio.h>//#include<string.h>main(){while(1) //输入符合逻辑值的命题变元P值{int a,b,c,d,e,f,g;while(1){printf("\ninput the logic value of the minti P(0 or 1):");scanf("%d",&a);if((a!=0)&&(a!=1)){printf("you have input the wrong value,please reinput");}else break;}while(1) //输入符合逻辑值的命题变元Q值{printf("\ninput the logic value of the minti Q(0 or 1):");scanf("%d",&b);if(b!=0&&b!=1)printf("you have input the wrong value,please reinput");else break;}c=a*b; //合取d=a+b; //析取e=(!a)+b; //条件式f=a*b+(!a)*(!b); //双条件式if(c==0) //化为逻辑值c=0;elsec=1;if(d==0)d=0;elsed=1;if(e=0)e=0;elsee=1;if(f==0)f=0;elsef=1;printf("\nthe logic value of hequ:%d\nthe logic value of xiqu:%d\nthe logic value of tiaojian:%d\nthe logic value of shuangtiaojian:%d\n",c,d,e,f);printf("do you want to continue?input 'y' continue");g=getch();{if(g=='y');else break;}}}2(B类)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>typedef struct Node //二叉树节点结构体{char data; //存节点字符struct Node *leftchild;//左孩子指针struct Node *rightchild;//右孩子指针int temp;//判断该节点前是否有特别的字符类型}BeTreeNode;/*typedef struct{char stack[30];int top;}SeqStack;//账的结构体*/void print_char(BeTreeNode *root);void prints(BeTreeNode *p);char str[30]; //输入的字符串char S[16]; //仅存是字母的字符串int w,length,x=1; //分辨取哪一种真值赋值//SeqStack mystack;//定义一个栈BeTreeNode *pt[30];//定义指针数组int **S_num; //二维数组存真值的多种赋值情况int L=0;/*void StackInitiate(SeqStack *S) //初始化{S->top=0;}int StackNotEmpty(SeqStack S) //非空否{if(S.top<=0)return 0;else return 1;}int StackPush(SeqStack *S,char x)//入栈{if(S->top>=16){printf("堆栈已满无法插入!\n");return 0;}else{S->stack[S->top]=x;S->top++;return 1;}}*/BeTreeNode *MakeTree(int a,int b) //建立二叉树{int i,j=0,k=0,a1[10],b1[10];int L=0;BeTreeNode *p[10];BeTreeNode *pp,*sign=NULL;for(i=a;i<=b;i++)//若有括号的先渐入括号的最内层{if(str[i]=='('){//if(mystack.top==0)if(L==0)a1[j]=i;L++;}if(str[i]==')'){L--;if(L==0){b1[j]=i;p[j]=MakeTree(a1[j]+1,b1[j]-1);j++;} }}j=0;for(i=a;i<=b;i++,k++)//用指针来存储二叉树的每个节点{if(str[i]=='!'){if(str[i+1]=='('){ pt[k]=p[j];pt[k]->temp=2;i=b1[j];j=j+1;}else{pt[k]=(BeTreeNode *)malloc(sizeof(BeTreeNode)); pt[k]->data=str[i+1];pt[k]->leftchild=NULL;pt[k]->rightchild=NULL;pt[k]->temp=-1;i=i+1;}}else if(str[i]=='('){pt[k]=p[j];pt[k]->temp=1;i=b1[j];j=j+1;}else{ pt[k]=(BeTreeNode *)malloc(sizeof(BeTreeNode)); pt[k]->data=str[i];pt[k]->leftchild=NULL;pt[k]->rightchild=NULL;pt[k]->temp=0;}}pp=pt[0];for(i=1;i<k;i=i+2)//把各个二叉树的节点连接起来{if(pt[i]->data=='|'){pt[i]->leftchild=pp;pt[i]->rightchild=pt[i+1];pp=pt[i];}else{if(sign!=NULL){pt[i]->leftchild=sign;sign->rightchild=pp;pp=pt[i];sign=NULL;}else{pt[i]->leftchild=pp;pp=pt[i];}if(i+2<k){if(pt[i+2]->data=='|'){pp=pt[i+1];sign=pt[i];}else{pp->rightchild=pt[i+1];}}}}if(sign!=NULL){sign->rightchild=pp;pp=sign;}else pp->rightchild=pt[k-1];return pp;}void prints(BeTreeNode *p)//根据各个节点前的标记符的赋值确定应该要输出哪种字符{if(p->temp==2){printf("!(");print_char(p);printf(")");}else if(p->temp==1){printf("(");print_char(p);printf(")");}else if(p->temp==-1){printf("!");print_char(p);}elseprint_char(p);}void print_char(BeTreeNode *root)//输出某个节点下的树{if(root->leftchild==NULL&&root->rightchild==NULL){printf("%c",root->data);}else{prints(root->leftchild);printf("%c",root->data);prints(root->rightchild);}}void print(BeTreeNode *root)//利用二重循环来进行从最内层的子树开始输出,直到输出整棵树{if(root->leftchild->leftchild!=NULL)print(root->leftchild);if(root->rightchild->leftchild!=NULL)print(root->rightchild);if(root->leftchild->temp==-1)printf("!%c ",root->leftchild->data);if(root->rightchild->temp==-1)printf("!%c ",root->rightchild->data);print_char(root);if(root->temp==2){printf("");prints(root);}printf("");}int numre(char c)//输出叶节点{int i;for(i=0;i<length;i++){if(S[i]==c)return S_num[w][i];}}int Judge(int num1,char c,int num2)//判断最简单的表达式的返回值{if(c=='&'){if(num1==num2&&num1==1)return 1;else return 0;}if(c=='|'){if(num1==num2&&num1==0)return 0;else return 1;}}int print_num(BeTreeNode *root)//从最内层开始输出返回值{int num1,num2,num,i;char c;if(root->leftchild==NULL&&root->rightchild==NULL){num=numre(root->data);}else{num1=print_num(root->leftchild);c=root->data;num2=print_num(root->rightchild);if((root->leftchild->temp==2)||(root->leftchild->temp==-1)){ for(i=0;i<x;i++)printf("");printf(" %d",num1);}if((root->rightchild->temp==2)||(root->rightchild->temp==-1)){ for(i=0;i<x;i++)printf("");printf(" %d",num2);}num=Judge(num1,c,num2);for(i=0;i<x;i++)printf("");printf(" %d",num);x=x+3;}if((root->temp==2)||(root->temp==-1)){if(num==1)num=0;else num=1;}return num;}int fac(int t)//计算出2的n次方的结果{if(t==0)return 1;if(t==1)return 2;return 2*fac(t-1);}void S_numf(int n)//开辟一个二维数组存储真值表的各种赋值情况{int row,col,i,j,k,p;row=fac(n);col=n;S_num=(int *)malloc(sizeof(int)*row);for(i=0;i<row;i++){S_num[i]=(int *)malloc(sizeof(int)*col);}for(i=0;i<row;i++)for(j=0;j<col;j++)S_num[i][j]=0;for(i=0;i<col;i++)for(k=0,j=fac(i);k<fac(i);j++,k++){for(p=col-1;p>col-1-i;p--)S_num[j][p]=S_num[k][p];S_num[j][p]=1;}}main(){int i,j,LEN,t=0,temp=1;BeTreeNode *root;//定义根节点//StackInitiate(&mystack);printf("请输入一个符合命题公式(仅支持非'!',析取'|',合取'&',优先级:!,|,&)\n:");gets(str);LEN=strlen(str);for(i=0;i<LEN;i++){ for(j=0;j<t;j++)if(S[j]==str[i])temp=0;if((str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')&&temp){S[j]=str[i];t++; }temp=1;}length=strlen(S);S_numf(length);root=MakeTree(0,LEN-1);printf("该复合命题公式的真值表是:\n");for(i=0;i<length;i++)printf("%c ",S[i]);print(root);printf("\n");for(w=0;w<fac(length);w++){for(i=0;i<length;i++)printf("%d ",S_num[w][i]);print_num(root);printf("\n");x=1;}}七收获与体会通过这次实验使我了解了一些数理逻辑问题可以通过用计算机编程的方法来解决,一些定理的证明同样也可以用计算机通过将命题符号化来编程解决。

离散数学第3章 命题逻辑

离散数学第3章 命题逻辑

0
0
0
1 1 0 0
1 0 1 0
0
13

一般来说, 只要不是非常明显的不可兼就使用.


例 p: 今天晚上我在寝室上自习, q :今天晚上我去电影 院看电影. 今天晚上我在寝室上自习或去电影院看电影。 p q.
14
5. 蕴涵(条件)联结词 : p q p: 我有时间, q : 我去看望我的父母. p q : 如果我有时间, 那么我去看望我的父母 . “”相当于“如果…那么…”, “若…则…”,等. p q 可读作“(若)p则q”. p称为前件, q称为后件.
p 1 1 0 0 q 1 0 1 0 pq 1 1 1 0
12
4. 异或联结词 : p q “不可兼或”, 它表示两者不能同时为真


例 p: 明天去深圳的飞机是上午八点起飞, q :明天去深圳 的飞机是上午八点半起飞. p q: 明天去深圳的飞机是上午八点或上午八点半起飞 . p 1 1 0 q 1 0 1 pq 0 1 1 p q pq 1 1 1


2









判断下列语句是否是命题. 2 + 3 = 5. √ 大熊猫产在我国东北. √ x > 3. 立正! 这朵花真漂亮! 你喜欢网络游戏吗? 1+1=10. √ 火星上有生物. √ 我说的都是假话. 小王和小李是同学. √ 你只有刻苦学习,才能取得好成绩. √
3
2. 命题的真值 命题的真值就是命题的逻辑取值. 经典逻辑值只有两个: 1和0 在数理逻辑中, 更多时候逻辑真是用 T(True) 或 t, 逻辑假用 F(False) 或 f 表示的.

离散数学实验二:命题逻辑(2).

离散数学实验二:命题逻辑(2).
}
void main()
{
char x = '0', y = '0', n = '0', n1, n2, n3;
int t = 0;
math math1(x, y);
loop:
{
cin.clear();
cin.sync();
math1.fengefu();
math1.caidan();
while (n)
cout << "0 1 0" << endl;
cout << "1 0 0" << endl;
cout << "1 1 1" << endl;
cout << "请选择(1-6)查看真值表:" ;
}
void math::fengefu()
{
cout << "########################################################################" << endl;
2.合取(P∧Q)
3.析取(P∨Q)
4.条件(P→Q)
5.双条件(P←→Q)
6.继续/退出(y/n)
****************************************************************
5.【算法描述】
真值表:列出命题公式真假值的表,通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。

《离散数学》双语教学 第一章 真值表,逻辑和证明

《离散数学》双语教学 第一章   真值表,逻辑和证明

《离散数学》双语教学第一章真值表,逻辑和证明《离散数学》双语教学第一章真值表,逻辑和证明CHAPTER 1TRUTH TABLES, LOGIC, AND PROOFSGlossarystatement, proposition:命题 logical connective:命题联结词compound statement:复合命题 propositional variable:命题变元negation:否定(式)truth table:真值表conjunction:合取 disjunction:析取 propositional function:命题公式fallacy: 谬误syllogism:三段论universal quantification:全称量词化 existential quantification:存在量词化 hypothesis(premise): 假设~前提~前件 conditional statement, implication:条件式~蕴涵式 consequent, conclusion:结论~后件 converse:逆命题contrapositive:逆否命题biconditional, equivalence:双条件式~等价(逻辑)等价的 logically equivalent:contingency:可满足式tautology:永真式(重言式)contradiction, absurdity:永假(矛盾)式 logically follow:是…的逻辑结论 argument:论证axioms:公理第 1 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明 postulate:公设rules of reference:推理规则modus ponens:肯定律 modus tollens:否定律reductio ad absurdum:归谬律proof by contradiction:反证法counterexample:反例 minterm:极小项disjunctive normal form:主析取范式maxterm:极大项conjunctive normal form:主合取范式第 2 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明本章内容及教学要点:1.1 Statements and Connectives教学内容:statements(propositions)~compound statement~connectives:negation~conjunction~disjunction~truth tables 1.2 Conditional Statements教学内容:implications(conditional statements)~biconditional~equivalent~and quantifications1.3 Equivalent Statements教学内容:logical equivalence~converse~inverse~contrapositive~tautology~contradiction(absurdity)~contingency~properties of logical connectives1.4 Axiomatic Systems: Arguments and Proofs教学内容:rules of reference~augument~valid argument~hypotheses~premises~law of detachment(modus ponens)~syllogism~modus tollens~addition~proof by contradiction 1.5 Normal Forms教学内容:minterm~disjunctive normal form~maxterm~conjunctive normal form定理证明及例题解答第 3 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明Logic, developed by Aristotle, has been used through the centuries in the development of many areas of learning including theology, philosophy, and mathematics. It is the foundation on which the whole structure of mathematics is built. Basically it is the science of reasoning, which may allow us to determine statements about mathematics whether are true or false based on a set of basic assumptions called axioms. Logic is also used in computer science to construct computer programs and to show that programs do what they are designed to do.逻辑学是研究人的思维形式的科学. 而数理逻辑是逻辑学的一个重要分支~是用数学形式化的方法研究思维规律的一门学科. 由于它使用了一套符号来简洁地表达出各种推理的逻辑关系~故它又称符号逻辑.数理逻辑用数学方法研究推理、利用符号体系研究推理过程中前提和结论之间的关系. 数理逻辑的主要内容:逻辑演算(L和L)、公理化集合论、模型论、S p构造主义与证明论. 数理逻辑在电子线路、机器证明、自动化系统、编译理论、算法设计方法方面有广泛的应用.The rules of logic specify the meaning of mathematicalstatements. Logic is the basis of all mathematical reasoning, and it has practical applications to the design of computing machines, to system specifications, to artificial intelligence(AI), to computer programming, to programming languages, and to other areas of computer science, as well as to many other fields of study.第 4 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明1.1 Statements and Connectivess(命题和联结词)命题逻辑研究的对象是命题及命题之间的逻辑关系.Propositions are the basic building blocks of logic. Many mathematical statements are constructed by combining one or more propositions.定义1.1.1 A proposition is a statement or declarative sentence that is either true or false, but not both,命题是一个非真即假的陈述句,.因此不能判断真假的陈述句、疑问句、祈使句和感叹句都不是命题.,1, The true or false value assigned to a statement is called its truth value; (一个命题的真或假称为命题的真值. 真用T或1表示~假用F或0表示),2, 一个陈述句有真值与是否知道它的真假是两回事.例1.1.1 判断下列语句是不是命题,若是~给出命题的真值: (1) 陕西师大不是一座工厂.(2) 你喜欢唱歌吗,(3) 给我一块钱吧:(4) 我不是陕西师大的学生.(5) 我正在说谎.Logical connectives(命题联结词)数理逻辑的特点是并不关心具体某个命题的真假~而是将逻辑推理变成类似数学演算的形式化过程, 关心的是命题之间的关联性. 因此需要进行命题符号化.命题联结词的作用是为了将简单命题组合成复合命题.We will now introduce the logical connectives that are used to form new propositions from existing propositions. And once truth values have been assigned to simple propositions, we can progress to more complicated compound statements.A statement that contains no connectives is called a simple第 5 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明statement. We will use p,q,r…to represent simple statements(简单命题就是简单陈述句~用字母p,q,r…(或带下标)表示),Sometimes, the letters p,q,r,s,…are used to denote propositional variables that can be replacedby statements(命题变元:可以用命题代替的变元).A statement that contains logical connectives(命题联结词) is called compound statements(复合命题). In general, a compound statement may have many component parts, each of which is itself a statement, represented by some propositional variable. The truth of a compound proposition is determined by the truth or falsity of the component parts.propositional constant(命题常元):T(1)或F(0)~或者表示一个确定的命题,propositional variable(命题变元):可用一个特定的命题取代。

离散数学实验报告

离散数学实验报告

离散数学实验报告离散数学实验报告一、引言离散数学是现代数学的一个重要分支,它研究离散的数学结构和离散的数学对象。

本实验报告将介绍我对离散数学的学习和实践的一些心得体会。

二、集合论集合论是离散数学的基础,它研究集合及其运算。

在实验中,我学习了集合的表示方法和运算规则。

集合的表示方法有枚举法、描述法和图示法等。

集合的运算包括并、交、差和补等。

通过实践操作,我深刻理解了集合的概念和运算规则。

三、逻辑与命题逻辑是离散数学的另一个重要内容,它研究推理和思维的规律。

在实验中,我学习了逻辑的基本概念和符号表示法。

逻辑中的命题是逻辑推理的基本单位,它可以是真或假。

通过实践操作,我能够正确地分析和判断命题的真值,并进行逻辑推理。

四、关系与函数关系与函数是离散数学中的重要内容,它们描述了元素之间的联系。

在实验中,我学习了关系的定义和性质,包括自反性、对称性和传递性等。

函数是一种特殊的关系,它将一个集合的元素映射到另一个集合。

通过实践操作,我能够正确地定义和分析关系与函数。

五、图论图论是离散数学中的重要分支,它研究图及其性质。

在实验中,我学习了图的基本概念和表示方法。

图由顶点和边组成,可以分为有向图和无向图。

通过实践操作,我能够正确地定义和分析图的性质,如度、路径和连通性等。

六、组合数学组合数学是离散数学的另一个重要分支,它研究离散对象的组合和排列。

在实验中,我学习了组合数学的基本原理和方法。

组合数学中的排列和组合是常见的计数问题,通过实践操作,我能够正确地计算排列和组合的数量。

七、实践应用离散数学在计算机科学、通信工程和运筹学等领域有着广泛的应用。

在实验中,我了解了离散数学在实际问题中的应用。

例如,图论可以用于网络路由算法的设计,组合数学可以用于密码学中的加密算法设计。

通过实践操作,我能够将离散数学的知识应用到实际问题中,提高问题的解决效率。

八、总结通过本次离散数学实验,我深入了解了离散数学的基本概念和方法,并通过实践操作加深了对离散数学的理解。

离散数学实验报告

离散数学实验报告

离散数学实验报告————————————————————————————————作者:————————————————————————————————日期:ﻩ重庆交通大学学生实验报告实验课程名称离散数学开课实验室数学实验室学院理学院专业信息与计算科学学生姓名谭冰学号631122020212班级2班开课时间2011 至2012学年第二学期教师评语:总成绩教师签名ﻬ目录实验一:教材第17页习题(1)(b);教材第39页习题(4)(b)…………3.实验二:教材第127页习题(2)(b);教材第113页习题(2)(b)9ﻩ实验一(此实验包含两题)一、实验内容1.从键盘输入两个命题变元P和Q的真值,求它们的非,合取,析取,条件和双条件的真值。

2.求任意一个命题公式的真值表。

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

三、实验环境MATLAB软件的编程环境实现四、实现两题的算法与原理(教材第17页习题(1)(b),39页习题(4)(d))根据析取,合取的定义可用简单的算术运算求出结果,并将结果转换成逻辑值。

同样根据等价关系可将条件式及双条件式转换成析取和合取的运算。

五、实验数据及结果分析实验所用函数:functiony=Not(x)if x==0y=1;else y=0;endfunction m=Vee(x,y)ifx==0&y==0m=0;else m=1;endfunction y=Wedge(P,Q)ifP==1&Q==1y=1;else y=0;endfunction y=If(P,Q)y=Vee(Not(P),Q);endfunctiony=Hh(P,Q,R)y=Vee(Wedge(P,R),If(P,Q));endfunction y=Ss(P,Q,R)y=Wedge(If(P,Wedge(Q,R)),If(Not(P),Wedge(Not(Q),Not(R))));endA=[0 000 010 100 1 11 0 01 0 11101 1 1];P=A(:,1);Q=A(:,2);R=A(:,3);In=input(‘请输入含有三个变元的命题公式:’);S={‘真值表为’};T=num2str([P,Q,R,In]);T%保存命名为Zzb'此为求(P→(Q∧R))∧(¬P→(¬Q∧¬R))主析取范式、主合取范式的程序,并判断是否为重言式,以K代替其真值'P=[0 0 00 11 1 1];Q=[00 1 1 0 0 11];R=[0 1 0 1 0 1 0 1];' P QR'Z=[P;Q;R]'K=Wedge(If(P,Wedge(Q,R)),If(Not(P),Wedge(Not(Q),Not(R))));'主析取范式:'A=[];V=[];for i=find(K)switch icase 1A=[A,'(¬P∧¬Q∧¬R)∨'];case 2A=[A,'(¬P∧¬Q∧R)∨'];case 3A=[A,'(¬P∧Q∧¬R)∨'];case 4A=[A,'(¬P∧Q∧R)∨'];case 5A=[A,'(P∧¬Q∧¬R)∨'];case 6A=[A,'(P∧¬Q∧R)∨'];case 7A=[A,'(P∧Q¬∧R)∨'];case 8A=[A,'(P∧Q∧R)'];otherwise'此为永假式'endendA'主合取范式'for i=find(Not(K))switch icase1V=[V,'(P∨Q∨R)∧'];case 2V=[V,'(P∨Q¬∨R)∧'];case 3V=[V,'(P∨¬Q∨R)∧'];case 4V=[V,'(P∨¬Q∨¬R)∧'];case 5V=[V,'(¬P∨Q∨R)∧'];case 6V=[V,'(¬P∨Q∨¬R)∧'];case 7V=[V,'(¬P∨¬Q∨R)∧'];case 8V=[V,'(¬P∨¬Q∨¬R)'];otherwise'此为永真式'endendVif all(K)==1'K是重言式'else'K不是重言式'end %保存文件名为ZyP17 (1) (b):(P∧R)∨(P→Q)运行过程及结果:>> P=[00 0 0 1 11 1],Q=[0 0 1 1 0 0 11],R=[010 1 0 1 0 1]P=0 0 0 0 1 1 1 1Q=0 0 1 1 001 1R =0 1 0 1 0 1 0 1>> Zzb本程序可以求真值表, 请输入含有三个变元的命题公式: Vee(Wedge(P,R),If(P,Q))T =00 0 10 0 1 10 1 0 10 1 1 1100 01 0 1 11 1 0 11111P39 (4)(d):(P→(Q∧R))∧(¬P→(¬Q∧¬R))运行过程及结果:>>Zyans =此为求(P→(Q∧R))∧(¬P→(¬Q∧¬R))主析取范式、主合取范式的程序,并判断是否为重言式,以K代替其真值ans =P QRZ =0 0000 10 1 00 1 11 0 01 0 11 1 01 1 1ans =主析取范式:A =(¬P∧¬Q∧¬R)∨(P∧Q∧R)ans =主合取范式V=(P∨Q¬∨R)∧(P∨¬Q∨R)∧(P∨¬Q∨¬R)∧(¬P∨Q∨R)∧(¬P∨Q∨¬R)∧(¬P∨¬Q∨R)ans =K不是重言式六、收获与体会通过实验使我了解了一些数理逻辑问题可以通过用计算编程的方法来解决,一些定理的证明同样也可以用计算机通过将命题符号化来编程解决。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【实验目的】
使学生熟练掌握利用计算机语言实现逻辑运算的基本方法。

【实验内容】
对给出的任意一个命题公式(不超过四个命题变元),使学生会用C语言的程序编程表示出来,并且能够计算它在各组真值指派下所应有的真值,画出其真值表。

【实验原理】
给出任意一个命题公式,我们可以将它用C程序表示出来,并且能够计算它在各组真值指派下所应有的真值(或是逻辑运算的结果)。

这有多种方法。

上面我们已经给出了逻辑连结词的定义,根据这种定义方法,我们也可以把一个命题公式表示成为条件语句中的条件表达式,这样我们就可以得到该命题公式的逻辑运算结果了。

【程序代码】
#include <bits/stdc++.h>
using namespace std;
int a[8][3]={{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}};
int b[8]={0,0,0,0,0,0,0,0};
int xa[8]={0,0,0,0,0,0,0,0};
int s(char c,int as,int i){//1 true;0 false
if(c=='|'){
if(a[i][as]==1||a[i][as+1]==1){
return 1;
} else{
return 0;
}
}
if(c=='&'){
if(a[i][as]==1&&a[i][as+1]==1){
return 1;
} else{
return 0;
}
}
if(c=='='){
if(a[i][as]==a[i][as+1]){
return 1;
} else{
return 0;
}
}
if(c=='!'){
if(a[i][as]==a[i][as+1]){
return 0;
return 1;
}
}
if(c=='>'){
if(a[i][as]==1||a[i][as+1]==0){
return 0;
} else{
return 1;
}
}
}
int so(char c,int i,int as){
if(c=='|'){
if(xa[i]==1||a[i][as+1]==1){
return 1;
} else{
return 0;
}
}
if(c=='&'){
if(xa[i]==1&&a[i][as+1]==1){
return 1;
} else{
return 0;
}
}
if(c=='='){
if(xa[i]==a[i][as+1]){
return 1;
} else{
return 0;
}
}
if(c=='!'){
if(xa[i]==a[i][as+1]){
return 0;
} else{
return 1;
}
}
if(c=='>'){
if(xa[i]==1||a[i][as+1]==0){
return 0;
return 1;
}
}
}
int main(void) {
string f;
cin>>f;
char c1=f[1];
char c2=f[3];
for(int i=0;i<8;i++){
for(int j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
for(int i=0;i<8;i++){
xa[i]=s(c1,0,i);
}
for(int i=0;i<8;i++){
b[i]=so(c2,i,1);
}
for(int i=0;i<8;i++){
printf("%d\n",b[i]);
}
return 0;
}
【实验结果】
【实验心得】。

相关文档
最新文档