fun strip :: "acom ==> com"where "strip SKIP = SKIP" | "strip (x ::= a) = (x ::= a)" | "strip (C1;; C2) = (strip C1;; strip C2)" | "strip (IF b THEN C1 ELSE C2) = (IF b THEN strip C1 ELSE strip C2)" | "strip ({_} WHILE b DO C) = (WHILE b DO strip C)"
funpre :: "acom ==> qassn ==> qassn"where "pre SKIP Q = (λs. eSuc (Q s))" | "pre (x ::= a) Q = (λs. eSuc (Q (s[a/x])))" | "pre (C1;; C2) Q = pre C1 (pre C2 Q)" | "pre (IF b THEN C1 ELSE C2) Q = (λs. eSuc (if bval b s then pre C1 Q s else pre C2 Q s ))" | "pre ({I} WHILE b DO C) Q = (λs. I s + 1)"
fun vc :: "acom ==> qassn ==> bool"where "vc SKIP Q = True" | "vc (x ::= a) Q = True" | "vc (C1 ;; C2) Q = ((vc C1 (pre C2 Q)) ∧ (vc C2 Q) )" | "vc (IF b THEN C1 ELSE C2) Q = (vc C1 Q ∧ vc C2 Q)" | "vc ({I} WHILE b DO C) Q = ((∀s. (pre C (λs. I s + 1) s ≤ I s + ↑(bval b s)) ∧ (Q s ≤ I s + ↑ (¬ bval b s))) ∧ vc C (%s. I s + 1))"
subsubsection"Soundness of VCG"
lemma vc_sound: "vc C Q ==>⊨2 {pre C Q} strip C { Q }" proof (induct C arbitrary: Q) case (Aif b C1 C2) thenhave Aif1: "⊨2 {pre C1 Q} strip C1 {Q}"and Aif2: "⊨2 {pre C2 Q} strip C2 {Q}"by auto show ?caseapply auto apply(rule hoare2.conseq) apply(rule hoare2.If[where P="%s. if bval b s then pre C1 Q s else pre C2 Q s"and Q="Q"])
subgoal apply(rule hoare2.conseq) apply (fact Aif1)
subgoal for s apply(cases "bval b s") by auto apply simp done
subgoal apply(rule hoare2.conseq) apply (fact Aif2)
subgoal for s apply(cases "bval b s") by auto apply simp done apply auto done next case (Awhile I b C) thenhave i: "(∧Q. vc C Q ==>⊨2 {pre C Q} strip C {Q})" and ii: " ∀s. pre C (λs. I s + 1) s ≤ I s + ↑ (bval b s) ∧ Q s ≤ I s + ↑ (¬ bval b s)" and iii: "vc C (λs. I s + 1)"by auto
from i iii have A: "⊨2 {pre C (λs. I s + 1)} strip C {(λs. I s + 1)}"by auto
have"⊨2 {λs. I s + 1} WHILE b DO strip C {Q}" apply(rule hoare2.conseq) apply(rule hoare2.While[where I=I]) apply(rule hoare2.conseq) apply(rule A) using ii by auto thenshow ?caseby auto qed (auto intro: hoare2.Skip hoare2.Assign hoare2.Seq )
lemma vc_sound': "[vc C Q ; (∀s. pre C Q s ≤ P s) ]==>⊨2 {P} strip C { Q }" apply(rule hoare2.conseq) apply(rule vc_sound) by auto
subsubsection"Completeness"
lemma pre_mono: assumes"∧s. P' s ≤ P s" shows"∧s. pre C P' s ≤ pre C P s" using assms by (induct C arbitrary: P P', auto)
lemma vc_mono: assumes"∧s. P' s ≤ P s" shows"vc C P ==> vc C P'" using assms proof (induct C arbitrary: P P') case (Awhile I b C) thus ?case apply (auto simp: pre_mono) using order.trans by blast qed (auto simp: pre_mono)
lemma"⊨2 { P } c { Q } ==>∃C. strip C = c ∧ vc C Q ∧ (∀s. pre C Q s ≤ P s)"
(is"_ ==>∃C. ?G P c Q C") proof (induction rule: hoare2.induct) case (Skip P) show ?case (is"∃C. ?C C") proofshow"?C Askip"by auto qed next case (Assign P a x) show ?case (is"∃C. ?C C") proofshow"?C(Aassign x a)"by simp qed next case (If P b c1 Q c2) fromIf(3) obtain C1 where strip1: "strip C1 = c1"and vc1: "vc C1 Q" and pre1: "(∧s. pre C1 Q s ≤ P s + ↑ (bval b s))"by blast fromIf(4) obtain C2 where strip2: "strip C2 = c2"and vc2: "vc C2 Q" and pre2: "(∧s. pre C2 Q s ≤ P s + ↑ (¬ bval b s))"by blast
show ?case apply(rule exI[where x="IF b THEN C1 ELSE C2"], safe)
subgoal using strip1 strip2 by auto
subgoal using vc1 vc2 by auto
subgoal for s using pre1[of s] pre2[of s] by auto done next case (Seq P1 c1 P2 c2 P3) from Seq(3) obtain C1 where strip1: "strip C1 = c1"and vc1: "vc C1 P2" and pre1: "(∀s. pre C1 P2 s ≤ P1 s)"by blast from Seq(4) obtain C2 where strip2: "strip C2 = c2"and vc2: "vc C2 P3" and pre2: "(∀s. pre C2 P3 s ≤ P2 s)"by blast
{ fix s have"pre C1 (pre C2 P3) s ≤ P1 s" apply(rule order.trans[where b="pre C1 P2 s"]) apply(rule pre_mono) using pre2 apply simp using pre1 by simp
} notepre = this show ?case apply(rule exI[where x="C1 ;; C2"], safe)
subgoal using strip1 strip2 by simp
subgoal using vc1 vc2 vc_mono pre2 by auto
subgoal usingpreby auto done next case (While I b c) from While(2) obtain C where strip: "strip C = c"and vc: "vc C (λa. I a + 1)" andpre: "∧s. pre C (λa. I a + 1) s ≤ I s + ↑ (bval b s)"by blast show ?case apply(rule exI[where x="{I} WHILE b DO C"], safe)
subgoal using strip by simp
subgoal usingpre vc by auto
subgoal by simp done next case (conseq P c Q P' Q') thenobtain C where"strip C = c"and vc: "vc C Q"andpre: "∧s. pre C Q s ≤ P s"by blast
from pre_mono[OF conseq(3)] have1: "∧s. pre C Q' s ≤ pre C Q s"by auto
show ?case apply(rule exI[where x=C]) apply safe apply fact
subgoal using vc conseq(3) vc_mono by auto
subgoal usingpre conseq(2) 1using order.trans by metis done qed
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-10)
¤
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.