イドリスはチューリングの完全性をあきらめることで何ができないのでしょうか?


35

Idrisには依存型があることは知っていますが、完全にはチューリングしていません。チューリングの完全性をあきらめることで何ができませんか?これは依存型を持つことに関連していますか?

これは非常に具体的な質問だと思いますが、依存型と関連する型システムについてはあまり知りません。


2
具体的な例をお探しですか?私はIdrisに詳しくはありませんが、Isabelle / HOLでは、常に終了しない(さらに悪いことに、終了証明を与える必要がある)関数を記述(またはコンパイル)することはできません。
ラファエル

これらの線に沿って何か-はい、私はあなたがタイプシステムの特定のプロパティを持つ言語をエンコードできないようなかなりニッチなケースがあるかどうか、またはそれがもう少し一般的であるかどうかは完全にわかりませんでした、すべての機能が終了することを証明する必要があります)
イカ14年

1
この誤った仮定は、イドリスが「パックマン完全」であると言っているエドウィン・ブレイディから来ていると思います。「チューリング完全」ではなく「パックマン完全」と言うことの彼の主なポイントは、機械だけでなく人間の脳でも簡単にコンパイルできる言語の重要性を強調したいということだと思います。チューリング完全で、それは、BrainFuckで書か理解のコードにかなり長い間、人間の脳を取るための開発、そしてさらに重要なことができます維持 .. BrainFuckでパックマンプログラムは非常に手間がかかる
Michelrandahl

@Mitzhそうでもない。話の中で彼が言うのを聞いたことを誤解したからだと思う。
イカ

回答:


50

イドリスはチューリング完了です!全体性(データでプログラミングする場合の終了、コデータでプログラミングする場合の生産性)はチェックしますが、すべてが完全である必要はありません。

興味深いことに、部分関数のモナドを書くことができるので、データとコデータがあればチューリング完全性をモデル化するのに十分です。私はこれを何年も前にCoqでやった-たぶん今ではビットロットされているかもしれないが、それでもここではhttp://eb.host.cs.st-andrews.ac.uk/Partial/partial.vである

そのようなことを実際に実行するには、1つのエスケープが必要ですが、イドリスはそれを可能にします。

Idrisは、型チェックを決定可能に保つために、型レベルで部分関数を削減しません。また、証拠として合理的に信じることができるのは合計プログラムのみです。


4
男自身。この文脈での生産性とは何ですか?
イカ14

5
デュアルからターミネーション:帰納的定義は(そのデータをすべて消費することによって)終了する必要がありますが、共帰納的定義は生産的でなければなりません。私はこの説明が最も明確であることがわかりました(ymmv):adam.chlipala.net/cpdt/html/Coinductive.html-
エドウィンブレイディ

14

最初に、私たちが「計算」と呼ぶものはすべてチューリング機械(または他の多くの同等のモデル)で実行できるものであると述べる教会チューリングの論文をすでに聞いたことがあると思います。したがって、チューリング完全言語は、あらゆる計算を表現できる言語です。逆に、チューリング不完全言語とは、表現できない計算があるものです。

わかりました、それはあまり有益ではありませんでした。例を挙げましょう。チューリング不完全言語ではできないことの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のような非チューリング完全言語の実際的な制限は何ですか?を参照してください(この回答は、大規模な拡張に対するものです)。


3
「チューリングが不完全な言語では書けない便利なプログラムは何ですか?」Java仮想マシン。
デビッドリチャービー14年

@DavidRicherbyできませんか?JVMは本当にチューリング完全ですか?個々のオブジェクトのサイズには制限がありますが、無制限の数のオブジェクトを割り当ててアクセスするように手配できますか?たとえば、Cでは、ポインター値が有限数しかないため、答えはノーのようです。
ジル「SO-悪であるのをやめる」14年

その部分に興味のある読者のために、常に終止する言語のためのプログラミング言語が存在できない理由に関する別の投稿があります。
ラファエル

3
@Gillesおっしゃるとおりですが、実際のプログラミング言語はチューリング完全ではないということと多かれ少なかれ同等ではありませんか?結局のところ、どの実装でも、あなたが言及するような障壁にぶつかるでしょう。それはチューリング完全ではないことによってイドリスが失うものを考慮しながら、部屋に持っているかなり大きな象のようです。たとえば、他のどの言語よりも多くを失いますか?無制限の外部ストレージ(たとえば、プログラムが「次/前のディスクを挿入してください」と言って停止する)を禁止する場合、どの言語もチューリング完全ではないので、そのケースに関する質問は空虚です。
デビッドリチャービー14年

3
@DavidRicherby私のコメント(私の答えではありません)は、プログラミング言語理論のオタクモードです。(たとえば)SMLの正式な仕様を採用する場合、すべての計算可能なプログラムをシミュレートできる言語の実装を設計できます(ただし、物理的な世界では実装しません)。これはCではそうではありませんsizeof(void*)。メモリの有限性が言語に組み込まれているためです()。私の答えでは、言語を理想的な方法で扱うため、SMLまたはCはチューリング完全とみなされます。
ジル 'SO-悪であるのをやめる' 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.