「実際の」コンピュータプログラムの計算の硬さ


10

ライスの定理により、Webブラウザー、ワープロ、またはオペレーティングシステムのバグをキャッチするプログラムを作成できないと言われているのをよく耳にします。チューリング完全言語の意味的プロパティはすべて決定不可能です。

ただし、これがオペレーティングシステムなどの実際のプログラムにどの程度当てはまるかはわかりません。これらのタイプのプログラムには、チューリング完全性の完全な強さが必要ですか?これらのアプリケーションを記述できる、より単純な計算モデル(PRなど)はありますか?もしそうなら、これはどの程度プログラムの正確さの決定可能性を可能にしますか?


非常に弱いモデルの自明ではない普遍的なプロパティ(たとえば、すべての入力に対して何かが保持されている)を確認することはできません。たとえば、2つのポリタイム計算可能なTMが同じ関数を計算しているかどうかを確認することはできません(ただし、ポリタイムTMは常に停止するため、停止は決定可能です)。一方、入力のドメインが制限されている場合は、一部のモデルでいくつかのプロパティを確認できます。たとえば、少なくとも理論的には、プログラムはサイズが1,000未満の入力でクラッシュしません(実際には扱いにくい場合があります)。
Kaveh

穏やかに関連する質問
Artem Kaznatcheev

回答:


14

あなたは間違いなくバグをキャッチするプログラムを書くことができます-それを正確に行うプログラムを書く人々の大規模で活発なコミュニティがあります。ただし、ライスの定理が妨げているのは、健全で完全なバグキャッチャーを作成することです(つまり、特定のクラスのすべてのバグを誤検出なしにキャッチする)。

とはいえ、計算モデルに対する単純な制限は、実際にはプログラム分析の実用性を向上させるのにあまり役立ちません。その理由は、whileループを回すことで、「ほぼ同じこと」を行うプログラムを取得できるためです。

while P do 
   C

大きな反復定数を持つforループに:

for i = 0 to BIGNUM do 
  if P then 
    C
  else
    break

このプログラムは、プリミティブな再帰の完全な強度さえも必要としません(forループは巨大なネストされたif-then-elseステートメントにマクロ展開できるため)。しかし、ほとんどの実際的なケースでは、以前と同じように動作します。これは理論的に決定可能性に役立つことに注意してください-プログラムは完全なので、プログラムを実行して何が起こるかを確認することで質問に答えることができます。これは私たちが実際に望んでいることではありません。つまり、プログラムを実行するよりも速く回答を得ることです。実際のプログラムロジックのエラーが原因でバグが発生するため、導入された人工終了は実際のプログラム分析には役立ちません。それはまったく触れなかった。

ϵ0


「このプログラムは原始的な再帰でさえない」とはどういう意味ですか?
ライアンウィリアムズ

@RyanWilliamsはおそらく、ループで明示的な(コンパイル時)境界を必要とするプログラムなど、プリミティブな再帰関数の完全な配列よりも少ないシステムで記述できることだけです。
cody、2011

ループをマクロ展開して、分岐プログラムを残すことができます(つまり、if-then-elseおよび順次合成のみ)。
ニールクリシュナスワミ2011

おそらく「このプログラムは原始的な再帰の完全な力さえも必要としない」のようなことを言うことはより明確になるでしょう。
最大

@Max:提案が受け入れられました!
Neel Krishnaswami

5

オペレーティングシステムなどの実際のプログラムの正確性について質問したので、seL4プロジェクト(ジャーナルpdf会議)に興味があるかもしれません。

NICTAチームは、Haskellの抽象的な仕様に従って実装されたCの8700行と600行のアセンブラーの第3世代マイクロカーネルを採用しました。彼らは、実装が仕様に厳密に従っていることを(Isabelle / HOLで)正式にマシンチェックした証明を提供しました。したがって、彼らのプログラムにバグがないことを証明します。

したがって、停止の問題と同様に、一般に解決することはできませんが、特定のインスタンスでは解決することができます。この場合、任意のCコードにバグがないことを証明することはできませんが、seL4マイクロカーネルの場合は可能です。


認定されたコードは依然として仕様の誤りに対して脆弱であるため、仕様に比べてコードにバグがないと言えます。
nponeccop

@nponeccopは間違いなく真実ですが、仕様に疑問を持ち始めると、悪名高いバグ機能のラインを本当に不明瞭にし始めます。何かを「バグ」と呼ぶには、暗黙の仕様を念頭に置いておく必要があります。そのような暗黙の仕様の背後にある直観を捉えると、数学の哲学の基礎(Brouwer対Hilbertのスタイル)で疑問にぶつかるまで、本当に深く掘り下げ始めます。 。
Artem Kaznatcheev

「仕様」とは、正式な仕様、つまり証明する正式な定理を意味します。テキスト要件を定理に変換する際に、まだ間違いを犯す可能性があります。認定によって得られる唯一のものは、信頼できるコードベースの削減(コードや証明ではなく、定理のみを信頼する必要があります)と定理とのコードの整合性です。
nponeccop

次に、seL4 Webサイトからの引用を示します。「seL4マイクロカーネルのCコードは、その抽象的な仕様に記述されている動作を正しく実装しているだけで、それ以上のものはありません。」
nponeccop

2

あなたが尋ねる質問は実際にはかなり異なります。

ただし、これがオペレーティングシステムなどの実際のプログラムにどの程度当てはまるかはわかりません。これらのタイプのプログラムには、チューリング完全性の完全な強さが必要ですか?

計算のモデルがチューリング完全であるために非常に少ししかかかりません。たとえば、カウンター備えたさまざまなモデルは、チューリングマシンをシミュレートできます。ソフトウェアが任意に操作できる3つ以上のカウンターを必要とする場合は、チューリング完全言語を使用しています。マシンの整数は事前に制限されていますが、ヒープに割り当てられたデータ構造は通常は制限されていません。ソフトウェアにリスト、ツリー、その他の動的に割り当てられたデータが必要な場合は、チューリング完全言語を使用しています。

これらのアプリケーションを記述できる、より単純な計算モデル(PRなど)はありますか?もしそうなら、これはどの程度プログラムの正確さの決定可能性を可能にしますか?

ソフトウェアの任意のプロパティをチェックしたくないことを認識することが重要です。非常に具体的で狭いプロパティ(バッファーオーバーフロー、ヌルポインター逆参照、無限ループなど)をチェックすると、ソフトウェアの品質と使いやすさが大幅に向上します。理論的には、そのような問題はまだ決定できません。実際には、特定のプロパティに焦点を当てることで、問題を解決するためにしばしば利用できるプログラムの構造を見つけることができます。

特に、元の質問を次のように変更できます。

非チューリング完全モデルで効率的に分析できるソフトウェアの抽象化はありますか?

抽象化は、元のソフトウェアの動作と、場合によっては多くの追加動作を含むモデルです。チューリング完全ではなく、分析できるワンカウンターマシンやプッシュダウンシステムなどのモデルがあります。自動化ツールを使用したプログラム検証の標準的なアプローチは、そのようなモデルで抽象化を構築し、それをアルゴリズムでチェックすることです。

ハードウェアやソフトウェアの洗練された特性を気にするアプリケーションがあります。ハードウェア企業はチップに算術アルゴリズムを正しく実装することを望んでおり、自動車および航空電子工学企業は認定された正しいソフトウェアを求めています。それが重要な場合は、(訓練された)人間を使用する方がよいでしょう。


私はあなたが反対の質問に答えたと思います、すなわち、ワードプロセッサがチューリング完全であることは可能ですか?レジスタを適切に処理することで、そうなります。それにもかかわらず、レジスター操作の規則を課してチューリング完全性を打ち破ることは可能です。私の質問は、これらの狭い制約の中で実際にどれだけプログラムできるかです。
David Harris

私は、オペレーティングシステムやその他のアプリケーションソフトウェアの作成にチューリング完全プログラミング言語が必要かどうかについての質問に答えていました。複数のカウンターまたは無制限のデータ構造が必要な場合は、チューリング完全プログラミング言語が必要です。
Vijay D

@Vijay:いいえ、これは真実ではありません。非常に表現力があり、無限の再帰を許可しないタイプ理論(AgdaやCoqなど)はたくさんあります。
Neel Krishnaswami '30

@ニール:明確にするために、私はチューリング完全性についてのみ話している。これらの理論でチューリング機械をシミュレートすることは不可能ですか?
Vijay D

そうです、彼らは完全なチューリングではありません。建設的なロジックでは、チューリング完全性により、ラッセルのパラドックスの類似物をプログラムすることができます。
Neel Krishnaswami、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.