トータル関数プログラミングの制限は何ですか?


19

トータル関数型プログラミングの制限は何ですか?チューリング完全ではありませんが、可能なプログラムの大部分のサブセットを引き続きサポートしています。チューリング完全言語で記述できるが、完全な関数型言語では記述できない重要な構成要素はありますか?

そして、完全な関数型言語で書かれたプログラムは完全に静的に分析でき、チューリング完全言語の静的分析は停止問題のようなものによって制限されていると言うのは正しいでしょうか?それは、実行時にしかわからないものがあるため、完全に機能的な言語ですべてが静的に決定できるという意味ではありませんが、理論的には、理想的な完全な機能プログラミング言語で書かれたプログラムを分析して、理論的には静的に決定できますが、静的に決定できます。または、静的解析を不完全にする機能言語全体に継承される未決定の問題がまだありますか?一部の問題は、それがどの言語で書かれているかにかかわらず、常に決定できませんが、言語に継承されるこのような問題に興味があります。

回答:


16

それは総機能言語に依存します

この答えは警戒のように聞こえますが、これ以上具体的なことは言えません。結局のところ、興味のある重要な決定可能なプログラムを検討してください。それを解決するために、お気に入りのチューリング完全言語でプログラムを作成してください。問題は決定可能であるため、プログラムはすべての入力で停止します。

(おそらく、決定不可能な問題には興味深いプログラムがあるかもしれませんが、答えを知るのに十分長く待てないため、人々が使用できるようなものではありません。)

ここで、有効な入力プログラムが1つだけになるように新しい言語を定義します。これは、前と同じセマンティクスを使用して作成したプログラムです。それで書かれたすべてのプログラムへのすべての入力(そのうち1つしかない)は常に終了するので、確かに合計です。

この安価なトリックは実際に便利です。たとえば、言語Coqは、終了する証拠がない限り、プログラムの型チェックを行わないという完全な機能言語です。(その要件を放棄した場合、チューリング完全になるので、唯一の障害は終了の証拠を見つけることです。)

「理論的に静的に決定できるものはすべて静的に決定できる」という意味がわかりません。それはトートロジー的に真実に聞こえます。それにもかかわらず、総言語は本質的に分析が容易ではありません。発散するものはないことは知っています。これは有用な事実ですが、入力と出力の関係は依然として複雑です。(特に、可能な限り無限に多くの入力が可能であるため、理論的にもすべてを網羅的に試すことはできません。)


ご回答有難うございます。したがって、トータルであることはいくらか役立ちますが、それは非常に難しい問題のままです。「理論的に静的に決定できるものはすべて静的に決定できる」とは、入力と出力の間のすべての関係を分析することが可能な場合、非常に難しい場合もそうでない場合もあります。 。または、これが制限されている基本的な理由は何ですか?ライスの定理のように、これは部分関数の場合であることを証明しています。それとも、ライスの定理を誤解していますか?
Matthijsスティーン

それはあなたが「関係」によって何を意味するかに依存するかもしれないと思います。特に、「入力Aが出力Bに行く」という意味であれば、これは完全な関数型言語で簡単に決定できます。プログラムを実行するだけです。しかし、おそらく入力の無限クラスについて何かを言う分析に興味があります。
ポール・スタンシファー

(おっと、ヒットを誤って入力してください)...しかし、私はしたい場合、私は恒等関数について決定不能な質問をすることができますので、これは、別の愚かなトリックを開きます:「いくつかのためにX、ある(identity X)チューリングマシンのことを停止しますか?」確かに、それは ではないようですがidentity、「約」をどのように定義しますか?
ポール・スタンシファー

はい、個々の入力ではなく、ある定義のすべての可能な入力値に適用されるかどうかを知りたいです。ですから、あなたが正しく理解していれば、どんな種類のプログラミング言語が使用されていても、未定の質問が常にあるということですか?この決定不可能な質問のいくつかは、ホールティング問題の完全な機能言語のように、そもそも問題が発生するのを防ぐことで回避されるかもしれませんか?アイデンティティ関数に関するあなたの質問は、完全な関数型言語で決定できないのではないでしょうか?
Matthijsスティーン

はい; 「チューリングマシン」が「その保証がチューリングマシンの期限切れになった後の故障」に置き換えられた問題の修正版は、簡単に解決可能です。これらの目的のために、プログラムを調べることで決定不能性がぎっしり詰まっているとき、停止する問題が決定不能な問題の重要な例であることは、やや面倒です。
ポール・スタンシファー

16

トータル関数型プログラミングの制限は何ですか?チューリング完全ではありませんが、可能なプログラムの大部分のサブセットを引き続きサポートしています。チューリング完全言語で記述できるが、完全な関数型言語では記述できない重要な構成要素はありますか?

LLL

  1. LLLL一貫しています。これは、Goedelの定理が除外するものであり、算術ができると仮定しています。したがって、完全な関数型言語で自己通訳を書くことができないことを知っています。

  2. しかし、これの裏側は、総言語の表現力の限界が本質的に数学自体の表現力の限界であることです。たとえば、Coq(証明アシスタント)で定義可能な関数は、ZFCを使用して計算可能であることが証明できる関数であり、多くのアクセスできない基数があります。したがって、基本的に、作業中の数学者が満足するまで完全に証明できる関数は、Coqで定義できます。

  3. 裏側の裏側は、数学が難しいということです!したがって、合計言語が「完全に分析可能」であるという簡単な感覚はありません。関数が終了することを知っていても、必要なプロパティがあることを証明するために多くの創造的な作業を行う必要があります。たとえば、リストからリストへの関数が合計であることを知っているだけでは、ソート関数であることを証明することはあまりできません。


ご回答有難うございます。Lambda the Ultimateウェブログでこの問題についての記事を読みましたが、コメントの一部の人々は、それ自身の評価者を通常の明示的に構成可能な用語として持つことは不可能ですが、動作する自己を作成することが可能であると述べていますいくつかのトリックを持つ評価者。だから私は、迂回のいくつかのトリックで完全な関数型言語で解決できない(または近似できない)問題があるのだろうか?
Matthijsスティーン

自己評価は言語によって異なるため、問題とは見なされません。「言語Xでプログラムを評価する」という問題は、言語XまたはYで解決しようとしても同じ問題です。特に、言語Xが完全な機能言語である場合、問題はいくつかの完全な機能言語で解決可能です。 、前に使用したのと同じ愚かなトリックを使用します。
ポール・スタンシファー

ニール、完全な言語が独自のインタープリターをサポートできないことを証明するのは、それよりもかなり簡単なはずです。私はあなたを誤解していますか?単純な対角化により、固定小数点のない関数を持つ言語は、独自のインタープリターをサポートできません(算術をサポートしているかどうかにかかわらず)。:引数はコナーここマクブライドで詳述されてmail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
トム・エリス

@TomEllis:私の議論は本質的にコナーのものと同じです。実際、彼が「エピメニデス/カントール/ラッセル/クイン/ゴーデル/チューリングの議論」と呼ぶとき、彼の投稿はすでにこの観察をしています(コナーの特徴的な機知で)。
ニールクリシュナスワミ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.