从前,一个名叫侯世达写了一本书叫做哥德尔、埃舍尔、巴赫:永恒的金辫子。除其他外,它讨论了哥德尔不完全性定理也就是说,没有一个系统强大到足以包含关于数论两者都是一致的(每个可证明的陈述要么是真的,要么不是真的)以及完成(每一个真实的陈述都是可以证明的)。证明这一事实的方法与不动点原理负责奎因对角论证法建立背景知识来证明这一点需要书中的很大一部分,而证明最终会出现在二十章中的第十四章中。

所涵盖的知识之一是对印刷品数论体系,毫无想象力地被称为,印刷体数字理论,或TNT公司在对其工作原理进行了一些阐述并提供了完整的语法描述之后,霍夫施塔特为读者提供了一些翻译练习,但没有答案,如果读者倾向于尝试将这些数论(N)语句转换为印刷(TNT)等价物。

实施TNT的确切细节并不重要,只要知道TNT可以并且是严格定义的,同时保留其表现力引申到,数论的表现力。关于TNT最重要的事实是,除了等式之外,它所拥有的唯一数学运算符是加法和乘法。其他每一种数论结构都可以而且必须通过创建更聪明、更复杂的变量和量化组合来定义,它们有时可能需要大量的独创性。

霍夫施塔特的作业见第8章(20周年纪念版第215页),内容如下:


再做几个翻译练习

现在,为您做一些练习,测试您对TNT符号的理解。试着把下面的前四个N句子翻译成TNT句子,把最后一个翻译成一个开放的格式良好的公式。

所有自然数都等于4。
没有一个自然数等于它自己的平方。
不同的自然数有不同的后继数。
如果1等于0,那么每个数字都是奇数。
b条是2的幂。

最后一个你可能会觉得有点棘手。但与此相比,这算不算什么:

b条是10的幂。

奇怪的是,在我们的符号中,这需要很大的智慧。我会提醒你,只有在你愿意花费数小时和数小时在这上面,并且你知道一点数论的情况下,才可以尝试它!


必要时将解释与练习相关的TNT部分,但作为一般原则,对给定N句进行编码的特定TNT句子不如对N句进行足够简单的描述那样重要,这样就可以相对轻松地将其实现为TNT。目前,TNT在除数的余数之间缺乏区分,这对于指定一个数字是否为奇数很有用;也没有指数运算表达权力,这将大大简化最后两个练习。正如我们稍后将看到的那样,TNT有足够的力量来模仿这些机制,但并非没有很大的努力。


所有自然数都等于4。

这句话用TNT写起来很简单,因为它是一个简单的概念。我们可以简单地将这句话改写为“对于所有自然数a,a=4”,它直接对应于TNT字符串∀a:a=SSSS0。

需要注意的是,数字是以零的后继形式表示的,例如SS0是0的后继,也称为2;并且∀子句是一个可以对一个变量进行操作的量词,它所量化的表达式中必须是自由的,这意味着可以将所有数字替换到公式中,以生成一个真正的语句。它还有一个对应项,即“存在”,这意味着至少有一个数满足等式。另外值得注意的是,尽管这句话显然不是真的,因为只有一个自然数真的等于4,这并不意味着我们的公式写错了:它只是意味着在用TNT证明事物时,你会遇到这个句子的否定,而不是它。并非所有格式良好的语句都是正确的!


没有一个自然数等于它自己的平方。

再说一遍,只要你知道,这是一项相当简单的任务n个² =n个·n个N句可以变成“There does not exist an a,that a equals The product of a and a”,即~∃a:a=(a·a)。

这里的注释是波浪号意味着否定,它确实会影响它的位置水反应堆。任何量词;为了消除歧义,任何和或乘积都必须用括号括起来,尽管我们知道((a+b)+c)和(a+(b+c))由于结合性此外,在TNT中操作时需要选择一个。


不同的自然数有不同的后继数。

这是我们第一次面临翻译挑战。为了讨论两个不同的自然数,我们知道每个自然数都需要一个变量和量词。称它们为a和b:相关的量词是∀。如果a和b是两个不同的数字,那么我们知道~a=b。它们的后继Sa和Sb有相同的等价性。然后,语句是,“对于所有a和b,如果~a=b,那么~Sa=Sb。”因此,我们的TNT字符串是∀a:∀b:<~a=b⊃~Sa=Sb>。

正如加法和乘法都有括号一样逻辑连词(和,∧),分离(OR,∨)和含义(暗示,⊃)有尖括号。这些逻辑运算符以及前面提到的波浪号都是GEB中早期引入的逻辑演绎系统的结转,它正好反映了标准的逻辑演绎符号逻辑,尽管采用了严格的排版方式。此外,这里GEB的TNT的一个符号不便之处是显而易见的:=比~更紧密地绑定,并且没有绑定,这可能给那些用于标准符号逻辑的人带来不便。


如果1等于0,那么每个数字都是奇数。

该语句中含义的第一个子句很简单:S0=0。但我们如何描述每个数字都是奇数呢?首先,变量a是偶数还是奇数意味着什么?如果a是偶数,这意味着有一个数是a的一半:“a是偶号”可以用TNT表示为∃b:a=(b+b)。表示a是奇数的两种方法是,a)否定“a是偶数”,或b)说a是2的倍数的1。两者都同样有效:我们将使用后者。在TNT中:<S0=0 a:b:a=S(b+b)>。

这里开始需要创建中间语句,以便在转录中使用。如果伪TNT有助于您的思维过程,那么在中间步骤中使用它是可以的,但请记住,如果您要坚持它的最初目的,即将标准数论公理化为可计算枚举的系统。另外,关于这个系统的一个事实是:量词可以放在暗示的结果之外,围绕着整个语句,如果你这样选择的话;这变化不大,但可以说有点不得体,甚至粗鲁。几乎必须始终注意准确地知道什么是量化的,以及按什么顺序:将∃b放在∀a之前意味着不同的东西。您只能交换两个相邻的∃或∀,不能混用这两个。


b条是2的幂。

第一次尝试这样做可能是尝试将b指定为double某物。然而,这是一个递归方法,并要求一个人已经有了一个谓词来谈论二的幂,这导致了无法求解无限后退相反,我们需要的是一种更直接的方法。让我们检查2的幂,2n个.分解2n个加法不会带来快速的结果,但如果你检查一下它的因素,你会发现它们本身都是2的幂。值得注意的是,它们的一个共同点是它们都是均匀的。如果我们能证明只有偶数因子的b在逻辑上等价于b是2的幂,那么我们可以用它作为表示b是2幂的钩子。看2的素因式分解n个很明显,每个素数因子都是偶数,任何奇数因子都会导致一个奇数素数因子,而不是2。

最后一段中的讨论排除了数字1默契的假设所有涉及的数字都等于2或更大。然而,1既是2的幂,也是每个数字的因子,因此必须小心处理这种情况。要么b等于1,要么它的每一个大于1的因子都是偶数。等价地,要么b是1,要么对于所有SSa,a c的存在使得(SSa·c)=b意味着SSa是偶数。如果SSa是偶数,那么通过扩展a也是偶数,因此我们可以稍微简化公式。(因为最小的自然数是0,我们可以使用SSa来表示2或更大的数字,但必须记住SSa是最初调用的数字,而不仅仅是a。)

总而言之,在TNT中:。请注意c是如何在两个不同的量词下使用两次的:这是可以接受的,只要它是什么意思。


b条是10的幂。

这是有趣的部分.

在学习了如何表达2的幂之后,我们可以尝试一种等效的方法。要么b是1,要么它的所有因子都是10的倍数。然而,这种方法存在大量问题。首先,10的幂有两个和五个素因子,所以根据定义,没有一个数的所有因子都是10的倍数。如果你试图通过说所有因子10或更大都是10的倍数来弥补这个问题,你仍然会遇到问题:例如,25=5×5是一个因子100=10²,但它本身不是10的倍数,所以你只描述了1和10。此外,4=2²小于5,这意味着除非从列表中只排除2和5,否则允许20,无论如何,这并不能弥补所有其他功能的不足。钥匙是更扭曲的东西。

需要的是一种以非递归方式对10的任意幂进行编码的方法。这样做的等效方法是指定可以生成的有限序列,如{1、10、100…、10n个}. 要生成这个序列(称为{yn个})在信息量不变的情况下,我们需要一些初始值(在本例中为1),这是一个递归适用的规则(y米+1=10年合适的m),以及由n自己提供的停车位置。这是一个恒定的信息量,现在,它可以对任意长的序列进行编码(这意味着我们可以达到10的所有有限幂);然而,它仍然是递归的,所以我们需要一种方法将这些规则映射到一些TNT可表达结构上。

我们的救世主以中国剩余定理通过将序列项编码为某个数的结果,例如k,当取一组模时两两互质的我们可以轻松索引的数字为我们检索序列的成员提供了一种相对简单的方法。这些编码中最容易实现的是使用存在任意长度的事实素数的算术级数:两个数字i和j可以对n+1素数序列{i,i+j,i+2j,…,i+nj}进行编码。然而,这个结果直到2004年才出现,如果给定一个N,那么更类似于N长序列{1+N!,1+2(N!),1+3(N),…,1+N(N!并且其他具有成对共基性的优良序列也可以在TNT中描述。

重述:序列{10n个}由编码三倍的(,j个,k个),其中每个术语解释为k个+新泽西州-序列的长度与素数的算术级数相同。k个国防部=1和10(k个国防部+mj(百万焦耳)) =k个国防部+(+1)j个对于0≤<n个哪里n个是10的期望指数和序列的长度。如果存在三元组(不需要找到它-k个其中之一,将是难以置信的巨大,即使是相对微薄的价值n个)这样b是序列中的最后一项,那么b是10的幂。

好吧,差不多了。如果上述三元组存在,那么可以方便地说b是10的幂。然而,应该注意的是,它只意味着n个存在b=10n个这是相关的,因为上面使用的归纳规则只适用于0≤<n个-特别是,n个总是至少为1,而与上面的“2的幂”一样,1仍然是10的幂。因此,如果b是10的幂,要么存在上述三元组,要么b=S0。

我们将使用的主要中间谓词是实现模运算。我们可以定义一些临时符号MOD{k,n,a},它代表与…一致k个国防部n个在TNT中,这个谓词是<∃a′:n=(a+Sa′)∧n′:k=((n·n′)+a)>,它还必须确保a是唯一小于n的数字,与k个国防部n个。原因是,如果给定k和n-if all,则a是唯一的k个国防部n个如果允许,则该序列将不仅编码{10n个}还有其他数字。

那么我们的字符串看起来像什么?首先,我们将定义PRIME{n},以帮助对TNT字符串进行高级描述,然后进行替换。素数{n}是~d:d′:n=(SSd·SSd′);换句话说,如果一个数n是质数,那么不可能存在任何一对数,每对数都大于2,它们相乘就构成n。

公式最终看起来是这样的:∃n:\8707;i:𕏟j:∅k:<∀n′:<䤓n〃:n=(n′+n〃)⊃底漆{(i+(n′·j))}>∧<感应式∧<基础最终>>>。处理排序的三个谓词抽象的和列在下面。

  • INDUCTIVE谓词对序列y上的归纳步骤进行编码,n个'永远不平等n个,即素数+新泽西州不需要入职培训。)
    n′:n〃:n=(n′+Sn〃)y:<国防部{k、 (i+(n′·j)),(10·y)}国防部{k、 (i+(Sn′·j)),y}>>
  • 基本情况相对简单,最终成为不需要检查的退化MOD情况。
    国防部{k、 i,1}
  • FINAL情况是将序列的最后一项连接到b的位。
    国防部{k、 (i+(n·j)),b}

经过一番乏味的替换,我们得到了最终产品。

<b=S0∨n:∃i:∀j:∅k:<\8704;n′:<ᙋn〃:n=(n′+n〃)⊃~ \8707;d′:(i+(n′·j))=(SSd·SSd′)>∧n′:)=((SSSSSSSSSS 0·y)+Sy′)∧m:k=((i+(n′·j))·m)+(SSSSSS 0.y))>∧:(i+∧:(i+(n·j))=(b+Sb′)∧:k=((i+


这就结束了练习。

如果你可以在任何地方发现拼写错误或逻辑错误,请告诉我。

说不是这样!这篇文章中有一个逻辑错误!我之前曾建议三元组的存在(,j个,k个)编码序列{10n个}最多n个用于任意n个如上所述,充分涵盖10的所有功率。这是不正确的,因为它只适用于n个>0,也就是说它排除了其他有效的n个=0案例,其中100= 1. 此错误已于2013年7月10日更正。


*精明的读者会注意到n个> 1 +n个·n个!—值得思考的是,如何修补这些漏洞。另一个好奇心是如何表达n个! 完全。

登录登记在这里写点什么或联系作者。