try ai
科普
编辑
分享
反馈
  • 谓词与量词

谓词与量词

SciencePedia玻尔百科
核心要点
  • 谓词充当属性和关系的模板,而全称量词 (∀) 和存在量词 (∃) 则对它们做出概括性论断。
  • 量词的顺序至关重要,交换它们(例如,∀x∃y\forall x \exists y∀x∃y 与 ∃y∀x\exists y \forall x∃y∀x)会从根本上改变语句的逻辑含义。
  • 谓词逻辑是精确性的语言,对于在数学、计算机科学和哲学中无歧义地定义复杂概念至关重要。
  • 机械地否定量化语句——通过翻转量词并将否定向内移动——是构造证明和定义的强大技巧。

引言

在追求以完美清晰的方式表达复杂思想的过程中,自然语言往往因其充满歧义和细微差别而显得力不从心。我们如何才能精确地陈述一条规则、一个数学定律或一个科学原理,使其不留任何误解的余地?本文通过介绍专为精确性而设计的强大语言——谓词逻辑,来应对这一根本性挑战。其核心是两个简单而深刻的概念:​​谓词​​(用于捕捉事物的属性)和​​量词​​(用于对事物进行论断)。通过掌握这个系统,我们从日常言语的模糊不清转向形式思维的清晰锐利。

在接下来的章节中,我们将首先解构这门语言的核心​​原理与机制​​,学习它的构建模块、量词顺序的关键规则以及逻辑否定的艺术。然后,我们将探索其变革性的​​应用与跨学科联系​​,看看这些工具如何为现代计算机科学、数学乃至我们对知识极限的理解提供基石。

原理与机制

好了,让我们开始动手实践吧。我们已经谈论了创造一种完美思想语言的宏伟抱负,但这门语言实际上是什么样的?它是如何运作的?你可能会惊讶地发现,它巨大的威力仅来自于几个出人意料的简单核心思想。这就像发现一部交响乐的所有复杂性都是由少数几个音符和它们的组合规则构建而成。我们的“音符”被称为​​谓词​​,而我们的“组合规则”则是​​量词​​。

构建模块:作为思想模板的谓词

想想我们每天所做的陈述。“这个苹果是红色的。”“Socrates 是个哲学家。”“Alice 爱 Bob。”这些句子中的每一个都将一种属性赋予某物,或描述事物之间的关系。谓词就是这种思想的骨架。它是一个带有一个或多个空白的陈述,等待被填入内容。

例如,“是哲学家”这个概念可以用模板 ___ 是个哲学家 来捕捉。让我们给这个模板一个简称,比如 PPP。空白可以由一个变量(如 xxx)填充,得到 P(x)P(x)P(x)。就其本身而言,P(x)P(x)P(x) 既非真也非假;它是一个待定的命题。只有当我们说明 xxx 是什么时,它才获得真值。如果 xxx 是 Socrates,P(Socrates)P(\text{Socrates})P(Socrates) 就是真的。如果 xxx 是一块石头,P(rock)P(\text{rock})P(rock) 就是假的。

同样,像“爱”这样的关系可以是一个有两个空白的模板:___ 爱 ___。我们可以称之为 L(x,y)L(x,y)L(x,y)。现在我们有了一个适用于一整类陈述的模板:L(Romeo, Juliet)L(\text{Romeo, Juliet})L(Romeo, Juliet)、L(a reader, a good book)L(\text{a reader, a good book})L(a reader, a good book) 等等。这些谓词是我们逻辑语言的基本原子。它们是我们用来表示构成我们世界之属性和关系的方式。

两大扫描器:“对于所有”与“存在”

仅有模板是不够的。我们希望做出宏大、概括性的论断。我们不仅想说 Socrates 是一个哲学家;我们还想说诸如“所有哲学家都是逻辑学家”或“有些诗人是评论家”之类的话。这就是真正神奇之处,它由两个强大的工具——量词——来实现。

首先,我们有​​全称量词​​,写作 ∀\forall∀,意为“对于所有……”或“对于每一个……”。它是一个强大的扫描器,会扫过我们论域(我们当前谈论的事物宇宙)中的每一件东西,以检查某个条件是否成立。

让我们试着陈述“所有哲学家都是逻辑学家”。一个常见的初步错误是认为它的意思是“对于每个人 xxx,xxx 是一个哲学家并且 xxx 是一个逻辑学家”。这会写成 ∀x(P(x)∧L(x))\forall x (P(x) \land L(x))∀x(P(x)∧L(x))。但请停下来想一想!这个句子声称存在的每一个人既是哲学家又是逻辑学家。这显然不是我们的本意。

陈述“所有哲学家都是逻辑学家”的正确方式更为微妙。它是一个条件陈述。它说的是:“对于任何人 xxx,如果那个人是哲学家,那么他也是一个逻辑学家。”这写作: ∀x(P(x)→L(x))\forall x (P(x) \rightarrow L(x))∀x(P(x)→L(x)) 这个结构极其重要。“如果-那么”箭头 (→)(\rightarrow)(→) 限制了我们的论断范围。我们只对满足“如果”部分的个体做出断言。对于任何不是哲学家的人,该陈述是空洞为真(vacuously true)的——它不适用于他们,因此无法被他们证伪。∀\forall∀ 和 →\rightarrow→ 的这种优雅结合是表达任何“所有 A 都是 B”这类论断的标准方式。

我们的第二个工具是​​存在量词​​,写作 ∃\exists∃,意为“存在……”或“对于某个……”。它像一盏探照灯,扫描论域,看是否能找到至少一个符合描述的事物。

让我们试着陈述“有些诗人是评论家”。在这里,我们断言至少存在一个身兼两职的人。我们在寻找一个既是诗人又是评论家的人。因此,逻辑结构是: ∃x(P(x)∧C(x))\exists x (P(x) \land C(x))∃x(P(x)∧C(x)) 注意这个模式。形式为“所有 A 都是 B”的全称论断通常使用箭头(∀\forall∀ 与 →\rightarrow→),而形式为“有些 A 是 B”的存在论断通常使用合取(∃\exists∃ 与 ∧\land∧)。这不是一条随意的规则;这正是我们试图表达内容的逻辑所在。如果我们错误地在这里使用箭头,写成 ∃x(P(x)→C(x))\exists x (P(x) \rightarrow C(x))∃x(P(x)→C(x)),我们说的将是“存在某个人,如果他是诗人,那么他是评论家”。这是一个异常弱的陈述!一个面包师(不是诗人)会使“如果”部分为假,而假的前提使得任何蕴涵都为真。因此,只要有一个面包师存在,这个陈述就成立了,即使根本不存在任何诗人。逻辑的精确性使我们免于此类谬误。

顺序至关重要:量词之舞

现在来看量词或许最深刻、最令人费解的一面:它们的顺序至关重要。非常重要。交换量词的顺序可以完全改变一个句子的意思,将一个微不足道的真理变成一个宇宙级的论断,反之亦然。

思考这个简单的英文句子:“A teacher evaluated every student.”(一位老师评估了每一位学生。)这个句子是模棱两可的。它的意思是……

  1. 有一位英雄般的老师评估了每一位学生?
  2. 对于每一位学生,都有某个老师(不一定是同一位)评估了他/她?

逻辑迫使我们对此做出明确区分。让我们把它们写下来。设 T(x)T(x)T(x) 为“xxx 是老师”,S(y)S(y)S(y) 为“yyy 是学生”,E(x,y)E(x,y)E(x,y) 为“xxx 评估了 yyy”。

解读 1:“超级教师”版本。存在量词“一位老师”的范围更广。 ∃x∀y(T(x)∧(S(y)→E(x,y)))\exists x \forall y (T(x) \land (S(y) \rightarrow E(x,y)))∃x∀y(T(x)∧(S(y)→E(x,y))) “存在一个人 xxx,xxx 是老师,并且对于所有人 yyy,如果 yyy 是学生,则 xxx 评估了他们。”

解读 2:“团队协作”版本。全称量词“每一位学生”的范围更广。 ∀y∃x(S(y)→(T(x)∧E(x,y)))\forall y \exists x (S(y) \rightarrow (T(x) \land E(x,y)))∀y∃x(S(y)→(T(x)∧E(x,y))) “对于所有人 yyy,如果 yyy 是学生,那么存在某个人 xxx,xxx 是老师并且评估了他们。”

这两个陈述是不同的!第一个蕴涵了第二个(如果一位老师完成了所有工作,那么每位学生都得到评估当然是真的),但第二个并不蕴涵第一个。

让我们用一个清晰的玩具宇宙来看看这一点。想象一个只有三个存在物:aaa、bbb 和 ccc 的世界。让我们定义一个关系 RRR 为一组箭头:a→ba \rightarrow ba→b,b→cb \rightarrow cb→c 和 c→ac \rightarrow ac→a。这意味着谓词 R(x,y)R(x,y)R(x,y) 仅对数对 (a,b)(a,b)(a,b)、(b,c)(b,c)(b,c) 和 (c,a)(c,a)(c,a) 为真。

现在,让我们对这个小宇宙提出两个问题:

  • ∀x∃yR(x,y)\forall x \exists y R(x,y)∀x∃yR(x,y) 是真的吗?这个问题问的是:“每个存在物是否都有一个箭头指向某个其他存在物?”我们来检查一下。aaa 有一个指向 bbb 的箭头。bbb 有一个指向 ccc 的箭头。ccc 有一个指向 aaa 的箭头。是的!该陈述是​​真的​​。
  • ∃y∀xR(x,y)\exists y \forall x R(x,y)∃y∀xR(x,y) 是真的吗?这个问题问的是:“是否存在一个单一的存在物,有来自所有存在物(包括其自身)的箭头指向它?”我们来检查一下。是否存在一个普遍的目标?
    • 目标 aaa:它只接收来自 ccc 的箭头。
    • 目标 bbb:它只接收来自 aaa 的箭头。
    • 目标 ccc:它只接收来自 bbb 的箭头。 没有任何一个存在物是所有箭头的目标。该陈述是​​假的​​。

看!完全相同的符号,顺序不同,得出的结论却相反。量词之舞决定了一切。∀∃\forall\exists∀∃ 是一个比 ∃∀\exists\forall∃∀ 弱得多的论断。前者是关于个体适应性的陈述,后者则是关于一个普适常量的陈述。

否定的艺术:精确地否定

如果我们想要否定一个量化陈述怎么办?逻辑为我们提供了一种优美而机械的方法。规则简单且非常直观:

  • 要否定“所有东西”都具有某个属性(¬∀x P(x)),你只需要找到“某个东西”不具有该属性(∃x ¬P(x))。
  • 要否定“某个东西”具有某个属性(¬∃x P(x)),你必须证明“所有东西”都不具有该属性(∀x ¬P(x))。

否定只是翻转量词并将“非”向内推。让我们通过一个来自数学的优美例子来实际操作一下:定义函数“无界”的含义。

首先,让我们陈述函数 f(x)f(x)f(x) “有上界”的含义。它意味着存在某个上限,某个数 MMM,函数值永远不会超过它。用逻辑表示: “存在一个数 MMM,使得对于所有数 xxx,f(x)≤Mf(x) \le Mf(x)≤M。” ∃M∀x,f(x)≤M\exists M \forall x, f(x) \le M∃M∀x,f(x)≤M 现在,它的逻辑否定是什么?无界意味着什么?我们不必猜测;我们可以推导出来。我们只需转动否定机器的曲柄:

  1. 从整个陈述的否定开始:¬(∃M∀x,f(x)≤M)\neg (\exists M \forall x, f(x) \le M)¬(∃M∀x,f(x)≤M)
  2. 外部的 ¬∃M 变成 ∀M¬:“对于你所能想象的任何可能的上限 MMM……” ∀M¬(∀x,f(x)≤M)\forall M \neg (\forall x, f(x) \le M)∀M¬(∀x,f(x)≤M)
  3. 内部的 ¬∀x 变成 ∃x¬:“……存在某个点 xxx,函数在该点的值不低于那个上限。” ∀M∃x¬(f(x)≤M)\forall M \exists x \neg (f(x) \le M)∀M∃x¬(f(x)≤M)
  4. 而 f(x)≤Mf(x) \le Mf(x)≤M 的否定是什么?就是 f(x)>Mf(x) > Mf(x)>M。 ∀M∃x,f(x)>M\forall M \exists x, f(x) > M∀M∃x,f(x)>M 瞧!无界函数的精确定义是:对于你提出的任何上限 MMM,都存在一个 xxx 使得函数值更高。逻辑不仅检验了我们的直觉;它为我们构建了精确的定义。这种强大的技术在计算机科学中用于定义系统故障,在法律中用于寻找漏洞,在哲学中用于澄清论证。

深入底层:基本规则

最后,值得欣赏的是,要使这个优美的系统正常工作,其内部机制必须精心构建。语法规则不仅仅是学究式的细节;它们是防止我们将思想开下悬崖的安全特性。

例如,当我们形式化一个想法时,我们有多种选择。考虑短语“每个人的父亲”。我们可以用一个函数 father(x)father(x)father(x) 来表示,它对任何输入 xxx 都会吐出一个唯一的人。使用这样的函数是一种紧凑的捷径,但它偷偷引入了两个大的假设:每个人都有一个父亲(存在性)和每个人只有一个父亲(唯一性)。一种更基本的方法是使用一个二元谓词 Father(x,y)Father(x,y)Father(x,y),意为“yyy 是 xxx 的父亲”。这并不会做出那些假设。如果我们想要这些假设,就必须将它们作为明确的公理添加进来。符号的选择反映了我们愿意对我们的世界做出的假设。

一个更为关键的安全特性涉及我们如何处理变量。公式中的变量如果是被量词捕获的,则称为​​约束​​变量。在 ∀xP(x)\forall x P(x)∀xP(x) 中,xxx 是约束的。它充当一个通用的占位符。如果一个变量没有被任何量词约束,比如 P(y)P(y)P(y) 中的 yyy,它就是​​自由​​变量。它是一个具体但未命名的个体,等待被定义。

当同一个变量名在复杂公式中既作为自由变量又作为约束变量出现时,情况就会变得危险。这就像一本书的同一章里有两个同名角色——简直是混淆的根源。真正的问题始于我们试图将项代入这些公式时。这可能导致​​变量捕获​​,一个微妙但致命的错误。

想象你有这样一个公式:“对于每个学生 xxx,存在某人 yyy 指导他们”:∀x(S(x)→∃yA(y,x))\forall x (S(x) \rightarrow \exists y A(y,x))∀x(S(x)→∃yA(y,x))。现在假设你想将这个一般规则应用于一个具体情况:“yyy 的导师”,我们将其写为项 f(y)f(y)f(y)。如果你天真地用 f(y)f(y)f(y) 替换 xxx,你会得到:S(f(y))→∃yA(y,f(y))S(f(y)) \rightarrow \exists y A(y, f(y))S(f(y))→∃yA(y,f(y))。看看这场灾难!f(y)f(y)f(y) 中的 yyy,原本指我们正在讨论其导师的某个特定的人,已经被 ∃y\exists y∃y 量词“捕获”了,而这个量词仅仅意味着“某人”。原来的意思被完全破坏了。这是一个身份混淆的案例。

逻辑规则有一个简单的解决方案:在代入之前,只需重命名会引起冲突的约束变量。将 ∃y\exists y∃y 改为 ∃z\exists z∃z,公式就变成 ∀x(S(x)→∃zA(z,x))\forall x (S(x) \rightarrow \exists z A(z,x))∀x(S(x)→∃zA(z,x))。现在代入是安全的:S(f(y))→∃zA(z,f(y))S(f(y)) \rightarrow \exists z A(z, f(y))S(f(y))→∃zA(z,f(y))。意思得以保留。这些规则不仅仅是为形式主义而形式主义;它们是理性的护栏。正是它们使得这门简单、优美的语言能够表达复杂的思想,而绝不会陷入矛盾或歧义。

应用与跨学科联系

现在我们已经熟悉了谓词和量词的基本机制——形式逻辑的齿轮和杠杆——你可能会问:“这一切是为了什么?”这仅仅是一个形式游戏,一套抽象的符号 shuffling 规则吗?远非如此。我们一直在研究的是精确性的语言,这个智力工具箱让我们能够以完美、无歧义的清晰度从自然语言的模糊大理石中雕刻出思想。它是现代科学、数学和计算机科学所使用的语言。

让我们踏上一段旅程,看看这个非凡的工具在实践中的应用。我们将看到这些简单的符号——∀\forall∀(“对于所有”)和 ∃\exists∃(“存在”)——如何让我们构建世界,发现它们的属性,甚至理解它们的终极极限。

数字世界的蓝图

我们的第一站是现代最具体的创造:计算机。你如何告诉一台机器——它会以令人恼火的字面意义理解你说的每一句话——规则是什么?你不能含糊其辞。想象一下你正在设计一个文件系统。你需要强制执行诸如“每个非隐藏目录必须包含至少一个未锁定且不太大的文件”之类的规则。你如何毫无回旋余地地陈述这一点?

自然语言是含糊的。“至少一个”适用于文件、目录还是两者?“太大”究竟意味着什么?有了谓词,我们可以把它钉死。我们可以定义诸如 D(x)D(x)D(x) 表示“xxx 是一个目录”,H(x)H(x)H(x) 表示“xxx 是隐藏的”,以及 C(x,y)C(x, y)C(x,y) 表示“xxx 包含 yyy”之类的谓词。有了这些,我们可以将我们的规则翻译成一个完全清晰的陈述: ∀x((D(x)∧¬H(x))→∃y(C(x,y)∧F(y)∧¬R(y)∧¬M(y)))\forall x \big( (D(x) \land \neg H(x)) \rightarrow \exists y (C(x, y) \land F(y) \land \neg R(y) \land \neg M(y)) \big)∀x((D(x)∧¬H(x))→∃y(C(x,y)∧F(y)∧¬R(y)∧¬M(y))) 这行符号可能看起来令人生畏,但它像蓝图一样精确。它说:“对于任何项目 xxx,如果 xxx 是一个目录且不是隐藏的,那么必须存在某个项目 yyy,使得 xxx 包含 yyy,并且 yyy 是一个文件,且 yyy 不是只读的,且 yyy 不是过大的。”计算机可以理解这一点。没有任何歧义。同样的原则被用来设计数据库、指定网络协议和定义软件行为。例如,确保学术出版物数据库中“每篇论文恰好有一个通讯作者”,是构建一个工作系统所必须用逻辑完美陈述的另一条规则。

砥砺数学之基石

几个世纪以来,数学家们一直在与无穷和无穷小的概念作斗争。像连续性、极限和收敛这样的思想在直觉上被理解,但它们的文字描述却充满了悖论。19世纪谓词逻辑的发明,就像给了一个钟表匠一个珠宝商的放大镜。突然之间,一个论证的最精细的细节都可以被自信地看到和操纵。

思考一下微积分的基石——极限的定义。我们说 lim⁡x→cf(x)=L\lim_{x \to c} f(x) = Llimx→c​f(x)=L,粗略地讲,如果当 xxx “足够接近” ccc 时,f(x)f(x)f(x) 会“任意接近” LLL。这些带引号的短语是什么意思?epsilon-delta 定义给了它们一个纯逻辑的脊梁: ∀ϵ>0,∃δ>0,∀x,(0∣x−c∣δ→∣f(x)−L∣ϵ)\forall \epsilon > 0, \exists \delta > 0, \forall x, (0 |x - c| \delta \rightarrow |f(x) - L| \epsilon)∀ϵ>0,∃δ>0,∀x,(0∣x−c∣δ→∣f(x)−L∣ϵ) 每个部分都有其意义。“任意接近”由 ∀ϵ>0\forall \epsilon > 0∀ϵ>0 捕捉——告诉我任何小的距离 ϵ\epsilonϵ,我都能接受你的挑战。“足够接近”由 ∃δ>0\exists \delta > 0∃δ>0 捕捉——我能找到一个围绕 ccc 的范围 δ\deltaδ 来完成任务。

然而,真正的魔力在于当我们想证明一个极限不存在时。上面陈述的精确反面是什么?有了我们否定量词的规则,我们不必猜测。我们可以机械地转动逻辑的曲柄:∀\forall∀ 变成 ∃\exists∃,∃\exists∃ 变成 ∀\forall∀,最后的蕴涵   ⟹  \implies⟹ 变成合取 ∧\land∧。极限定义的否定变成: ∃ϵ>0,∀δ>0,∃x,(0∣x−c∣δ∧∣f(x)−L∣≥ϵ)\exists \epsilon > 0, \forall \delta > 0, \exists x, (0 |x - c| \delta \land |f(x) - L| \ge \epsilon)∃ϵ>0,∀δ>0,∃x,(0∣x−c∣δ∧∣f(x)−L∣≥ϵ) 这不仅仅是符号推演;这是一个启示。它为我们提供了一个证明极限不存在的具体策略:我们必须找到一个单一的目标范围 ϵ\epsilonϵ(一个“误差容限”),无论我们的对手选择多么小的 δ\deltaδ,这个范围都永远无法被满足。在任何 δ\deltaδ-邻域内,我们总能找到一个捣乱者 xxx,其函数值 f(x)f(x)f(x) 在 ϵ\epsilonϵ-容限之外。

有了这门强大的语言,数学家们可以定义和探索一整套复杂的概念。他们可以描述一条光滑曲线和一条有尖锐“跳跃”间断点的曲线之间的区别。他们可以区分点与点之间都相互分离的集合(像尘埃),和那些连续的集合(像一条线段)。他们甚至可以捕捉像紧致性这样奇妙的抽象属性,这不仅涉及到对点的量化,还涉及到对无限集合集的量化。谓词逻辑是整个现代分析学摩天大楼得以建立的脚手架。

探寻真理与计算的基石

到目前为止,我们使用逻辑来描述世界。但是我们能用它来描述逻辑本身和数学的本质吗?故事在这里发生了迷人的转折。

考虑一个我们从小学习的关于数字的简单真理:“0 不是任何数的后继数。”这似乎显然是真的。但它是一个逻辑真理,就像“ppp 或非 ppp”一样吗?还是一个关于我们数系的特定事实?通过将其形式化为 ∀x(S(x)≠0)\forall x (S(x) \neq 0)∀x(S(x)=0),我们发现了一些深刻的东西。我们可以轻易地想象一个这个陈述为假的“宇宙”(例如,一个只有一个物体 000 的宇宙,它的后继是它自己)。这意味着该陈述不是逻辑的普遍法则;它是我们为了让标准数系得以建立而必须假设的一个基础规则。它是算术的公理。逻辑迫使我们对自己的假设保持诚实。

这种向内的转向导致了20世纪最伟大的智力成就之一:理解了可计算和可证明的极限。关键在于量词的交替。在理论计算机科学中,一个计算问题的“难度”可以通过定义它所需的量词结构来分类。一个 ​​NP​​ 中的问题,比如“这个图是否存在一条访问每个城市的路径?”,涉及一次单一的搜索:∃p(p is a valid path...)\exists p (\text{p is a valid path...})∃p(p is a valid path...)。它的补问题,一个 ​​co-NP​​ 中的问题,是一个全称检查:∀p(p is not a valid path...)\forall p (\text{p is not a valid path...})∀p(p is not a valid path...)。更复杂的问题需要交替:“对于玩家 A 的每一步,是否存在一个玩家 B 的制胜反击?”交替的次数,∀∃∀…\forall \exists \forall \dots∀∃∀…,将问题分入一个难度递增的层次结构中,这个阶梯被称为多项式层次结构(Polynomial Hierarchy)。一个问题的逻辑形式直接反映了其内在的计算复杂性。

最终的发现是,有些事情根本超出了计算和证明的范围。这一点由 Alan Turing 和 Kurt Gödel 通过一个极其优美的论证证明,其逻辑骨架惊人地简单。让我们想象一个游戏。假设我们有两个谓词:H(p,i)H(p, i)H(p,i) 意为“程序 ppp 在输入 iii 上停机”,以及 D(p,i)D(p, i)D(p,i) 意为“一个假设的‘判定器’程序声称 ppp 在输入 iii 上停机”。

现在,考虑两个命题。

  1. 让我们假设一个“完美的判定器”存在。这是一个总是正确的程序 DDD。用逻辑表示:∀p,∀i,[D(p,i)  ⟺  H(p,i)]\forall p, \forall i, [D(p, i) \iff H(p, i)]∀p,∀i,[D(p,i)⟺H(p,i)]。
  2. 现在,让我们构建一个淘气的“反程序”,我们称之为 CCC。这个程序被设计用来做与判定器对其自身预测相反的事情。具体来说,当且仅当判定器说程序 ppp 在以其自身代码为输入时不停机时,CCC 才在输入程序 ppp 上停机。用逻辑表示:∃c∀p,[H(c,p)  ⟺  ¬D(p,p)]\exists c \forall p, [H(c, p) \iff \neg D(p, p)]∃c∀p,[H(c,p)⟺¬D(p,p)]。

这两个命题能同时为真吗?让我们看看。如果一个完美的判定器存在(命题 1),那么对于任何程序 ppp,D(p,p)  ⟺  H(p,p)D(p, p) \iff H(p, p)D(p,p)⟺H(p,p)。如果反程序存在(命题 2),我们可以将它自己的代码 ccc 喂给它。ccc 的规则告诉我们:H(c,c)  ⟺  ¬D(c,c)H(c, c) \iff \neg D(c, c)H(c,c)⟺¬D(c,c)。

现在,让我们把这些结合起来。我们从判定器的完美性得到 D(c,c)  ⟺  H(c,c)D(c,c) \iff H(c,c)D(c,c)⟺H(c,c),从反程序的定义得到 H(c,c)  ⟺  ¬D(c,c)H(c,c) \iff \neg D(c,c)H(c,c)⟺¬D(c,c)。这迫使我们得到 D(c,c)  ⟺  ¬D(c,c)D(c,c) \iff \neg D(c,c)D(c,c)⟺¬D(c,c),一个公然的矛盾!一个陈述不能等价于它自身的否定。

我们打破了什么?逻辑是健全的。不可避免的结论是,我们的初始前提——一个用于停机问题的“完美判定器”可以存在——必定是错误的。这在逻辑上是不可能的。通过量词和否定的简单舞蹈,我们发现了一个知识的基本极限。这同一个论证位于哥德尔不完备性定理的核心,该定理表明任何足够强大的数学形式系统都将包含它无法证明的真陈述。

逻辑,这个追求绝对确定性的工具,恰恰也是让我们得以确定地证明某些事物必然保持不确定性的工具。这是一个多么非凡、优美而深刻的思想。