プログラムがtrueまたはfalseを返すかどうかを判断できない


7

入力チューリングマシンを取得し、計算が停止した後、最終セルがかかを判断する問題を考えます。それが何か他のものを書き込んだり、停止したりしない場合、あなたはどんな答えでも与えることが許されます(しかし、あなたは停止し、すべての入力に対していくつかの答えを与える必要があります)。01

この問題は決定不可能ですか?私の直感は、それはそうあるべきだと言いますが、停止問題の軽減を見つけることができません。停止することもしないこともあるチューリングマシンを考えると、停止した場合はで終了するようにマシンを設定できますが、非停止の場合は何も終了できないため、オラクルはだけ言うことができますこの場合、実際にマシンが停止するかどうかを知る必要はありません。00

他の方向への減少は単純であることに注意してください。停止問題を解決できる場合は、またはで終了するTMを指定して、書き込みステップを無限ループに置き換えて、新しいTMを作成します。新しいTMが停止した場合は、「書き込む」と言い、停止しない場合は「書き込む」と言います。この答えは、TMが実際にまたはで停止する限り正しいことが保証されているため、元の問題を解決できます。0110101

回答:


8

説明したような関数があると仮定します。

def haltify(f):
    # Never fails to halt.
    # If 'f' halts, returns f().
    # If 'f' doesn't halt, anything could be returned.
    ... magic ...

しかし、誰かがやって来てこれを行います:

def evil():
    return not haltify(evil)

問題がわかりましたか?

  1. haltify(f)all fで停止することが保証されている場合は、特定のものをevil呼び出して出力を反転させるだけなので、停止することも保証されます。haltifyf
  2. evil停止するのでhaltify(evil)、と同じことを評価する必要がありevil()ます。
  3. だから、not haltify(evil)のように簡単になりnot evil()、どのようなことのevil()リターン。
  4. x満足のいくものがないので、それは問題x == not xです。悪の結果は矛盾している。
  5. したがって、私たちが使用した仮定の1つは間違っています。haltify停止することが保証されていないかf()、停止を通過したときに戻ることが保証されていませんf

ボーナス演習:def good(): return haltify(good)明らかに無限ループに単純化されているにもかかわらず、関数がhaltifyの問題を引き起こさないのはなぜdef good(): return good()ですか?


非常に素晴らしい。これは、Yuvalの答えに同型ですが、ややこしいほど簡潔です。Re:ボーナス、haltifyの結果を選択して取得しgood()、どちらの場合もそれは一貫していますが、(ブードゥーマジックによって)haltify(good)停止するため、それでも戻ります。したがって、実際の無限ループではありません。回答。(実際には、実装する方法haltifyは単に引数を実行することです。その場合、両方ともgoodevil分岐によって矛盾から救われますが、当然haltify、分岐を許可することを余儀なくされます。これはポイントを無効にします。)
Mario Carneiro

別の興味深い問題は、入力TMを受け取り、同じ結果を計算するがより高速なを出力する「最適化コンパイラ」を作成できるかどうかです。答えはマシンの詳細に大きく依存し、研究の活発な分野です。この結果は、このようなコンパイラーの場合、有限時間で実行するために「高速化」できない少なくとも一部の無限計算があることを示しています(これは、エンコードスキームの非圧縮性定理の一種の無限バージョンです)。TT
Mario Carneiro 2016年

@MarioCarneiro有限バージョンはここでも適用されます:常に有限時間で実行される少なくともいくつかのチューリングマシンがありますが、高速化できません。
John Dvorak

IEEE 754はNaN満足しませんx == !xか?

@tac Pythonでは、not float('nan')false と評価されます。notまた、オーバーロードできない演算子の1つです。常にブール値を返します。(boolへのカスタム変換を定義できますが、インタプリタは実際にboolを返したことを確認します)。xを満たすPythonでハックな方法がx == not xあるとしても、例は教育的に正しいことだけを意図しており、教育的に正しいことは意図されていません。
Craig Gidney

6

がこの問題を解決するマシンであると仮定します。はチューリングマシンと入力を受け入れると仮定しますが、必要に応じてチューリングマシンのみを受け入れるように設定できます。次のように機能する別のマシンを構築します。入力では、マシンと入力でを実行し、出力をとして記録し、最初のセルにを書き込みます。ここでを実行して矛盾を解消します。MMTxMxxb1bT


1
動作しません。元の問題を次の制約に置き換えます。入力チューリングマシンは停止することが保証されています。実際、この削減は停止の問題でも間違っていますが、かなり明白な理由があります。
ジョシュア

私は問題を見ません。おそらくあなたはそれを説明できますか?
Yuval Filmus

1
入力が停止することが保証されている場合、マシンはそれを実行して答えを見つけるだけでよいため、失敗することはありません。
ジョシュア

1
それぞれ自分自身に。
Yuval Filmus

@ジョシュア:すべての入力チューリングマシンが停止することが保証されている、または特定の入力チューリングマシンが停止することが保証されていると言っていますか?すべての入力が停止するという保証はありませんが「単に実行する」ためには、停止している入力を特定する必要があります。M
user2357112は

-3

停止問題の削減は、論理的には非常に順調です。マシンが停止した場合、その入力のプリミティブ構成に基づいて、ある時間Tで停止する必要があります。停止の問題が解決できない場合は、構造に損失が生じるはずです。したがって、誤って推測して完全に評価されずに停止するマシンが存在し、XORの長いチェーンが完全な評価を強制して正しい答えに到達します。したがって、間違った答えを出す機械が存在します。

実際、入力として非停止マシンを除外しない重要な問題は、この方法で停止問題に減少します。参照:https : //en.wikipedia.org/wiki/Rice's_theorem


2
残念ながら、あなたの答えはあまり意味がありません。
Yuval Filmus

私はあなたの最後の段落が何を意味することになっているのか分かりません。ほとんどの問題、停止問題に帰着しません。たとえば、すべての入力で停止するチューリングマシンのセットは、停止の問題を軽減することはできませんが、厳密には、より複雑になります。(0>T0)
Noah Schweber

@NoahSchweber:これはコンピュータサイエンスの深い定理です。停止問題を解決できないため、すべての型なし再帰関数の重要なプロパティを証明することはできません。問題のドメインを、停止する再帰関数に制限する必要があります。
ジョシュア

@ジョシュア・ライスの定理は「コンピュータサイエンスの深い定理」ではなく、計算可能性理論の非常に基本的な定理です。そして、それはあなたがそれが何を意味するように思われるかを意味するものではありません-停止問題は非常に弱いレベルの決定不能性を表しています。(ライスの定理は、あなたが書いたものの反対を実際に述べています。実際、停止の問題、「部分的な計算可能な関数の重要な特性」と同じか、それよりも複雑ではないということです。)基本を再検討する価値があります。たとえば、私が上記で述べた事実()に精通していますか?0>T0
Noah Schweber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.