ライスの定理が当惑


37

要約:ライスの定理によれば、すべては不可能です。それでも、私この不可能と思われることを常にやっています!


もちろん、ライスの定理は単に「すべては不可能」とは言いません。「コンピュータープログラムのすべての特性は計算不可能です。」

(ヘアを分割したい場合は、すべての「重要な」プロパティ。つまり、すべてのプログラムが所有する、またはプログラムが所有しないプロパティは、簡単に計算できます。しかし、他のプロパティは計算できません。)

それは定理が言うこと、または言うように見えます。そして、おそらく非常に多くの非常に賢い人々がこの定理の正しさを慎重に検証したでしょう。しかし、ロジックを完全に無視しているようです!計算するのは簡単なプログラムの多くのプロパティがあります!! 例えば:

  • 停止する前にプログラムは何ステップ実行しますか?この数が有限であるか無限であるかを決定することは、計算できないホールティング問題です。この数が有限のより大きいか小さいかを判断するのは簡単です!プログラムを最大ステップ実行し、停止するかどうかを確認します。簡単!nnn

  • 同様に、プログラムは最初の回実行ステップでユニットより多いまたは少ないメモリを使用しますか?簡単に計算できます。mnm

  • プログラムのテキストはという名前の変数に言及していますか?些細なテキスト分析で答えが明らかになります。k

  • プログラムはコマンド呼び出しますか?再度、そのコマンド名を探してプログラムテキストをスキャンします。σ

計算できないように見えるプロパティもたくさんあります。たとえば、プログラムの完全な実行は何回追加されますか?まあ、それはプログラムが実行するステップ数を尋ねることとほぼ同じです。これは実質的に停止の問題です。しかし、非常に簡単に計算できるプログラムプロパティが大量にあるようです。それでも、ライスの定理は、それらのいずれも計算可能ではないと主張します。

ここに何が欠けていますか?


8
「ライスの定理によれば、すべては不可能です。」-いいえ。「コンピュータプログラムのすべてのプロパティは計算不可能です。」-いいえ。しかし、あなたは一人ではありません:ほとんどの学生はこの誤解に遭遇します。
ラファエル

回答:


36

この説明の目的上、「プログラム」とは、常に入力として整数を取り、永久に実行するか整数を返すコードのことです。2つのプログラムとは、同じ関数を計算する場合、つまり、すべての数値について、と両方が永久に実行されるか、両方が同じ数値を終了して出力する場合、拡張的に等しいと言います。g n f n g n fgnf(n)g(n)

プログラムの拡張プロパティは、拡張平等を尊重するプロパティです。つまり、とが拡張的に等しい場合、両方ともプロパティ持っているか、両方とも持っていません。f g PPfgP

拡張プロパティの例を次に示します。

  1. プログラムはステップ以内に停止します。(プログラムを、より長く実行される拡張的に等しいものにいつでも変更できます。)n
  2. プログラムは、実行の最初のステップ内で未満のメモリセルを使用します。(プログラムを拡張的に等しいものにいつでも変更できるので、正当な理由でメモリを使い果たすことはありません。)mnm
  3. プログラムのテキストには、という名前の変数が記載されていますk。(変数の名前を変更できます。)
  4. コマンド呼び出しプログラムい。これは少し依存するかもしれませんが、何らかの方法でシミュレートできるものであれば、を回避し、元のプログラムと拡張的に等しいプログラムを保持できます。σ σσσσ

ライスの定理に対する反論の申し立てを正確にリストしたことに気づいたと思います。

定理(ライス):プログラムの計算可能な拡張特性は、すべてのプログラムを保持するか、まったく保持しないかのいずれかです。

これを説明する別の方法があります:プログラムとそれが計算する関数を区別する必要があります。多くの異なるプログラムが同じ関数を計算します(それらはすべて拡張的に等しいです)。ライスの定理は、関数を計算するプログラムのプロパティではなく、関数のプロパティに関するものです。


私はこの答えを得ることができません..(私が同じことを尋ねている場合は申し訳ありませんが、この点を明確にするとよいでしょう)。構文を変更することでこれらのプログラムを変更して、同等の拡張機能を取得できると書かれていますが、そもそも拡張機能が同等であるかどうかを確認する方法は?一般にそれらのプログラム機能が両方のプロパティを持っているかどうかを比較するためにプログラムを使用することはできません。 IDE for it "?..)一度修正すると、一般的にはチェックできないと思うので、たぶんライスが保持します。
Hernan_eche 14年

1
一般に、これが事実であること証明することにより、2つの特定のプログラムが拡張的に等しいことを確認します。コンピューターがすべての値についてこの同等性を「チェック」できないとしても、すべての整数についてという事実に反対しますか?うまくいけない。ブール値を計算するプログラムを作成することと、特定のステートメントに特定の真理値があることを証明することには違いがあります。証明できるものの、計算できないものがあります(2つの特定のプログラムが拡張的に等しい、または加算が可換であるという事実など)。n+m=m+n
アンドレイバウアー14年

また、あなたは推論において奇妙な推論の飛躍を犯しています:拡大平等は決定できないので、ライスの定理は間違っているかもしれません。どうして?そして、拡張平等が決定できないからといって、それが私たちが決定できるインスタンスがないという意味ではありません。私が言及したもの-私たちはそれらを決めることができます。
アンドレイバウアー14年

36

基本的な誤解:

コンピュータープログラムのすべてのプロパティは計算不可能です。

それはライスの定理が述べていることではありません。関数のプロパティと、この関数を計算するプログラムのセットが決定できないことについて説明しています。正式には、セットが与えられますPRE

{MfMP}

決定できません。あなたが言及するプロパティについては、プログラムのセットがこの形式を持っている適切なを見つけることができません。1つの機能の一部のプログラムにはプロパティがありますが、他の(同じ機能の)プログラムにはない場合があります。参照してください。ここにいくつかの例のために。P

ライスの定理は、セマンティックプロパティ(プログラムによって計算される関数のプロパティ、たとえばドメインや値の範囲)を扱います。参照するのは構文プロパティ(実行時や使用する変数の数など、プログラムのプロパティ)です。

構文特性についてはあまり知られていないようです。この質問を参照してください。


1
私は最初の文かそこらで迷子になりました。ごめんなさい。誰かがセマンティックプロパティと構文プロパティの違いについて詳しく説明できますか?
MathematicalOrchid

@MathematicalOrchid:その文は安全に無視できます。最初の段落には、必要なすべての情報が含まれています。とにかく、詳しく説明します。
ラファエル

2
セマンティック=プログラムの機能について。構文=プログラムの外観について。
reinierpost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.