编程语言和数学基础如何关联?


30

基本上我知道数学的三个基础

  1. 集合论
  2. 类型理论
  3. 范畴论

那么编程语言和数学基础在哪些方面相关?

编辑

最初的问题是“基于数学基础的语言编程”

与添加的paragarph

理论的实现
1. Coq中的类型论
2. SETL中的
集合论3. Haskell中的范畴论

根据建议,该内容已更改为“编程语言和数学基础如何相关”

由于这是我不知道所要问的问题但想学习一些东西的问题之一,因此,我正在修改问题以使其对学习和其他人更有价值,但又保留了细节以免安德烈·鲍尔(Andrej Bauer)当前的答案似乎不合时宜。

感谢到目前为止的所有评论和答复,我正在向他们学习。


1
我不确定我是否理解其中的问题或假设。就我所知,Coq不是一种编程语言。可以从Coq证明中提取程序,但这并不能使其成为一种编程语言。类别理论和类型理论也密切相关,因此我不确定是否可以像您一样对它们进行分类。不了解SETL。另请参阅Wikipedia上的证明助手列表。
凯夫

3
Haskell并不是“范畴论的实现”,无论如何,数学基础与编程语言的作用不同。尽管可以进行某种比较,但试图将比较强制为正式关系并不是很好。
Andrej Bauer


有趣的是:软件基础
Guy Coder

Answers:


29

[注意:此段现在已过时。]您的问题的标题包含一个不必要的假设,即编程语言“基于数学基础”。尽管这两个区域确实具有重要关系,但通常情况并非如此。更为准确的说法是(某些)编程语言是使用基础技术设计的。一个更好的问题是“编程语言和数学基础如何相关?”

最普遍的联系体现在标语作为程序的证明中,可以使它以多种方式起作用。该柯里-霍华德同构是最明显的一个。通过它,我们可以立即联系类型理论,逻辑和程序设计。但是应该强调的是,在每种通用编程语言都支持的通用递归的情况下,Curry-Howard对应不能很好地工作(因为每种类型都已被使用)。

使口号证明作为程序工作的一种更巧妙的方法是使用可实现性。这里我们也将证明和程序联系起来,但是现在的方向是从证明到程序:每个证明都给出一个程序,但不是每个程序都一定是证明。

基于基础编程语言的主要例子是阿格达,它仅仅依赖类型理论的实现。但是,Agda不是通用编程语言,因为它不支持通用递归。Agda中的每个功能都是合计的,有些可计算的功能无法在Agda中实现。实际上,程序员不会注意到这一点,但是他们会注意到Agda不允许使用不确定的值,例如无限循环。

勒柯克不是一种编程语言,而是一种证明助手。但是,它也具有提取功能,可以提供来自证明的程序。证明助手和编程语言不应相互混淆。

我们不应忘记,序言和其他逻辑编程语言从计算是证明搜索的思想中汲取了灵感。当然,这与逻辑紧密相关。

Haskell是一种基于领域理论的通用编程语言。也就是说,它的语义是领域理论的,因为它必须考虑部分功能和递归。Haskell社区开发了许多受类别理论启发的技术,其中最著名的是monad,但不应与monad混淆。通常,高级编程功能通常结合领域理论和类别理论来对待,但这不是街上的Haskell程序员擅长的。Haskell类型的所谓“句法范畴”是Haskell与范畴理论如何相互对应的外行人观点。

集合论(古典的或建设性的)似乎在较小程度上启发了编程语言中的思想。当然,建设性集合论与通过建设性逻辑进行编程有联系。直觉集合论在编程语言中的一项重要应用是Alex Simpson提出的,他用它来使综合领域理论发挥作用。但这是相当高级的东西,也许请看这些幻灯片。Jean-Louis Krivine为古典布景理论开发了一个非常有趣的可实现性品牌。这似乎是将经典集合理论与程序设计联系起来的好方法。

总而言之,编程语言理论使用基础技术。这并不奇怪,因为我们认为计算是一个基本概念。但是,说编程语言是“基于”某种基础的,这太天真了。实际上,基础的“集合论-类型论-范畴论”三分法仍然只是一个有用的高级观察,可以用各种方式在数学上精确地进行观察,但是这没有必要。这是历史性的事故。


计算就是证明搜索的想法。” 我对这句话感到困惑。当然,证明搜索是计算的一种形式,但不是所有的计算都是证明搜索?在此问题的上下文中,还提供了证明验证,类型检查。通常,只需添加5 + 3。这句话是什么意思?
user56834

6

这是一个非常复杂的主题,关于该主题的书籍很多,最近的一本叫做《图灵大教堂》,它是数字宇宙的起源,也是逻辑引擎,数学家和计算机的起源

计算机语言已经发展了几十年,但是不管您相信与否,都有两种原始的编程语言显示出数学和计算机科学之间的紧密联系:

有两个关键人物跨越“编程语言”超越了数学和计算机科学的界限:

  • 信息理论的首创香农表示数学和计算机科学之间的渊源颇深

  • 冯·诺依曼Von Neumann)是数学和计算机科学之间的另一个重要人物。他发明了冯·诺依曼(von neumann)架构,将程序存储在内存中。

甚至更早的“编程语言”:

  • 英语中的“计算机”一词最初的含义更像是“计算器”,它对数字进行了数学运算,其含义已实质上转移到了当今的通用编程概念。因此,编程语言与早期计算器之间存在联系。
  • 从19世纪末到20世纪初,织机上使用的打孔卡是用于编织图案的“编程语言”。请注意,在1960年代,打孔卡主要用于大型机编程。这些最初被视为“计算机”(使用数学!),而不是现代通用计算机。
  • BabbageAda Lovelace在1800年代中期使用“计算引擎”开发了“编程语言”的基本概念。
  • 布尔代数最初是Boole发明的纯数学概念
  • 用于数学计算的古老(千年历史)算盘被视为现代计算机的先驱。但是可以说,操纵它的操作是一种“编程语言”(人类遵循)

但是,在现代编程语言中,随着抽象的增加和扩展,在过去的几十年中,与数学的清晰,直接的联系有所减少,但它始终是固有的,并且在某些方面有所增强。例如,具有严格类型的Java之类的语言与数学有联系,并且在大约1990年代末期,主流计算机语言(例如c ++,Java,Ruby等)开始显式地将许多数学高级对象实现为接近原语的语言。语言,例如集合,树(例如Btree或哈希图)等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.