text‹This is the standard set of rules that you find in many publications.
While-rule is different from the one in Concrete Semantics in that the
is indexed by natural numbers and goes down by 1 with
iteration. The completeness proof is easier but the rule is harder
apply in program proofs.›
definition hoare_tvalid :: "assn ==> com ==> assn ==> bool"
(‹⊨t {(1_)}/ (_)/ {(1_)}›50) where "⊨t {P}c{Q} ⟷ (∀s. P s ⟶ (∃t. (c,s) ==> t ∧ Q t))"
inductive
hoaret :: "assn ==> com ==> assn ==> bool" (‹⊨t ({(1_)}/ (_)/ {(1_)})›50) where
If: "[⊨t {λs. P s ∧ bval b s} c1 {Q}; ⊨t {λs. P s ∧¬ bval b s} c2 {Q} ] ==>⊨t {P} IF b THEN c1 ELSE c2 {Q}" |
While: "[∧n::nat. ⊨t {P (Suc n)} c {P n}; ∀n s. P (Suc n) s ⟶ bval b s; ∀s. P 0 s ⟶¬ bval b s ] ==>⊨t {λs. ∃n. P n s} WHILE b DO c {P 0}" |
conseq: "[∀s. P' s ⟶ P s; ⊨t {P}c{Q}; ∀s. Q s ⟶ Q' s ]==> ⊨t {P'}c{Q'}"
text‹Building in the consequence rule:›
lemma strengthen_pre: "[∀s. P' s ⟶ P s; ⊨t {P} c {Q} ]==>⊨t {P'} c {Q}" by (metis conseq)
lemma weaken_post: "[⊨t {P} c {Q}; ∀s. Q s ⟶ Q' s ]==>⊨t {P} c {Q'}" by (metis conseq)
lemma Assign': "∀s. P s ⟶ Q(s[a/x]) ==>⊨t {P} x ::= a {Q}" by (simp add: strengthen_pre[OF _ Assign])
text‹The soundness theorem:›
theorem hoaret_sound: "⊨t {P}c{Q} ==>⊨t {P}c{Q}" proof(unfold hoare_tvalid_def, induction rule: hoaret.induct) case (While P c b) have"P n s ==>∃t. (WHILE b DO c, s) ==> t ∧ P 0 t"for n s proof(induction"n" arbitrary: s) case0thus ?caseusing While.hyps(3) WhileFalse by blast next case Suc thus ?caseby (meson While.IH While.hyps(2) WhileTrue) qed thus ?caseby auto next caseIfthus ?caseby auto blast qed fastforce+
definition wpt :: "com ==> assn ==> assn" (‹wpt›) where "wpt c Q = (λs. ∃t. (c,s) ==> t ∧ Q t)"
lemma [simp]: "wpt (IF b THEN c1 ELSE c2) Q = (λs. wpt (if bval b s then c1 else c2) Q s)" apply(unfold wpt_def) apply(rule ext) apply auto done
text‹Function ‹wpw› computes the weakest precondition of a While-loop
is unfolded a fixed number of times.›
fun wpw :: "bexp ==> com ==> nat ==> assn ==> assn"where "wpw b c 0 Q s = (¬ bval b s ∧ Q s)" | "wpw b c (Suc n) Q s = (bval b s ∧ (∃s'. (c,s) ==> s' ∧ wpw b c n Q s'))"
lemma WHILE_Its: "(WHILE b DO c,s) ==> t ==> Q t ==>∃n. wpw b c n Q s" proof(induction"WHILE b DO c" s t rule: big_step_induct) case WhileFalse thus ?caseusing wpw.simps(1) by blast next case WhileTrue thus ?caseusing wpw.simps(2) by blast qed
lemma wpt_is_pre: "⊨t {wpt c Q} c {Q}" proof (induction c arbitrary: Q) case SKIP show ?caseby (auto intro:hoaret.Skip) next case Assign show ?caseby (auto intro:hoaret.Assign) next case Seq thus ?caseby (auto intro:hoaret.Seq) next caseIfthus ?caseby (auto intro:hoaret.If hoaret.conseq) next case (While b c) let ?w = "WHILE b DO c" have c1: "∀s. wpt ?w Q s ⟶ (∃n. wpw b c n Q s)" unfolding wpt_def by (metis WHILE_Its) have c3: "∀s. wpw b c 0 Q s ⟶ Q s"by simp have w2: "∀n s. wpw b c (Suc n) Q s ⟶ bval b s"by simp have w3: "∀s. wpw b c 0 Q s ⟶¬ bval b s"by simp have"⊨t {wpw b c (Suc n) Q} c {wpw b c n Q}"for n proof - have *: "∀s. wpw b c (Suc n) Q s ⟶ (∃t. (c, s) ==> t ∧ wpw b c n Q t)"by simp show ?thesis by(rule strengthen_pre[OF * While.IH[of "wpw b c n Q", unfolded wpt_def]]) qed from conseq[OF c1 hoaret.While[OF this w2 w3] c3] show ?case . qed
corollary hoaret_sound_complete: "⊨t {P}c{Q} ⟷⊨t {P}c{Q}" by (metis hoaret_sound hoaret_complete)
text‹Two examples:›
lemma"⊨t {λs. ∃n. n = nat(s ''x'')} WHILE Less (N 0) (V ''x'') DO ''x'' ::= Plus (V ''x'') (N (-1)) {λs. s ''x'' ≤ 0}" apply(rule weaken_post) apply(rule While) apply(rule Assign') apply auto done
lemma"⊨t {λs. ∃n. n = nat(s ''x'')} WHILE Less (N 0) (V ''x'') DO (''x'' ::= Plus (V ''x'') (N (-1));; (''y'' ::= V ''x'';; WHILE Less (N 0) (V ''y'') DO ''y'' ::= Plus (V ''y'') (N (-1)))) {λs. s ''x'' ≤ 0}" apply(rule weaken_post) apply(rule While) defer apply auto[3] apply(rule Seq) prefer2 apply(rule Seq) prefer2 apply(rule weaken_post) apply(rule_tac P = "λm s. n = nat(s ''x'') ∧ m = nat(s ''y'')"in While) apply(rule Assign') apply auto[4] apply(rule Assign) apply(rule Assign') apply auto done
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.