プログラミング言語と数学の基礎はどのように関係していますか?


30

基本的に私は数学の3つの基礎を知っています

  1. 集合論
  2. 型理論
  3. カテゴリー理論

それでは、プログラミング言語と数学の基礎はどのように関係していますか?

編集

元の質問は「数学の基礎に基づいたプログラミング言語」でした

追加されたパラガルフ

そして理論の実装
1. Coqの型理論
2. SETLの集合論
3. Haskellのカテゴリー理論

提案に基づいて、これは「プログラミング言語と数学の基礎はどのように関係しているのか」に変更されました。

これは私が尋ねていることについて十分に知らなかったが何かを学びたいと思った質問の1つであるため、質問を変更して、学習や他の人にとってより価値のあるものにしますが、Andrej Bauerによる現在の答えは話題から外れているようです。

これまでのすべてのコメントと回答に感謝し、私はそれらから学んでいます。


1
質問またはそれに記載されている仮定を理解しているかどうかはわかりません。Coqは、私の知る限りプログラミング言語ではありません。プログラムはCoqの証明から抽出できますが、プログラミング言語にはなりません。また、カテゴリ理論と型理論は密接に関連しているため、これらをあなたのように分類できるかどうかはわかりません。SETLについて知りません。ウィキペディアの証明アシスタントのリストも参照してください。
カベ

3
Haskellは「カテゴリ理論の実装」ではありません。いずれにしても、数学の基礎はプログラミング言語とは異なる目的に役立ちます。何らかの比較を行うことはできますが、比較を正式な関係に強制しようとするのはあまり良くありません。
アンドレイバウアー


回答:


29

[注:この段落は現在では時代遅れです。]質問のタイトルには、プログラミング言語が「数学の基礎に基づいている」という不当な仮定が含まれています。2つの領域には重要な関係がありますが、一般的にはそうではありません。より正確な説明は、(一部の)プログラミング言語が基本的な手法を使用して設計されたということです。より良い質問は、「プログラミング言語と数学の基礎はどのように関係しているのでしょうか?」です。

最も一般的な接続は、いくつかの方法で動作するように作成できるスローガンプルーフアズプログラムで具体化されています。カリー=ハワード同型対応は、最も明白なものです。それを使用して、型理論、論理、プログラミングを一度に関連付けます。しかし、すべての汎用プログラミング言語がサポートする一般的な再帰(すべての型が常駐するため)が存在する場合、Curry-Howardの対応はあまりうまく機能しないことを強調する必要があります。

スローガンとしてのプルーフをプログラムとして機能させる微妙な方法は、実現可能性を使用することです。ここでも証明とプログラムを関連付けますが、今では証明からプログラムへの方向性があります。すべての証明がプログラムを提供しますが、すべてのプログラムが必ずしも証明ではありません。

基礎に基づいてプログラミング言語の主な例は、Agda単に、ある依存型理論の実装。ただし、Agdaは一般的な再帰をサポートしていないため、汎用プログラミング言語ではありません。Agdaのすべての関数は合計であり、Agdaで実装できない計算可能な関数があります。実際には、プログラマーはこれに気付かないでしょうが、Agdaは無限ループなどの未定義の値を許可しないことに気付くでしょう。

コックはありません、プログラミング言語ではなく、証明支援。ただし、プルーフからプログラムを提供する抽出機能も備えています。証明アシスタントとプログラミング言語を混同しないでください。

プロローグや他の論理プログラミング言語は、計算が証明探索であるという考えからインスピレーションを得ていることを忘れてはなりません。もちろん、これはロジックと密接に関係しています。

Haskellは、ドメイン理論に基づいた汎用プログラミング言語です。つまり、部分的な機能と再帰を考慮する必要があるため、そのセマンティクスはドメイン理論です。Haskellコミュニティは、カテゴリ理論に触発された多くのテクニックを開発しました。それらのモナドは最もよく知られていますが、モナドと混同しないでください。より一般的には、高度なプログラミング機能は通常、ドメイン理論とカテゴリー理論の組み合わせで扱われますが、これは街頭のHaskellプログラマーが熟知しているものではありません。Haskell型のいわゆる「構文カテゴリ」は、Haskellとカテゴリ理論が互いにどのように対応するかについての素人の見方です。

集合論(古典的または建設的)は、プログラミング言語のアイデアをそれほど刺激しないようです。もちろん、構成的集合論は、構成的論理を介したプログラミングと関連しています。プログラミング言語への直観主義集合論の重要な応用の1つは、合成領域理論を機能させるためにそれを使用したAlex Simpsonによって与えられました。しかし、これは非常に高度なものです。これらのスライドを参照してください。Jean-Louis Krivineは、古典集合論の実現可能性の非常に興味深いブランドを開発しました。これは、古典的な集合論とプログラミングを関連付ける良い方法のようです。

要約すると、プログラミング言語の理論は基本的な手法を使用しています。計算は基本概念であると考えているため、これは驚くことではありません。しかし、プログラミング言語は特定の基盤に「基づいている」と言うのはあまりにも単純です。実際、基礎の三分法「集合論-型論-カテゴリー論」は、さまざまな方法で数学的に正確にできる有用な高レベルの観察であるが、それについては何も必要ない。これは歴史的な事故です。


計算は証明探索であるという考え。」私はこの声明に混乱しています。確かに、証明探索は計算の一形式ですが、すべての計算が証明探索ではありませんか?この質問の文脈では、証明検証、型チェックもあります。より一般的には、単に5 + 3を追加します。この声明はどういう意味ですか?
user56834

6

これは非常に複雑なトピックであり、多くの偉大な、最近のものが呼び出された主題の本があるTurings大聖堂、デジタル宇宙の起源ともロジック、数学のエンジンとコンピュータの起源は

コンピューター言語は何十年にもわたって進化してきましたが、数学とコンピューターサイエンスが密接に絡み合っていることを示す2つのオリジナルのプログラミング言語があると信じています。

  • 停止問題に関するチューリングの1936年の論文。世紀の変わり目にhilbertによって提案された問題を解決するための理論的構築、Entscheidungsproblem、すなわち数学的問題を解決するための自動化された手順!

  • 同時に開発された教会のラムダ計算は、LispSchemeなどの言語で今も生き残っています

「プログラミング言語」について数学とコンピューターサイエンスの境界を越えた2つの重要人物がいます。

  • シャノンが開拓した情報理論は、数学とコンピューターサイエンスの深いつながりを示しています

  • 数学とコンピューターサイエンスを横断するもう1つの重要な人物は、フォンノイマンです。彼は、プログラムをメモリに保存するフォンノイマンアーキテクチャを発明しました。

以前の「プログラミング言語」でも:

  • 英語の「コンピューター」という言葉はもともと、数値に数学演算を使用する「計算機」のようなものを意味し、その意味は今日の汎用プログラミングの概念に大きくシフトしました。そのため、プログラミング言語と初期の計算機の間には関係があります。
  • 19世紀後半から20世紀初頭の織機で使用されるパンチカードは、織パターンの「プログラミング言語」でした。1960年代には、メインフレームのプログラミングにパンチカードが使用されていたことに注意してください。これらは元々は「計算機」(数学を使用して!)と見なされていましたが、それほど現代的な汎用コンピューターではありませんでした。
  • バベッジエイダ・ラブレースは、「計算エンジン」で1800年代半ばに「プログラミング言語」の基本的な初期概念を開発しました。
  • ブール代数はもともとブールによって発明された純粋に数学的な概念でした
  • 数学計算のための古代(千年古い)そろばんは、現代のコンピューターの先駆けと見なされています。しかし、それを操作するための操作は、一種の「プログラミング言語」であると言えます(人間がそれに続きます)。

しかし、現代のプログラミング言語では、抽象化が増加およびスケーリングされたため、数学への明確で直接的なつながりは数十年でやや減少しましたが、常にかなり本質的であり、何らかの形で強化されています。たとえば、Javaなどの厳密な型の言語は数学と関連があり、1990年代後半から主流のコンピューター言語(c ++、Java、Rubyなど)で、多くの数学的な高レベルオブジェクトを明示的にプリミティブに近いものとして明示的に実装し始めましたセット、ツリー(Btreeやハッシュマップなど)などの言語

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.