计算命题演算公式的真值
命题公式真值表

说明:
(1)命题变元是没有真假值的,只有当命题变元用 确定的命题代入时,才得到一个命题,命题的真值 依赖于代换变元的那些命题的真值;
1-3 命题公式与翻译
(2) 不是所有由命题变元 ,常元 ,联结词和括号组成的字符串 都能成为命题公式.例如, P , P (Q ) 等不是命题公式.
定义 1-3.1 命题演算的合式公式,规定为: (1)单个命题变元本身是一个合式公式; (2)如果 A 是合式公式,那么 A 是合式公式; (3)如果 A 和 B 是合式公式,那么
1-3 命题公式与翻译
2、命题的翻译
练习 将下列命题符号化: (1)她既聪明又用功. (2)他虽聪明但不用功. (3)虽然这次语文考试的题目很难,但是王丽还是取得了好成绩. (4)张三或李四都可以做这件事. (5)一公安人员审查一起案件,事实如下,请将案件事实符 号化: 张三或李四盗窃了机房的一台电脑,若是张三所为,则作案 时间不能发生在午夜前;若李四的证词正确,则午夜时机房 的灯未灭; 若李四证词不正确,则作案时间发在午夜前; 午夜时机房的灯全灭了.
分配律
P (Q R) ( P Q) ( P R)
吸收律
P ( P Q) P , P ( P Q) P
1-4 真值表与等价公式
4.基本等价公式
德·摩根律 同一律 零律 否定律 (互补律) 条件式转化律 双条件转化律
( P Q) P Q , ( P Q) P Q
1-3 命题公式与翻译
1、命题公式(合式公式)
定义 1 由命题变元、常元、联结词、括号以规定的格式联结 起来的字符串称为命题公式,也称合式公式.命题公式中的命 题变元称为命题公式的分量.
例如,若 P 和 Q 是命题变元, 则下面式子均是命题公式
真值表与等价公式

思考:命题公式是命题吗?为 什么?
解答:命题公式不一定是命题。
因为命题公式没有确定的真值。
把符号命题翻译成自然语言命题: 这种翻译比较简单,只要求用词准确,力求保
持原命题的意思。 例 设 A: 今天下雨。
B: 今天下雪。 C: 今天天晴。试把下列命题翻译成自然语言: 1) ┐(A∧B) 2) C↔ (┐A∧┐B) 3) A∨B→┐C 解 :1) 说今天下雨且下雪是不对的。 2) 今天天晴当且仅当今天既不下雨又不下雪。 3) 如果今天下雨或者下雪, 今天就不是晴天。
¬(p→q)∧ q
0
0
0
0
( p→q)∧¬r 1 0 1 0 0 0 1 0
公式的分类 设A为一个命题公式,则:
1 若A在它的所有解释下都为真, 则 称A为 永 真 式(也 称 为 重 言 式)
2 若A在它的所有解释下都为假, 则 称A为 永 假 式(也 称 为 矛 盾 式)
3 若A在 它 的 至 少 一 个 解 释为下真 , 则 称A为 可 满 足 式(也 称 偶 然 式)
定义1-12 如果X是命题公式A的一部分,且X本身 是一个合式公式,则称X为公式A的子公式。
定理1-3 设X是命题公式A的子公式,若X⇔Y,如 果将A中的X用Y置换,所得的公式B与命题公式 A等价。
证明:
因为在相应分量的任一种真值指派下,X和Y的 真值都相同,用Y置换X后,公式B与A在相应分 量的真值指派下,其真值仍相同,所以A⇔B 。
一、命题公式
回顾
命题公式也称命题演算的合式公式(Well form formula,简写为wff)。
定义1-6 命题公式的递归定义如下:
命题逻辑等值演算

1设A与B均为含n个命题变项的公式, 判断下列命题是否为真?.(1)A B 当且仅当 A B是可满足式.该命题为真该命题为假(2)A B 当且仅当 A与B有相同的主析取范式.该命题为真该命题为假(3)若A为重言式, 则A的主析取范式中含有2n个极小项.该命题为真该命题为假(4)若A为矛盾式, 则A的主析取范式为1.该命题为真该命题为假(5)若A为矛盾式, 则A的主合取范式为1.该命题为真该命题为假(6)任何公式A都能等值地化为联结词集{∧、∨} 中的公式.该命题为真该命题为假(7)任何公式A都能等值地化为联结词集{┐、→、∧}中的公式.该命题为真该命题为假用等值演算法来判断下列公式的类型.2.(1)(p→q)→(┐q→┐p)(2)┐(p→q)∧r∧q(3)(p→q)∧┐p3用主析取范式法判断题2中3个公式的类型, 并求公式的成真赋值. .题2中三个公式如下:(1)(p→q)→(┐q→┐p)(2)┐(p→q)∧r∧q(3)(p→q)∧┐p求题2中3个公式的主合取范式, 并求公式的成假赋值.4.题2中三个公式如下:(1)(p→q)→(┐q→┐p)(2)┐(p→q)∧r∧q (3)(p→q)∧┐p5 . 已知命题公式A中含3个命题变项p, q, r, 并知道它的成真赋值分别为001, 010, 111, 求A的主析取范式和主合取范式.6. 用等值演算法证明下面等值式.(1)(┐p∨q)∧(p→r)p→(q∧r)(2)(p∧q)∨┐(┐p∨q)p7.求公式(p→┐q)∧r在以下各联结词完备集中与之等值的一个公式:(1){┐,∧, ∨}(2){┐,∧}(3){┐,∨}(4){┐, →}(5){↑}8.用等值演算法求解下面问题.某公司要从赵、钱、孙、李、周五名新毕业的大学生中选派一些人出国学习. 选派必须满足以下条件:(1)若赵去, 则钱也去(2)李、周中至少去一人(3)钱、孙中去且仅去一人(4)孙、李两人都去或都不去(5)若周去, 则赵、钱也同去问该公司应选派哪些人出国?例题分析题1分析:(1)A B 当且仅当 A B为重言式, 而不是可满足式.(2)A B说明A与B有相同的成真赋值, 因而有相同的主析取范式;反之若A与B有相同的主析取范式,说明它们有相同的成真赋值,当然也有相同的成假赋值. 因而A B为重言式,故A B.(3)若A为重言式, 说明2n个赋值都是成真赋值, 因而主析取范式中含有2n个极小项.(4)若A为矛盾式, 则A无成真赋值, 因而A的主析取范式不含任何极小项, 规定A的主析取范式为0, 而不是1. 若是1, 则A1, 这与A为矛盾式不是矛盾了吗?(5)若A为矛盾式, 则A的2n个赋值都是成假赋值, 因而主合取范式应含有2n个极大项, 而不是1. 若为1,则A1, A不就成了重言式了吗?(6){∧、∨}不是联结词完备集. 因而, 有的公式不能等值地化为它中的公式. 例如:p q ┐p∨q ┐(p∧┐q) ... 但无论如何不能只含联结词∧和∨.(7){┐、→}是联结词完备集, 在它中再加一个联结词∧, 所得集合{┐、→、∧}也为完备集, 因而任何公式A都能等值地化为联结词集{┐、→、∧}中的公式.题2分析:(1)(p→q)→(┐q→┐p)┐(┐p∨q)∨(q∨┐p) (蕴涵等值式)(p∧┐q)∨(┐p∨q) (德·摩根律、交换律)((p∧┐q)∨┐p)∨q (结合律)((p∨┐p)∧(┐q∨┐p))∨q (分配律)(1∧(┐p∨┐q))∨q (排中律、交换律)┐p∨(┐q∨q) (同一律、结合律)┐p∨1 (排中律)1 (零律)由于该公式与1等值, 故它为重言式.(2)┐(p→q)∧r∧q┐(┐p∨q)∧q∧r (蕴含等值式、交换律)p∧(┐q∧q)∧r (德·摩根律、结合律)p∧0∧r (矛盾律)0 (零律)由于公式与0等值, 故它为矛盾式.(3)(p→q)∧┐p(┐p∨q)∧┐p (蕴含等值式)┐p (吸收律)由最后一步可知, 该公式既有成真赋值00和01, 又有成假赋值10和11, 故它为可满足式.注意:等项演算的过程不是唯一的, 但重言式一定与1等值, 矛盾式一定与0等值. 而可满足式化简到能观察出成真和成假赋值都存在即可.题3分析:求主析取范式可用真值表法, 也可以用等值演算法, 这里用等值演算法.(1)(p→q)→(┐q→┐p)┐(┐p∨q)∨(q∨┐p) (消去→)(p∧┐q)∨┐p∨q(┐内移) (已为析取范式)(p∧┐q)∨(┐p∧┐q)∨(┐p∧q)∨(┐p∧q)∨(p∧q)(*)m2∨m0∨m1∨m1∨m3m0∨m1∨m2∨m3 (幂等律、排序)(*)由┐p及q派生的极小项的过程如下:┐p┐p∧(┐q∨q)(┐p∧┐q)∨(┐p∧q)q(┐p∨p)∧q(┐p∧q)∨(p∧q)熟练之后, 以上过程可不写在演算过程中. 该公式中含n=2个命题变项, 它的主析取范式中含了22=4 个极小项, 故它为重言式, 00, 01, 10, 11全为成真赋值.(2)┐(p→q)∧r∧q┐(┐p∨q)∧r∧q (消去→)p∧┐q∧q∧r(┐内移)0 (矛盾律和零律)该公式的主析取范式为0, 故它为矛盾式, 00, 01, 10, 11全为成假赋值, 无成真赋值.(3)(p→q)∧┐p(┐p∨q)∧┐p (消去→)┐p∨(┐p∧q) (分配律、幂等律) 已为析取范式(┐p∧┐q)∨(┐p∧q)m0∨m1主析取范式中含2个极小项, 成真赋值为00和01.题4分析:求公式的主合取范式一般可有三种方法:(i)真值表法;(ii)等值演算法;(iii)用主析取范式求主合取范式.这里用方法(iii), 其余两种方法留给读者.(1)由题3可知, 主析取范式为:(p→q)→(┐q→┐p)m0∨m1∨m2∨m3因而该公式为重言式, 它的主合取范式为1, 无成假赋值.(2)由题3可知, 它为矛盾式, 即它的主析取范式为0, 因而无成真赋值, 于是主合取范式含8个极大项,即:┐(p→q)∧r∧q M0∧M1∧M2∧M3∧M4∧M5∧M6∧M7(3)该公式的主析取范式中含2个极小项m0和m1, 故主合取范式中含22-2=2个极大项M2和M3, 即(p→q)∧┐p M2∧M3成假赋值为10和11.题5分析:由于公式含3个命题变项, 并且已知有3个成真赋值001, 010, 111, 因而有5个成假赋值000, 011, 100, 101, 110.成真赋值对应的极小项分别为m1, m2, m7, 故主析取范式为A m1∨m2∨m7成假赋值对应的极大项分别为M0, M3, M4, M5, M6, 故主合取范式为A M0∧M3∧M4∧M5∧M6注意:公式的真值表与主析取范式(主合取范式)可以相互唯一确定.题6分析:用等值演算法证明A B, 可以有3种方式. 从A出发, 证到B;从B出发证到A;或证明A C和BC,由于等值关系有传递性和对称性, 故A B.题7分析:(1)(p→┐q)∧r(┐p∨┐q)∧r (已满足要求)(2)(p→┐q)∧r(┐p∨┐q)∧r┐(p∧q)∧r (已满足要求)(3)(p→┐q)∧r(┐p∨┐q)∧r┐┐((┐p∨┐q)∧r)┐(┐(┐p∨┐q)∨┐r) (已满足要求)(4)(p→┐q)∧r┐┐((p→┐q)∧r)┐(┐(p→┐q)∨┐r)┐( (p→┐q)→┐r) (已满足要求)(5)(p→┐q)∧r(┐p∨┐q)∧r┐(p∧q)∧r(p↑q)∧r┐┐((p↑q)∧r)┐((p↑q)↑r)((p↑q)↑r)↑((p↑q)↑r)注意:以上各式的推导和最后形式不唯一.题8分析:解此类问题的步骤应为:① 将简单命题符号化② 写出各复合命题③ 写出由各复合命题组成的合取式④ 将写出的公式化成析取范式, 给出其成真赋值, 即可得到答案.具体解法如下:① 令 p:派赵去q:派钱去r:派孙去s:派李去u:派周去② (1) p→q(2) s∨u(3) ((q∧┐r)∨(┐q∧r))(4) ((r∧s)∨(┐r∧┐s))(5) u→(p∧q)③ 设A=(p→q)∧(s∨u)∧((q∧┐r)∨(┐q∧r))∧((r∧s)∨(┐r∧┐s))∧(u→(p∧q))④ 求A的析取范式(用等值演算法), 简要过程如下:A(┐p∨q)∧(s∨u)∧((q∧┐r)∨( ┐q∧r))∧((r∧s)∨(┐r∧┐s))∧(┐u∨(p∧q))(┐p∨q)∧((q∧┐r)∨(┐q∧r))∧((r∧s)∨(┐r∧┐s))∧(s∨u)∧(┐u∨(p∧q))((┐p∧q∧┐r)∨(q∧┐r)∨(┐p∧┐q∧r))∧((r∧s)∨(┐r∧┐s))∧(s∨u)∧(┐u∨(p∧q))((q∧┐r)∨(┐p∧┐q∧r))∧((r∧s)∨(┐r∧┐s))∧(s∨u)∧(┐u∨(p∧q)) (用了吸收律)((┐p∧┐q∧r∧s)∨(q∧┐r∧┐s))∧(s∨u)∧(┐u∨(p∧q))((┐p∧┐q∧r∧s)∨(┐p∧┐q∧r∧s∧u)∨(q∧┐r∧┐s∧u))∧(┐u∨(p∧q))(┐p∧┐q∧r∧s∧┐u)∨(p∧q∧┐r∧┐s∧u)最后一步得到一个主析取范式, 含有两个极小项. 当p, q, r, s, u取值分别为0, 0, 1, 1, 0 或 1, 1, 0, 0, 1 时, A为真, 故公司应派孙、李去, 而赵、钱、周不去,或赵、钱、周去, 而孙、李不去.注意, 在演算中, 多次用了矛盾律和同一律.返回例题答案题1答案:(1)为假;(2)为真;(3)为真;(4)为假;(5)为假;(6)为假;(7)为真.题2答案:(1)为重言式;(2)为矛盾式;(3)为可满足式.题3答案:(1)为重言式, 00, 01, 10, 11为成真赋值.(2)为矛盾式, 无成真赋值. (3)为可满足式, 成真赋值为00和01.题4答案:(1)该公式的主合取范式为1, 无成假赋值.(2)它的主合取范式为:M0∧M1∧M2∧M3∧M4∧M5∧M6∧M7, 8个赋值全是成假赋值.(3)该公式的主析取范式为M2和M3, 成假赋值为10和11.题5答案:A的主析取范式为 m1∨m2∨m7;A的主合取范式为 M0∧M3∧M4∧M5∧M6.题6答案:(1)从左出发证(┐p∨q)∧(p→r)(┐p∨q)∧(┐p∨r) (蕴涵等值式)┐p∨(q∧r) (分配律)p→(q∧r) (蕴涵等值式)也可以从右出发证(请读者自己证).(2)从右出发证pp∧1 (同一律)p∧(q∨┐q) (排中律)(p∧q)∨(p∧┐q) (分配律)(p∧q)∨┐┐(p∧┐q) (双重否定律)(p∧q)∨┐(┐p∨q) (德·摩根律)题7答案:答案不唯一, 参看分析.题8答案:应该派赵、钱、周或派孙, 李去.返回。
【精品】命题公式分类及等值演算2

命题公式及分类 等值演算
福建师范大学数学与计算机科学学院
1.2 命题公式及其赋值
• 简单命题是真值唯一确定的命题逻辑中最基本的研 究单位,所以也称简单命题为命题常项或命题常元。 用p,q,r,…等小写字母表示命题常项。 • 称真值可以变化的陈述句为命题变项或命题变元 。 也用p,q,r,…表示命题变项。 • 当p,q,r,…表示命题变项时,它们就成了取值0或1的 变项,因而命题变项已不是命题。 • 这样一来,p,q,r,…既可以表示命题常项,也可以表 示命题变项。在使用中,需要由上下文确定它们表 示的是常项还是变项。 • 将命题变项用联结词和圆括号按一定的逻辑关系联 结起来的符号串称为合式公式或命题公式。
定义1.8 赋值或解释
• 设p1,p2,…,pn是出现在公式A中的全部命题变项,给 p1,p2,…,pn各指定一个真值,称为对A的一个赋值或解 释。若指定的一组值使A的真值为1,则称这组值为A的 成真赋值;若使A的真值为0,则称这组值为A的成假赋 值。 • 对含n个命题变项的公式A的赋值情况做如下规定: (1)若A中出现的命题符号为p1,p2,…,pn,给定A的赋值 α1α2,…,αn 是指p1=α1,p2=α2,…,pn=αn。 (2)若A中出现的命题符号为p,q,r...,给定A的赋值 α1,α2,…,αn是指p=α1,q=α2,…,最后一个字母赋值αn。 上述αi取值为0或1,i=1,2,…,n。
真值表
• 将命题公式A在所有赋值下取值情况列成表, 称作A的真值表。
构造真值表的具体步骤如下: (1)找出公式中所含的全体命题变项p1,p2,…,pn (若无下角标就 按字典顺序排列),列出2n个赋值。本书规定,赋值从00…0 开始,然后按二进制加法依次写出各赋值,直到11…1为止。 (2)按从低到高的顺序写出公式的各个层次。 (3)对应各个赋值计算出各层次的真值,直到最后计算出公式的 真值。 公式A与B具有相同的或不同的真值表,是指真值表的最 说 后一列是否相同,而不考虑构造真值表的中间过程。 明
命题逻辑I 命题公式与等值演算

合式公式的层次 (续)
例如 公式 p p p q (p q ) r ((pq) r)(rs)
0层 1层 2层 3层 4层
21
公式的赋值
定义 给公式A中的命题变元 p1, p2, … , pn指定 一组真值,称为对A的一个赋值或解释 成真赋值: 使公式为真的赋值 成假赋值: 使公式为假的赋值 说明: 赋值=12…n之间不加标点符号,i=0或1. A中仅出现 p1, p2, …, pn,给A赋值12…n是 指 p1=1, p2=2, …, pn=n A中仅出现 p, q, r, …, 给A赋值123…是指 p=1,q=2 , r=3 … 含n个变元的公式有2n个赋值.
28
2元真值函数对应的真值表 p q 0 0 0 1 p 0 0 0 1 0 1 1 1 q 0 1 1 1
F0( 2) F1( 2) F2( 2) F3( 2) F4( 2) F5( 2) F6( 2) F7( 2)
0 0 0 0
F8( 2)
0 0 0 1
F9( 2)
0 0 1 0
( 2) F10
15
例
例 求下列复合命题的真值 (1) 2 + 2 = 4 当且仅当 3 + 3 = 6.
(2) 2 + 2 = 4 当且仅当 3 是偶数.
(3) 2 + 2 = 4 当且仅当 太阳从东方升起. (4) 2 + 2 = 4 当且仅当 美国位于非洲.
1 0
1 0 0
16
(5) 函数 f (x) 在x0 可导的充要条件是它在 x0 连续.
p q
p q p q
q p q p p q q p q p
14
注意: pq 与 qp 等值(真值相同)
真值表逻辑等价永真蕴涵

逻辑等价
• 在真值表中,两个命题公式A和B 在分量的不同指派下,其真值总是 相同的,则称这两个命题公式A和B 是逻辑等价的
• 记做A⇔B
10
逻辑等价例1
• 证明┐P∨Q ⇔ P→Q
P 0 0 1 1 Q 0 1 0 1 ┐P∨Q 1 1 0 1 P→Q 1 1 0 1
11
逻辑等价例2
• 证明 P▽Q⇔(┐P∧Q)∨(┐Q∧P)
(9)┐P∧(P∨Q) ⇒ Q
(10)(P→Q)∧(Q→R) ⇒ P→R
(11)(P∨Q)∧(P→R)∧(Q→R) ⇒ R (12)(P→Q)∧(R→S) ⇒ (P∧R)→(Q∧S ) (13)(PQ) ∧(QR) ⇒ (P R)
33
永真蕴含的性质
• 设A、B、C是命题公式 (1)若A⇔B,则A⇒B,B⇒A; (2)若A⇒B, 则 PA⇒PB; PA⇒PB;(补充) PA⇒PB;(补充) (注意: AP⇒BP;AP⇒BP; PA⇒PB 或PA⇒PB 都不一定成立。)
• P∨(Q∧R) ⇔ (P∨Q)∧(P∨R) (分配律) P∧(Q∨R) ⇔ (P∧Q)∨(P∧R) • P∨(P∧Q) ⇔ P P∧(P∨Q) ⇔ P (吸收律)
14
常用的逻辑等价公式(3)
• ┐(P∨Q) ⇔ ┐P∧ ┐Q ┐(P∧Q) ⇔ ┐P∨ ┐Q (摩根律)
•
P∨ P ⇔ P P∧ P ⇔ P P∨ 0 ⇔ P P∧ 1 ⇔ P
证明: 因为P→Q ⇔ ┐P∨Q, 利用代换规则得 P∧(P→Q) ⇔ P∧(┐P∨Q) ⇔ (P∧ ┐P)∨(P∧Q) ⇔ 0∨(P∧Q) ⇔ P∧Q
17
命题的演算
• 利用代换规则从一个命题得到另一 个逻辑等价的命题称为命题的演算。
计算命题演算公式的真值

LSNode;/*定义了链式堆栈用于下面检测表达式的括号匹配*/
void StackInitiate(LSNode** head) /*初始化堆栈*/
int StackNotEmpty(LSNode* head) /*检测堆栈是否为空的函数*/
int StackPush(LSNode* head,DataType x) /*将元素入栈*/
程序要更加细心才行。
4.
此程序中'&T~'分别代表代表’与''或''非'运算
首先输入一个包含变量,运算符表达式,再按Enter执行。再依次输入各变量的值。如
果不继续输入,按0退出。再按y继续或者n退出。
5.
输入a&b&c
p->n ext=head->n ext;
head->n ext=p;
return1;
}
/*将元素入栈*/
int StackTop(LSNode* head,DataType *d) {
LSNode* p=head-> next;
if(p==NULL)
{
cout<<"堆栈已空出错"<<endl; return 0;
void StackPush2(SeqStack2 *S,BiTreeNode 2*/
int Con vert(char a[500],char b[500][100],SeqStack1 *S,i nt n) /*将待求表
har b[500][100],i nt n)/*根据表达式的后缀形式,构
}
/*弹岀栈顶元素*/
离散数学-逻辑学-命题公式求真值表

离散逻辑学实验班级: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 表示假。
命题逻辑的等值和推理演算

(PQ) = PQ = PQ = (P∧Q)∨(P∧Q)
8. 同一律 P∨F = P P∧T = P TP = P TP = P
还有 PF = P FP = P
9. 零律 P∨T = T P∧F = F
还有
PT = T FP = T 10. 补余律 P∨P = T P∧P = F 还有
P Q = Q P 4. 分配律
P∨(Q∧R) = (P∨Q)∧(P∨R) P∧(Q∨R) = (P∧Q)∨(P∧R)
P(QR) = (PQ)(PR) 5. 等幂律(恒等律)
P∨P = P P∧P = P
PP = T
PP = T
6. 吸收律 P∨(P∧Q) = P P∧(P∨Q) = P
7. 摩根律 (P∨Q) = P∧Q (P∧Q) = P∨Q
Venn图可以用来理解 集合间、命题逻辑中、 部分信息量间的一些 关系。
2.2.2 若干常用的等值公式
等值演算中,由于人们对、∨、∧更为熟 悉,常将含有和的公式化成仅含有、 ∨、∧的公式。这也是证明和理解含有, 的公式的一般方法。但后面的推理演算 中,更希望见到和.
11. PQ = P ∨Q
证明:
左端= (P∧(Q∧R)) ∨((Q∨P)∧R) (分配律)
=((P∧Q)∧R))∨((Q∨P)∧R) (结合律)
=((P∨Q)∧R)∨((Q∨P)∧R) (摩根律)
=((P∨Q)∨(Q∨P))∧R
(分配律)
=((P∨Q)∨(P∨Q))∧R
(交换律)
=T∧R
(置 换)
=R
(同一律)
例2: 试证 ((P∨Q)∧(P∧(Q∨R)))
问题提出:由命题公式写真值表是容易 的,那么如何由真值表写命题公式呢?
命题公式真值表

(4) (P Q) (P Q);
(5) (P Q) (P Q).
A
6
1-4 真值表与等价公式
解 (1) P Q 的真值表为:
P
Q
T
T
T
F
F
T
F
F
P Q
T F T T
(2) P Q 的真值表为:
P
Q
PQ
T
T
T
T
F
F
F
T
T
F
F
T
A
7
1-4 真值表与等价公式
(3) (P Q) P 的真值表为:
(1)单个命题变元本身是一个合式公式;
(2)如果 A 是合式公式,那么 A是合式公式;
(3)如果 A 和 B 是合式公式,那么
A B , A B , A B, A B 是合式公式;
(4)当且仅当能够有限次地应用(1)、(2)、(3)
所得到的包含命题变元,联结词和括号的字符串
是合式公式.
A
3
1-3 命题公式与翻译
A 中的 X 用Y 置换,所得公式 B 与公式 A 等价,即 A B .
例 4 证明: Q (P (P Q)) Q P
例 5 证明下列等价式
(1) (P Q) (P Q) P ;
(2) P (Q R) Q (P R) .
练习 证明 P (Q R) (P Q) R
A
14
1-4 真值表与等价公式
例 6 化简下列命题公式: (1) P (P (Q P)) (2) (P Q) (Q P)
说明:
(1)命题变元是没有真假值的,只有当命题变元用 确定的命题代入时,才得到一个命题,命题的真值 依赖于代换变元的那些命题的真值;
常用的命题等价公式

0
成立
练习 :用真值表判断下列等价公式是否成立 1 (1)p (q r ) ( p q ) r 成立
p 0 0 0 0 1 1 1 1 q 0 0 1 1 0 0 1 1 r 0 1 0 1 0 1 0 1 q→r 1 p∧q 0 p→(q → r) ( p∧q )→ r 1 1 1 1 1 1 1 1 0 1 1 1 1 1
证明 1):( p q) r (p q ) r ( (p q ) r ( p q ) r ( q p ) r
(2) p q r p r q r
(2) p q r p r q r
(2)( p q) p q r 解 : ( p q) p q r (p q) p q r (p p) (q p) q r 0 (q p) q r (q p) q r (q p) q r (q p) q r q p q r 1 r 0 r 0 该公式是永假式
练习4:利用基本等价公式判断下列公式的类型
(1) ( p q ) q p (2)( p q) p q r 解(1): p q) q p (
( p q ) q p (p q ) (q q ) p ( p q ) 0 p ( p q ) p (p q ) p ( p q ) p p q p 1 该公式是永真式
由于日本和中国不能并列第一,日本不能既第一又第三, 韩国和日本不能并列第三,即第一、第三和第四为0,所以 (R1 Q 3 P 1 R3) 1 ⑷
离散数学-命题演算

P Q
于是得到: (P Q) (P Q)
Lu Chaojun, SJTU
21
还有别的联结词吗?
• 除,,,,外还可定义其他联结词.如:
异或: P Q = (P Q) (P Q) 与非(NAND): P | Q = (P Q) Sheffer stroke 或非(NOR): P Q = (P Q) Peirce arrow
Lu Chaojun, SJTU
19
方法一
• 从每个使为真的解释写出一个各命题变
元的合取式;然后写出各合取式的析取式.
例:有三个成真解释.
P
Q
由(P,Q)=(F,F)可写出合取式: F
F
T
P Q
F
T
T
T
F
F
由(P,Q)=(F,T)可写出合取式: T
T
T
P Q
由(P,Q)=(T,T)可写出合取式:P Q
• 将 中所有肯定形式出现的变元Pi换成Pi, 所
有否定形式出现的变元Pi换成Pi, 所得公式记
为-. • 注意:求*时不能有,;求-时无此限制.
Lu Chaojun, SJTU
29
*和-的性质
• 定理
(*)* = (-)-=
• 定理
(*) = ()* (-) = ()-
• 定理
= *- (De Morgan律的一般形式)
命题逻辑的等值演算 和推理演算
主要内容
• 公式间的等值关系与等值演算 • 利用真值表列写公式 • 联结词的完备集 • 对偶定理 • 范式和主范式 • 公式间的重言蕴涵关系与推理演算
Lu Chaojun, SJTU
2
公式间的等值关系
命题公式及真值表

离散结构命题公式及真值表教学目标基本要求(1)会判断命题公式及其层次;(2)真值表;(3)公式类型;重点难点真值表的应用。
命题中的符号命题中的符号:(1) 命题常元:真值唯一确定。
例如:T、F(2) 命题变元:真值可变化。
例如:P、Q、R(3) 联接词:优先级按¬, ∧, ∨, →, ↔递减(4) 辅助符号如括号()。
命题中的符号任意组成的符号串是否都有意义?例:(∧p ¬q) pq →(思考:按什么规律组成的符号串才有意义?合式公式合式公式:合法的命题公式。
(简称公式)(1)命题常元或变元是合式公式(2)若A, B是合式公式,(¬A),(A∧B),(A∨B),(A→B),(A↔B)也是合式公式(3)只有有限次地应用(1)、(2)形成的符号串才是合式公式注意这个定义是递归的。
(1)是递归的基础,由(1)开始,使用规则(2),可以得到任意的合式公式。
公式简写的约定1) 最外层括号可以省略;2) 省略括号后, 运算顺序与联结词的优先级一致,则可以省略;3) 相同联结词按从左到右的顺序计算,则可以省略。
公式的层次定义:(1)若公式A 是单个的命题变项,则称A 为0层公式。
(3)若公式的层次为k ,则称A 是k 层公式。
(2)若有下面情况之一的,称A 为n+1层公式:A 是¬B ,B ∧C ,B ∨C ,B→C ,B↔C ,其中B 、C 分别是i 层、j 层公式,且n=max(i,j); 例:((¬p ∧q)∨(p ∧ ¬q))→r1层 2层 3层 4层公式的解释命题公式代表一个命题,但只有当公式中的每一个命题变元都用一个确定的命题代入时,命题公式才有确定值,成为命题。
解释(I):给公式A( P1,P2,…,Pn )中的命题变元P1,P2,…,Pn指定一组真值称为对A的一个解释(赋值)。
成真赋值: 使公式为真的赋值。
成假赋值: 使公式为假的赋值。
用真值表法判断命题公式

用真值表法判断命题公式真值表法是一种常用的推理方法,用于判断命题公式的真假。
它通过列出所有可能的真假组合来确定命题公式的真值。
在进行真值表法判断时,首先需要确定命题公式中所有的命题变量。
命题变量是命题公式中可以取真或假的变量。
然后,列出所有可能的真假组合,并依次代入命题公式,以确定每种组合下命题公式的真值。
举个例子,假设我们有一个命题公式为p∨(¬q∧r),其中p、q和r是命题变量。
那么我们可以列出如下的真假组合:p,q,r,¬q,(¬q∧r),p∨(¬q∧r):-----:,:-----:,:-----:,:--:,:------:,:----------:真,真,真,假,假,真真,真,假,假,假,真真,假,真,真,真,真真,假,假,真,假,真假,真,真,假,假,假假,真,假,假,假,假假,假,真,真,真,真假,假,假,真,假,假通过代入每种组合,我们可以得出该命题公式的真值表。
从真值表中可以看出,该命题公式在p为真,或(¬q∧r)为真时,整个命题公式为真。
因此,该命题公式可以表示为p∨(¬q∧r)。
这就是真值表法判断命题公式的基本过程。
在进行真值表法判断时,我们还可以利用真值表的特点来推导命题公式的等价关系、重言式、矛盾式等。
例如,如果我们得出一个真值表中的其中一列的值全为真,那么可以得出该命题公式是一个重言式。
如果其中一列值全为假,那么命题公式是一个矛盾式。
真值表法的优点是能够准确地判断命题公式的真假,而不受语义混淆的干扰。
然而,对于较复杂的命题公式而言,真值表法的计算量可能非常庞大,因为需要列出所有可能的真假组合。
在这种情况下,可以考虑使用其他推理方法,如逻辑推理、等价转换、命题演算等来简化问题。
综上所述,真值表法是一种能够准确判断命题公式真假的常用推理方法。
它通过列出所有可能的真假组合,代入命题公式,来确定命题公式的真值。
真值表法可以用于推导命题公式的等价关系、重言式和矛盾式,并且可以用于简化复杂的命题公式。
命题逻辑的等值演算

1命题逻辑的等值演算这一讲讨论命题公式之间的等值关系,其中一些重要的等值关系将用于对命题公式进行等值运算和设计推理规则。
1. 等值式定义1.1 若命题公式A 和B 是恒等的布尔代数式,即在任何赋值下二者的值总相等,则称二者是等值的,记为A B A B ≡⇔或者称为等值式。
注意,等值式不是逻辑公式,而是逻辑学的公式。
显然,A ≡B 当且仅当A B ↔是永真公式。
等值关系的性质:(1) 自反性:对任何公式A ,都有 A A ≡。
(2) 对称性:若 A B ≡,则 B A ≡。
(3) 传递性:若 A B ≡且若 B C ≡,则 A C ≡。
例1.2 试证明下列等值式。
a a ⌝⌝≡证明:当a =1时,左式=101⌝⌝=⌝==右式。
当a =0时,左式=010⌝⌝=⌝==右式。
因此,左式恒等于右式。
依定义,该等值式成立。
例1.3试证明下列等值式。
()()() a b c a b a c ∧∨≡∧∨∧证明:当a =1时,左式=b c ∨,右式=b c ∨,两边相等。
当a =0时,左式=0,右式=0,两边相等。
因此,该等值式成立。
2上述两例中的证明方法可以称为代数分析法。
还有一种演算方法,可以将将左式等值地变形为右式。
这种保持公式真值的演算称为等值演算。
2. 等值演算规则:替换等值演算是将当前公式中的某个子公式替换为与之等值的公式。
替换在课本中称为置换,与抽象代数中的置换(permutation )是不同的概念。
替换的定义如下。
定义3.1 设[] A Φ是一个命题公式,A 是出现在其中某处的一个子公式。
若用另外一个公式B 替换[] A Φ中的A ,则可得一个新公式,记为[] A Φ。
我们称这种公式变形为替换(replacement )。
注意,这里A 是指[] A Φ中某一处出现的子公式,不是[] A Φ中所有与A 相同的子公式。
例如,将()()p q p r ⌝⌝→∨⌝⌝→中第二次出现的子公式p ⌝⌝替换为p ,得()()p q p r ⌝⌝→∨→定理3.2(替换原理)若 A B ≡,则[][] A B Φ≡Φ。
命题逻辑的真值形式

命题逻辑的真值形式命题逻辑是一种研究命题及其关系的逻辑系统,它可以用来分析和推理自然语言中的陈述句。
命题逻辑的基本单位是命题,即能够判断为真或假的陈述句。
例如,“今天是星期五”、“北京是中国的首都”、“2+2=5”等都是命题。
命题之间可以通过逻辑联结词(如“与”、“或”、“非”、“如果……那么……”等)组合成复合命题,例如,“今天是星期五且北京是中国的首都”、“如果2+2=5,那么我是超人”等。
为了方便表示和操作命题,我们通常会用符号来代替自然语言中的命题和联结词,这就是命题逻辑的符号化。
符号化的好处是可以避免自然语言中的歧义、模糊和冗余,使得逻辑表达更加清晰和精确。
符号化的过程包括以下几个步骤:为每个原子命题(即不能再分解为更小的命题的命题)分配一个字母,如p、q、r等。
为每个逻辑联结词分配一个符号,如∧(与)、∨(或)、¬(非)、→(如果……那么……)等。
按照自然语言中的命题结构,用括号和符号将原子命题组合成复合命题。
例如,我们可以将“今天是星期五且北京是中国的首都”符号化为p∧q,其中p表示“今天是星期五”,q表示“北京是中国的首都”。
我们也可以将“如果2+2=5,那么我是超人”符号化为r→s,其中r表示“2+2=5”,s表示“我是超人”。
命题逻辑的真值在命题逻辑中,每个命题都有一个确定的真值,即真(T)或假(F)。
原子命题的真值由事实决定,例如,“今天是星期五”的真值取决于今天是否真的是星期五。
“2+2=5”的真值则永远是假,因为它违反了数学规律。
复合命题的真值则由原子命题的真值和逻辑联结词的真值表决定。
真值表是一种列出所有可能情况下命题真值的表格,它可以帮助我们判断复合命题在不同情况下的真假。
例如,以下是“与”、“或”、“非”、“如果……那么……”四种联结词的真值表:p q p∧qT T TT F FF T FF F Fp q p∨qT T TT F TF T TF F Fp¬pT FF Tp q p→qT T TT F FF T TF F T真值表的读法是这样的:对于每一行,如果给定的原子命题的真值分别是该行的第一列和第二列,那么复合命题的真值就是该行的最后一列。
计算命题演算公式的真值

四计算命题演算公式的真值一.实验题目所谓命题演算公式是指由逻辑变量(其值为TRUE或FALSE)和逻辑运算符∧(AND)、∨(OR)和┐(NOT)按一定规则所组成的公式(蕴含之类的运算可以用∧、∨和┐来表示)。
公式运算的先后顺序为┐、∧、∨,而括号()可以改变优先次序。
已知一个命题演算公式及各变量的值,要求设计一个程序来计算公式的真值。
要求:(1)利用二叉树来计算公式的真值。
首先利用堆栈将中缀形式的公式变为后缀形式;然后根据后缀形式,从叶结点开始构造相应的二叉树;最后按后序遍历该树,求各子树之值,即每到达一个结点,其子树之值已经计算出来,当到达根结点时,求得的值就是公式之真值。
(2)逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。
(3)根据用户的要求显示表达式的真值表。
二.实验设计1. 设计思想(1)数据结构设计a 建立一个链式堆栈,实现括号的匹配问题。
b建立一个顺序堆栈,来实现中缀转后缀并实现二叉树的打印。
(2)算法设计a.括号匹配b中缀转后缀c打印二叉树和真值表2. 设计表示自定义和调用的函数如下所示:#include""#include""#include<>#include<>#include<>#include<>#include<>函数说明如下SeqStack1; /*定义一个堆栈SeqStack1*/void StackInitiate1(SeqStack1 *S) /*初始化堆栈1,栈底为‘#’*/void StackPush1(SeqStack1 *S,DataType x) /*将元素压入堆栈1*/void StackPop1(SeqStack1 *S,DataType *x) /*弹出堆栈1的栈顶元素*/int StackTop1(SeqStack1 S,DataType *d) /*取堆栈1的栈顶元素*/SeqStack2; /*定义一个顺序堆栈SeqStack2*/void StackInitiate2(SeqStack2 *S) /*初始化堆栈2*/BiTreeNode * StackPop2(SeqStack2 *S) /*从堆栈2中弹出栈顶元素*/BiTreeNode; /*定义二叉树的结点*/void Initiate(BiTreeNode **root) /*初始化树的根结点*/void print(BiTreeNode *bt,int n) /*逆时针打印二叉树*/void StackPush2(SeqStack2 *S,BiTreeNode *x) /*将二叉树结点压入堆栈2*/int Convert(char a[500],char b[500][100],SeqStack1 *S,int n) /*将待求表达式转换为后缀形式*/BiTreeNode * BuildTree(char b[500][100],int n)/*根据表达式的后缀形式,构造相应的二叉树*/LSNode; /*定义了链式堆栈用于下面检测表达式的括号匹配*/void StackInitiate(LSNode** head) /*初始化堆栈*/int StackNotEmpty(LSNode* head) /*检测堆栈是否为空的函数*/int StackPush(LSNode* head,DataType x) /*将元素入栈*/int StackPop(LSNode* head,DataType* d) /*弹出栈顶元素*/int StackTop(LSNode* head,DataType *d) /*取栈顶元素*/void Destroy(LSNode* head) /*撤消*/void ExplsCorrect(char exp[]) /*检测输入表达式的括号匹配函数*/i3.详细设计void StackInitiate(LSNode** head){if((*head=(LSNode*)malloc(sizeof(LSNode)))==NULL)exit(1);(*head)->next=NULL;} /*初始化堆栈*/int StackNotEmpty(LSNode* head){if(head->next==NULL)return 0;else return 1;}/*检测堆栈是否为空的函数,若为空,返回0,否则返回1*/typedef struct snode{DataType data;struct snode* next;}LSNode;/*定义了链表的结点用于下面检测表达式的括号匹配*/int StackPop(LSNode* head,DataType* d){LSNode* p=head->next;if(p==NULL){cout<<"堆栈已空出错"<<endl;return 0;}head->next=p->next;*d=p->data;free(p);return 1;}/*弹出栈顶元素*/int StackPush(LSNode* head,DataType x){LSNode* p;if((p=(LSNode*)malloc(sizeof(LSNode)))==NULL) {cout<<"内存空间不足无法插入!"<<endl;return 0;}p->data=x;p->next=head->next;head->next=p;return 1;}/*将元素入栈*/int StackTop(LSNode* head,DataType *d){LSNode* p=head->next;if(p==NULL){cout<<"堆栈已空出错"<<endl;return 0;}*d=p->data;return 1;}/*取栈顶元素*/void Destroy(LSNode* head){LSNode* p,*p1;p=head;while(p!=NULL){p1=p;p=p->next;free(p1);}}/*撤消*/三.调试分析在运行程序的过程中,碰到了一些错误,其中有很多是括号和分号的问题,看来以后写程序要更加细心才行。
命题逻辑真值形式

第一章命题逻辑一、真值形式1命题及其真值、原子命题和复合命题前题及其真值我们已经知道,作为逻辑研究主要对象的推理,是一个命题序列,是从某个或某些命题得到某个命题的思维过程。
那么,什么是命题呢?命题是表达判断的语句。
所谓判断,就是人对思维对象有所断定。
一切能被人思考的客体都构成思维对象,简称对象。
对象可以是有形的,也可以是无形的;可以是物质的,也可以是精神的;可以是存在的,也可以是不存在的。
总之,包罗万象。
对象要能被思考,必须具有一定的性质,处于——定的关系之中。
对象的性质和对象之间的关系•统称对象的属性。
没有属性的对象,是不存在的。
判断对对象有所断定,就是断定对象具有或不具有某种属性。
判断用语句的形式表达出来,就是命题。
例如:(1)所有不受外力作用的物体都作匀速直线运动。
(2)上帝是万能的追物主。
⑶如果上帝是万能的造物主,那么他既能又不能造出一块他自己都无法举起的石头。
这些都是命题。
命题都有真假。
没有真假的语切不表达确定的判断•因而不是命题。
命题的真或假,称为命题的真值。
也就是说,命题的真值包括两个值,一个值是“真”,另一个值是“假”。
真命题的真值是“真”,假命题的真值是“假”。
原子命题和复合命题原子命题是不包含和自身不同的命题的命题。
例如:(1)癌症是遗传的。
(2)癌症不是遗传的。
(3)并非癌症是遗传的。
(4)如果癌症是遗传的,那么老李患癌症是不可避免的。
(5)老李知道癌症是遗传的。
其中,句⑴和句⑵是原子命题,因为其中不包合和自身不同的命题,而句(3)、句⑷和句(5)不是原子命题,因为这些命题中都包含了和自身不同的命题(划横线的部分),这样的命题称为支命题。
像句(3)、句(4)和句(5)这样的命题,虽然都是包含支命题的非原子命题.但它们之间存在重要的区别。
句⑶和句⑷的真值是由其支命题的真值惟一地确定的,而句⑸则不是。
如果“癌症是遗传的”是真的,则句(3)是假的;如果“癌症是遗传的”是假的,则句(3)是真的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四计算命题演算公式的真值
一.实验题目
所谓命题演算公式是指由逻辑变量(其值为TRUE或FALSE)和逻辑运算符∧(AND)、∨(OR)和┐(NOT)按一定规则所组成的公式(蕴含之类的运算可以用∧、∨和┐来表示)。
公式运算的先后顺序为┐、∧、∨,而括号()可以改变优先次序。
已知一个命题演算公式及各变量的值,要求设计一个程序来计算公式的真值。
要求:
(1)利用二叉树来计算公式的真值。
首先利用堆栈将中缀形式的公式变为后缀形式;然后根据后缀形式,从叶结点开始构造相应的二叉树;最后按后序遍历该树,求各子树之值,即每到达一个结点,其子树之值已经计算出来,当到达根结点时,求得的值就是公式之真值。
(2)逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。
(3)根据用户的要求显示表达式的真值表。
二.实验设计
1. 设计思想
(1)数据结构设计
a 建立一个链式堆栈,实现括号的匹配问题。
b建立一个顺序堆栈,来实现中缀转后缀并实现二叉树的打印。
(2)算法设计
a.括号匹配 b中缀转后缀 c打印二叉树和真值表
2. 设计表示
自定义和调用的函数如下所示:
#include""
#include""
#include<>
#include<>
#include<>
#include<>
#include<>
函数说明如下
SeqStack1; /*定义一个堆栈SeqStack1*/
void StackInitiate1(SeqStack1 *S) /*初始化堆栈1,栈底为‘#’*/
void StackPush1(SeqStack1 *S,DataType x) /*将元素压入堆栈1*/
void StackPop1(SeqStack1 *S,DataType *x) /*弹出堆栈1的栈顶元素*/
int StackTop1(SeqStack1 S,DataType *d) /*取堆栈1的栈顶元素*/
SeqStack2; /*定义一个顺序堆栈SeqStack2*/
void StackInitiate2(SeqStack2 *S) /*初始化堆栈2*/
BiTreeNode * StackPop2(SeqStack2 *S) /*从堆栈2中弹出栈顶元素*/
BiTreeNode; /*定义二叉树的结点*/
void Initiate(BiTreeNode **root) /*初始化树的根结点*/
void print(BiTreeNode *bt,int n) /*逆时针打印二叉树*/
void StackPush2(SeqStack2 *S,BiTreeNode *x) /*将二叉树结点压入堆栈2*/
int Convert(char a[500],char b[500][100],SeqStack1 *S,int n) /*将待求表达式转换为后缀形式*/
BiTreeNode * BuildTree(char b[500][100],int n)/*根据表达式的后缀形式,构造相应的二叉树*/
LSNode; /*定义了链式堆栈用于下面检测表达式的括号匹配*/ void StackInitiate(LSNode** head) /*初始化堆栈*/
int StackNotEmpty(LSNode* head) /*检测堆栈是否为空的函数*/
int StackPush(LSNode* head,DataType x) /*将元素入栈*/
int StackPop(LSNode* head,DataType* d) /*弹出栈顶元素*/
int StackTop(LSNode* head,DataType *d) /*取栈顶元素*/
void Destroy(LSNode* head) /*撤消*/
void ExplsCorrect(char exp[]) /*检测输入表达式的括号匹配函数*/
i
3.详细设计
void StackInitiate(LSNode** head)
{
if((*head=(LSNode*)malloc(sizeof(LSNode)))==NULL)exit(1);
(*head)->next=NULL;
} /*初始化堆栈*/
int StackNotEmpty(LSNode* head)
{
if(head->next==NULL)return 0;
else return 1;
}
/*检测堆栈是否为空的函数,若为空,返回0,否则返回1*/
typedef struct snode
{
DataType data;
struct snode* next;
}LSNode;
/*定义了链表的结点用于下面检测表达式的括号匹配*/
int StackPop(LSNode* head,DataType* d)
{
LSNode* p=head->next;
if(p==NULL)
{
cout<<"堆栈已空出错"<<endl;
return 0;
}
head->next=p->next;
*d=p->data;
free(p);
return 1;
}
/*弹出栈顶元素*/
int StackPush(LSNode* head,DataType x)
{
LSNode* p;
if((p=(LSNode*)malloc(sizeof(LSNode)))==NULL) {
cout<<"内存空间不足无法插入!"<<endl;
return 0;
}
p->data=x;
p->next=head->next;
head->next=p;
return 1;
}
/*将元素入栈*/
int StackTop(LSNode* head,DataType *d) {
LSNode* p=head->next;
if(p==NULL)
{
cout<<"堆栈已空出错"<<endl;
return 0;
}
*d=p->data;
return 1;
}
/*取栈顶元素*/
void Destroy(LSNode* head)
{
LSNode* p,*p1;
p=head;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}/*撤消*/
三.调试分析
在运行程序的过程中,碰到了一些错误,其中有很多是括号和分号的问题,看来以后写程序要更加细心才行。
四.用户手册
此程序中'&''|''~'分别代表代表'与' '或' '非'运算
首先输入一个包含变量,运算符表达式,再按Enter执行。
再依次输入各变量的值。
如果不继续输入,按0退出。
再按y继续或者n退出。
五.测试数据及测试结果
输入a&b&c
六.源程序清单
typedef struct
{
DataType stack[1000];
int top;
}SeqStack1;
出真值计算 1.重新输入各变量的值):";
cin>>i;
if(i==0) break;
}
int v[100],p;
printf("真值表如下:\n");
End=0;
long count=(int)pow(2,num);
for(p=0;p<num;p++)
{
v[p]=0;
}
for (long ii=0;ii<count;ii++)
{
j=0;
for(i=0;i<20;i++)
{
if(b[i][0]!='!'&& b[i][0]!='&'&& b[i][0]!='|')
c[i]=v[j++];
}
for (int jj=0;jj<num;jj++)
{
printf("%d ",v[jj]);
}
printf("真值为:%ld\n",End=PostOrder(P,c,b,n));
printf("\n");
v[num-1]++;
p=num-1;
while(v[p]>=2)
{
v[p]%=2;
v[p-1]++;
p--;
}
}
cout<<"\n'y':继续下一个表达式的计算 'n':退出程序"<<endl;
cout<<"\n'y' or 'n'";
cin>>m;
cout<<"\n\n";
}
}。