一种讨论“逻辑简单”的框架

题图:Edge InPrivate 浏览 Wikipedia 英文的 Kolmogorov complexity 词条的截图,截图时已经启动放大镜并使用反色效果。

本文重新整理后已 发表 在我的个人博客上。

本文旨在表达作者认为一种可以用来定义“逻辑简单”的方法。

任何上过小学数学的人都应该见过“找规律填数”这类问题。一方面,通常人确实会认为数列“1、2、3、?、5、6”中空缺项(问号)应该是 4;另一方面,任何知道 Lagrange 插值多项式的人都知道这个问号处填任何数都是可以被解释的;甚至,就我个人来说,我更喜欢用分段函数解释。

此外,近来我在浏览知乎的时候有看到大家探讨“是汉语的动词变化逻辑简单还是英语动词变化逻辑简单”这类问题。譬如“V 过”“V 了”“V 过了”与 V-ed/to have V-ed 等的对应。有人认为汉语的动词变化比较简单(语气、语态、时、体等体现在外部且规律性很强),对应地,英语的动词形态变化比较复杂(过去式、过去分词)。

之前在考虑如何好地定义找规律填数类问题答案的时候有过本文将要介绍的思路,现在把它整理下来。

阅读以下内容需要有基本的计算理论知识,至少知道什么是语言、什么是图灵机。不熟悉该概念的读者可以简单地把语言包含一些字符串的集合等同起来,把图灵机图灵完全语言的程序等同起来,这种对应关系下文章的解读将会标注在括号里面。

计算理论里的经典考虑——字符串的 Kolmogorov 复杂度

选定一个 Turing 可计算的 Turing 机编码(也就是,把程序和源代码对应起来)r:\mathrm{TM}\to\Sigma^\ast,这就是说,存在着图灵机 U,当输入像 r(M) 时,U 可以模拟 MU 可以理解为语言的解释器)。

考虑串 s,如果图灵机 M 在输入 t 时停机并输出 s,我们说 s 可以被 ({M,t}) 表示(或后者是前者的一个表示),称 |r(M)|+|t| 为这个表示的长度。对于一个串 s,它的所有表示中长度最小者叫做它的最小表示,最小表示的长度叫做它的 Kolmogorov 复杂度,定义 Kolmogorov 复杂度除以长度为压缩率

两个简单的例子:

一个压缩率很低的串:(连续 n1 的串的压缩率是 \mathcal{O}\left(\frac{\log n}{n}\right)

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

一个 Kolmogorov 复杂度很高的串:

bJc.5Ha~@mtynS7(tTB5#_7!6;m<4ut~QsQT;XE6guA/P+dNc(5H256%F4?w&yS[{FB$9jg3:Y;)24^8]GBf]E&7qXu93x5Mr43+

熟知几个结论:

  • 串的 Kolmogorov 复杂度不超过它的长度加上一个常数(该常数和选定的 r 有关系);
  • 对于每个长度的串,存在着压缩率不小于 1 的串;
  • 大多数串的压缩率都很(接近 1,很难压缩);
  • 判断输入串的压缩率是否不小于 1,是 Turing 不可计算的。

找规律填数

下面我给出一种令我信服的、找规律填数类问题答案的定义。希望也能让你信服。

在考题之前,我们要先规定 r(规定一种程序语言),设有一个给定 a_1,\dots,a_{n-1},a_{n+1},\dots,a_ma_n 的题目 P。考虑图灵机 M,使得 M(k)=a_k\quad({k=1,\dots,n-1,n+1,\dots,m}) 成立,且 M(n) 停机,则说 MP 的一个|r(M)| 叫做这个解的逻辑复杂度

考虑 P 的逻辑复杂度最低的解 M^\star(如果同样长度的有多个,可以用 r(M) 的字典序决定谁更优先),则应该认为这里规律就是指 M^\star,以 a_n=M^\star(n) 作为标准答案。

一句话解释:选定一个固定的程序设计语言;两段代码相比,更短的更优先,同样长的代码字典序更小的更优先;给定数列的某些项和一些待填写的下标,如果某个程序在这些下标都能运行完毕,并且运行结果和已经给出的项是一致的,则认为是解;最优先的解代表了“规律”,因此最优先的解在待填写下标上的输出就是应该填写的答案。

例子:考虑“1、2、3、?、5、6”,使用的语言约定是 JavaScript ES5 的表达式,该表达式必须是一个方法表达式,且返回的方法就作为程序使用,长度相同时,Unicode 字典序更小者认为更优先。那么该问题的一个解可以是:

function (n) {
    if (n != 4) return n;
    return 16384;
}

该问题的最优解是:

function($){return $}

因此此题标准答案是 4。

类似地,可以定义需要填多项的题目如何定义标准答案。

关于这个定义的几个结论是:

  • 对于所有给出有限项,要填有限个缺失项的题目,在该定义下都有解;
  • 如果给定无限项,要填一个缺失项,则该定义不一定有解,考虑任意一个不可计算数列,抽去一项,那么这样的题目是不存在解的;
  • 该定义下的最优解是 Turing 不可计算的(可以用 Kolmogorov 复杂度来归约);
  • 考虑找规律(不填数)问题,这个问题里面只要寻找最小机器 M 符合给定的数列规律,设有一个(无穷长的)可计算数列 a_1,\dots,a_n,\dots 的最优解是 M,则存在 N,使得对任意 m>N,问题 a_1,\dots,a_m 的最优解是 M

其中第一条和第三条告诉我们了该定义的辨证矛盾(pia 飞):该定义对于实际问题是良好的,但是是不可计算的。这正好说明了能够解决复杂的找规律问题的人具有超乎寻常的计算能力。注意:对于任意一个具体的(有限大小的)找规律问题,它的解都是可计算的,但是不存在计算任意规模问题的算法,因此也不要因为自己的找规律问题做得很好而沾沾自喜。

第四条是后来加上的,它的含义是:对于一个可计算数列,存在一个项数的界,使得给出该界以内的所有项,就不存在比能够完整生成该可计算数列的最小机器在逻辑上更简单(更小)的机器了。

譬如评论中提问 2、3、5、7、?、13、17、19 的问题,如果考虑上述模型,或许写一个分段函数(分 8 段)比写一个求第 n 个质数的程序短,从而该问题答案不一定是 11;但是,如果题目坚持这个数列的规律是“第 n 个质数”,那么可以通过给出更多的项,例如给出 2、3、5、7、?、13、17、19、23、……、某个超级大的质数,这样就可以锁定答案必须是 11。

此外,在刚刚的“1、2、3、?、5、6”里面,如果我们把问题改成“1、?”,那么最优解将变成:(被填写的数将不是 2 而是 1)

function(){return 1}

这里这个 N(给出至少多少项可以锁定最简单的逻辑到那个可计算数列,也就是例子中“某个超级大的质数”是第几个质数)可以非常非常大,存在性的证明是平凡的:考虑比 M 小(优先)的所有机器,它们都不是该可计算数列的解,因此它们计算的数列某一项和该数列不同(要么这一项上它不停机,要么它算出的结果不同),设这些机器第一次和该数列不同的诸个下标的最大值是 N,则这个 N 恰好就是可以选择的最小的 N。细心的读者一定已经发现,该 N 一定是 Turing 不可计算的。

可以证明,在上述模型(JavaScript ES5)下,对于可计算数列 a_n=n,只要给出前两项即可“锁定”它的逻辑。

语言的逻辑性

读者已经可以仿照上述过程比较两个语言的逻辑性。

给出一个 sketch:首先假定语义可以被(用 Turing 可计算的映射)编码,然后选定一个 r,定义图灵机 M 是自然语言 L 的机器,当且仅当 M 输入任意语义的编码的时候,都停机,且输出一句语法正确、语义同输入的被编码语义、用法符合母语使用者用法的句子。定义一个自然语言的逻辑复杂度为它的所有机器中 |r(M)| 最小者的 |r(M)|

对于两个自然语言,逻辑复杂度较小者,逻辑更简单,更“符合逻辑”。

转载

在未经书面授权的情况下,您不可以用除了复制本文章地址的方法转载该文章。注意:您不能复制本文章的内容,也不能复制部分内容作为摘要,您只能通过 URL 链接到该文章。您可以复制文章的内容供个人观看,但将其贴在公众可浏览位置并不算是个人观看,即使该位置只有您自己观看。当转载到的位置上的软件提供 URL 预览功能的时候,您应该尝试关闭该功能。

编辑于 2018-01-04