合計関数が列挙できないのはなぜですか?


29

関数の列挙の概念について学びました。実際には、プログラミング言語に対応しています。

教授は、発言の中で、すべての合計関数(つまり、すべての入力に対して常に終了する関数)のクラスは列挙できない述べました。つまり、すべての全機能を記述できるプログラミング言語を考案することはできませんが、他の機能は一切実現できません。

それで、まともな計算能力が必要な場合、どうやら(明らかに)非終了の可能性を受け入れなければならないのでしょうか?

回答:


24

対角化のため。場合からのすべての合計計算関数の計算列挙たNN毎ように、Fのeは合計し、次いで、G I = fをII + 1は、全計算可能であろう関数ですが、列挙には含まれません。これは、シーケンスに関する仮定と矛盾します。したがって、計算可能な関数の列挙は、計算可能な関数の合計だけで構成することはできません。(fe:eN)NNfeg(i)=fi(i)+1

私たちはユニバーサル計算機能を考えると仮定し「ユニバーサル」手段、hは計算バイナリ関数であり、それはすべての合計計算単項関数のためにF N いくつか存在している電子、その結果、F I = H e i すべてのiに対して。次に、g n = h e n )のようなeも必要です。h(e,i)hf(n)ef(i)=h(e,i)ieg(n)=h(e,n)前の段落のため、合計関数ではありません。それ以外の場合、はすべての計算可能な単項関数をすべて含む、計算可能な単項関数の計算可能な列挙を提供します。h

したがって、すべての機能が機能のシステムであるという要件は、そのシステムに普遍的な機能が存在することと互換性がありません。原始的な再帰関数などの一部の弱いシステムでは、すべての関数が合計されますが、普遍的な関数はありません。チューリングの計算可能性などの普遍的な機能を備えたより強力なシステムは、普遍的な機能が存在できるようにするために、単に部分的な機能を持たなければなりません。


対角化の抜け穴と思われるものを誰かが見つけたことを付け加えたいと思います。プログラムに型付き表現を使用する場合、型システムを使用して対角化を禁止し、完全な自己解釈を作成できます。詳細については、「正規化の障壁の突破:F-オメガの自己解釈」を参照してください。
ハッチ

もちろん、システムFはチューリング完全なシステムではありません。リンクした論文は興味深いです。彼らは、チューリング完全性を興味深い方法で活用しているようです。
カールムンマート

g(i)=fi(i)+1gk,fk=gg(k)g(k)=fk(k)+1=g(k)+1gg

また、この問題を回避するためにシフトされた対角線を使用しても、矛盾が生じるようです。
agemO

10

明確にするために、数学関数(関数と呼んでいますが、数え切れないほど多くの関数があるため、それらはすべて列挙可能ではありません)と書くことができる関数を区別する必要があります:プログラムまたは計算可能な関数と呼びます。

SExExSxSS

有限セットのすべての要素でプログラムを実行し、すべてが終了した場合に「yes」を返すインタープリターを作成できるため、有限セットの合計であるすべてのプログラムのセット列挙可能です。(ただし、それらのいずれかが表示されない場合は表示できません)

あなたの教授は、あなたが無限の数の要素でプログラムを実行することはできないので、無限の集合の合計であるすべてのプログラムの集合列挙できないと言いました。

しかし、これはこれが悪いという意味ではありません。

  1. 例えば、セットがあるすべてのプログラムならば証明可能合計は、列挙あなたがすべての証拠を列挙し、機械的に、彼らはあなたのプログラムが合計であることを証明かどうかを確認することができますので。

  2. 列挙可能なセットでさえ実用的ではありません。プロシージャが1日で終了するかどうかを確認せずに永遠に待たなければならない場合があるためです。すべての合計機能を列挙するプログラムの使用方法がわかりません...

あなたが書いたすべてのものが静的型付けだけで終了することが保証されているいくつかのプログラミング言語があります!多項式限界を保証するものもあります。今のところほとんどがアカデミックです。それらを書くと、おそらくPythonで書くよりも制約を感じるでしょうが、これに取り組んでいる多くの研究者がいます。

だからあなたの質問に答えるために:ある意味では、はい。チューリング完全(現時点では最高の計算能力)であるためには、潜在的な非終端が必要です。しかし、これは、合計関数が列挙可能かどうかに直接関係しているとは思いません。あなたはまだすべての合計プログラムを書くことができます!


2
「無限の数の要素でプログラムを実行することはできないからです」-これは、プログラム自体から必要なすべての情報を回収できる場合、これを行う必要がないかもしれないので、弱い議論です。推論の危険性を示す質問については、こちらをご覧ください。
ラファエル

確かに。私はそれが証拠であると主張しませんでした(常に対角線の引数を作成する必要があるため)、「because」という言葉を使用すべきではなかったかもしれません。教授の発言の証拠ではなく、終了が計算能力と矛盾する理由についての質問に答えようとしていました。
jmad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.