行動のサブタイピングが決定できないのはなぜですか?


12

この分野でのリスコフの研究は、行動サブタイプに焦点を当てていました。この記事で説明した型システムの安全性に加えて、サブタイプは、一部の契約のスーパータイプによって保証されるすべての不変式を保存することも必要とします。このサブタイピングの定義は一般に決定できないため、型チェッカーでは検証できません。

From:http : //www.wikiwand.com/en/Subtyping#/Function_types

回答:


24

oタイプの操作の契約Tは、すべての入力に対して停止することです。次にo、サブタイプの操作がS <: Tその契約を満たすかどうかを決定します。停止問題を解決しました。

より一般的にS::oは、T::oif と同じ関数を計算する必要がありS <: Tます。2つのプログラムが同じ関数を計算するかどうかを決定することは関数問題と呼ばれ、停止問題を解決することと同等です。

一般に、重要な実行時プロパティを静的に決定することは、ほとんど常に停止問題と同等です。


3
その最後の行はそれを打ちます。あなたが不可能に踏み込んでいる行動設定でプログラムが何をするかについての特性を証明したい瞬間。型システムと静的分析ツールが機能する理由は、プログラムが直接実行される方法のプロパティではなく、異なる言語(プログラムのタイプ、プログラム内の変数のスコープなど)を処理するためです。
ベンジャミングリュンバウム

5
@BenjaminGruenbaum Jorgの答えとあなたのコメントは正しいが、微妙な点があるので明確にしたい。多くの場合、特定のプログラムに関するプロパティを証明することが可能です。すべてのプログラムで機能する、盲目的にたどることのできるアルゴリズムはありません。Javaで記述されたこのメソッドを検討してください。BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }特定のメソッドが常に整数配列の要素の合計を返し、他に何もしないことを証明するのは難しくありません(引数がnullでない場合)。
ドーバル

1
そして、それが停止する問題と同等でないとき、それはしばしばさらに悪化します。不可能というのはすでに十分な困難ではなかったからです。
user2357112は、Monica

2
または、Dovalのポイントを別の(簡潔な)方法で言うと、これがまさにチューリング完全言語が興味深く有用な理由です。多くの場合、実際の作業にはチューリング完全性(モジュールレベルで)は必要ありません。
ルーシェンコ

@Doval:非常に良い点。ランダムプログラムの終了や正当性を証明するアルゴリズムを使用できないことは事実ですが、プログラムの正確性を証明できる方法でプログラムを作成することは可能です。
ジョルジオ

12

プログラムの動作に関するほとんどすべての質問は決定不能だからです。ライスの定理により、次の形式の決定問題:

このプロパティを持つ関数を計算するプログラムもあれば、このプロパティを持たない関数を計算するプログラムもあります。プログラムPが与えられた場合、Pによって計算された関数は前述の特性を持っているかどうか?

決定不能です。そのため、たとえば、入力の2乗を計算するコードとそうでないコードを常に区別できるわけではありません。単純なケースでは、関数がそうすることを証明することはしばしば可能ですが、すべてのプログラムで機能する一般的な手順はありません。

興味深い行動の不変式のほとんどは、ライスの定理に該当します。これらのステートメントは、メソッドが内部的にどのように見えるか、特定の入力に応じてメソッドが返すもの、副作用を説明することはめったにないからです。


3
少し明確にすることができます:特定のプログラムが、どんなに病理学的であっても、すべての分析に抵抗できるわけではありませんが、特定の分析では、適切に分類できないプログラムが少なくとも1つ存在します。
ネイサンタギー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.