最近我沿着王垠的提示(特别是Frege逻辑)读了一些数学的内容,有了一些新的想法。
首先王垠指的不是数学工具与编程语言的直接对应关系,这涉及人们对数学不同看法,从我的关注点出发理解(也是猜)他指的是数学工具的目的(达到某种思维训练,建立判断力/直觉)与编程语言设计之间的关系。
举个不太恰当的例子,null类型在不同编程语言中的实现,在Ruby里面的nil有一个专门的NilClass,R里则是它自己,Java(可能还有其他C类语言)都是不作为任何类/对象的,这个问题和集合论的关系是数学和程序设计问题的重要关注点。
最近我读了几页Kolmogorov的Elements of the Theory of Functions and Functional Analysis,这种数学系学生看的书竟然还能读懂一部分,对于空集的论述,他的说法让我有点惊讶,大意是“空集的设置主要目的是考虑到有时候不清楚集合中是否存在元素的情况”。
同时我找到了Alonzo Church(lambda calculus发明者)的的Introduction to Mathematical Logic,序言部分赫然写着我之前读过所有数学逻辑等方面的书没有强调的内容:Name和Sense的区分,具体内容不复述了,但结合Gottlob Frege在Begriffsschrift前面对于逻辑的定义,以及他回应罗素悖论的内容https://edisciplinas.usp.br/mod/resource/view.php?id=2261850 一个共性的东西可以理解:逻辑是一个模型,而且不保证是“完全模型”。朴素集合论出问题是人们探索能描述整个宇宙的模型之一,出问题太正常了,胜败乃兵家常事。
我对现代概率论的基础测度论早有心仪,顺着Kolmogorov的书搜到了奠基人Maurice Frechet的一些内容,经他人转述,In his thesis Fréchet defines a metric space or class (D) as a class of elements, the relations among which are established by means of a function of pairs of elements of this class
(https://www.ams.org/journals/tran/1927-029-03/S0002-9947-1927-1501402-2/S0002-9947-1927-1501402-2.pdf)
Frege的集合/逻辑思想通过他给罗素的回信中可窥见一些,很惭愧大意还没完全看懂,但关键词也是class和object。
类别class和object的关系在编程语言中的意义,这些也都是探索中的模型。
Niklaus Wirth在代表作Algorithms+Data Structures = Programs (也是刚借到的书)里指出编程语言是对能理解这个语言的计算机的抽象。换句话说,计算机(连同编程语言;或者说编程语言基础上的计算机)也是对计算的一个探索和发展,这跟数学有极大重合。
然而一般意义上的数学没有假设计算机这种自动化设备的存在。参考A method of programming, Dijkstra关于一般自动设备(比如60年代的咖啡机)和计算机,根本区别在于计算机programmable可编程,确切说是可以自由无限编程,摆脱了特定硬件束缚,根本原因在于形式语言的发展为计算提供了一个普遍的可拓展方案。而数学没有这么一个体系化的内容。
你看许多极其复杂的计算都通过算法实现了,人们争相阅读Scikit-learn(一个Python机器学习库)来研究那些天书般的数学是如何在计算机上实现的。我最初看到牛顿法求解方程时候觉得挺奇怪的,因为有种计算机计算不是直接套公式,而是追求数值方法(迫近)的感觉。
现在我觉得之所以有种种疑惑和纠结是因为数学学习的目的没有明晰,数学为了是培养思维、建立理性直觉的,而绝大部分数学教程和学习资源都是强调工具本身。
如王垠所说,也许从古至今都是这样,有知识的人喜欢把知识垄断,让没知识的人知其然而不知其所以然。让他们去套用我们想出来的公式和定理,证明给他们看这些是正确的。但是不要告诉他们这些公式和定理是怎么想出来的,不要把知识的“生产工具”给他们。这样这些人就不可能想出跟我们同样水准的公式,就会把我们当成“天才”供养起来。
(https://github.com/AlexiaChen/YinWangBak/blob/master/%E8%AE%BA%E7%A0%94%E7%A9%B6.md)
从刚才谈测度论第三个基本公理(三角公理)的文章开头(虽然后面看不懂,也不看了)很清楚理解到,Frechet建立测度论的根本不是为了研究某个特定空间(比如实轴[0,1],表面上这就是概率论的话题)而且为了提供一个研究各种空间内(各种class)拓扑关系(具体而言是点拓扑,而他对“点”也建立了严密的定律值得一看)的普遍方案,这个方案基于3条公理,正如欧氏几何的公理一样。
从数理逻辑和测度论的经典著作序言或概要文章我们可以很清楚认识到这个观点:真正好的学习是学习“道”/思维。数学学习和编程学习都是要为了培养独立探索模型化和分析事物的能力的,至于那些具体分支、符号都是工具。
然而数学本身的符号体系(广义的)如王垠所说非常糟糕,这种糟糕严重干扰了它模型化世界的初衷,人们纠结各种细节、符号含义而无法专注于背后的思维。程序语言/计算机多大程度基于数学而产生我无从探讨,但它肯定现在由于数学符合的混杂晦涩和计算机硬件(电路)的特征走上了“迭代式”构建的道路,反而突破了数学沉沉相因的困境。
数学计算实现大多数都是数值方法,之前看到的一点资料显示R的C底层是这样的,「Matlab应该也是但它闭源」,这本身就可能是对“精确数学”范式的挑战,跟号2的1.41421...到底区别是什么,计算机由于硬件局限经常高度迫近0但无法达到准确的0,这种区别在计算机时代有和意义,这都值得探索。
大多数学生应该都会对数学符号感到头疼,程度不一样但绝对极少有喜欢这种繁复的,相比之下程序语言非常有限的关键词(C类语言20多个,极端的COBOL300多但也比现有数学概念少得多了)加上运算符就能几乎计算一切,这难道不是一个突破吗?
也许数学的真谛——宇宙规律有很多种描述方法,现有数学也好,另辟奚径的程序语言也好都是实现方式。
刚才我在搜索“通过编程来理解数学概念”(不是单纯学习使用数学工具)结果重温了这个帖子。The Haskell Road绝对是好的尝试,但是它也只探索到初级的微积分。
ps 学习内容方面,真的要看大师原著,测度论祖师爷的Invitation to Combinatorial Topology才100多页「组合拓扑在计算机图像等领域非常重要」,基本问题都点到了而且“力求高中毕业生能读懂”,深入浅出不是一句空话,很多高深莫测的理论都根植于高中生能理解的生活现象/常识中。