手短に:
部分的な正確さは終了の問題であり、計算されたものの正確さではありません。関数は、終了時に、計算結果が正しい限り、仕様に関して部分的に正しいです。このアイデアは、不完全な(部分的な)回答の計算に拡張できます。計算された答えは何でも正しいですが、プログラムはある時点で、おそらくすべての答えを計算せずに非終了ループに入る可能性があります。部分回答は、完全回答の近似です。
この近似構造は部分順序であり、スコットのセマンティクスドメインの基本概念であり、実際には、質問の別の解釈に答えるために使用できます。配列の1つの要素が(未知数ではなく)間違っているなど、正解と不正解の間の距離を測定できますか?そのような距離を定義する1つの方法は、近似の順序を考慮し、2つの互換性のない解答(正しい解答と誤った解答)を両方の近似である最良の部分解答に関連付けることです。この問題は、精度分析が不可欠である数値分析やその他のいくつかの分野の観点からすばやく見られます。
この2つ目のポイントは、最初は2つの回答が関連している可能性があることを最初に認識していなかったため、質問の2つ目の回答で検討されています。しかし、どちらの回答も非常に長く、接続を理解したときにそれらをマージするのは賢明ではありませんでした。
部分的な正確さの最初の簡単なビュー
絶対的な意味で(部分的に)正しいということはありません。プログラムが仕様を満たしていれば正しいですが、与えられています。仕様は、別のプログラム、論理ステートメント、または形式化できるものであれば何でもかまいません。仕様には、プログラムがいつ終了するかについての情報を、おそらく常に(ほとんどの定義では実際に想定されているため、これ以上複雑なことを言う必要はない)含める必要があります。実際には、ドメインは仕様で終了が予想される部分に制限されている可能性があるため、終了は常に予想され、通常の定義(wikipediaおよびwikipediaでドメイン全体の終了を想定すると正当化される場合があります))。これは、仕様に暗黙の仮定を課します。仕様は非常に便利な場合とそうでない場合があります。
プログラムは
、仕様書に記載されているとおりに終了する場合に限り、仕様書に関して正しく、その結果は仕様書に適合します。仕様書に記載されているとおりに終了しない場合がありますが、終了時に常に正しい結果が得られる場合は、部分的に正しいです。PS
その結果、決して終了しないプログラムは、仕様に関して部分的に正しいです。
また、わずかに拡張された定義を選択しました。これは、表記の意味論で使用されているような、スコットの意味論的ドメインにおける近似の概念に正確に対応しているためです。スコットドメインには、部分的正しさの考え方に正確に対応する部分的順序が含まれています(「部分的」という単語の2つの使用法は多少関係がありません)。関数であり、関数の近似値でありいつでも終了
終了し、両方のギブ同じ結果。したがって、はが結果をないときに結果を返すことがあります。そして、はに関して部分的に正しいか、またはFGGFGFFGFおおよその、または。GF⊑G
これらのアイデアは、ループ(または再帰)を持つ関数のセマンティクスを、ループまたは再帰のない関数の無限セットの制限として定義するために不可欠です。たとえば、ウィキペディア、またはSEに関する非常に非公式なプレゼンテーションを参照してください。
標準のHoareロジックは、部分的な正確性を証明するためにのみ機能し、終了プロパティに対処するために拡張する必要があるため、完全な正確性に対処します(ウィキペディアを参照)。そのような特定の拡張機能の実装例があります。
完全な正当性を証明することは、部分的な正当性と終了を証明することになります。Hoareロジックは、部分的な正確性に非常に適しています。終了の証明には、通常、帰納法による証明(反復)が必要です。これは、スコットのセマンティクスで物事を証明する自然なアプローチです(セマンティクス自体が帰納的に定義されているため)。ダニエルプの答えは、そのような帰納法がホーアの論理の証明をどのように補完できるかを示しています。
部分的な正確さを定量化することについては、まだそうしたいと思っている場合、プログラムが終了するか、終了しないドメインの部分、またはそれらの部分のいくつかのプロパティを何らかの方法で特定することができます。
ソート結果に適用される、複雑な結果への拡張。
実際、データ構造などの複雑な回答を検討する場合、問題はもう少し複雑になる可能性があります(配列をソートする場合など)。仕様では2つの回答(つまり、ペア)の計算が必要になる場合があり、入力ドメインの一部では、実際のプログラムはペアの1つの要素を見つけることができますが、他の計算中に終了することはできません。要素、または両方を見つける、または何も見つけない。これはスコットの意味ではまだ近似であり、そのようなプログラムは部分的に正しいです。
より一般的には、スコットの意味での近似の考え方は、データだけでなくプログラムにも当てはまります。そのためには、非公式に、未知の答えの概念が必要です(まだ計算されていない、計算が終了しない場合はおそらく不明)。通常はという記号で表されます。ペア近似します。36の部分を提供し、その後終了しないプログラムで得られるものは、で表すことができます。⊥(⊥,36)(25,36)(⊥,36)
5つの整数の配列をソートするプログラムにこれをどのように適用できますか?メインアプリケーションと並行して実行するプログラムSORT5(私は現実のものにしようとしている)を作成し、そのような配列をアプリケーション用に並べ替えると仮定します。プログラムSORT5は、その結果をアプリケーションが提供する配列に格納することになっています。それを配置する場所がわかると、要素ごとに個別に格納できます。最初に最大値と最小値を探し、両端に格納してから、再帰(または何でも)を試みますが、それ以上の結果なしに無限ループに送信するバグがあります。メインアプリケーションはまだ部分的な回答を取得します。ソートする配列が場合、返される答えは[25,36,3,9,12][3,⊥,⊥,⊥,36]代わりに
。提供されたものはすべて正しく、残りは計算されないため、答えの一部しか得られません。したがって、希望する結果の近似値が得られます。これが常に当てはまることを証明できれば、終了しないバグの多いプログラムSORT5は、ソートプログラムの仕様に関して部分的に正しいです。[3,9,12,25,36]
部分的に正しいプログラムが役立つ場合があります。並べ替えは実際には必要なく、最大の要素と最小の要素だけが必要な場合もあります。その場合、ソートプログラムSORT5が終了せず、部分的にしか正しくないという事実は問題にならず、アプリケーションは機能し、うまくいけば正しい答えで終了します。
しかし、コンピューティングパワーを浪費し続ける不正なソートアルゴリズムを誰が止めるでしょうか。計算方法(遅延評価)があり、その結果に関する詳細が現在必要ない場合はサブプログラムを実行しません。したがって、最大および最小の要素を取得した後、他の要素が要求されるまでプログラムSORT5は保留されます。
もちろん、この場合、部分的な正確さを定量化する方法が考えられます。しかし、それが非常に役立つかどうかはわかりません。
この文脈では、定義を少し改訂する必要があります。
プログラムPは、仕様Sに関して部分的に正しいが、終了する前に仕様を満たす完全な回答を提供するか、回答のさらなる部分を提供しない非終了計算に入る前に仕様を満たす回答の一部を提供する。
次に、終了せず、結果の一部を生成しないプログラムは、仕様に関して部分的に正しいです。
この定義では、コンピューティングを継続し、答えの新しい部分を生成し続けるプログラムを除外していることに注意してください。しかし、それは無限小を生成しないので(これが計算上意味があるかどうかはわかりません)、実際には無限の答えを計算しています。
これらの手法は、の値の正確な10進数(または2進数)表現や無限リストなど、無限オブジェクト(非常に忍耐強いユーザーのみ)の計算のセマンティクスを形式化するために実際に非常に有益です。他にも興味深いアプリケーションがあります。しかし、これは最初の質問とはかけ離れています。そのため、私はそれを省略しています。π