Idrisには依存型があることは知っていますが、完全にはチューリングしていません。チューリングの完全性をあきらめることで何ができませんか?これは依存型を持つことに関連していますか?
これは非常に具体的な質問だと思いますが、依存型と関連する型システムについてはあまり知りません。
Idrisには依存型があることは知っていますが、完全にはチューリングしていません。チューリングの完全性をあきらめることで何ができませんか?これは依存型を持つことに関連していますか?
これは非常に具体的な質問だと思いますが、依存型と関連する型システムについてはあまり知りません。
回答:
イドリスはチューリング完了です!全体性(データでプログラミングする場合の終了、コデータでプログラミングする場合の生産性)はチェックしますが、すべてが完全である必要はありません。
興味深いことに、部分関数のモナドを書くことができるので、データとコデータがあればチューリング完全性をモデル化するのに十分です。私はこれを何年も前にCoqでやった-たぶん今ではビットロットされているかもしれないが、それでもここではhttp://eb.host.cs.st-andrews.ac.uk/Partial/partial.vである。
そのようなことを実際に実行するには、1つのエスケープが必要ですが、イドリスはそれを可能にします。
Idrisは、型チェックを決定可能に保つために、型レベルで部分関数を削減しません。また、証拠として合理的に信じることができるのは合計プログラムのみです。
最初に、私たちが「計算」と呼ぶものはすべてチューリング機械(または他の多くの同等のモデル)で実行できるものであると述べる教会チューリングの論文をすでに聞いたことがあると思います。したがって、チューリング完全言語は、あらゆる計算を表現できる言語です。逆に、チューリング不完全言語とは、表現できない計算があるものです。
わかりました、それはあまり有益ではありませんでした。例を挙げましょう。チューリング不完全言語ではできないことの1つがあります。チューリングマシンシミュレータを書くことはできません(そうでなければ、シミュレートされたチューリングマシンで計算をエンコードできます)。
わかりました、それはまだあまり有益ではありませんでした。本当の問題は、チューリングが不完全な言語では書けない便利なプログラムはどれですか?さて、だれかが誰かが有用な目的のために書いたすべてのプログラムを含み、すべてのチューリング機械計算を含まない「有用なプログラム」の定義を思いつきませんでした。したがって、有用なプログラムをすべて記述できるチューリング不完全言語の設計は、依然として非常に長期的な研究目標です。
現在、非常に異なる種類のチューリングが不完全な言語がいくつかあり、それらは何ができないかが異なります。ただし、共通のテーマがあります。チューリング完全言語には、プログラムのサイズに制限されない時間を条件付きで終了または継続する方法、および入力に依存するメモリ量をプログラムが使用する方法を含める必要があります。具体的には、ほとんどの命令型プログラミング言語は、それぞれwhileループと動的メモリ割り当てを通じてこれらの機能を提供します。ほとんどの関数型プログラミング言語は、再帰とデータ構造のネストによりこれらの機能を提供します。
イドリスはアグダに強く触発されています。Agdaは定理を証明するために設計された言語です。現在、定理の証明とプログラムの実行は非常に密接に関連しているため、定理を証明するようにAgdaでプログラムを書くことができます。直観的に、定理「AがBを意味する」の証明は、定理Aの証明を引数として取り、定理Bの証明を返す関数です。
システムの目標は定理を証明することなので、プログラマに任意の関数を書かせることはできません。この言語により、自分自身を呼び出したばかげた再帰関数を記述できると想像してください。
oops : A -> B
oops x = oops x
そのような関数の存在に、AがBを暗示することを納得させることはできません。さもなければ、真の定理だけでなく何かを証明することができます。したがって、Agda(および同様の定理証明器)は、任意の再帰を禁止します。再帰関数を書くときは、常に終了することを証明する必要があります。そのため、定理Aの証明で実行すると、定理Bの証明が構築されることがわかります。
Agdaの差し迫った実用上の制限は、任意の再帰関数を記述できないことです。システムはすべての非終了関数を拒否できる必要があるため、停止問題(またはより一般的にはライスの定理)の決定不能性により、拒否される終了関数も確実に存在します。さらに実用的な難点は、システムがあなたの機能が終了したことを証明するのを助けなければならないことです。
AからBまでの関数がある場合、AがBを暗示する数学的証明と同じくらい良いという保証を妥協することなく、証明システムをよりプログラミング言語のようにすることに関する多くの進行中の研究があります。関数の終了は、研究トピックの1つです。他の拡張の方向には、入出力や同時実行性などの「現実の」問題への対処が含まれます。別の課題は、これらのシステムを単なる人間にアクセス可能にすることです(あるいは、単に人間に実際にアクセス可能であると確信させることです)。
私はイドリスに詳しくありません。これは、私が今述べた課題への取り組みです。2013年のプレプリントを大まかに見てわかる限り、イドリスはチューリング完全ですが、全体チェッカーが含まれています。全体チェッカーは、キーワードで注釈されたすべての機能がtotal
終了することを確認します。すべての機能が合計されたIdrisプログラムのみを含む言語フラグメントは、表現力においてArdaに似ています(おそらく、型理論の違いによる完全一致ではありませんが、意図的に試さない限り気付かないほど近い)。
さまざまな方法でチューリング完全ではない言語の他の例については、Coqのような非チューリング完全言語の実際的な制限は何ですか?を参照してください。(この回答は、大規模な拡張に対するものです)。
sizeof(void*)
。メモリの有限性が言語に組み込まれているためです()。私の答えでは、言語を理想的な方法で扱うため、SMLまたはCはチューリング完全とみなされます。