跳转至内容

离散数学/逻辑

来自维基教科书,开放世界中的开放书籍
离散数学
 ← 数论 逻辑 逻辑/第2页 → 

在传统代数中,字母和符号用来表示数字及其相关运算:+、-、×、÷等。这样做可以帮助简化和解决复杂问题。在逻辑中,我们试图用代数符号来表达语句及其之间的联系,同样是为了简化复杂的想法。不幸的是,就像普通代数一样,最初看起来恰恰相反。这可能是因为简单的例子总是看起来更容易用常识方法解决!

命题是一个具有真值的陈述:它要么是(T),要么是(F)。

示例 1

以下哪些是命题?

(a) 17 + 25 = 42
(b) 7月4日发生在北半球的冬季。
(c) 美国人口少于2.5亿。
(d) 月亮是圆的吗?
(e) 7 大于 12。
(f) x 大于 y


答案

(a) 是一个命题;当然它的'真值'是
(b) 是一个命题。当然,它是的,但它仍然是一个命题。
(c) 是一个命题,但我们可能并不知道它是还是。然而,事实是,陈述本身一个命题,因为它一定是的。
(d) 不是一个命题。这是一个问题。
(e) 是一个命题。当然,它是的,因为 7<12。
(f) 有点争议!它当然是一个可能的命题,但在我们知道xy 的值之前,我们不能真正说它是还是。请注意,这与 (c) 不完全相同,在 (c) 中,我们可能不知道真值,因为我们没有足够的了解。见下一段。


命题函数

[编辑 | 编辑源代码]

函数,简单来说,是一种操作,它以一个或多个参数值作为输入,并产生一个明确定义的输出。


例如,您可能熟悉三角学中的正弦和余弦函数。这些是函数的例子,它们以单个数字(角度大小)作为输入,并产生小数数字(事实上将位于 +1 和 -1 之间)作为输出。


如果我们愿意,我们可以定义我们自己的函数,例如RectangleArea,它可以以两个数字(矩形的长度和宽度)作为输入,并产生一个数字作为输出(通过将两个输入数字相乘形成)。


在上面的 (f) 中,我们有一个命题函数的例子。这是一个函数,它产生的输出不是像正弦、余弦或RectangleArea 那样的数字,而是一个真值。然后,这是一个陈述,当它被提供了一个或多个参数值时,它会变成一个命题。在 (f) 中,参数是xy。所以如果 x = 2 且 y = 7,它的输出是;如果 x = 4 且 y = -10,它的输出是


稍后将详细介绍 命题函数

我们通常用小写字母 pq、... 来表示命题。

复合命题

[编辑 | 编辑源代码]

命题可以通过一个或多个逻辑运算符进行修改,以形成所谓的复合命题

有三个逻辑运算符

  • 合取: 表示 AND
  • 析取:∨ 表示 OR
  • 否定:¬ 表示 NOT


示例 2

p 表示命题“亨利八世有六个妻子”。
q 表示命题“英国内战发生在19世纪”。
(a) 用 OR 连接这两个命题。由此产生的复合命题是真还是假?
(b) 现在用 AND 连接它们。这个复合命题是真还是假?
(c) p 的“反面”是真还是假?


答案

(a) pq 是“亨利八世有六个妻子,或者英国内战发生在19世纪”。
这是真的。复合命题的第一部分是真,这足以使整个语句为真——即使听起来有点奇怪!


如果你认为这个例子看起来很人为,想象一下你正在参加一个历史测验;还剩两道题,你需要至少答对一题才能赢得测验。你做了上面关于亨利八世和内战的两句话。你赢得测验了吗?是的,因为亨利八世有六个妻子,或者英国内战发生在19世纪,这是真的。


请注意,这是一个包含 OR:换句话说,我们不排除两部分都是真的。所以 pq 表示“p 是真,或者 q 是真,或者两者都是真的”。


(b) p q 是“亨利八世有六个妻子,并且英国内战发生在19世纪”。
这是的。


要为真,两部分都必须为真。这等同于你需要两道题都答对才能赢得测验。你失败了,因为你答错了第二题。


(c) p 的反面,我们写成 ¬p,是“亨利八世没有六个妻子”。这显然是假的。一般来说,如果 p 为真,那么 ¬p 为假,反之亦然。


示例 3

p 是“打印机离线”。
q 是“打印机缺纸”。
"r" 是“文档已完成打印”。
用英语句子写出来,尽可能自然。
(a) pq
(b) r q
(c) q ¬r
(d) ¬(pq)


答案

(a) 打印机离线或缺纸。


请注意,我们在写或说英语时通常会省略一些词。这听起来比“打印机离线,或者打印机缺纸”更自然。


(b) 文档已完成打印,并且打印机缺纸。


现在句子的每个部分的主语都不一样,所以这次没有缺词。


(c) 打印机没纸了,而且文档还没有打印完。


但是和而且

(c) 中的陈述可能是某人报告问题,他们也可能同样会说

(c) 打印机没纸了,但是文档还没有打印完。


所以请注意,在逻辑学中,但是而且的意思相同。只是我们在引入对比或意外时使用但是。例如,我们可能会说

  • 阳光明媚,但是外面冷得要命。

从逻辑上来说,我们可以使用而且连接这句话的两个部分,但 (!) 更自然的是使用但是


在 (d) 中,¬(pq) 是什么意思?那么,pq 表示p 为真或 q 为真(或两者都为真)。当我们在前面加上 ¬ 时,我们就否定了这一点。所以它的意思(字面上)是

  • 打印机不在线或打印机没纸这两种情况都不成立。


换句话说

(d) 打印机既不在线,也没有缺纸。


注意,使用短语“不成立……”来翻译 ¬ 通常很方便。

逻辑练习 1

[edit | edit source]

点击链接进入逻辑练习 1

真值表

[edit | edit source]

考虑复合命题 p qpq 的各种取值组合下的可能取值。使 p q 为真的唯一取值组合是 pq 都为真;任何其他组合都将包含一个,这将使整个复合命题为假。另一方面,复合命题 pq 将在pq(或两者)为真的情况下为真;只有当 pq 都为假时,pq 才为假。


我们用一个叫做真值表的东西总结这些结论,AND 的真值表为

p q p q
T T T
T F F
F T F
F F F



OR 的真值表为

p q pq
T T T
T F T
F T T
F F F



真值表中行的顺序

[edit | edit source]

注意上面每个真值表中前两列中 T 和 F 的模式。在第一列(p 的真值)中,有 2 个 T 后面跟着 2 个 F;在第二列(q 的取值)中,T 和 F 在每一行上都会改变。我们将在这个文本中采用这种行的顺序。采用真值表中行的顺序的惯例有两个优点

  • 它确保了 T 和 F 的所有组合都被包含在内。(在只有两个命题和真值表中只有四行的情况下,这可能足够容易;在有 4 个命题的情况下,真值表中将有 16 行,这就不那么容易了。)
  • 它会产生一个标准的、可识别的 T 和 F 的输出模式。因此,例如,T、F、F、F 是 AND()的输出模式(或者你可以说是“足迹”),而 T、T、T、F 是 OR(∨)的足迹。

NOT 的真值表

[edit | edit source]

上面两个真值表都包含两列“输入”(一列用于 p 的取值,一列用于 q 的取值),以及一列“输出”。当然,它们都需要四行,因为当两个命题组合时,T 和 F 有四种可能的组合。NOT(¬)的真值表将更简单,因为 ¬ 是一个一元运算——一个需要单个命题作为输入的运算。因此它只有两列——一个输入和一个输出——以及两行。

p ¬p
T F
F T


绘制真值表

[edit | edit source]

下面描述了绘制任何复合表达式真值表的方法,然后给出了四个例子。采用严谨的方法并保持工作整洁非常重要:有很多机会让错误潜入,但只要小心,这个过程就非常直观,无论表达式多么复杂。因此

  • 步骤 1:行数
    确定表需要多少行。一个输入只需要两行;两个输入需要 4 行;三个需要 8 行,依此类推。如果表达式中有 n 个命题,则需要 2n 行。
  • 步骤 2:空白表
    绘制一个空白表,并包含适当数量的输入列和行,以及一个足够宽的输出列,以便舒适地容纳输出表达式。如果需要 8 行或更多行,您可能需要每行在表上划一条水平线,以便保持行整齐。
  • 步骤 3:输入值
    填写所有输入值,使用上面真值表中行顺序的惯例;也就是说,从最右边的输入列开始,交替填写 T 和 F 值,在行上都改变一次。然后移到左边下一列,填写 T 和 F,每两行改变一次。依此类推,直到所有剩余的列都填好。然后最左边的列将在表中前半部分的所有行中包含 T,在后半部分的所有行中包含 F。
  • 步骤 4:规划策略
    仔细研究评估表达式中涉及的运算的顺序,注意可能存在的任何括号。就像在传统的代数中一样,您不必一定从左到右进行操作。例如,表达式 p ∨ ¬q 将首先计算 ¬q,然后使用 ∨ 将结果与 p 组合。当您确定了需要执行每个运算的顺序时,就在输出表达式下划出额外的列——每一步评估过程对应一列。然后在每列的底部(最下面)编号,按照执行的顺序编号。代表最终输出的列将是评估过程中的最后一步,因此在它的底部会有最高的数字。
  • 步骤 5:向下处理各列
    最后一步是按照在步骤 4中写下的顺序,向下处理每列。为此,您将使用上面 AND、OR 和 NOT 的真值表,使用输入列和已完成的任何其他列中的值。请记住:向下处理各列,不要横向处理各行。这样一来,您每次只需要考虑一个运算。


您可能认为这听起来非常复杂,但一些例子应该可以使这个方法变得清晰。


实例

[edit | edit source]

示例 4

为以下表达式绘制真值表

(a) ¬(¬p)
(b) p q)
(c) (p q) ∨ (¬p ∨ ¬q)
(d) q (pr)


解答

(a) ¬(¬p) 很明显与 p 本身相同,但我们仍将使用上述方法,以展示该方法的工作原理,然后再继续处理更复杂的示例。 所以

  • 步骤 1:行数

这里只有一个输入变量,所以我们需要两行。


  • 步骤 2:空白表

所以表格是

p ¬(¬p)
.
.



  • 步骤 3:输入值

接下来,我们填入输入值:在本例中,只有一个 T 和一个 F

p ¬(¬p)
T
F



  • 步骤 4:规划策略

就像在“普通”代数中一样,我们首先计算括号中的内容,所以我们先 (1) 完成 (¬p) 值,然后 (2) 使用左边的 ¬ 符号,从而得到整个表达式的最终输出值。 我们划出一列来将这两个过程分开,并在这两列的底部写上 (1) 和 (2)。 因此

p ¬ p)
T
F
(2)

输出

(1)



  • 步骤 5:向下处理各列

最后,我们将列 (1) 中的值 - F 后跟 T - 插入,然后使用 *这些* 值将列 (2) 中的值插入。 所以完成的真值表是

p ¬ p)
T T F
F F T
(2)

输出

(1)



正如我们在本例开头所说,¬(¬p) 明显与 p 相同,所以输出值的模式,T 后跟 F,与输入值的模式相同。 虽然这看起来很微不足道,但同样的技巧适用于更复杂的例子,其中结果远非显而易见!


(b) p q)

  • 步骤 1

有两个输入变量,pq,所以我们需要表格中有四行。


  • 步骤 2 和 3

q 列中,将 T 和 F 交替写入每一行;在 p 列中,每隔两行交替。 在此阶段,表格如下所示

p q p q)
T T
T F
F T
F F



  • 步骤 4 和 5

与 *示例 (a)* 一样,我们首先 (1) 计算括号内的表达式,(¬q),然后 (2) 使用 运算符将这些结果与 p 结合起来。 所以我们将表格的输出部分分成两列;然后完成列 (1) 的计算,最后完成列 (2) 的计算。 完成的表格是

p q p q)
T T F F
T F T T
F T F F
F F F T
(2)

输出

(1)



(c) (p q) ∨ (¬p ∨ ¬q)

  • 步骤 1 到 3

与 *示例 (b)* 一样。


  • 步骤 4 和 5

在计算表达式 (p q) ∨ (¬p ∨ ¬q) 中,将会有 5 个阶段。 它们的顺序是

(1) 第一个括号: (p q)
(2) 第二个括号中的 ¬p
(3) 第二个括号中的 ¬q
(4) 第二个括号中的 ∨
(5) 两个括号之间的 ∨。 那么,这个最后阶段代表了整个表达式的输出。


提醒:不要横向计算;按照 (1) 到 (5) 的顺序纵向计算。 这样,您只需一次处理一个操作。

完成的表格是

p q (p q) p ¬q)
T T T T F F F
T F F T F T T
F T F T T T F
F F F T T T T
(1) (5)

输出

(2) (4) (3)



请注意,输出仅包含 T。 这意味着 (p q) ∨ (¬p ∨ ¬q) 无论 pq 的值为多少,始终为 *真*。 因此它是一个 *重言式* (见下文).


(d) q (pr)

这个简单的表达式包含 3 个输入变量,因此其真值表需要 23 = 8 行。 当用笔绘制此真值表时,在第 4 行下方画一条线,以帮助您保持工作的整洁。 在此表中,它显示为双线。 完成的表格如下所示。

p q r q (pr)
T T T T T
T T F T T
T F T F T
T F F F T
F T T T T
F T F F F
F F T F T
F F F F F
(2)

输出

(1)


重言式

[edit | edit source]

始终具有 *真* 值的表达式称为 *重言式*。

此外,任何冗余或幂等的语句也被称为重言式,原因与前面提到的相同。 如果 P 为真,那么我们可以确定 P ∨ P 为真,P ∧ P 也为真。

逻辑练习 2

[edit | edit source]

点击链接进入 逻辑练习 2

优先级顺序

[edit | edit source]

在“普通”代数中,执行运算的优先级顺序是

1 括号
2 指数(幂)
3 × 和 ÷
4 + 和 -


在逻辑代数中,通常会插入括号以明确执行运算的顺序。 为了避免可能的歧义,商定的优先级规则是

1 括号
2 非(¬)
3 与 ()
4 或 (∨)


所以,例如,pq r 表示

首先计算 q r
然后将结果与 p ∨ 结合起来。

由于这很容易被误解,建议即使括号不是严格必需的,也应该包含它们。因此,pq r 通常写成 p ∨ (q r)。

逻辑等价命题

[edit | edit source]

回顾一下你在 练习 2 中对问题 2 和 3 的答案。在每个问题中,你应该发现每对命题的真值表的最后一列都是相同的。

当两个命题 pq 的真值表的最后一列相同时,我们说 pq逻辑等价 的,我们写

pq


示例 5

为以下命题构造真值表:

(i) p ∨ (q r),以及
(ii) (pq) (pr),

从而证明这些命题是逻辑等价的。


(i)

p q r p (q r)
T T T T T
T T F T F
T F T T F
T F F T F
F T T T T
F T F F F
F F T F F
F F F F F
(2)

输出

(1)



(ii)

p q r (pq) (pr)
T T T T T T
T T F T T T
T F T T T T
T F F T T T
F T T T T T
F T F T F F
F F T F F T
F F F F F F
(1) (3)

输出

(2)



每种情况下的输出均为 T、T、T、T、T、F、F、F。因此,这些命题是逻辑等价的。


示例 6

构造 ¬(¬p ∨ ¬q) 的真值表,并由此找到一个更简单的逻辑等价命题。


p q ¬ p ¬q)
T T T F F F
T F F F T T
F T F T T F
F F F T T T
(4)

输出

(1) (3) (2)



我们识别出输出:T、F、F、F 作为 AND 操作的“足迹”。所以我们可以将 ¬(¬p ∨ ¬q) 简化为

p q

逻辑定律

[edit | edit source]

与集合类似,逻辑命题形成了一个被称为 布尔代数 的体系:适用于集合的定律 也有相应的适用于命题的定律。即


交换律

p qq p
pqqp


结合律

(p q) rp (q r)
(pq) ∨ rp ∨ (qr)


分配律

p (qr) ≡ (p q) ∨ (p r)
p ∨ (q r) ≡ (pq) ( pr)


幂等律

p pp
ppp


恒等律

p T ≡ p
p ∨ F ≡ p


支配律

p ∨ T ≡ T
p F ≡ F


对合律

¬(¬p) ≡ p


德摩根律

¬(pq) ≡ (¬p) q)
(有时写成 p NOR q)
¬(p q) ≡ (¬p) ∨ (¬q)
(有时写成 p NAND q)


补律

p ¬p ≡ F
p ∨ ¬p ≡ T
¬T ≡ F
¬F ≡ T


示例

[edit | edit source]

例 7

命题函数 p, qr 定义如下

p 是 “n = 7”
q 是 “a > 5”
r 是 “x = 0”

将以下表达式用 p, qr 表示,并证明每对表达式在逻辑上是等价的。仔细说明在每一步中使用了哪些上述定律。

(a)

((n = 7) ∨ (a > 5)) (x = 0)
((n = 7) (x = 0)) ∨ ((a > 5) (x = 0))

(b)

¬((n = 7) (a ≤ 5))
(n ≠ 7) ∨ (a > 5)

(c)

(n = 7) ∨ (¬((a ≤ 5) (x = 0)))
((n = 7) ∨ (a > 5)) ∨ (x ≠ 0)


解答

(a)

(pq) r
(p r) ∨ (q r)
(pq) r = r (pq) 交换律
= (r p) ∨ r q) 分配律
= (p r) ∨ (q r) 交换律 (两次)


(b)

首先,我们注意到

¬q 是 "a ≤ 5"; 并且
¬p 是 "n ≠ 7".

所以表达式为

¬(p ¬q)
¬pq
¬(p ¬q) = ¬p ∨ ¬(¬q) 德摩根定律
= ¬pq 对合律



(c)

首先,我们注意到

¬r 是 "x ≠ 0".

所以表达式为

p ∨ (¬(¬q r))
(pq) ∨ ¬r
p ∨ (¬(¬q r)) = p ∨ (¬(¬q) ∨ ¬r) 德摩根定律
= p ∨ (q ∨ ¬r) 对合律
= (pq) ∨ ¬r 结合律


逻辑练习 3

[编辑 | 编辑源代码]

点击链接查看 逻辑练习 3.

离散数学
 ← 数论 逻辑 逻辑/第2页 → 
华夏公益教科书