なぜ課題規則がHoare Logicにあるのですか?
-
28-09-2020 - |
質問
課題規則がホーレロジック/公理セマンティクスにあるのはなぜですか? 課題規則が私が予想したものから逆方向にある理由を周りに私の頭を包むことはできません。
私はHoare Logicが使用されていることを理解してプログラムの状態を正式な命題を実行することを証明します。したがって、コマンドを実行した場合、 $$ x:= e $$ 私は、次の状態にそのような置換をしたことが予想されます。しかし、置換が起こるようです前に私たちがビザアを見つける任務を実行します。私は予想したでしょう:
$$ \ {p} x:= e \ {p [e / x] \} $$
$ p $ は、プログラム状態に関するステートメントです。
これには良い説明があると確信しています。これが基本的な質問であればすみません、私はそれがなければならないことを知っています。しかし、誰かが私にそれを説明することができますか?
ボーナス質問:
代入規則を次のように書いてみませんか。
$$ \ {q \} x:= e \ {q [x / e] \} $$
$ x $ と $ e $ スワップしてください。 $ E $ がある場合は、 $ x $ を配置します。 executeのステートメントは、 $ x $ の値を保持することです $ e $ の値が保持されているので、事前条件がヘルプされている場合、 $ e $ を $ x $ に置き換えることができます。< / P>
私が読んだ関連記事は助けられなかった:
- 課題のためのHoare Triple {x / e} x := e {P}
- Wikipedia Hoare Logic
-
https://www.quora.com/unanswered/why-is-the-astignment-in-the-way-it-is-in-hoare-logic - https://www.reddit.com/r/programminglanguages/コメント/ e8suhh / why_is_the_assignment_rule_the_way_it_is_in_hoare /
付録:
米国の解読症のために、この質問では、代替表記法が意味するものです。
$$ p [e / x]= p [e \ to x] $$
すき。 $ x $ のすべての空き出現をexpression / term / thingie $ E $ 。
解決
それでも読んで考える後、これは私の説明です(ありがとうソフトウェア基礎):
私のための重要な混乱は、 $ p [e / x] $ の意味です(Xのすべての空きインスタンスをe)。これがどのようなもので、シンボルが表示されていますが、 $ x $ 文字通り削除して $ e $ を配置します。例えば $ p [E / x]=(x + + 1)[E / x]¥¥¥¥¥¥¥¥¥¥$ それで、 $ p $ から $ x $ が解消された方法に注意してください。だから私たちが望むことは一度割り当てをします:
$$ x:= e $$
$ x $ が $ e $ の代わりにtrueであること。そのルールが次のとおりです。
$$ \ {p [e / x] \} x:= e \ {p \} $$
$ x $ を $ e $ の場合、 $ x $ の場合実現することを考慮した声明。そのため、コードを開始する前に、 $ p [e / x] $ があります。その後、 $ e $ の割り当てを実行し、 $ x $ のgetを取得します。それらを交換してください。 ranが割り当てされていたコードが割り当てられていた場合はがtrueである必要があります( $ x $ 以降、値 $ E $ 、 $ e $ の除去、 $ x $ )
それは抽象概念の説明です。 (Shamlessに)ソフトウェアファンデーション(SF)の例:
{{y= 1}} x ::= {{x= 1}}英語:yの値が1で、xにyを割り当てた状態で起動すると、 xが1の状態で終了すると、1に等しい性質がyからxに転送されます。
SFからの有用な段落:
も同様に、 {{y + z= 1}} x ::= y + z {{x= 1}} 同じプロパティ(1に等しい)が、割り当ての右側の式y + zからxに転送されます。 より一般的には、aが算術式である場合、 {{a= 1}} x ::= a {{x= 1}} 有効なホアレトリプルです。
コメントの素晴らしい観察からの補遺:
その規則を認識することが重要です { p 【 e. / / バツ ] } バツ := e. { p } 式の両方を許可します e. そして変数 バツ 後処法で発生する。言い換えれば、推論規則を使用すると、オカレンスの発生のサブセットを推測できます。 e. 前提条件では交換されました バツ 彼らのどれも含まない。さらに、それはあなたが同時にこれらのさまざまな後部条件のすべてを推測することを可能にします。
ボーナスへの返信なぜ
1) $ \ {p [e / x] \} x:= e \ {p \} $
よりも優れています
2) $ \ {\} x:= e \ {q [x / e] \} $ :
Xを非表示にする可能性がある式とXを交換する微妙な点に加えて(e= 0、 $ 0 $ を無限の数の $ x $ 's?ゼロがそこにいない場合...ルールは構文的であるべきですが、そのような混乱を回避するのが良いと思います)、これが理由であると思います:< / P>
課題の規則がどのようにキャプチャするかは、式eを変数xに割り当てていることです。したがって、Xによって「置き換え」する必要があります。直感的に、コード内(またはより正確には、プログラムの状態 $ \ sigma $ )の場合、eが値eを開始すると、それでもランダムに意味がありません。割り当て $ x:= e $ を実行した後、Xになる可能性があります。実際、それは今のことを意味するのですが、Xの郵便条件があることです。これで、割り当てに割り当てがない場合は、 $ e $ の値を持つべきです。代替/代入の代入を "元に戻す" Assignmentコマンドのみがあります。他のすべてのランダム表現eではありません。要するに、課題が行われた後にPOST状態から開始する場所を知る唯一の方法で、そこからeの場所から始まります。私たちがそれを後退させるならば、我々は置き換えたくなかったEの交換かもしれません(私たちがおそらく真実だったとしても、xを割り当てられた後に彼らはxを求めてからxを求めているので彼らは値eを持っていると思います)。
他のヒント
プログラムx := e
を実行していると仮定し、 $ \ sigma $ を初期状態にし、 $ \ sigma ' $ は最終状態です。
ここでの重要な直感は次のとおりです。 $ \ SIGMA '$ は、 initial 状態 $ E $ の値と同じです。 "math-container"> $ \ sigma $ 。確かに、後者は $ x $ に割り当てる値です。
したがって、 $ p( - )$ の場合、式 $ p(\ mbox { $ x $ in-in-the-final-state})$ は $ p(\ mbox {$ E $ -in-the-e-e-e-the-state})と同じです。 $ 。言い換えれば、 postcondition の $ p(x)$ (state $ \ sigma ') $ )は、 precondition の $ p(e)$ と同じです( $ \ sigma $ )
代替の使用は、「 $ p(x)$ 、そしてその後、 $ p(e)$ を前提条件として要求します。