计算命题演算公式的真值

合集下载

命题公式真值表

命题公式真值表

说明:
(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 是命题变元, 则下面式子均是命题公式

真值表与等价公式

真值表与等价公式
(4)当且仅当有限次地应用(1)、(2)、(3)所得 到的符号串是命题公式。
思考:命题公式是命题吗?为 什么?
解答:命题公式不一定是命题。
因为命题公式没有确定的真值。
把符号命题翻译成自然语言命题: 这种翻译比较简单,只要求用词准确,力求保
持原命题的意思。 例 设 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

【精品】命题公式分类及等值演算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 命题公式与等值演算

命题逻辑I 命题公式与等值演算
20
合式公式的层次 (续)
例如 公式 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 表示假。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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";
}
}。

相关文档
最新文档