この分野でのリスコフの研究は、行動サブタイプに焦点を当てていました。この記事で説明した型システムの安全性に加えて、サブタイプは、一部の契約のスーパータイプによって保証されるすべての不変式を保存することも必要とします。このサブタイピングの定義は一般に決定できないため、型チェッカーでは検証できません。
この分野でのリスコフの研究は、行動サブタイプに焦点を当てていました。この記事で説明した型システムの安全性に加えて、サブタイプは、一部の契約のスーパータイプによって保証されるすべての不変式を保存することも必要とします。このサブタイピングの定義は一般に決定できないため、型チェッカーでは検証できません。
回答:
o
タイプの操作の契約T
は、すべての入力に対して停止することです。次にo
、サブタイプの操作がS <: T
その契約を満たすかどうかを決定します。停止問題を解決しました。
より一般的にS::o
は、T::o
if と同じ関数を計算する必要がありS <: T
ます。2つのプログラムが同じ関数を計算するかどうかを決定することは関数問題と呼ばれ、停止問題を解決することと同等です。
一般に、重要な実行時プロパティを静的に決定することは、ほとんど常に停止問題と同等です。
BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }
特定のメソッドが常に整数配列の要素の合計を返し、他に何もしないことを証明するのは難しくありません(引数がnullでない場合)。
プログラムの動作に関するほとんどすべての質問は決定不能だからです。ライスの定理により、次の形式の決定問題:
このプロパティを持つ関数を計算するプログラムもあれば、このプロパティを持たない関数を計算するプログラムもあります。プログラムPが与えられた場合、Pによって計算された関数は前述の特性を持っているかどうか?
決定不能です。そのため、たとえば、入力の2乗を計算するコードとそうでないコードを常に区別できるわけではありません。単純なケースでは、関数がそうすることを証明することはしばしば可能ですが、すべてのプログラムで機能する一般的な手順はありません。
興味深い行動の不変式のほとんどは、ライスの定理に該当します。これらのステートメントは、メソッドが内部的にどのように見えるか、特定の入力に応じてメソッドが返すもの、副作用を説明することはめったにないからです。