MathLabs

数学基础

谓词逻辑

谓词逻辑用量词 ∀x P(x)\forall x\, P(x)(“对所有 xx,P(x)P(x)”)和 ∃x P(x)\exists x\, P(x)(“存在 xx 使得 P(x)P(x)”)扩展了命题逻辑,使我们能够形式化关于某个论域中每个元素或某个元素的陈述,并用塔斯基满足语义对其进行推理。

直观"所有"与"存在"

“这个房间里的每一位学生都通过了考试”和“这个房间里有某位学生通过了考试”是两个截然不同的断言,尽管都在谈论同一个房间。谓词逻辑把这种区别明确化:谓词 P(x)P(x) 是一个性质,当把 xx 替换为论域(话语域)MM 中的具体对象时就变成一个真假分明的命题。全称量词 ∀x P(x)\forall x\, P(x) 断言 PP 对 MM 中每个对象都成立;存在量词 ∃x P(x)\exists x\, P(x) 断言 PP 对 MM 中至少一个对象成立。

量化变量 x 与 y 之间依赖关系的交互式图形,展示见证元素的依赖性。
变量 xx 与 yy 之间的依赖图:从 xx 到 yy 的边表示 yy 的见证元素可能依赖于所选的 xx——拖动高亮部分,比较“固定见证”∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) 与“可变见证”∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y)。

大学形式句法与量词否定

定义: 量词与自由/约束变量

给定论域 MM 与谓词 P(x)P(x):∀x P(x)\forall x\, P(x)(“对所有 xx,P(x)P(x)”)在 MM 中为真当且仅当 PP 对 MM 的每个元素都成立;∃x P(x)\exists x\, P(x)(“存在 xx 使得 P(x)P(x)”)为真当且仅当 PP 至少对一个元素成立。位于约束它的量词作用域内的变量称为约束变量;否则称为自由变量。没有自由变量的公式称为语句,在给定结构中具有确定的真值。

¬(∀x P(x))≡∃x ¬P(x)\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x)

这条定律是说:“并非人人都具有性质 PP”恰好等价于“有人不具有 PP”。与之对偶的定律 ¬(∃x P(x))≡∀x ¬P(x)\neg(\exists x\, P(x)) \equiv \forall x\, \neg P(x) 说“没有人具有性质 PP”等价于“人人都不具有 PP”。这两条定律是德摩根定律对 ∧,∨\wedge, \vee 的量词版本,是把所有否定向内推、从而达到前束范式(所有量词移到最前面的公式,例如 φ\varphi 不含量词的 ∀x ∃y φ\forall x\, \exists y\, \varphi)的关键步骤。

¬(∃x P(x))≡∀x ¬P(x)\neg(\exists x\, P(x)) \equiv \forall x\, \neg P(x)
前束范式:推移否定与量词
公式等价前束形式
¬∀x P(x)\neg \forall x\, P(x)∃x ¬P(x)\exists x\, \neg P(x)
¬∃x P(x)\neg \exists x\, P(x)∀x ¬P(x)\forall x\, \neg P(x)
∀x P(x)∧∀x Q(x)\forall x\, P(x) \wedge \forall x\, Q(x)∀x (P(x)∧Q(x))\forall x\, (P(x) \wedge Q(x))
∃x P(x)∨∃x Q(x)\exists x\, P(x) \vee \exists x\, Q(x)∃x (P(x)∨Q(x))\exists x\, (P(x) \vee Q(x))

大学主要定理:实例化与量词顺序

对任意具有论域 MM 的结构 M\mathcal{M}、任意赋值 ss,以及 P(x)P(x) 中对 xx 可代入的任意项 tt:若 M⊨s∀x P(x)\mathcal{M} \models_s \forall x\, P(x),则 M⊨sP(t)\mathcal{M} \models_s P(t)。规则形式:∀x P(x)⊢P(t)\forall x\, P(x) \vdash P(t)。

为什么成立?

∀x P(x)\forall x\, P(x) 意味着“无论把 xx 换成什么,PP 都成立”——所以代入任意具体的项 tt,P(t)P(t) 也必须成立。这条规则把一般规律变成具体实例:从“∀x (Human(x)→Mortal(x))\forall x\, (\text{Human}(x) \to \text{Mortal}(x))”在 t=Socratest = \text{Socrates} 处实例化,得到“Human(Socrates)→Mortal(Socrates)\text{Human}(\text{Socrates}) \to \text{Mortal}(\text{Socrates})”,即经典三段论的第一个前提。

证明

我们直接从塔斯基满足语义出发论证,该语义按公式结构递归定义了在一个结构中的真。

由 ∀\forall 的语义子句:M⊨s∀x P(x)  ⟺  for every d∈M, M⊨s[x↦d]P(x)\mathcal{M} \models_s \forall x\, P(x) \iff \text{for every } d \in M,\ \mathcal{M} \models_{s[x \mapsto d]} P(x)。假设前提 M⊨s∀x P(x)\mathcal{M} \models_s \forall x\, P(x);由此子句,M⊨s[x↦d]P(x)\mathcal{M} \models_{s[x \mapsto d]} P(x) 对每个 d∈Md \in M 都成立,毫无例外。

既然该断言对每个 d∈Md \in M 都成立,它特别地对 d=tM,sd = t^{\mathcal{M},s}(项 tt 在赋值 ss 下于 M\mathcal{M} 中所表示的元素)也成立。代入这个特定的 dd,得到 M⊨s[x↦tM,s]P(x)\mathcal{M} \models_{s[x \mapsto t^{\mathcal{M},s}]} P(x)。

由代入引理(一个把变量赋值与项代入联系起来的标准结果,可对 PP 的结构作归纳证明):M⊨s[x↦tM,s]P(x)  ⟺  M⊨sP(t)\mathcal{M} \models_{s[x \mapsto t^{\mathcal{M},s}]} P(x) \iff \mathcal{M} \models_s P(t),该引理恰好在 tt 对 P(x)P(x) 中的 xx 可代入时成立(即 tt 的自由变量不会被意外约束)。应用此引理,把 M⊨s[x↦tM,s]P(x)\mathcal{M} \models_{s[x \mapsto t^{\mathcal{M},s}]} P(x) 转化为 M⊨sP(t)\mathcal{M} \models_s P(t)。

由于 M\mathcal{M}、ss、tt 都是任意的,从 ∀x P(x)\forall x\, P(x) 到 P(t)P(t) 的推理在每个结构、每种赋值下都保真:该规则是可靠的。

对任意结构 M\mathcal{M} 与公式 R(x,y)R(x,y):∃y ∀x R(x,y)⇒∀x ∃y R(x,y)\exists y\, \forall x\, R(x,y) \Rightarrow \forall x\, \exists y\, R(x,y)。其逆蕴含一般不成立。

为什么成立?

∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) 要求存在单一的见证元素 yy 对每个 xx 都适用(“固定”见证),而 ∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) 只要求每个 xx 都有某个见证元素,不同的 xx 可以对应不同的见证元素(“可变”见证)。固定见证自动也是可变见证(重复使用即可),但反过来不然——这正是“有人爱着所有人”(一个普遍的爱人)与“人人都被某人所爱”(可能各不相同)之间的区别,是谓词逻辑澄清的自然语言中经典的歧义来源。

证明

正向。 设 M⊨s∃y ∀x R(x,y)\mathcal{M} \models_s \exists y\, \forall x\, R(x,y)。由 ∃\exists 的语义子句,M⊨s∃y φ  ⟺  there is d∈M with M⊨s[y↦d]φ\mathcal{M} \models_s \exists y\, \varphi \iff \text{there is } d \in M \text{ with } \mathcal{M} \models_{s[y \mapsto d]} \varphi;应用于此处得到某个 d0∈Md_0 \in M 使得 M⊨s[y↦d0]∀x R(x,y)\mathcal{M} \models_{s[y \mapsto d_0]} \forall x\, R(x,y)。

对此应用 ∀\forall 的子句,得 M⊨s[y↦d0][x↦a]R(x,y)\mathcal{M} \models_{s[y \mapsto d_0][x \mapsto a]} R(x,y) 对每个 a∈Ma \in M 都成立,因为 ∀x\forall x 遍历整个 MM,与之后选取哪个 aa 无关。

现在固定任意 a∈Ma \in M 来验证 ∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y)。由上一段,取 x↦ax \mapsto a 得 M⊨s[y↦d0][x↦a]R(x,y)\mathcal{M} \models_{s[y \mapsto d_0][x \mapsto a]} R(x,y),这表明在 x↦ax \mapsto a 下 d0d_0 本身就是 ∃y R(x,y)\exists y\, R(x,y) 的见证元素;因此 M⊨s[x↦a]∃y R(x,y)\mathcal{M} \models_{s[x \mapsto a]} \exists y\, R(x,y)。

由于 a∈Ma \in M 是任意的,M⊨s[x↦a]∃y R(x,y)\mathcal{M} \models_{s[x \mapsto a]} \exists y\, R(x,y) 对每个 aa 都成立,这正是 M⊨s∀x ∃y R(x,y)\mathcal{M} \models_s \forall x\, \exists y\, R(x,y) 的语义子句。这就证明了 ∃y ∀x R(x,y)⇒∀x ∃y R(x,y)\exists y\, \forall x\, R(x,y) \Rightarrow \forall x\, \exists y\, R(x,y)。

逆命题不成立:反例。 设 M\mathcal{M} 的论域为 M=ZM = \mathbb{Z}(整数),把 R(x,y)R(x,y) 解释为“x<yx < y”。此时 ∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) 为真:对每个整数 xx,取 y=x+1y = x+1 即有 x<yx < y。但 ∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) 为假:它需要一个单一整数 yy 大于每个整数 xx,而不存在这样的最大整数(对任何候选 yy,整数 y+1y+1 都违反 y+1<yy+1 < y)。所以 ∀x ∃y R(x,y)\forall x\, \exists y\, R(x,y) 成立而 ∃y ∀x R(x,y)\exists y\, \forall x\, R(x,y) 不成立,说明逆蕴含一般不成立。

大学实际应用与典型例题

SQL 没有原生的“所有”关键字,所以关系数据库用量词否定定律来编码 ∀x P(x)\forall x\, P(x):“∀x P(x)\forall x\, P(x)”变成 `NOT EXISTS (... WHERE NOT P ...)`,即程序员正是按照 ¬(∀x P(x))≡∃x ¬P(x)\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x) 通过对 ∃\exists 的双重否定来实现 ∀\forall。形式化规约语言(Z 记法、Hoare 逻辑前/后置条件、TLA+)直接使用 ∀\forall 与 ∃\exists 来陈述正确性性质,如“每个数组下标都在范围内”或“存在一条有效的执行路径”,验证工具随后用实例化与消去量词的技术来检查这些性质。

例题: 关系除法:"购买了每种商品"

数据库中有表 `Purchases(customer, product)` 与 `Products(product)`。用谓词逻辑形式化“顾客 cc 购买了每种商品”,然后只用 `NOT EXISTS` 转换成 SQL 查询。

解答

设 Bought(c,p)\text{Bought}(c,p) 表示“(c,p)(c,p) 出现在 Purchases 中”,Product(p)\text{Product}(p) 表示“pp 出现在 Products 中”。“顾客 cc 购买了每种商品”即 ∀p (Product(p)→Bought(c,p))\forall p\, (\text{Product}(p) \to \text{Bought}(c,p))。

SQL 没有 ∀\forall,于是对 ¬∃p ¬(Product(p)→Bought(c,p))\neg\exists p\,\neg(\text{Product}(p) \to \text{Bought}(c,p)) 应用量词否定定律 ¬(∀x P(x))≡∃x ¬P(x)\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x),即把全称量词改写成“不存在顾客 cc 没买的产品”:¬∃p (Product(p)∧¬Bought(c,p))\neg \exists p\, (\text{Product}(p) \wedge \neg\text{Bought}(c,p))。

这可直接翻译为:`SELECT c FROM Customers c WHERE NOT EXISTS (SELECT FROM Products p WHERE NOT EXISTS (SELECT FROM Purchases WHERE customer = c.c AND product = p.product))`——实现关系除法的经典“双重 NOT EXISTS”模式,正是全称量词转存在量词否定定律的直接应用。

例题: 形式规约:排序不变式

某排序算法的后置条件规定为 ∀i (0≤i<n−1→a[i]≤a[i+1])\forall i\, (0 \le i < n-1 \to a[i] \le a[i+1]),其中 aa 是长度为 nn 的数组。验证者想检查 i=0i=0 处的具体实例。哪条推理规则支持从后置条件中提取出 a[0]≤a[1]a[0] \le a[1]?所得公式是什么?

解答

设 P(i)P(i) 表示 0≤i<n−1→a[i]≤a[i+1]0 \le i < n-1 \to a[i] \le a[i+1]。后置条件即 ∀i P(i)\forall i\, P(i)。

由上面证明的全称实例化的可靠性,对论域中任意项 tt 有 ∀x P(x)⊢P(t)\forall x\, P(x) \vdash P(t)——这里取 t=0t = 0:由 ∀i P(i)\forall i\, P(i) 有效地推出 P(0)P(0),即 0≤0<n−1→a[0]≤a[1]0 \le 0 < n-1 \to a[0] \le a[1]。

由于当 n≥2n \ge 2 时 0≤0<n−10 \le 0 < n-1 为真(这是验证者另行检查的一个附加条件,例如根据数组声明的长度),接着用肯定前件式得到所需的 a[0]≤a[1]a[0] \le a[1]——这正是验证者想要检查的实例,通过把全称实例化与肯定前件式串联得到。

哪个公式在逻辑上等价于 ¬(∀x P(x))\neg(\forall x\, P(x))?

设论域为 Z\mathbb{Z},R(x,y)R(x,y) 表示“x<yx < y”,下列哪项为真?

SQL 的 `NOT EXISTS (... WHERE NOT P ...)` 模式对 PP 实现的是哪个量词?

已知 ∀x P(x)\forall x\, P(x) 在结构 M\mathcal{M} 中为真,对项 tt 用全称实例化可以得出哪个结论?

参考文献

  1. Herbert B. Enderton (2001). A Mathematical Introduction to Logic
  2. David Hilbert, Wilhelm Ackermann (1928). Grundzüge der theoretischen Logik