部分的に正しいプログラムがどれほど正しいかを定量化できますか?


7

部分的正しさと呼ばれるものがあることは知っていますが、半正解が完全正解にどれだけ近いかを知る方法があるのか​​と思っていました。

たとえば、配列をほぼ完全に並べ替える並べ替えプログラムがある場合、Hoareロジックを使用して、正しい答えを得るのにどれだけ近いかを判断できますか?これを行う1つの方法は、一連のandステートメントを前提条件にして、これらのステートメントのうち、プログラムを通じて伝播される事後条件の結果として最も弱い前提条件がいくつあるかを確認することです。

ただし、この方法は非常に粗雑なようです。このようなことをする他の方法はありますか?


2
私の傾向は、ロジックを使用できるということですが、プログラムについて推論しているため、これを支援する一般的なアルゴリズムはありません。ライスの定理を参照してください。
jmite 2014年

2
退屈な場合を除いて、プログラムは間違いなく多くの間違いを犯します。それでは、あるプログラムが別のプログラムよりも正しいと言えば、どういう意味ですか?
ラファエル

@jmite実存的数量化と普遍的数量化の間で混乱を引き起こしています。質問に答える一般的なテクニックがないという事実は、それが有用な答えを持っている興味深いサブドメインがないことを意味しません。...あればそこで質問はまだ理にかなって
babou

3
部分的に正確であることは、答えがどんな意味でもほぼ正しいことを意味するのではなく、プログラムが終了するたびに正しいことだけを意味します。したがって、終了せず結果を生成しないプログラムは、仕様に関して部分的に正しいものです。これは部分的な回答に拡張できます。回答の提供された部分は、非生産的で終了しない計算に入る前に、仕様に関して(正確な意味で)完全に正しい必要がありますが、回答は不完全なままになる場合があります。 。
バブー14年

@Raphaelそれは私が思っていることです。ロジックを使用して、プログラムが正しいソリューションにどれだけ近いかを確認する方法はありますか?また、2つの誤ったプログラムを互いに比較する方法はありますか?
GyCn 2014年

回答:


5

部分的に正確であることは、仕様のすべてのステートメントがアルゴリズムによって満たされるわけではないことを意味しません。見てい正しさに関するWikipediaの記事を

アルゴリズムの部分的な正確さは、アルゴリズムが終了した場合に正しい答えを返すことを意味します。

完全に正確であることは、アルゴリズムが終了することがさらに保証されることを意味します。

このような終了の証明は、たとえばループバリアントによって実行できます。ループが終了することを証明するには、整数式がループ本体で減少し、式が常に負でないままであることを示します。その場合、ループは有限回数だけ繰り返すことができます。B-方法は、整数は、その一方のループ内に変異体が使用されます。整数式の代替案は、各反復で要素が削除される有限セットです。

:サイズnの配列を0で初期化する単純なアルゴリズム:

i := 0
while i<n do
  x[i] := 0
  i := i+1
done

部分的な正しさ(「xのすべての要素ループ不変条件を使用して証明することができる0..i0です」、 、)。0<=i i<=nループに入るとき、および各反復の後で、不変条件が満たされていることを示す必要があります。ループの後、不変条件が満たされ、ループ条件が満たされていないことがわかります(i>=nループ不変条件と合わせて、が意味することi=n、つまり「xのすべての要素0..nが0 であること」を意味します)。行を忘れたとしてもi := i+1、アルゴリズムの部分的な正確さを証明できます。つまり、配列は終了後に0で埋められます。問題は、それが終了しないことです。

終了はn-i、バリアントとして選択することで表示できます。不変でi<=n、バリアントは常に非負であるとことを証明することができn-i、すべての反復で(私を増やすことで)減少しています。したがって、ループは終了する必要があります。部分的な正確さとともに、全体的な正確さが示されています。


4

手短に:

部分的な正確さは終了の問題であり、計算されたものの正確さではありません。関数は、終了時に、計算​​結果が正しい限り、仕様に関して部分的に正しいです。このアイデアは、不完全な(部分的な)回答の計算に拡張できます。計算された答えは何でも正しいですが、プログラムはある時点で、おそらくすべての答えを計算せずに非終了ループに入る可能性があります。部分回答は、完全回答の近似です。

この近似構造は部分順序であり、スコットのセマンティクスドメインの基本概念であり、実際には、質問の別の解釈に答えるために使用できます。配列の1つの要素が(未知数ではなく)間違っているなど、正解と不正解の間の距離を測定できますか?そのような距離を定義する1つの方法は、近似の順序を考慮し、2つの互換性のない解答(正しい解答と誤った解答)を両方の近似である最良の部分解答に関連付けることです。この問題は、精度分析が不可欠である数値分析やその他のいくつかの分野の観点からすばやく見られます。

この2つ目のポイントは、最初は2つの回答が関連している可能性があることを最初に認識していなかったため、質問の2つ目の回答で検討されています。しかし、どちらの回答も非常に長く、接続を理解したときにそれらをマージするのは賢明ではありませんでした。

部分的な正確さの最初の簡単なビュー

絶対的な意味で(部分的に)正しいということはありません。プログラムが仕様を満たしていれば正しいですが、与えられています。仕様は、別のプログラム、論理ステートメント、または形式化できるものであれば何でもかまいません。仕様には、プログラムがいつ終了するかについての情報を、おそらく常に(ほとんどの定義では実際に想定されているため、これ以上複雑なことを言う必要はない)含める必要があります。実際には、ドメインは仕様で終了が予想される部分に制限されている可能性があるため、終了は常に予想され、通常の定義(wikipediaおよびwikipediaでドメイン全体の終了を想定すると正当化される場合があります))。これは、仕様に暗黙の仮定を課します。仕様は非常に便利な場合とそうでない場合があります。

プログラムは 、仕様書に記載されているとおりに終了する場合に限り、仕様書に関して正しく、その結果は仕様書に適合します。仕様書に記載されているとおりに終了しない場合がありますが、終了時に常に正しい結果が得られる場合は、部分的に正しいです。PS

その結果、決して終了しないプログラムは、仕様に関して部分的に正しいです。

また、わずかに拡張された定義を選択しました。これは、表記の意味論で使用されているような、スコットの意味論的ドメインにおける近似の概念に正確に対応しているためです。スコットドメインには、部分的正しさの考え方に正確に対応する部分的順序が含まれています(「部分的」という単語の2つの使用法は多少関係がありません)。関数であり、関数の近似値でありいつでも終了 終了し、両方のギブ同じ結果。したがって、はが結果をないときに結果を返すことがあります。そして、はに関して部分的に正しいか、またはFGGFGFFGFおおよその、または。GFG

これらのアイデアは、ループ(または再帰)を持つ関数のセマンティクスを、ループまたは再帰のない関数の無限セットの制限として定義するために不可欠です。たとえば、ウィキペディア、または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進数)表現や無限リストなど、無限オブジェクト(非常に忍耐強いユーザーのみ)の計算のセマンティクスを形式化するために実際に非常に有益です。他にも興味深いアプリケーションがあります。しかし、これは最初の質問とはかけ離れています。そのため、私はそれを省略しています。π


2

プログラムの正確さを定量化することは、現在、正式なメソッドのコンテキストでは実際にかなりホットなトピックです。参考文献のリストを投稿する代わりに、ここから始め(フルバージョンはこちら)、参照から続けることができます。開示:この論文は私の作品です。

この作業の概要:一連の「品質関数」によって線形時相論理を補強する仕様形式を紹介します。これらの機能はデザイナーが選択するため、デザイナーは好みに応じて品質を定義できます。

このロジックのモデルチェックがPSPACEにあることを示します。適切な品質関数を使用して、たとえば、ソートされた配列からの配列の距離を測定できます。


  1. S. Almagor、U。Boker、O。Kupferman(2013)による品質に関する形式化と推論

1

原則として、Hoareロジックのようなものを使用してこの条件を表現することは可能ですが、それが非常に有用であるか実用的であるかは明確ではありません。

関数を検討 fプログラムでは、1つの引数を使用します。述語があるとしましょうP(x,y)、という条件を表現する y 入力に対する正しい答えです x、つまり、 f 出力を生成します y 入力時 xその後、この出力は正しいです。また、述語があるとしますQ(y,y) その答えを表現する y そして yお互いに近いです。述語を定義するR(x,y) 沿って

R(x,y)y.P(x,y)Q(y,y).

その後 R(x,y) あなたが望む状態、つまり y 入力に対する正解に近い x

あなたの例では、 P(x,y) というステートメントを表現できます y はソートされたバージョンです x、および Q(y,y) リスト上にいくつかの距離メトリックを表現できます(たとえば、 y から得ることができます y 少数の転置による)。

これが仕様の問題です。検証の別の問題があります。つまり、関数の検証f 仕様を満たしています R。検証の問題は実際には醜くて難しいかもしれません。また、jmiteが述べるように、関数の実装が特定の仕様を満たすかどうかを確認することは、一般に決定できません。したがって、いつもの検証と同様に、常に決定不能性(たとえば、不完全性)を処理します。


ロジックだけで、特定の入力からの結果ではなくプログラム自体を見ることによってQを決定する方法があるのか​​と、私は実際に思っていました。さらに、qが単なるtrue / falseではなく、値の範囲であるのではないかと考えていました。
GyCn 2014年

質問に対する私のコメントを参照してください。(CC @ user2828752)
babou

1

不正確

私は部分的な正確さについて最初の回答を書きましたが、それは正確な技術的な意味を持っています。私はこの他の答えを分離する方が良いと思いました。それは真実ではないことが判明しましたが、両方の答えは十分に長いので、それらをマージしない方がいいと思いました

どうやらOPは、部分的に正しくないプログラムの考え、ある点で正しくない答えを見つけることの方に興味を持っているようです。

関数を修正するために近さを検討する方法は2つあります。

  • 計算された回答に正しい部分と誤った部分があるかどうか、または

  • それらが時々正しいか、時々正しくないかどうか。

しかし、これらの2つの側面は組み合わせることができます。回答セットの値の間の距離のようなものを定義できた場合は、それを関数間の距離に拡張することができます。これは、非常に非公式に、ドメインのすべてのポイントに対する結果の距離のある種の積分です。 、またはドメインのすべてのポイントの不正確さの他のいくつかの機能。

次に、問題は、完全に正しい関数とプログラムされた関数との間の距離が一定のしきい値を超えていないかどうか、または関数を適用した結果のエラーが各ドメインポイントで関連するしきい値を超えていないかどうかを判断することです。このドメインポイント。

これらの手法は、実験結果など、ある意味で最初は正しくないデータを使用して、可能な限り正確な計算を行うのにも役立ちます。不正確さの程度を評価または仮定できる場合、これは計算への影響を追跡するのに役立ちます。

これはおそらく、計算しているデータの種類に大きく依存しています。

私はすでに数値計算のためのそのような理論があり、技術的な仕事にしばしば適用されると信じていますが、私はそれについてほとんど知りません。基本的な側面は、物理学のコースでよく教えられています。

多くの数値計算は実数を扱います。コンピューターは実数の近似のみを使用するため、正確な(正しい)ことはできません(正確な実数演算を使用した計算の概念はありますが、非常に異なるトピックであり、理論的には部分的な正確さに非常に関連してい ます)。数値計算における近似は、小さなエラー(丸め誤差)を)増殖する可能性があり、時には手に負えなくなるほど成長します。したがって、数値計算者は、プログラムを分析し、答えが正しい結果にどれだけ近いかを評価する手法を開発しました。一部の操作の順序は、伝播するエラーのサイズに大きな影響を与える可能性があるため、実際には、他の通常の基準に加えて、計算エラーを最小限に抑えるようにアルゴリズムを設計しています。

これらの手法は、それ自体が「修正に近い」、つまり何らかの近似で与えられる物理データを処理する必要があることが多いため、重要です。入力のエラーを計算エラーと一緒に処理すること、およびそれらの伝搬は、数値解析の分野における重要な研究の目的であると私は信じています。しかし、私は専門家ではありません。一部のプログラムは、おおよその結果と、正しい答えが見つかるその周りのエラー間隔の両方を計算します。これは、物理的な測定誤差と数値計算誤差の両方を悪化させます。

ただし、これは実数(連続する値のセット)を扱う数値数学では本質的に避けられませんが、シンボリック計算に同様の組み込みの制限はなく、したがって、同様の手法を開発するための明らかなインセンティブ、アプリオリはありません。さらに、それを行うことは明らかでない場合があります。

それでも、解析および自然言語処理におけるエラー処理手法を詳しく見ると、純粋にシンボリックなコンテキストであっても、実際には同様の概念的なビューを使用していることがわかります。

Shaull回答はソフトウェアエンジニアリングにおけるそのような近似のアイデアに興味があるかもしれないことを示しているようですが、同じ概念を扱っているかどうかはわかりません。私は彼の論文を読んだことがなく、このトピックに関する文献をほとんど読んでいません。その答えは、彼が検討している可能性のあるテクニックのヒントを与えていません。

ソフトウェアエンジニアリングはソフトウェアのバグの程度を測定することに非常に関心があるので、それはまったく異なる考えかもしれませんが、うっかりバグがあります。一部の統計分析では、プログラムで測定できるさまざまなパラメーターがプログラムの品質、保守性、バグの可能性に統計的に関連していることを示しています。

数値解析におけるおおよその回答のアイデア(たとえば)は、バグの問題ではなく、物理的な測定の制限のほか、実数を扱うために使用される場合の計算(本質的にカウント可能)の制限の処理に関するものです(数えられない)。それがバグであるならば、それは私たちの宇宙のせいであり、プログラマーのせいではありません。

問題の統一を試みる:部分的な正確性と不正確さの測定

以下は純粋に投機的なものであり、実行可能な作業を示しています。私はそれの少なくとも一部がすでに行われていると思います(私は徹底的に検索しませんでした)。しかし、私はそれについて読んだことを思い出せず、適切な参照を与えることはできません。説明は単なるスケッチであり、定義の選択を含め、説明の多くを洗練またはより正確にする必要がある可能性があります。数学的に完全に計算できていないものは保証できません(それでも... :)。

実数近似の定義に基づく実数計算に関する文献が公開されており、スコットドメインで整理されています。間隔で実数を近似することは確かにそれを行う方法であり、それは実数にわたって計算可能性の理論を発展させる1つの適切な方法です。私の推測では、それはすでに行われているはずであり、セマンティクス理論、および上記のように結果の精度の評価とともに実数の計算プログラムを分析するための優れた基礎を提供します。(私は専門家に依頼する機会がありませんでした)。

これは、特に複雑なデータ、つまりデータ構造の使用がある場合に、ほぼ正しい計算の概念を取得するために、シンボリック計算または整数に対する計算をどうするかに関するヒントになるかもしれません。

基本的な考え方は実際のものと同じであり、近似の概念を使用して、計算ドメイン(計算に使用する値)をスクートドメインとして編成します。ただし、これはラティスのようなものである必要があり 、2つの要素には最大の下限(glbまたはmeet)と最小の上限(lubまたはjoin)が必要です。数値の場合、glbは他の2つの間隔を含む最小間隔に対応し、lubと間隔の交差に対応します。

最初の回答からソートの例をとると、5つの数値の配列をソートします[25,36,3,9,12]、すべての部分配列をラティスと見なすことができます。

  • lub([3,,,,36],[,9,,,36])=[3,9,,,36]

  • glb([3,,,,36],[7,9,,,36])=[,,,,36]

次に、順序構造で距離の概念を定義すると、2つの可能な回答間の距離を、それらのglbまでの距離の合計として定義できます(または、これら2つの距離の対称的で単調に増加する他の関数)。

ドメインにglbがない場合は、それぞれの下限(実際には一連の下限の最大要素のみ)に従って距離を取得し、そのような最小の距離(またはおそらく他のいくつかの距離の関数)を考慮することができます。最大要素、適切なプロパティ)。

重要なポイントは、操作するデータ上の正確さの距離を扱いやすく定義することです。

次に、この距離の概念を拡張して、機能間の距離を測定することができます。これは、尋ねられた質問への回答となるはずです。(微積分学の意味での)何らかの形の統合が必要になる可能性があるため、どれだけ多くの余分な数学的装置が必要かわかりません。

これらの問題についてウェブをざっと検索すると、「Scott Domainsを介したプログラム間の距離の計算に向けて」という論文がすでに15年前に作成されています。それはより良い数学的背景を提供するはずです。しかし、私はこの答えを書いた後にそれを見つけました。

この問題は他のロジックで対処できる可能性がありますが、値のドメイン内の近似の概念では、これがはるかに問題になると思います。それらを構築する方法は、配列について上記で説明した方法以外にもあります。データの近似の定義は、抽象データ型の定義の一部、またはオブジェクト指向プログラミングのクラスの一部である可能性があります。

注:私は以前の答えとのこの関係を期待していませんでした。したがって、2つの別々の答えです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.