subsection‹Relation between the Hoare logics in big-O style› theory DiscussionO imports SepLogK_Hoare QuantK_Hoare Nielson_Hoare begin
(* here we compare quantitative Hoare logic with constant with Nielson's Hoare logic *)
subsubsection‹Relation Nielson to quantHoare›
definition emN :: "qassn ==> Nielson_Hoare.assn2"where"emN P = (λl s. P s < ∞)"
(* quanthoare can be simulated by Nielson *) lemmaassumes s: "⊨1 { emN P'} c { %s. (THE e. enat e = P' s - Q' (THE t. (∃n. (c, s) ==> n ⇓ t ) )) ⇓ emN Q' }" (is"⊨1 { ?P } c { ?e ⇓ ?Q }") shows quantNielson: "⊨2' { P' } c { Q' }" proof - from s obtain k where k: "k>0"and qd: "∧l s. emN P' l s ==> (∃t p. (c, s) ==> p ⇓ t ∧ p ≤ k * ?e s ∧ emN Q' l t)" unfolding hoare1_valid_def by blast
show ?thesis unfolding QuantK_Hoare.hoare2o_valid_def apply(rule exI[where x=k]) apply safe apply fact proof - fix s assume P': "P' s < ∞" thenhave"(emN P') (λ_. 0) s"unfolding emN_def by auto with qd obtain p t where i: "(c, s) ==> p ⇓ t"and p: "p ≤ k * ?e s"and e: "emN Q' (λ_. 0) t" by blast have t: "↓s (c, s) = t"using bigstepT_the_state[OF i] by auto
from P' obtainprewherepre: "P' s = enat pre"by fastforce from e have"Q' t < ∞"unfolding emN_def by auto thenobtainpostwherepost: "Q' t = enat post"by fastforce
have"p > 0"using i bigstep_progress by auto
thm enat.inject idiff_enat_enat the_equality have k: "(THE e. enat e = P' s - Q' (THE t. ∃n. (c, s) ==> n ⇓ t)) = pre - post" unfolding t prepostapply(rule the_equality) using idiff_enat_enat by auto with p have ieq: "p ≤ k * (pre - post)"by auto thenhave"p + k * post ≤ k * pre"using‹p>0› using diff_mult_distrib2 by auto then have ii: "enat p + k * Q' t ≤ k * P' s"unfoldingpostpreby simp from i ii show"(∃t p. (c, s) ==> p ⇓ t ∧ enat p + k * Q' t ≤ k * P' s)"by auto qed qed
(* Nielson can be simulated by quanthoare *) lemmaassumes s: "⊨2' { %s . emb (∀l. P l s) + enat (e s) } c { %s. emb (∀l. Q l s) }" (is"⊨2' { ?P } c { ?Q }") and sP: "∧l t. P l t ==>∀l. P l t"(* "support P = {}" *) and sQ: "∧l t. Q l t ==>∀l. Q l t"(* "support Q = {}" *) shows NielsonQuant: "⊨1 { P } c { e ⇓ Q }" proof - from s obtain k where k: "k>0"and qd: "∧s. ?P s < ∞⟶ (∃t p. (c, s) ==> p ⇓ t ∧ enat p + enat k * ?Q t ≤ enat k * ?P s)" unfolding QuantK_Hoare.hoare2o_valid_def by blast
show ?thesis unfolding hoare1_valid_def apply(rule exI[where x=k]) apply safe apply fact proof - fix l s assume P': "P l s" thenhave aP: "∀l. P l s"using sP by auto thenhave P: "?P s < ∞"by auto with qd obtain p t where i: "(c, s) ==> p ⇓ t"and p: "enat p + enat k * ?Q t ≤ enat k * ?P s" by blast have t: "↓s (c, s) = t"using bigstepT_the_state[OF i] by auto
from P have Q: "Q l t"using p k apply auto by (metis (full_types) emb.simps(1) enat_ord_simps(2) imult_is_infinity infinity_ileE not_less_zero plus_enat_simps(3)) with sQ have"∀l. Q l t"by auto thenhave"?Q t = 0"by auto with p have"enat p ≤ enat k * ?P s"by auto with aP have p': "p ≤ k * e s"by auto
from i Q p' show"∃t p. (c, s) ==> p ⇓ t ∧ p ≤ k * e s ∧ Q l t"by blast qed qed
subsubsection‹Relation SepLogic to quantHoare›
definition em :: "qassn ==> (pstate_t ==> bool)"where "em P = (%(ps,n). (∀ex. P (Partial_Evaluation.emb ps ex) ≤ enat n) )"(* with equality next lemma also works *)
lemmaassumes s: "⊨3' { em P} c { em Q }" shows"⊨2' { P } c { Q }" proof - from s obtain k where k: "0<k"and s': "∧ps n. em P (ps, n) ==> (∃ps' ps'' m e e'. (c, ps)==>A m ⇓ ps'+ ps'' ∧ ps' ## ps'' ∧ k * n = k * e + e' + m ∧ em Q (ps', e))"unfolding hoare3o_valid_def by auto
{ fix s assume P: "P s < ∞" thenobtain n where n: "P s = enat n" by fastforce with P have"em P (part s, n)"unfolding em_def by auto with s' obtain ps' ps'' m e e' where c: "(c, part s) ==>A m ⇓ ps' + ps''"and orth: "ps' ## ps''" and m: "k * n = k * e + e' + m"and Q: "em Q (ps', e)"by blast
from Q have q: "Q (Partial_Evaluation.emb ps' (Partial_Evaluation.emb ps'' (λ_. 0))) ≤ enat (e)"unfolding em_def by auto
have z: "(Partial_Evaluation.emb ps' (Partial_Evaluation.emb ps'' (λ_. 0))) = (Partial_Evaluation.emb (ps'+ps'') (λ_. 0))" unfolding Partial_Evaluation.emb_def apply (auto simp: plus_fun_def) apply (rule ext) subgoalfor v apply (cases "ps' v") apply auto using orth by (auto simp: sep_disj_fun_def domain_conv) done
from q z have q: "enat k * Q (Partial_Evaluation.emb (ps'+ps'') (λ_. 0)) ≤ enat k * enat e"using k by (metis i0_lb mult_left_mono)
have i: "(c, s) ==> m ⇓ (Partial_Evaluation.emb (ps'+ps'') (λ_. 0))"using part_to_full'[OF c] by simp
have ii: "enat m + enat k * Q (Partial_Evaluation.emb (ps'+ps'') (λ_. 0)) ≤ enat k * P s"unfolding n using q m using enat_ile by fastforce
from i ii have"(∃t p. (c, s) ==> p ⇓ t ∧ enat p + enat k * Q t ≤ enat k * P s)"by auto
} note B=this show ?thesis unfolding QuantK_Hoare.hoare2o_valid_def apply(rule exI[where x=k], safe) apply fact apply (fact B) done qed
definition embe :: "(pstate_t ==> bool) ==> qassn"where "embe P = (%s. Inf {enat n|n. P (part s, n)} )"
lemmaassumes s: "⊨2' { embe P } c { embe Q }"and full: "∧ps n. P (ps,n) ==> dom ps = UNIV" shows"⊨3' { P} c { Q }" proof - from s obtain k where k: "k>0"and s: "∧s. embe P s < ∞⟶ (∃t p. (c, s) ==> p ⇓ t ∧ enat p + enat k * embe Q t ≤ enat k * embe P s)" unfolding QuantK_Hoare.hoare2o_valid_def by auto
{ fix ps n let ?s =" (Partial_Evaluation.emb ps (λ_. 0))" assume P: "P (ps, n)" with full have"dom ps = UNIV"by auto thenhave ps: "part ?s = ps"by simp from P have l': "({enat n |n. P (ps, n)} = {}) = False "by auto have t: "embe P ?s < ∞"unfolding embe_def Inf_enat_def ps l' apply(rule ccontr) using l' apply auto by (metis (mono_tags, lifting) Least_le infinity_ileE) with s obtain t p where c: "(c, ?s) ==> p ⇓ t"and ineq: "enat p + enat k * embe Q t ≤ enat k * embe P ?s"by blast from t obtain z where z: "embe P ?s = enat z" using less_infinityE by blast with ineq obtain y where y: "embe Q t = enat y" using k by fastforce thenhave l: "embe Q t < ∞"by auto thenhave zz: "({enat n|n. Q (part t, n)} = {}) = False"unfolding embe_def Inf_enat_def apply safe by simp from y have"Q (part t, y)"unfolding embe_def zz Inf_enat_def apply auto using zz apply auto by (smt Collect_empty_eq LeastI enat.inject)
from full_to_part[OF c] ps have c': "(c, ps) ==>A p ⇓ part t"by auto
have"∧P n. P (n::nat) ==> (LEAST n. P n) ≤ n"apply(rule Least_le) by auto
from z P have zn: "z ≤ n"unfolding embe_def ps unfolding embe_def Inf_enat_def l' apply auto by (metis (mono_tags, lifting) Least_le enat_ord_simps(1))
from ineq z y have"enat p + enat k * y ≤ enat k * z"by auto thenhave"p + k * y ≤ k * z"by auto alsohave"…≤ k * n"using zn k by simp finallyobtain e' where"k * n = k * y + e' + p"using k by (metis add.assoc add.commute le_iff_add)
have"∃ps' ps'' m e e'. (c, ps) ==>A m ⇓ ps' + ps'' ∧ ps' ## ps'' ∧ k * n = k * e + e' + m ∧ Q (ps', e)" apply(rule exI[where x="part t"]) apply(rule exI[where x="0"]) apply(rule exI[where x="p"]) apply(rule exI[where x="y"]) apply(rule exI[where x="e'"]) apply auto by fact+
}
show ?thesis unfolding hoare3o_valid_def apply(rule exI[where x=k], safe) apply fact by fact qed
subsection‹A General Validity Predicate with Time›
definition valid where "valid P c Q n = (∀s. P s ⟶ (∃s' m. (c, s) ==> m ⇓ s' ∧ m ≤ n ∧ Q s'))"
definition validk where "validk P c Q n = (∃k>0. (∀s. P s ⟶ (∃s' m. (c, s) ==> m ⇓ s' ∧ m ≤ k * n ∧ Q s')))"
lemma"validk P c Q n = (∃k>0. valid P c Q (k*n))" unfolding valid_def validk_def by simp
subsubsection‹Relation between valid predicate and Quantitative Hoare Logic›
lemma"⊨2' {%s. emb (P s) + enat n} c { λs. emb (Q s) } ==>∃k>0. valid P c Q (k*n)" proof - assume valid: "⊨2' {λs. ↑ (P s) + enat n} c {λs. ↑ (Q s)}" thenobtain k where val: "∧s. ↑ (P s) + enat n < ∞==> (∃t p. (c, s) ==> p ⇓ t ∧ enat p + enat k * ↑ (Q t) ≤ enat k * (↑ (P s) + enat n))" and k: "k>0"unfolding QuantK_Hoare.hoare2o_valid_def by blast
{ fix s assume Ps: "P s" thenhave" ↑ (P s) + enat n < ∞"by auto with val obtain t m where
c: "(c, s) ==> m ⇓ t"and"enat m + k * ↑ (Q t) ≤ k * (↑ (P s) + enat n)"by blast
thenhave"m ≤ k * n ∧ Q t"using k using Ps add.commute add.right_neutral emb.simps(1) emb.simps(2) enat_ord_simps(1) infinity_ileE plus_enat_simps(3) by (metis (full_types) mult_zero_right not_gr_zero times_enat_simps(1) times_enat_simps(4))
with c have"(∃s' m. (c, s) ==> m ⇓ s' ∧ m ≤ k * n ∧ Q s')"by blast
} note bla=this show"∃k>0. valid P c Q (k*n)"unfolding valid_def apply(rule exI[where x=k]) using bla k by auto qed
lemma valid_quantHoare: "∃k>0. valid P c Q (k*n) ==>⊨2' {%s. emb (P s) + enat n} c { λs. emb (Q s) }" proof - assume"∃k>0. valid P c Q (k*n)" thenobtain k where valid: "valid P c Q (k*n)"and k: "k>0"by blast
{ fix s assume"(%s. emb (P s) + enat n) s < ∞" thenhave Ps: "P s"apply auto by (metis emb.elims enat.distinct(2) enat.simps(5) enat_defs(4)) with valid[unfolded valid_def] obtain t m where
c: "(c, s) ==> m ⇓ t"and"m ≤ k * n""Q t"by blast thenhave"enat m + k * ↑ (Q t) ≤ k * (↑ (P s) + enat n)"using Ps by simp with c have"(∃s' m. (c, s) ==> m ⇓ s' ∧ enat m + enat k * ↑ (Q s') ≤ enat k * (↑ (P s) + enat n))"by blast
} note funk=this show"⊨2' {%s. emb (P s) + enat n} c { λs. emb (Q s) }"unfolding QuantK_Hoare.hoare2o_valid_def apply(rule exI[where x=k]) using funk k by auto qed
subsubsection‹Relation between valid predicate and Hoare Logic based on Separation Logic›
definition"embP2 P = (%(ps,n). ∀s. P (Partial_Evaluation.emb ps s) ∧ n = 0)" definition"embP3 P = (%(ps,n). dom ps = UNIV ∧ (∀s. P (Partial_Evaluation.emb ps s)) ∧ n = 0)"
lemma emp: "a + Map.empty = a" by (simp add: plus_fun_conv)
lemma oneway: "⊨3' {embP3 P ** $n} c {embP2 Q} ==> validk P c Q n" proof - assume partial_true: "⊨3' {embP3 P ** $n} c {embP2 Q}" from partial_true[unfolded hoare3o_valid_def] obtain k where k: "k>0"and
q : "∀ps na. (embP3 P ∧* $ n) (ps, na) ⟶ (∃ps' ps'' m e e'. (c, ps) ==>A m ⇓ ps' + ps'' ∧ ps' ## ps'' ∧ k * na = k * e + e' + m ∧ embP2 Q (ps', e)) "by blast
{ fix s assume"P s" thenhave g: " (embP3 P ∧* $ n) (part s, n)" unfolding embP3_def dollar_def sep_conj_def by auto from q g obtain ps' ps'' m e e' where pbig: "(c, part s) ==>A m ⇓ ps' + ps''"and orth: "ps' ## ps''" and ii: "k * n = k * e + e' + m"and erg: "embP2 Q (ps', e)"by blast
have ii': "m ≤ k * n"using ii by auto
from part_to_full'[OF pbig] have i: "(c, s ) ==> m ⇓ Partial_Evaluation.emb (ps' + ps'') s"by simp
from erg have z2: "∧s. Q (Partial_Evaluation.emb ps' s)"unfolding embP2_def by auto have"Partial_Evaluation.emb (ps' + ps'') s = Partial_Evaluation.emb (ps'' + ps') s" using orth by (simp add: sep_add_commute) alsohave"Partial_Evaluation.emb (ps'' + ps') s = Partial_Evaluation.emb (ps') (Partial_Evaluation.emb (ps'') s)" apply rule unfolding emb_def plus_fun_conv map_add_def by (metis option.case_eq_if option.simps(5)) finallyhave z: "Partial_Evaluation.emb (ps' + ps'') s = Partial_Evaluation.emb (ps') (Partial_Evaluation.emb (ps'') s)" . have iii: "Q (Partial_Evaluation.emb (ps' + ps'') s)"unfolding z apply (fact) .
from i ii' iii have"∃s' m. (c, s) ==> m ⇓ s' ∧ m ≤ k * n ∧ Q s'"by auto
} with k show"validk P c Q n"unfolding validk_def by blast qed
lemma theother: "validk P c Q n ==>⊨3' {embP3 P ** $n} c {embP2 Q }" proof - assume valid: "validk P c Q n" thenobtain k where k : "k>0"and v: "(∀s. P s ⟶ (∃s' m. (c, s) ==> m ⇓ s' ∧ m ≤ k * n ∧ Q s'))" unfolding validk_def by blast
{ fix ps na assume an: "(embP3 P ∧* $ n) (ps, na)" have dom: "dom ps = UNIV"and Pps: "∧s. P (Partial_Evaluation.emb ps s)"and nan: "na = n"using an unfolding sep_conj_def by (auto simp: embP3_def dollar_def)
from v Pps obtain s' m where big: "(c, (Partial_Evaluation.emb ps (%_. 0))) ==> m ⇓ s'"and ii: "m ≤ k * n"and erg: "Q s'"by blast
have"part (Partial_Evaluation.emb ps (λ_. 0)) = ps "using dom by simp with full_to_part[OF big] have i: "(c, ps) ==>A m ⇓ part s'"by auto
have iii: "embP2 Q (part s', 0)" unfolding embP2_def apply auto by fact
have"k * na = k * n - m + m"using ii k nan by simp
have"(∃ps' ps'' m e e'. (c, ps) ==>A m ⇓ ps' + ps'' ∧ ps' ## ps'' ∧ k * na = k * e + e' + m ∧ embP2 Q (ps', e))" apply(rule exI[where x="part s'"]) apply(rule exI[where x="0"]) apply(rule exI[where x="m"]) apply(rule exI[where x="0"]) apply(rule exI[where x="k * n - m"]) apply auto by fact+
} with k show"⊨3' {embP3 P ** $n} c {embP2 Q }"unfolding hoare3o_valid_def by blast qed
lemma"validk P c Q n ⟷⊨3' {embP3 P ** $n} c {embP2 Q }" using oneway and theother by metis
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.