专业课总复习-离散数学-Chap.1


离散数学 Chap.1 逻辑与证明

本系列离散数学博文基于Youtube易志偉老师的免费课程整理而来, 目的在于系统的梳理计算机专业课的基础知识, 并为将来的面试做好充分的准备.

除本系列外, 计算机考研相关还包括数据结构 / 操作系统 / 计算机组成原理 / 计算机网络的相关内容.

引子, 为什么要学离散?

在开始梳理前, 稿主认为有必要明确, 离散数学在计算机体系中占据一个怎样的地位?

尤其是, 离散数学甚至不在408的考试范围内, 为什么要学这门课?
以笔者的理解, 离散数学为计算机的很多结构建立了 基本模型 , 并在其上提出了很多解决关于该模型问题的 通用方法 . 在今后的学习中, 很多情况下我们离不开这些模型.

本博文不太像知识的梳理, 更多的是博主根据课程内容与自己的理解进行的知识概述, 希望能对读者的学习过程有所帮助.

1.1 逻辑

离散数学为什么要先讲逻辑呢? 因为计算机的很多功能脱不开逻辑, 如果脱离了逻辑, 那计算机就不能叫计算机了, 该叫计算器.

1.1.1 命题

首先, 需要明确几个概念:

概念: 命题(Propositions) / 命题的真值(Truth Value)
命题 指一个可以 明确判别真假陈述句 .
命题的真假 指这个命题到底 是真是假(True or False) .

请读者注意, 命题一定要有两层意思在里面:

  • 它是有 对错之分的 , 也就是说, 你一看到它就能觉得这东西有对错.
  • 它是 能明确判别真假的 .

例子: 命题 / 非命题
命题: $ 2+3 = 5 $ ; $ 5+7=10 $ ; 星期二的下一天是星期三.
非命题: $ x+3 = 5 $ ; 你好! ; 我是学生, 请给我钱.


那问题来了, 上面的命题还挺短的, 如果命题贼长, 那每次都要写一遍也太费劲了, 所以给了个东西叫 命题变量(Propositional Variables)

概念: 命题变量(Propositional Variables)
指可以代表一个命题的一个变量.

其实说白了就是把一个句子用一个字母指代一下.

注意: 命题变量请务必用小写字母来表示


所以, 命题被定义出来了, 就可以被组合起来计算了, 因此有个单独的模块叫 命题计算(Propositional Calculus) .

计算的话, 通常不会对单独一个命题进行计算, 那太简单了. 所以出现了 复合命题 .

概念: 复合命题(Compound Proposition)
即被多个命题以及逻辑运算组合而成的新命题.

例子: 复合命题
北京是中国的首都, 并且北京在中国的华北地带.

这就是两个命题的组合.

这个概念不难, 但重要在其中有个要求, 就是必须用 逻辑运算(也叫逻辑算子 / Logical Operators) 给它们串起来. 那有哪些逻辑运算呢 ?

1.1.2 逻辑运算符

1.1.2.1 非(Negation / Not)

概念: 非(Negation)
$ p $ 是一个命题, 则通常用 $ \neg p $$ \overline{p} $ 来表示 非p . 即p的否定.

说白了, 其表达的意思就是 p是错的(Is not the state of p.). 这意味着 $ p $ 与 $ \neg p $ 的 真值是相反的 .

1.1.2.2 且(Conjunction / And)

概念: 且(Conjunction)
$ p, q $ 是两个命题, 则通常用 $ p \land q $ 来表示 p且q .

意思是 只有p和q均为真, p且q才为真 . 画个真值表:

$$
\begin{array}{|c|c|c|}
\hline
p & q & p \land q \\
\hline
T & T & T \\
T & F & F \\
F & T & F \\
F & F & F \\
\hline
\end{array}
$$

1.1.2.3 或(Disjunction / Or)

概念: 或(Disjunction)
$ p, q $ 是两个命题, 则通常用 $ p \lor q $ 来表示 p或q .

意思是 只有p和q均为假, p或q才为假 . 画个真值表:

$$
\begin{array}{|c|c|c|}
\hline
p & q & p \lor q \\
\hline
T & T & T \\
T & F & T \\
F & T & T \\
F & F & F \\
\hline
\end{array}
$$

1.1.2.4 异或(Exclusive OR / XOR)

我们先给真值表:

$$
\begin{array}{|c|c|c|}
\hline
p & q & p \oplus q \\
\hline
T & T & F \\
T & F & T \\
F & T & T \\
F & F & F \\
\hline
\end{array}
$$

概念: 异或(Exclusive OR)
$ p, q $ 是两个命题, 则通常用 $ p \oplus q $ 来表示 p异或q .

意思是只有二者不同时, 异或才为真.

1.1.2.5 条件运算符(Conditional Operator / Only if)

概念: 条件运算符(Conditional Operator)
$ p, q $ 是两个命题, 则通常用 $ p \to q $ 来表示 若p则q .

给出真值表:

$$
\begin{array}{|c|c|c|}
\hline
p & q & p \to q \\
\hline
T & T & T \\
T & F & F \\
F & T & T \\
F & F & T \\
\hline
\end{array}
$$

这里显然可能有些反常识, 因为 $ p $ 为假时, 该命题也为真. 这是因为当 $ p $ 前提都不满足, 则我们自然无法明确 $ p $ 与 $ q $ 的逻辑关系, 因此此时我们认为这种命题是对的.

用一种更广泛令人接收的说法:

$ p \to q $ , 则 $ p $ 是 $ q $ 的充分条件 , $ q $ 是 $ p $ 的必要条件 .

注意: 条件运算符的各种说法
我去, 这玩意能说的方法可太多了, 什么if, unless, only if, … 读者就细品吧, 这东西挺 多样 的 :(


我们这里扩展一下, 多写一些东西:

$$
\begin{array}{|c|c|c|c|c|c|c|c|}
\hline
p & q & \neg p & \neg q & p \to q & q \to p & \neg p \to \neg q & \neg q \to \neg p \\
\hline
T & T & F & F & T & T & T & T \\
T & F & F & T & F & T & T & F \\
F & T & T & F & T & F & F & T \\
F & F & T & T & T & T & T & T \\
\hline
\end{array}
$$

哎嘿, 这后面四列怎么有点相似呢是不是. 这种情况通常用一个三等于来表示:

$$ (p \to q) \equiv (\neg q \to \neg p) $$

$$ (q \to p) \equiv (\neg p \to \neg q) $$

这里就是提一下, 具体我们下一节再唠.


1.1.2.6 双条件运算符(Biconditional Operator)

概念: 双条件运算符(Biconditional Operator)
$ p, q $ 是两个命题, 则通常用 $ p \leftrightarrow q $ 来表示 p q必须同时成立 .

事实上, 它有另一种表达方式:

$$ (p \leftrightarrow q) \equiv (p \to q) \land (q \to p) $$

那意思很简单, 就是前键跟后键必须相同, 这个式子才成立.

给个真值表:

$$
\begin{array}{|c|c|c|}
\hline
p & q & p \leftrightarrow q \\
\hline
T & T & T \\
T & F & F \\
F & T & F \\
F & F & T \\
\hline
\end{array}
$$

1.1.2.7 运算符的优先权

直接给个表:

$$
\begin{array}{|c|c|}
\hline
operator & priority \\
\hline
\neg & 1 \\
\land & 2 \\
\lor & 3 \\
\to & 4 \\
\leftrightarrow & 5 \\
\hline
\end{array}
$$

给个记忆方式, 其实 $ \neg $ 类似于数学运算中的 $ - $ (负号) , $ \land $ 类似于 $ \times $ (乘) , $ \lor $ 类似于 $ + $ (加) , 剩下俩是逻辑运算, 在它们之后.

1.2 逻辑等价

逻辑等价(Propositional Equivalences) , 即通过一些正确的关系, 来将一个复杂的逻辑表达式化简为比较简单的表达式的过程.

给两个定义:

概念: 永真式 / 重言式(Tautology)
一个复合逻辑命题, 它永远为真.

概念: 矛盾式(Contradiction)
一个复合逻辑命题, 它永远为假.

例子: 永真式 / 重言式

$$
\begin{array}{|c|c|c|c|}
\hline
p & \neg p & p \land \neg p & p \lor \neg p \\
\hline
T & F & F & T \\
F & T & F & T \\
\hline
\end{array}
$$

所以, 我们给出 逻辑等价 的定义:

概念: 逻辑等价(Propositional Equivalences)
$ p, q $ 是两个命题, 如果 $ p \leftrightarrow q $ 是一个永真式, 则称 $ p, q $ 逻辑等价, 记作: $ p \equiv q $ .

例子: 逻辑等价

$$
\begin{array}{|c|c|c|c|c|c|c|c|}
\hline
p & q & \neg p & \neg q & p \to q & q \to p & \neg p \to \neg q & \neg q \to \neg p \\
\hline
T & T & F & F & T & T & T & T \\
T & F & F & T & F & T & T & F \\
F & T & T & F & T & F & F & T \\
F & F & T & T & T & T & T & T \\
\hline
\end{array}
$$

$$ (p \to q) \equiv (\neg q \to \neg p) $$

$$ (q \to p) \equiv (\neg p \to \neg q) $$

1.2.1 常用的逻辑等价关系

注意: 逻辑等价的证明方法
底下这一堆, 其实证明方式都是 画真值表 . 容笔者犯个懒, 读者如果想证明就自己画一下就好.

1.2.1.1 恒等律(Identity Laws)

$$ p \land True \equiv p $$

$$ p \lor False \equiv p $$

应该好理解, 上面是乘1, 下面是加0.

1.2.1.2 支配律(Domination Laws)

$$ p \lor True \equiv True $$

$$ p \land False \equiv False $$

一个道理, 上面是加1, 下面是乘0.

1.2.1.3 幂等律(Idempotent Laws)

$$ p \land p \equiv p $$

$$ p \lor p \equiv p $$

自己乘自己和自己加自己.

1.2.1.4 双重否定(Double Negation)

$$ \neg (\neg p) \equiv p $$

负负得正.

1.2.1.5 结合律(Associative Laws)

俩式子:

$$ (p \land q) \land r \equiv p \land (q \land r) $$

$$ (p \lor q) \lor r \equiv p \lor (q \lor r) $$

1.2.1.6 交换律(Commutative Laws)

俩式子:

$$ p \land q \equiv q \land p $$

$$ p \lor q \equiv q \lor p $$

1.2.1.7 分配律(Distributive Laws)

$$ p \land (q \lor r) \equiv (p \land q) \lor (p \land r) $$

$$ p \lor (q \land r) \equiv (p \lor q) \land (p \lor r) $$


还记得笔者说的记忆逻辑运算的方法吗, 把 $ \lor $ 记成加法, 把 $ \land $ 记成乘法.
加法和乘法是不是有交换律 / 结合律 / 分配律?
这里一个意思.


1.2.1.8 德摩根律(De Morgan Laws)

德摩根律有两个式子:

$$ \neg(p \lor q) \equiv \neg p \land \neg q $$

$$ \neg(p \land q) \equiv \neg p \lor \neg q $$

1.2.1.9 吸收率(Absorption Laws)

$$ p \land (p \lor q) \equiv p $$

$$ p \lor (p \land q) \equiv p $$

1.2.1.10 永真律 / 矛盾律(Nogation Laws)

$$ p \land \neg p \equiv False $$

$$ p \lor \neg p \equiv True $$

1.2.1.11 关于条件运算符

$$ p \to q \equiv \neg q \to \neg p $$

$$ p \to q \equiv \neg p \lor q $$

还有些过于复杂的玩意, 咱就不写了.

1.2.1.12 关于双条件运算符

$$ p \leftrightarrow q \equiv (p \to q) \land (q \to p) $$

$$ p \leftrightarrow q \equiv (p \land q) \lor (\neg p \land \neg q) $$

$$ p \leftrightarrow q \equiv \neg p \leftrightarrow \neg q $$

1.2.2 逻辑运算

上面一大堆, 但是实际上读者做熟练了会发现一个常用的原则.

一般而言, 最优先处理的永远是这俩玩意: $ \to $$ \leftrightarrow $ . 因为这俩玩意在式子里面搞得逻辑关系挺乱的. 那怎么处理?
$ p \to q \equiv \neg p \lor q $
$ p \leftrightarrow q \equiv (p \to q) \land (q \to p) $
$ p \leftrightarrow q \equiv (p \land q) \lor (\neg p \land \neg q) $

这种俩费劲的玩意倒腾完之后就可以直接套别的公式了.

本处实际上就是公式的运用, 实在没什么可以说的, 读者就自行找些题目练习一下就好.

1.3 谓词逻辑

谓词逻辑(Predicate Logic) , 相比于我们之前的内容更进一步, 能够更方便的表示一些很麻烦的玩意, 我们给个例子.

例子: 谓词逻辑
假如你现在要表示这么个意思, 你们班上的所有人年龄都大于18岁 .

我们只用我们之前学的, 会发现这东西太麻烦了, 我得一个个把人都列出来, 然后写出所有人的这个陈述: <人名>的年龄大于18岁 .
这太费劲了.

因此, 可以引入一些如 $ P(x) $ 的谓词以及两个量词 $ \forall, \exists $ , 来表示上面这个意思.

啥是谓词?

概念: 谓词(Predicate)
简单来说, 谓词就是一个陈述句模板, 它把原本陈述句中的名词(或判断对象)转变为了一个 变量 .
这样的话就很好理解, 谓词本身是 没有对错的 . (都有不确定变量了还怎么判断对错)
而经过填充后, 谓词才能形成一个命题, 进而被判断对错.

那继续下一个问题, 我们怎么填充谓词? 先给出这俩量词的含义:

概念: 全称量词( $ \forall $ )
$ \forall P(x) $ 表示在指定的域中, 每一个元素x都使谓词P(x)为真.

概念: 存在量词( $ \exists $ )
$ \exists P(x) $ 表示在指定的域中, 至少有一个元素x都使谓词P(x)为真.

回到最开始的问题, 我可以这么设置:
$ P(x) $ : $ x $ 在你们班, 且年龄大于18岁.
$ \forall x P(x) $ .

读者品一下, 是不是就是最开始那个命题的意思?


关于两个量词的展开式

其实两个量词更像一种简写, 它们是可以被展开的:

$$ \forall xP(x) \equiv P(x_1) \land P(x_2) \land … \land P(x_n) $$

$$ \exists xP(x) \equiv P(x_1) \lor P(x_2) \lor … \lor P(x_n) $$

那我们再想想, 是不是这个式子就成立(用德摩根律):

$$
\begin{align*}
\neg (\forall xP(x)) & \equiv \neg (P(x_1) \land P(x_2) \land … \land P(x_n)) \\
& \equiv \neg P(x_1) \lor \neg P(x_2) \lor … \lor \neg P(x_n) \\
& \equiv \exists (\neg P(x))
\end{align*}
$$

另一个也成立, 这里就不写了(懒):

$$ \neg (\exists xP(x)) \equiv \forall x (\neg P(x)) $$

这俩玩意我们用人话解释一下, 意思就是:

  • 所有x都满足条件 的否定命题是 存在x不满足条件 .
  • 存在x满足条件 的否定命题是 所有x都满足条件 .

是不是顺口多了 :)


再往后, 我们还要明确一下这俩量词的优先级, 扩充一下表:

$$
\begin{array}{|c|c|}
\hline
operator & priority \\
\hline
\forall, \exists & 1 \\
\neg & 2 \\
\land & 3 \\
\lor & 4 \\
\to & 5 \\
\leftrightarrow & 6 \\
\hline
\end{array}
$$

这俩玩意的优先级 非常非常高 , 甚至比 $ \neg $ 还要更加优先一些.


还有一些比较麻烦的事情, 我们在这里一并说一下, 我们假设 $ P(x, y) $ 意思是 x喜欢y , x, y的取值范围是班上的人, 请读者比较一下下面几个式子:

  • $ \forall x \forall y P(x, y) $ : 班上所有同学都互相喜欢
  • $ \exists x \exists y P(x, y) $ : 班上存在一对同学, 其中一个喜欢另一个
  • $ \forall x \exists y P(x, y) $ : 班上所有的人都有另一个喜欢的人
  • $ \exists y \forall x P(x, y) $ : 班上有一个人被其它所有同学都喜欢着
  • $ \exists x \forall y P(x, y) $ : 班上有一个人喜欢其它所有人
  • $ \forall y \exists x P(x, y) $ : 对于班上的所有人, 都能找到另一个人喜欢自己

希望通过这一堆例子, 能跟读者说明白, 量词的顺序是很重要的! , 往往不同量词的顺序会产生截然不同的效果.


另外一个需要注意的点, 即这种东西:

$$ \forall x (P(x) \to Q(x)) $$

只有加了 $ \forall x $ 后面那一层的括号之后, 才能代表x的作用范围是后面这一整条语句. 因此读者在书写或化简时, 请注意括号的使用, 不要漏掉它.

1.4 推理与证明

1.4.1 这是个啥?

我们前面捣鼓了那么半天, 其实真正的目的就在这, 我们要尝试着根据我们知道的一些事情, 用我们学过的一些玩意, 推导出一些我们不知道, 或者需要证明的一些事情.

上面这个过程有两个更加正式的词语来定义它:

概念: 前提(Premises)
从本质上来讲, 就是 若干个命题 . 这些命题是我们已知的, 且真值一定为真.

概念: 结论(Conclusion)
其实也是一个或多个命题, 这个命题是我们需要证明的.

所以我们其实可以把我们的目标写成这个样子, 假设前提为 $ p_1, p_2, …, p_n $ , 结论为 $ q $ , 我们希望证明:

$$ (p_1 \land p_2 \land … \land p_n) \to q $$

是个 永真式 .

1.4.2 我们怎么做?

首先需要肯定的是, 我们其实前面已经写了挺多的公式, 这已经为我们做推理造就了很好的条件. 但问题在于, 它们太 基础 了, 因此我们这里还得给一些更加常用的推理公式:

  • 肯定前键式: $ [p \land (p \to q)] \to q $ , p为真, p能推出q, 那q一定为真.
  • 否定后键式: $ [\neg q \land (p \to q)] \to \neg p $ , q为假, p能推出q, 那p一定为假.
  • 假言三段论: $ [(p \to q) \land (q \to r)] \to (p \to r) $ , p能推出q, q能推出r, 那p一定能推出r.
  • 选言三段论: $ [(p \lor q) \land \neg p] \to q $ , p或q是真的, 但p是假的, 那q一定是真的.
  • 加法规则: $ p \to (p \lor q) $ , p是真的, 则p或上任何一个命题都一定是真的.
  • 简化规则: $ (p \land q) \to p $ , p和q是真的, 那p(q也一样)一定是真的.
  • 合取规则: $ [(p) \land (q)] \to (p \land q) $ , p是真的, q是真的, 那 p和q 也是真的.
  • 归结规则: $ [(p \lor q) \land (\neg p \lor r)] \to (q \lor r) $ , p或q是真的, 非p或r是真的, 那q和r一定有一个真的.

希望读者能理解, 上面的式子笔者尽可能每一个都给出一个比较 通俗易懂 的解释, 但真要证明的话, 还是需要使用我们在 1.2 中唠叨完的式子来证明的. 笔者这里就不证明了 (哥们, 用Markdown写完整证明, 真能把人写裂开)


到此, 其实逻辑部分我们能讲的知识就差不多了, 其余的工作, 就是留给读者的 灵活运用 , 那就不是笔者能做到的工作了对吧 :)

1.4.3 额外补充, 关于条件表达式的证明法

很遗憾, 最后我们还是逃不开这个条件表达式, 这东西在逻辑里面实在是太常见了. $ p \to q $ , 如果让我们得到这个结论, 我们该怎么整?
当然, 上述章节中我们提到的方法理论上一定可行对吧, 这叫做 直接证明(Direct Proof) , 我们假设p为真, 随后只要根据其它的前提得到q就可以.

但很现实的一点是, 有时候直接证明是很困难的一件事. 因此, 这里给出其余几种思路;

  • 逆否证明(Proof by Contraposition) : 即证明结论的一个 等价命题 , 在上例中, 我们也可以证明 $ \neg q \to \neg p $ .
  • 反证法(Proof by Contradiction) : 即 假设结论是假的 , 随后如果能推出与前提的矛盾, 则说明结论是真的. 上例中, 我们可以假设 $ p \land \neg q $ 为真, 随后再尝试推出其与其它前提的矛盾即可.
  • 空泛证明 / 平凡证明(Vacuous and Trivial Proof) : 这种情况专门针对结论的一部分进行证明. 在上例中, 假如我们能证明 $ p $ 永远是假的(矛盾式) 或者 $ q $ 永远是真的(重言式) . 那自然结论一定是真的.

1.4.4 枚举法

这是最 简单粗暴 的一种方式. 我们要证明一个结论, 假如说, 我们能够得知结论中某些部分的值域(即所有的情况) , 那我们只需要将所有情况分类讨论, 并明确每种情况都符合我们的结论即可.

其实思路上有些像直接列真值表, 对吧.


到这里, 就真的结束了.
对, 离散数学的第一章就讲了如何进行证明和逻辑推理.

这一定角度上是后面章节的基础.
这篇博文就到这里~


文章作者: MUG-chen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 MUG-chen !
  目录
加载中...