MathLabs

数学基础

哥德尔不完备定理

任何强大到足以描述算术的形式系统,都必然包含它无法证明的真命题,也无法证明自身的一致性——这一1931年发现的根本性限制,重塑了逻辑学、可计算性理论与数学哲学。

直观一句谈论自己的话

考虑这句话:"这句话无法被证明。"如果它能被证明,那它就是假的(因为它说自己不能被证明),这对一个只证明真命题的证明系统来说很糟糕。所以它必定不可证——但这样一来,它所说的内容就是真的。我们找到了一个真却无法证明的命题。这不是一个廉价的文字游戏;1931年,库尔特·哥德尔展示了如何在任何足够强大的形式系统内部,构造出一个诚实的、纯粹算术的句子,具有恰好这种行为。

中学形式系统是一个规则固定的游戏

可以把形式系统想象成国际象棋:一个固定的起始局面(公理)、一套固定的走子规则(推理规则),当你到达一个合法局面(被证明的定理)时就算"获胜"。这些规则对现实世界一无所知——计算机可以机械地检查每一步,而无需理解一个证明"意味着"什么。哥德尔的发现正是关于这一点:无论你如何为算术固定公理和规则,关于数的某些真命题永远无法作为这个游戏中的"合法局面"被到达。

大学真理与可证性,以及哥德尔编码

定义: 一致性与完备性

形式系统 FF 是一致的(无矛盾的),如果没有任何命题 φ\varphi 使得 FF 同时证明 φ\varphi 和 ¬φ\neg\varphi(记作 F⊢φF \vdash \varphi 与 F⊢¬φF \vdash \neg\varphi)。若对其语言中的每个句子 φ\varphi,都有 F⊢φF \vdash \varphi 或 F⊢¬φF \vdash \neg\varphi,则称它是完备的。若计算机能够判定一段给定文本是否是 FF 中的合法证明,则称 FF 是可有效公理化的。

一个关于数的公式怎么能谈论证明呢?靠的是哥德尔编码:给每个符号、每个公式 φ\varphi 以及每个公式序列分配一个唯一的自然数 ⌜φ⌝\ulcorner\varphi\urcorner(就像计算机把任何文件都存成数字一样)。检查一个公式序列是否为合法证明,只是对这些数字的机械计算,因此"数字 pp 编码了代码为 nn 的公式的一个证明"就变成了一个只用到 ++、×\times 和量词的普通算术关系 PrfF(p,n)\mathrm{Prf}_F(p, n)。FF 中的可证性由此变成了算术公式 ProvF(n):=∃p PrfF(p,n)\mathrm{Prov}_F(n) := \exists p\,\mathrm{Prf}_F(p, n)。

⌜φ⌝=2a13a2⋯pkak\ulcorner\varphi\urcorner = 2^{a_1} 3^{a_2} \cdots p_k^{a_k}

把一个公式 φ\varphi 看作一个有限的符号串,并设 a1,a2,…,aka_1, a_2, \dots, a_k 是这些符号依次对应的数字代码(比如某张固定的对照表给语言中的每个符号分配一个小整数)。整个公式的代码 ⌜φ⌝\ulcorner\varphi\urcorner 就是上面这个数:第 ii 个素数 p1,p2,…,pkp_1, p_2, \dots, p_k(即 2,3,5,…2, 3, 5, \dots)上的指数记录了第 ii 个符号的代码。由于每个自然数的质因数分解方式都是唯一的,这个数总能被唯一地解码回原来的符号串——把公式编码成数字不会丢失任何信息,就像计算机把一个文本文件存成一串字节一样。

T⊢G↔¬ProvT(⌜G⌝)T \vdash G \leftrightarrow \neg\mathrm{Prov}_T(\ulcorner G\urcorner)

上面这个等式 T⊢G↔¬ProvT(⌜G⌝)T \vdash G \leftrightarrow \neg\mathrm{Prov}_T(\ulcorner G\urcorner) 是每一个对角线(不动点)句子的通用形状:对一个理论 TT,它构造出一个句子 GG,可证地等价于断言"我,GG,在 TT 中不可证"。这并非哥德尔那个例子专有的把戏——同一套配方可以为算术中任何可表达的性质构造出一个自我指涉的句子,这正是下面所画的这个环永远无法逃脱闭合的原因:从 GG 出发的箭头总能找到回到 GG 的路。

一个网络图,展示了一个自我指涉的句子与断言其自身可证性的算术命题之间的有向环,图示了哥德尔对角线构造核心的自我指涉。
一个依赖环:句子 GFG_F 谈论的是它自身的可证性。节点"GFG_F"指向节点"ProvF(⌜GF⌝)\mathrm{Prov}_F(\ulcorner G_F\urcorner)"(断言它可证的命题),而这个命题又指回 GFG_F 本身——这正是哥德尔编码在纯算术内部所构造出的那个闭环。

设 FF 是一个一致的、可有效公理化的、能够表达初等算术的形式系统。则在 FF 的语言中存在一个句子 GFG_F,它在标准自然数 N\mathbb{N} 中为真,但 F⊬GFF \nvdash G_F(若 FF 是 ω\omega-一致的,则也有 F⊬¬GFF \nvdash \neg G_F)。特别地,FF 是不完备的。

为什么成立?

由对角线引理(康托尔对角线论证的形式化近亲),算术可以构造一个句子 GFG_F 满足 F⊢GF↔¬ProvF(⌜GF⌝)F \vdash G_F \leftrightarrow \neg\mathrm{Prov}_F(\ulcorner G_F\urcorner)——一个断言自身在 FF 中不可证的句子。若 F⊢GFF \vdash G_F,则 ProvF(⌜GF⌝)\mathrm{Prov}_F(\ulcorner G_F\urcorner) 成立,从而 F⊢¬GFF \vdash \neg G_F,与一致性矛盾。因此 F⊬GFF \nvdash G_F——而这恰恰就是 GFG_F 所断言的内容,所以 GFG_F 在 N\mathbb{N} 中为真。(罗瑟后来去掉了 ω\omega-一致性假设。)

证明

第1步(语法的算术化)。固定一种可计算的编码方案,给 FF 语言中的每个符号、每个公式以及每个有限公式序列都分配一个唯一的自然数,即它的哥德尔数。由于 FF 是可有效公理化的,关系 PrfF(p,n)\mathrm{Prf}_F(p, n)——"pp 是代码为 nn 的公式的一个证明的代码"——可以用一个只含 ++、×\times 和量词的算术公式来表达,因为逐行检查一个证明是一个有限的机械过程。定义 ProvF(n):=∃p PrfF(p,n)\mathrm{Prov}_F(n) := \exists p\, \mathrm{Prf}_F(p, n)。

第2步(对角线引理)。对任意只含一个自由变量的算术公式 ψ(x)\psi(x),对角线引理都能构造出一个句子 DD,满足 F⊢D↔ψ(⌜D⌝)F \vdash D \leftrightarrow \psi(\ulcorner D \urcorner)——DD 断言关于它自身代码的 ψ(x)\psi(x) 成立。将其应用于 ψ(x):=¬ProvF(x)\psi(x) := \neg\mathrm{Prov}_F(x):我们得到一个句子 GFG_F,满足 F⊢GF↔¬ProvF(⌜GF⌝)F \vdash G_F \leftrightarrow \neg\mathrm{Prov}_F(\ulcorner G_F \urcorner)。通俗地说,GFG_F 断言"我在 FF 中不可证"。

第3步(F⊬GFF \nvdash G_F)。反证:假设 F⊢GFF \vdash G_F。由于 FF 是可有效公理化的,这个证明本身有一个代码 p0p_0,所以 PrfF(p0,⌜GF⌝)\mathrm{Prf}_F(p_0, \ulcorner G_F \urcorner) 为真,从而 F⊢ProvF(⌜GF⌝)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner)(关于具体数字的可证算术事实,其本身在 FF 中也可证)。但对角线等价式连同 F⊢GFF \vdash G_F 又给出 F⊢¬ProvF(⌜GF⌝)F \vdash \neg \mathrm{Prov}_F(\ulcorner G_F \urcorner)。于是 FF 同时证明了一个命题及其否定,与一致性矛盾。因此 F⊬GFF \nvdash G_F。

第4步(GFG_F 为真,并且——假设 ω\omega-一致性——F⊬¬GFF \nvdash \neg G_F)。由于 F⊬GFF \nvdash G_F,没有任何数字编码 GFG_F 的证明,所以 ¬ProvF(⌜GF⌝)\neg\mathrm{Prov}_F(\ulcorner G_F \urcorner) 在 N\mathbb{N} 中成立;由对角线等价式,这恰恰就是 GFG_F 所断言的内容,所以 GFG_F 为真。如果 FF 也能证明 GFG_F 的否定,即 F⊢¬GFF \vdash \neg G_F,那么把这一点与对角线等价式结合就会得到 F⊢ProvF(⌜GF⌝)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner)——"存在某个 pp 编码了 GFG_F 的证明"——却没有任何实际证明能见证它,而这正是 ω\omega-一致性所排除的情形。所以在 ω\omega-一致性下 F⊬¬GFF \nvdash \neg G_F 也成立,FF 是不完备的。

设 FF 是一个扩展了皮亚诺算术(或强大到足以形式化自身证明谓词)的一致、可有效公理化的形式系统,并设 Con(F):=¬ProvF(⌜0=1⌝)\mathrm{Con}(F) := \neg\mathrm{Prov}_F(\ulcorner 0 = 1\urcorner) 为表达"FF 一致"的算术句子。则 F⊬Con(F)F \nvdash \mathrm{Con}(F)。

为什么成立?

第一定理的证明——"若 FF 一致,则 FF 不能证明 GFG_F"——本身可以在 FF 内部形式化,从而得到 F⊢Con(F)→GFF \vdash \mathrm{Con}(F) \to G_F。如果 FF 能证明 Con(F)\mathrm{Con}(F),用分离规则就会得出 F⊢GFF \vdash G_F,与第一定理矛盾。

证明

第1步(可证性谓词不仅可定义,而且可形式化)。由于 ProvF\mathrm{Prov}_F 是由可机械检验的关系 PrfF(p,n)\mathrm{Prf}_F(p,n) 构造出来的,以下三条"可导出性条件"本身在 FF 内部就是可证的(这正是本论证需要 FF 扩展皮亚诺算术、而不仅仅是一致的原因):(P1P_1)若 FF 证明 φ\varphi,则 FF 证明 ProvF(⌜φ⌝)\mathrm{Prov}_F(\ulcorner\varphi\urcorner);(P2P_2)FF 证明 ProvF(⌜φ→ψ⌝)→(ProvF(⌜φ⌝)→ProvF(⌜ψ⌝))\mathrm{Prov}_F(\ulcorner\varphi\to\psi\urcorner) \to (\mathrm{Prov}_F(\ulcorner\varphi\urcorner)\to\mathrm{Prov}_F(\ulcorner\psi\urcorner));(P3P_3)FF 证明 ProvF(⌜φ⌝)→ProvF(⌜ProvF(⌜φ⌝)⌝)\mathrm{Prov}_F(\ulcorner\varphi\urcorner) \to \mathrm{Prov}_F(\ulcorner\mathrm{Prov}_F(\ulcorner\varphi\urcorner)\urcorner)。

第2步(形式化定理1自身的论证)。由对角线等价式,F⊢¬GF→ProvF(⌜GF⌝)F \vdash \neg G_F \to \mathrm{Prov}_F(\ulcorner G_F \urcorner)。定理1的非形式论证——"如果 GFG_F 可证,那么它自身的证明就见证了 ProvF(⌜GF⌝)\mathrm{Prov}_F(\ulcorner G_F\urcorner),而对角线等价式随即又给出 ¬GF\neg G_F 的一个证明"——除了(P1P_1)–(P3P_3)所涵盖的机械符号操作外不需要别的东西,因此可以在 FF 内部逐步原样模拟为一个形式推导,从而得到 F⊢ProvF(⌜GF⌝)→ProvF(⌜¬GF⌝)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner) \to \mathrm{Prov}_F(\ulcorner \neg G_F \urcorner)。由于同时证明了 GFG_F 及其否定,FF 便能通过爆炸原理(ex falso quodlibet)导出 0=10 = 1,这给出 F⊢ProvF(⌜GF⌝)→¬Con(F)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner) \to \neg\mathrm{Con}(F),即 F⊢Con(F)→GFF \vdash \mathrm{Con}(F) \to G_F。

第3步(结论)。反证:假设 F⊢Con(F)F \vdash \mathrm{Con}(F)。将其与 F⊢Con(F)→GFF \vdash \mathrm{Con}(F) \to G_F 通过分离规则结合,FF 就会证明 GFG_F。但定理1已经表明,对一致的 FF 有 F⊬GFF \nvdash G_F——矛盾。因此 FF 无法证明 Con(F)\mathrm{Con}(F),这正是所要证明的结论。

20世纪20年代,大卫·希尔伯特提出了希尔伯特纲领:将整个数学公理化,然后仅使用关于符号的简单有限推理,证明该公理系统是一致且完备的。哥德尔的两个定理表明这无法按原设想实现:如果不使用比被检验系统更强的原则,皮亚诺算术甚至无法证明自身的一致性,更不用说集合论了。

对任意一阶理论 TT 和句子 φ\varphi,T⊢φT \vdash \varphi 当且仅当 φ\varphi 在 TT 的每一个模型中都为真(T⊨φT \models \varphi)。

为什么成立?

哥德尔于1929年(在他的博士论文中)证明了这一定理,它说明一阶逻辑的推理规则是完备的:不会遗漏任何逻辑推论。不完备定理(1931年)并不与之矛盾:GFG_F 不可证,是因为尽管 GFG_F 在标准模型 N\mathbb{N} 中为真,FF 却拥有使 GFG_F 为假的非标准模型。

证明

第1步(可靠性——容易的方向,T⊢φT \vdash \varphi 蕴含 T⊨φT \models \varphi)。对从 TT 到 φ\varphi 的形式证明的长度作归纳论证。根据定义,TT 的每条公理在 TT 的任意模型 MM 中都为真;每条纯逻辑公理(例如 φ→(ψ→φ)\varphi \to (\psi \to \varphi))都是有效的,在任何解释下都为真。而每条推理规则都在 MM 中保真:对分离规则而言,若 M⊨θM \models \theta 且 M⊨θ→φM \models \theta \to \varphi,则自动有 M⊨φM \models \varphi。因此证明的每一行都在 MM 中为真,特别是最后一行 φ\varphi 也为真;由于 MM 是 TT 的任意模型,故 T⊨φT \models \varphi。

第2步(完备性——困难的方向,用逆否命题:T⊬φT \nvdash \varphi 蕴含 T⊭φT \not\models \varphi)。设 T⊬φT \nvdash \varphi。则集合 T∪{¬φ}T \cup \{\neg\varphi\} 是一致的(若它能推出矛盾,由归谬法 TT 就会证明 φ\varphi)。利用亨金方法,将其扩张为一个带见证元的极大一致集 Σ\Sigma:每当 ∃x ψ(x)\exists x\, \psi(x) 属于 Σ\Sigma,就添加一个新常元 cc 使得 ψ(c)\psi(c) 也属于 Σ\Sigma。构造项模型 MΣM_\Sigma,其元素是扩张语言中按 Σ\Sigma 中可证等式加以等同的闭项,关系和函数直接由 Σ\Sigma 解释。对项的长度作归纳(即"真值引理")即可证明,对任意句子 θ\theta 都有 MΣ⊨θ  ⟺  θ∈ΣM_\Sigma \models \theta \iff \theta \in \Sigma。

第3步(拼装模型并得出结论)。由于 ¬φ∈Σ\neg\varphi \in \Sigma,真值引理给出 MΣ⊨¬φM_\Sigma \models \neg\varphi;又因 TT 的每条公理都属于 Σ\Sigma,也有 MΣ⊨TM_\Sigma \models T。所以 MΣM_\Sigma 是 TT 的一个真实模型,且在其中 φ\varphi 不成立,即 T⊭φT \not\models \varphi。这就证明了第2步的逆否命题,结合第1步即得:T⊢φT \vdash \varphi 当且仅当 T⊨φT \models \varphi——这正是哥德尔1929年博士论文的结果,后来由莱昂·亨金(1949年)整理为这里所用的项模型构造。

进阶不完备性、停机问题与不可判定问题

不存在这样的算法(图灵机)HH:它接收任意程序 PP 的代码和输入 xx,并总能停机且正确回答 P(x)P(x) 最终是否会停机。

为什么成立?

假设 H(P,x)H(P, x) 能判定停机。构造一台机器 D(P)D(P),它先运行 H(P,P)H(P, P),若 HH 回答"停机"就永远循环,若 HH 回答"循环"就停机。把 DD 自己的代码喂给它:D(D)D(D) 停机当且仅当 H(D,D)H(D, D) 说它循环——矛盾。这正是哥德尔对角线句子在计算领域的孪生兄弟。

证明

第1步(假设存在一个停机判定器)。反证:假设存在一个算法 HH,使得 H(P,x)H(P, x) 总是终止,并且正确地回答:若代码为 PP 的程序在输入 xx 上停机则输出"停机",否则输出"循环"。

第2步(由 HH 构造一台对角线机器)。定义一个新算法 D(P)D(P),它以程序代码 PP 为输入,首先计算 H(P,P)H(P, P)——把 PP 同时作为程序和输入喂给 HH 运行。如果 H(P,P)H(P, P) 回答"停机",那么 DD 就故意陷入无限循环;如果 H(P,P)H(P, P) 回答"循环",那么 DD 立即停机(比如返回 00)。

第3步(把 DD 自己的代码喂给它)。由于 DD 本身就是一个算法,它自己也有代码,没有什么能阻止我们在这段代码上运行 DD:考虑 D(D)D(D)。有两种情形,都不可能成立:如果 D(D)D(D) 停机,那么按构造,这恰好发生在 H(D,D)H(D, D) 回答"循环"的时候——也就是说 HH 错误地报告 DD 在 DD 上不停机,而它其实刚刚停机了。反之如果 D(D)D(D) 永远运行下去,这恰好发生在 H(D,D)H(D, D) 回答"停机"的时候——也就是说 HH 错误地报告它停机,而它其实永远循环。

第4步(结论)。无论哪种情形,HH 在输入 (D,D)(D, D) 上都给出了错误答案,与"HH 总是正确"的假设矛盾。所以这样的算法 HH 不可能存在:停机问题是不可判定的。

停机问题直接蕴含了第一不完备定理:如果一个可靠且可有效公理化的系统 FF 对算术是完备的,我们只需逐一枚举 FF 中的所有证明,直到找到"P(x)P(x) 停机"的证明或它不停机的证明,就能判定 P(x)P(x) 是否停机。而且不可判定性一直延伸到普通数论之中:希尔伯特第十问题(`hilbert-tenth-problem`)询问是否存在算法能判定整系数多项式方程是否有整数解,戴维斯、普特南、罗宾逊和马季亚谢维奇(1970年)证明了这样的算法不存在。因此,在任何一致的系统 FF 中,都存在一个实际上没有整数解的具体丢番图方程,但 FF 无法证明它无解。

大学实际应用与典型例题

哥德尔与图灵划定的界限并非只是哲学上的趣味谈资:它们为软件工具能够承诺的事情设下了硬性边界。每一个宣称"证明我的程序没有错误"的静态分析工具、每一个完全自动的定理证明器、以及每一款声称能检测一切恶意行为的杀毒软件,都会直接撞上这些定理——关于程序的某些问题,无论投入多少计算能力或巧思,都不可能被任何算法判定。下面两个例子把这一点具体化:一个在小规模上重现了证明核心的编号机制,另一个则展示了一项真实的软件工程任务,它直接从停机问题那里继承了不可判定性。

例题

为一个小型逻辑字母表固定一张示例对照表:¬↦1\neg \mapsto 1,∃↦3\exists \mapsto 3,x↦4x \mapsto 4。利用哥德尔编码公式,计算三符号串"¬∃x\neg \exists x"的代码 ⌜¬∃x⌝\ulcorner \neg \exists x \urcorner。

解答

第1步(依次读出各符号的代码)。字符串"¬∃x\neg \exists x"依次有三个符号:¬\neg、∃\exists、xx。查表得到代码序列 a1=1a_1 = 1、a2=3a_2 = 3、a3=4a_3 = 4。

第2步(套用编码公式)。有 k=3k = 3 个符号,公式为 ⌜¬∃x⌝=2a1⋅3a2⋅5a3=21⋅33⋅54\ulcorner \neg \exists x \urcorner = 2^{a_1} \cdot 3^{a_2} \cdot 5^{a_3} = 2^{1} \cdot 3^{3} \cdot 5^{4},以前三个素数 2,3,52, 3, 5 作为底数。

第3步(计算每个素数幂)。21=22^{1} = 2,33=273^{3} = 27,以及 54=6255^{4} = 625。

第4步(相乘)。⌜¬∃x⌝=2×27×625=33,750\ulcorner \neg \exists x \urcorner = 2 \times 27 \times 625 = 33{,}750。由于 33,75033{,}750 唯一地分解为 21⋅33⋅542^1 \cdot 3^3 \cdot 5^4,任何拿到这一个数字的人都能还原出指数 1,3,41, 3, 4,从而准确读回原始字符串"¬∃x\neg \exists x"——编码过程没有丢失任何信息。

例题

某静态分析团队想给他们的工具添加一个功能 ZZ:给定他们语言中任意函数 ff 的源代码,Z(f)Z(f) 总能终止,并正确报告是否存在某个输入使得 ff 抛出空指针异常。通过把停机问题归约到它,证明这样的 ZZ 不可能存在。

解答

第1步(把停机问题归约到空指针检测)。反证:假设 ZZ 存在。给定任意程序 PP 和输入 xx——停机问题的一个实例——按如下方式构造一个新函数 fP,xf_{P,x}(它自己不接受输入):fP,xf_{P,x} 首先逐步模拟 PP 在 xx 上运行,该模拟代码中不使用任何空指针。

第2步(附加一个可观察的信号)。在 P(x)P(x) 的模拟结束后——这只有在 P(x)P(x) 停机时才会发生——fP,xf_{P,x} 立即执行多一行代码,故意解引用一个空指针,抛出异常。如果 P(x)P(x) 的模拟永远不会结束,这一行就永远不会被执行,也就永远不会抛出异常。

第3步(归约是精确的)。按构造,fP,xf_{P,x} 在某个输入上抛出空指针异常,当且仅当 P(x)P(x) 停机:这里的"某个输入"并不重要,因为 fP,xf_{P,x} 忽略了自己的参数,但该工具对 fP,xf_{P,x} 做出的判定恰好回答了 (P,x)(P, x) 的停机问题。

第4步(矛盾)。运行假设存在的判定器 Z(fP,x)Z(f_{P,x}),就能对任意的 PP 和 xx 判定 P(x)P(x) 是否停机——但上面的定理已经证明不存在这样的算法。所以无论分析多么精巧,这个静态分析功能 ZZ 对任意程序都不可能存在。

研究自然的独立命题与连续统假设

哥德尔的句子 GFG_F 看起来有些人工——它是专门为了谈论自身的可证性而构造出来的。那么不完备性会不会落到数学家原本就已经在问的问题上?会的。最著名的例子是康托尔的连续统假设(`continuum-hypothesis`):是否存在一个集合,其基数严格介于 N\mathbb{N} 与 R\mathbb{R} 的基数之间?哥德尔(1940年)通过构造可构造宇宙 LL 证明了 ZFC 集合论无法否证它,而保罗·科恩(1963年)发明了力迫法(forcing),证明了 ZFC 也无法证明它。在算术本身内部,帕里斯–哈灵顿定理(1977年)与古德斯坦定理(1944年提出,1982年由柯比与帕里斯证明其独立性)都是关于有限数的真正组合学事实,它们在 N\mathbb{N} 中为真,却无法在皮亚诺算术中证明。

为什么哥德尔第一不完备定理不适用于普雷斯伯格算术(只有加法 ++ 而没有乘法 ×\times 的 N\mathbb{N} 的一阶理论)?

哥德尔第二不完备定理对一个扩展了皮亚诺算术的一致、可有效公理化的系统 FF 说了什么?

哥德尔在1929年证明了完备性定理,又在1931年证明了不完备性定理。为什么它们并不矛盾?

如果一个可靠且可有效公理化的形式系统 FF 对算术是完备的,这对停机问题意味着什么?

参考文献

  1. Kurt Gödel (ed. Jean van Heijenoort) (1967). On formally undecidable propositions of Principia Mathematica and related systems I (1931), in From Frege to Gödel · DOI:10.1007/BF01700692
  2. Peter Smith (2013). An Introduction to Gödel's Theorems · DOI:10.1017/cbo9780511800962
  3. Torkel Franzén (2005). Gödel's Theorem: An Incomplete Guide to Its Use and Abuse