(* Author: Tobias Nipkow *) theory Hoare_Sound_Complete imports Hoare begin subsection "Soundness" definition hoare_valid :: "assn \ com \ assn \ bool" ("\ {(1_)}/ (_)/ {(1_)}" 50) where "\ {P}c{Q} = (\s t. (c,s) \ t \ P s \ Q t)" lemma hoare_sound: "\ {P}c{Q} \ \ {P}c{Q}" proof(induct rule: hoare.induct) case (While P b c) { fix s t have "(WHILE b DO c,s) \ t \ P s \ P t \ \ bval b t" proof(induct "WHILE b DO c" s t rule: big_step_induct) case WhileFalse thus ?case by blast next case WhileTrue thus ?case using While(2) unfolding hoare_valid_def by blast qed } thus ?case unfolding hoare_valid_def by blast qed (auto simp: hoare_valid_def) subsection "Weakest Precondition" definition wp :: "com \ assn \ assn" where "wp c Q = (\s. \t. (c,s) \ t \ Q t)" lemma wp_SKIP[simp]: "wp SKIP Q = Q" by (rule ext) (auto simp: wp_def) lemma wp_Ass[simp]: "wp (x::=a) Q = (\s. Q(s[a/x]))" by (rule ext) (auto simp: wp_def) lemma wp_Semi[simp]: "wp (c\<^isub>1;c\<^isub>2) Q = wp c\<^isub>1 (wp c\<^isub>2 Q)" by (rule ext) (auto simp: wp_def) lemma wp_If[simp]: "wp (IF b THEN c\<^isub>1 ELSE c\<^isub>2) Q = (\s. (bval b s \ wp c\<^isub>1 Q s) \ (\ bval b s \ wp c\<^isub>2 Q s))" by (rule ext) (auto simp: wp_def) lemma wp_While_If: "wp (WHILE b DO c) Q s = wp (IF b THEN c;WHILE b DO c ELSE SKIP) Q s" unfolding wp_def by (metis unfold_while) lemma wp_While_True[simp]: "bval b s \ wp (WHILE b DO c) Q s = wp (c; WHILE b DO c) Q s" by(simp add: wp_While_If) lemma wp_While_False[simp]: "\ bval b s \ wp (WHILE b DO c) Q s = Q s" by(simp add: wp_While_If) subsection "Completeness" lemma wp_is_pre: "\ {wp c Q} c {Q}" proof(induct c arbitrary: Q) case Semi thus ?case by(auto intro: Semi) next case (If b c1 c2) let ?If = "IF b THEN c1 ELSE c2" show ?case proof(rule hoare.If) show "\ {\s. wp ?If Q s \ bval b s} c1 {Q}" proof(rule strengthen_pre[OF _ If(1)]) show "\s. wp ?If Q s \ bval b s \ wp c1 Q s" by auto qed show "\ {\s. wp ?If Q s \ \ bval b s} c2 {Q}" proof(rule strengthen_pre[OF _ If(2)]) show "\s. wp ?If Q s \ \ bval b s \ wp c2 Q s" by auto qed qed next case (While b c) let ?w = "WHILE b DO c" have "\ {wp ?w Q} ?w {\s. wp ?w Q s \ \ bval b s}" proof(rule hoare.While) show "\ {\s. wp ?w Q s \ bval b s} c {wp ?w Q}" proof(rule strengthen_pre[OF _ While(1)]) show "\s. wp ?w Q s \ bval b s \ wp c (wp ?w Q) s" by auto qed qed thus ?case proof(rule weaken_post) show "\s. wp ?w Q s \ \ bval b s \ Q s" by auto qed qed auto lemma hoare_relative_complete: assumes "\ {P}c{Q}" shows "\ {P}c{Q}" proof(rule strengthen_pre) show "\s. P s \ wp c Q s" using assms by (auto simp: hoare_valid_def wp_def) show "\ {wp c Q} c {Q}" by(rule wp_is_pre) qed end