diff --git a/lib/HaskellLib_H.thy b/lib/HaskellLib_H.thy index 32e984889e..e5bcaa4fd3 100644 --- a/lib/HaskellLib_H.thy +++ b/lib/HaskellLib_H.thy @@ -548,6 +548,9 @@ lemma gets_the_ohaskell_assert: "gets_the (ohaskell_assert P []) = assert P" by (clarsimp simp: ohaskell_assert_def split: if_splits) -lemmas omonad_defs = omonad_defs ohaskell_assert_def ohaskell_fail_def +definition ohaskell_state_assert :: "('s \ bool) \ unit list \ ('s, unit) lookup" where + "ohaskell_state_assert P L \ ostate_assert P" + +lemmas omonad_defs = omonad_defs ohaskell_assert_def ohaskell_state_assert_def ohaskell_fail_def end diff --git a/lib/Monads/nondet/Nondet_Reader_Option.thy b/lib/Monads/nondet/Nondet_Reader_Option.thy index 5a2dc85077..7e5b471f12 100644 --- a/lib/Monads/nondet/Nondet_Reader_Option.thy +++ b/lib/Monads/nondet/Nondet_Reader_Option.thy @@ -98,6 +98,11 @@ lemma gets_the_assert: "gets_the (oassert P) = assert P" by (simp add: oassert_def assert_def gets_the_fail gets_the_return) +lemma gets_the_ostate_assert: + "gets_the (ostate_assert P) = state_assert P" + by (clarsimp simp: ostate_assert_def state_assert_def gets_the_Some_get gets_the_obind + gets_the_assert) + lemma gets_the_assert_opt: "gets_the (oassert_opt P) = assert_opt P" by (simp add: oassert_opt_def assert_opt_def gets_the_return gets_the_fail split: option.splits) diff --git a/lib/Monads/reader_option/Reader_Option_Monad.thy b/lib/Monads/reader_option/Reader_Option_Monad.thy index 686dd1d626..cf03b2c3b2 100644 --- a/lib/Monads/reader_option/Reader_Option_Monad.thy +++ b/lib/Monads/reader_option/Reader_Option_Monad.thy @@ -216,6 +216,9 @@ definition oassert :: "bool \ ('s, unit) lookup" where definition oassert_opt :: "'a option \ ('s, 'a) lookup" where "oassert_opt r \ case r of None \ ofail | Some x \ oreturn x" +definition ostate_assert :: "('s \ bool) \ ('s, unit) lookup" where + "ostate_assert P \ do { s \ Some; oassert (P s)}" + definition oapply :: "'a \ ('a \ 'b option) \ 'b option" where "oapply x \ \s. s x" diff --git a/lib/Monads/reader_option/Reader_Option_VCG.thy b/lib/Monads/reader_option/Reader_Option_VCG.thy index d047236615..770ec119d4 100644 --- a/lib/Monads/reader_option/Reader_Option_VCG.thy +++ b/lib/Monads/reader_option/Reader_Option_VCG.thy @@ -58,6 +58,19 @@ lemmas owhile_add_inv = owhile_inv_def[symmetric] (* WP rules for ovalid. *) + +lemma ovalid_wp_comb1[wp_comb]: + "\ ovalid P' f Q; ovalid P f Q'; \s. P s \ P' s \ \ ovalid P f (\r s. Q r s \ Q' r s)" + by (simp add: ovalid_def) + +lemma ovalid_wp_comb2[wp_comb]: + "\ ovalid P f Q; \s. P' s \ P s \ \ ovalid P' f Q" + by (auto simp: ovalid_def) + +lemma ovalid_wp_comb3[wp_comb]: + "\ ovalid P f Q; ovalid P' f Q' \ \ ovalid (\s. P s \ P' s) f (\r s. Q r s \ Q' r s)" + by (auto simp: ovalid_def) + lemma ovalid_post_taut[wp]: "\P\ f \\\\" by (simp add: ovalid_def) @@ -102,6 +115,15 @@ lemma oassert_wp[wp]: apply (intro conjI; wpsimp) done +lemma ostate_assert_wp: + "\\s. f s \ P () s\ ostate_assert f \P\" + unfolding ostate_assert_def + by (wpsimp wp: ask_wp) + +lemma ostate_assert_sp: + "\P\ ostate_assert Q \\_ s. P s \ Q s\" + by (wpsimp wp: ostate_assert_wp ovalid_wp_comb2) + lemma ogets_wp[wp]: "ovalid (\s. P (f s) s) (ogets f) P" by wp @@ -150,19 +172,6 @@ lemma ovalid_is_triple[wp_trip]: by (auto simp: triple_judgement_def ovalid_def ovalid_property_def) -lemma ovalid_wp_comb1[wp_comb]: - "\ ovalid P' f Q; ovalid P f Q'; \s. P s \ P' s \ \ ovalid P f (\r s. Q r s \ Q' r s)" - by (simp add: ovalid_def) - -lemma ovalid_wp_comb2[wp_comb]: - "\ ovalid P f Q; \s. P' s \ P s \ \ ovalid P' f Q" - by (auto simp: ovalid_def) - -lemma ovalid_wp_comb3[wp_comb]: - "\ ovalid P f Q; ovalid P' f Q' \ \ ovalid (\s. P s \ P' s) f (\r s. Q r s \ Q' r s)" - by (auto simp: ovalid_def) - - (* WP rules for ovalidNF. *) lemma obind_NF_wp[wp]: "\ \r. ovalidNF (R r) (g r) Q; ovalidNF P f R \ \ ovalidNF P (obind f g) Q" @@ -234,6 +243,11 @@ lemma ovalidNF_wp_comb3[wp_comb]: (* FIXME: WP rules for no_ofail, which might not be correct. *) + +lemma no_ofail_pre_imp[wp_pre]: + "\ no_ofail P f; \s. P' s \ P s \ \ no_ofail P' f" + by (simp add: no_ofail_def) + lemma no_ofailD: "\ no_ofail P m; P s \ \ \y. m s = Some y" by (simp add: no_ofail_def) @@ -309,6 +323,11 @@ lemma no_ofail_oassert[simp, wp]: "no_ofail (\_. P) (oassert P)" by (simp add: oassert_def no_ofail_def) +lemma no_ofail_ostate_assert[wp]: + "no_ofail P (ostate_assert P)" + unfolding ostate_assert_def + by wpsimp + lemma no_ofail_is_triple[wp_trip]: "no_ofail P f = triple_judgement P f (\s f. f s \ None)" by (auto simp: triple_judgement_def no_ofail_def) @@ -355,10 +374,6 @@ lemma ovalidNF_pre_imp: "\ \s. P' s \ P s; ovalidNF P f Q \ \ ovalidNF P' f Q" by (simp add: ovalidNF_def) -lemma no_ofail_pre_imp[wp_pre]: - "\ no_ofail P f; \s. P' s \ P s \ \ no_ofail P' f" - by (simp add: no_ofail_def) - lemma ovalid_post_imp: "\ \r s. Q r s \ Q' r s; ovalid P f Q \ \ ovalid P f Q'" by (simp add: ovalid_def)