lemma"Γ⊨t{🍋M = 0 ∧🍋S = 0} WHILE 🍋M ≠ a INV {🍋S = 🍋M * b ∧🍋M ≤ a} VAR MEASURE a - 🍋M DO 🍋S :== 🍋S + b;; 🍋M :== 🍋M + 1 OD {🍋S = a * b}" apply vcg apply (auto) done
lemma"Γ⊨t{🍋I ≤ 3} WHILE 🍋I < 10 INV {🍋I≤ 10} VAR MEASURE 10 - 🍋I DO 🍋I :== 🍋I + 1 OD {🍋I = 10}" apply vcg apply auto done
text‹Total correctness of a nested loop. In the inner loop we have to
that the loop variable of the outer loop is not changed. We use ‹FIX› to introduce a new logical variable ›
lemma"Γ⊨t{🍋M=0 ∧🍋N=0} WHILE (🍋M < i) INV {🍋M ≤ i ∧ (🍋M ≠ 0 ⟶🍋N = j) ∧🍋N ≤ j} VAR MEASURE (i - 🍋M) DO 🍋N :== 0;; WHILE (🍋N < j) FIX m. INV {🍋M=m ∧🍋N ≤ j} VAR MEASURE (j - 🍋N) DO 🍋N :== 🍋N + 1 OD;; 🍋M :== 🍋M + 1 OD {🍋M=i ∧ (🍋M≠0 ⟶🍋N=j)}" apply vcg apply simp_all apply arith done
primrec fac:: "nat ==> nat" where "fac 0 = 1" | "fac (Suc n) = (Suc n) * fac n"
lemma fac_simp [simp]: "0 < i ==> fac i = i * fac (i - 1)" by (cases i) simp_all
text‹We only need partial correctness of modifies clause!›
lemma upd_hd_next: assumes p_ps: "List p next (p#ps)" shows"List (next p) (next(p := q)) ps" proof - from p_ps have"p ∉ set ps" by auto with p_ps show ?thesis by simp qed
lemma (in Rev_impl) shows
Rev_spec: "∀Ps. Γ⊨t{List 🍋p 🍋next Ps}🍋p :== PROC Rev(🍋p) {List 🍋p 🍋next (rev Ps)}" apply (hoare_rule HoareTotal.ProcNoRec1) apply (hoare_rule anno = "🍋q :== Null;; WHILE 🍋p ≠ Null INV {∃Ps' Qs'. List 🍋p 🍋next Ps' ∧ List 🍋q 🍋next Qs' ∧ set Ps' ∩ set Qs' = {} ∧ rev Ps' @ Qs' = rev Ps} VAR MEASURE (length (list 🍋p 🍋next) ) DO 🍋r :== 🍋p;; {🍋p ≠ Null}⟼🍋p :== 🍋p→🍋next;; {🍋r ≠ Null}⟼🍋r→🍋next :== 🍋q;; 🍋q :== 🍋r OD;; 🍋p :==🍋q"in HoareTotal.annotateI) apply vcg apply clarsimp apply clarsimp apply (rule conjI2) apply force apply clarsimp apply (subgoal_tac "List p next (p#ps)") prefer2apply simp apply (frule_tac q=q in upd_hd_next) apply (simp only: List_list) apply simp apply simp done
lemma (in Rev_impl) shows
Rev_modifies: "∀σ. Γ⊨UNIV {σ} 🍋p :== PROC Rev(🍋p) {t. t may_only_modify_globals σ in [next]}" apply (hoare_rule HoarePartial.ProcNoRec1) apply (vcg spec=modifies) done
lemma"Γ⊨t{List 🍋p 🍋next Ps} 🍋q :== Null;; WHILE 🍋p ≠ Null INV {∃Ps' Qs'. List 🍋p 🍋next Ps' ∧ List 🍋q 🍋next Qs' ∧ set Ps' ∩ set Qs' = {} ∧ rev Ps' @ Qs' = rev Ps} VAR MEASURE (length (list 🍋p 🍋next) ) DO 🍋r :== 🍋p;; 🍋p :== 🍋p→🍋next;; 🍋r→🍋next :== 🍋q;; 🍋q :== 🍋r OD;; 🍋p :==🍋q {List 🍋p 🍋next (rev Ps)} " apply vcg apply clarsimp apply clarsimp apply (rule conjI2) apply force apply clarsimp apply (subgoal_tac "List p next (p#ps)") prefer2apply simp apply (frule_tac q=q in upd_hd_next) apply (simp only: List_list) apply simp apply simp done
procedures
pedal(N,M) = "IF 0 < 🍋N THEN IF 0 < 🍋M THEN CALL coast(🍋N- 1,🍋M- 1) FI;; CALL pedal(🍋N- 1,🍋M) FI"
and
coast(N,M) = "CALL pedal(🍋N,🍋M);; IF 0 < 🍋M THEN CALL coast(🍋N,🍋M- 1) FI"
ML ‹ML_Thms.bind_thm ("HoareTotal_ProcRec2", Hoare.gen_proc_rec @{context} Hoare.Total 2)›
lemma (in pedal_coast_clique) shows"(Γ⊨t{True} PROC pedal(🍋N,🍋M) {True}) ∧ (Γ⊨t{True} PROC coast(🍋N,🍋M) {True})" apply (hoare_rule HoareTotal_ProcRec2
[where ?r= "inv_image (measure (λm. m) <*lex*> measure (λp. if p = coast_'proc then 1 else 0)) (λ(s,p). (N + M,p))"]) apply simp_all apply vcg apply simp apply vcg apply simp done
lemma (in pedal_coast_clique) shows"(Γ⊨t{True} PROC pedal(🍋N,🍋M) {True}) ∧ (Γ⊨t{True} PROC coast(🍋N,🍋M) {True})" apply (hoare_rule HoareTotal_ProcRec2
[where ?r= "inv_image (measure (λm. m) <*lex*> measure (λp. if p = coast_'proc then 1 else 0)) (λ(s,p). (N + M,p))"]) apply simp_all apply vcg apply simp apply vcg apply simp done
lemma (in pedal_coast_clique) shows"(Γ⊨t{True} PROC pedal(🍋N,🍋M) {True}) ∧ (Γ⊨t{True} PROC coast(🍋N,🍋M) {True})" apply(hoare_rule HoareTotal_ProcRec2
[where ?r= "measure (λ(s,p). N + M + (if p = coast_'proc then 1 else 0))"]) apply simp_all apply vcg apply simp apply arith apply vcg apply simp done
lemma (in pedal_coast_clique) shows"(Γ⊨t{True} PROC pedal(🍋N,🍋M) {True}) ∧ (Γ⊨t{True} PROC coast(🍋N,🍋M) {True})" apply(hoare_rule HoareTotal_ProcRec2
[where ?r= "(λ(s,p). N) <*mlex*> (λ(s,p). M) <*mlex*> measure (λ(s,p). if p = coast_'proc then 1 else 0)"]) apply simp_all apply vcg apply simp apply vcg apply simp done
lemma (in pedal_coast_clique) shows"(Γ⊨t{True} PROC pedal(🍋N,🍋M) {True}) ∧ (Γ⊨t{True} PROC coast(🍋N,🍋M) {True})" apply(hoare_rule HoareTotal_ProcRec2
[where ?r= "measure (λs. N + M) <*lex*> measure (λp. if p = coast_'proc then 1 else 0)"]) apply simp_all apply vcg apply simp apply vcg apply simp 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.