其实是有的,比如 Lean:
我们可以试着在 Lean 里面用类似题图里的符号表达集合的相关概念
constant e: ℕ -- 引入一个自然数 `e` constants S S': set ℕ -- 引入两个由一些自然数组成的集合 `S`, `S'` #check e ∈ S -- `e` 属于 `S` #check {a | odd a ∧ a ∈ S} -- `S` 中的所有奇数 #check S = S' -- `S` 等于 `S'` #check S ⊆ S -- `S` 包含于本身 #check S ∩ S' -- 交集 #check S ∪ S' -- 并集 #check S S' -- 差集
Lean 没有内置笛卡尔积的符号,但是要定义一个也是很简单的
notation S₁ ` ⨯ ` S₂:75 := {a: _ × _ | a.fst ∈ S₁ ∧ a.snd ∈ S₂} #check S ⨯ S' -- 笛卡尔积
你可能会好奇在代码里面引入这么多花里胡哨的符号到底要怎么打出来,那当然是得有 IDE 支持了
当然说到底虽然可以用 Lean 来进行各种应用场景的编程,但它还是主要用来做交互式定理证明的,或许你会觉得这只能归在数学领域内,那就见仁见智了
这个问题看起来简单,实际上涉及到上个世纪数学哲学的基本纷争:
为什么以布尔巴基原语出发的现代数学符号语言没有统一,同化以类型论原语出发的编程语言?
而答案也很简单:因为类型论原语确实持有关于“逻辑”本身的一系列真理,久经各种工业场景磨练,布尔巴基原语这种“不修”逻辑基础的何德何能将类型论原语吃掉?
所以,返回原题。为什么在计算机科学领域及编程中不使用现代数学建立的符号体系进行操作?原因其实和以前豪门争产九子夺嫡一样,纯属历史偶然。
如果当初胜利的是直觉主义者,你现在问的就是“为什么存在少数数学领域不使用编程语言写数学证明?”
如果在二次世界大战之前就出现成熟的类型论体系,你甚至还有可能会问出“现代标准汉语如此像编程语言,那为什么英语法语等西方主要语言不用编程语言重塑自己的母语”之类的问题。
Q1:现代数学符号用的人多,这就是人心向背!
A1:当我们讨论学科哲学的人心向背的时候,显然并不是在讨论一种文革带字报式的比谁声音大的人心向背。而布尔巴基学派音量最大的地方就在于,他能让大多数一般通过人产生一种“编程语言不是现代数学符号系统的成员”的错觉。LaTeX式的符号系统的出现是一个很晚期的事情,要搞辈分帽子批发大家同样跑不掉。
同样的,“人心向背”也不应该是苏联式的那种调动所有政治能量学术能量资本能量的你死我活式的皇城pk式的人心向背。要不然直接给全世界的数学从业者和计算机科学从业者每人发一把西瓜刀约在巴黎对砍得了,其中不少人还得先自己砍自己。
Q2:编程语言比数学符号难入门!
A2:你既然相信8岁能够搞少儿编程,那么你完全可以相信初中生可以通过编程学会整个初等数学。
你完全可以设想一个真正的“编程从娃娃抓起”的神国。小学开始学编程,初中完成初等数学的学习。中考高考用上电子自动阅卷。觉得本科的实分析复分析教材太过猪鼻可以直接git clone个新的教材。什么你说你学不会?中考还有个50%的腰斩筛呢。
Q3:用编程语言写数学证明太长了!
A3:一个巨大代码量的项目变得不可读,其失败是代码管理工程的失败,而不是因为它代码写的长而失败。
而且偷偷告诉你一件事,其实二十世纪的大中小学阀都不用自己亲自写论文,是可以叫徒子徒孙合同工钟点工做人力语音输入的。你以为还是中世纪教授还得担心今年的羊皮够不够造纸?
Q4:编程语言太多括号了!
A4:你有没有想过其实写证明就是需要很多括号,而你只是为了自己的“可写性”方便而省略了他们?通过定义别名,自动宏,命令式编程你一样可以省下大量括号。
而且这种为了“可写性”的“优化”是有代价的。如果你的证明确实是对的,那么可能确实省下了那么一点篇幅,提高了那么一点相关领域的可读性。如果你的证明其实是错的,有gap的,甚至就比如望月新一的ABC猜想证明。那么你甚至开几次研讨会都没有什么作用。
但基于类型论原语的编程语言就没这种屁事。是一个内定理就是,不是就不是,编译器一定可以递归的判定证明的类型。
第一感觉,数学领域那些符号是设计用来徒手演算的,那些符号用计算机输入并不方便。
不过,如果要深究这件事情,你会发现:常规的数学领域跟计算机使用的计算,完全不是一回事。
请思考一下,为什么常用的计算器,科学计算与程序员计算是两个不同的栏目?
编程领域定义的一个 int,它与数学领域的整数概念一致吗?
我提示一点:数学领域的整数,取值范围与数量都是无限的,编程领域的整数,其取值范围与数量都是有限的。
所以程序员的计算器里 2000000000+2000000000=-294967296,而科学计算器可不是这种结果。
所以对程序员来说 x>y 跟 x-y>0 不等价,但对数学家来说 x>y 跟 x-y>0 大概率等价。
那么我的观点:程序员使用的数,跟数学概念上的数,不完全相同,这种不同的概念,进行的变量之间的操作,自然也没必要与数学符号完全一致,反正,两者实质上是不同的东西。
数学符号是垃圾!理由见下。
每个数学符号的背后都有一个意思,但是你光从符号本身来看,通常完全不能理解它是什么意思,连一丁点儿的提示都没有。比如当你看到 ,你知道它啥意思?我是不知道啦。
如果编程语言用直接用数学语言,那估计也就只有搞数学的能用了,IT行业也不会有现在这种景象,科技的进步也不会有那么快了。
在数学里你会看到各种不一致的语法,比如
(函数调用式)
(前置运算符)
(中置运算符)
(后置运算符)
(外置运算符)
(纵向中置运算符)
(上置运算符)
(右上置运算符?)
(省略运算符)
(这TM算啥?)
(这TM又算啥?)
等等等等。
一门语言要是设计成兼容那么多种语法,那你写的代码谁能看懂?
比如 表示 ,但 为啥不是 捏?
再比如 表示a乘x,但为啥 不是d乘x捏?
还有 里的 和 为啥是上标而不是乘方捏?
为啥不等于 ?
如果编程语言用数学符号,那么要么用专用的公式编辑器,要么用LaTeX那种语法,不管用哪一种,都直接大幅度降低敲代码的效率,甚至会让大脑做不必要的上下文切换(比如反反复复地从业务逻辑切到LaTeX再切回来),疲劳度急剧上升。当然还有第三条路,那就是程序员必须学会使用专用键盘……
说到底,那些数学符号都是那些没有计算机甚至没有打字机的年代的数学家们搞出来的玩意儿。它们很容易在纸上和黑板上书写,但是它们很难用打字机打出来。它们对信息的压缩也是非常非常的厉害,你要是一个符号看不懂,那可能你整篇论文都别想看懂。可以说,这世上大部分人觉得数学很难,很大程度上要归咎于数学的符号体系。编程语言作为一种工具,怎么可以让人望而生畏呢?
另外,人的大脑处理书写在纸上的这些“图像”可能还比较快,但是你要让计算机能顺利解析那么多特例,这门语言的parser底下的状态机要多大?
评论区很多人都跟我杠那个表示微分的d的字体不对,OK,我改。不过我想反问几个问题:
mathrm{d}
可以打出那个字体正确的d,那么为什么不直接用mathrm{d}
或其他不依赖字体的名称,而非要用那个d呢?数个月后回来再看这个回答,发现评论区不少人在讨论数学和编程的差异,以及我如何如何贬低数学。我在这里想声明一点:我没说数学如何如何,我只是在说数学符号很垃圾而已,数学本身还是非常美的。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有