theory Demo13_2 = Hoare: consts fac :: "nat \ nat" primrec "fac 0 = 1" "fac (Suc n) = (Suc n) * fac n" record vars = A :: "nat" B :: "nat" lemma "\ \ True \ \B := 2 \ \B = 2 \" apply hoare done lemma mult_by_add: "\ \ \A = 0 \ \B = 0 \ WHILE \A \ a INV \ \B = \A * b \ DO \B := \B + b; \A := \A + 1 OD \\B = a * b \" apply hoare apply auto done lemma factorial_sound: "\ \ \A = n \ \B := 1; WHILE \A \ 0 INV \ \B * fac \A = fac n \ DO \B := \B * \A; \A := \A - 1 OD \ \B = fac n \" apply hoare apply simp apply clarsimp apply (case_tac "A s") apply simp apply (simp add: ring_eq_simps) apply clarsimp done -- "Arrays" record vars2 = I :: "nat" L :: "nat list" lemma zero_search: "\ \ True \ \I := 0; WHILE \I < length \L \ \L!\I \ key INV \ \j < \I. \L!j \ key \ DO \I := \I+1 OD \ (\I < length \L \ \L!\I = key) \ (\I = length \L \ key \ set \L) \" apply hoare apply simp apply clarsimp apply (case_tac "j < I s") apply fastsimp apply (subgoal_tac "j = I s") apply simp apply simp apply clarsimp apply (drule all_nth_imp_all_set, assumption) apply simp done end