Up to index of Isabelle/HOL/CoreSafe
theory SafeDAss_P9
(* Title: Safe DAss P9
Author: Javier de Dios and Ricardo Peņa
Copyright: March 2008, Universidad Complutense de Madrid
*)
header {* Derived Assertions. P9. closed v h' *}
theory SafeDAss_P9 imports SafeDAssBasic
SafeRegion_definitions
BasicFacts
begin
text{*
Lemma for REUSE
*}
lemma closureV_equals_reuse:
"[| p ∉ closureV v (h, k);
q ∉ closureV v (h, k)|]
==> closureV v (h, k) = closureV v (h(p := None)(q \<mapsto> (j, C, vn)), k)"
apply (rule equalityI)
apply (rule subsetI)
apply (simp add: closureV_def)
apply (case_tac v,simp_all)
apply (rename_tac q)
apply (erule closureL.induct)
apply (rule closureL_basic)
apply (rule closureL_step,simp)
apply (simp add: descendants_def)
apply (subgoal_tac "qa ≠ q",simp)
prefer 2 apply blast
apply (subgoal_tac "qa ≠ p",simp)
apply blast
apply (rule subsetI)
apply (simp add: closureV_def)
apply (case_tac v,simp_all)
apply (rename_tac q)
apply (erule closureL.induct)
apply (rule closureL_basic)
apply (rule closureL_step,simp)
apply (simp add: descendants_def)
apply (subgoal_tac "qa ≠ q",simp)
prefer 2 apply blast
apply (subgoal_tac "qa ≠ p",simp)
by blast
lemma closureL_reuse_closureV:
"[| E1 x = Some (Loc p); h p = Some (j, C, vn);
fresh q h|]
==> closureL q (h(p := None)(q \<mapsto> (j, C, vn)), k) =
(\<Union>i < length vn closureV (vn ! i) (h, k)) - {p} ∪ {q}"
apply (frule_tac k=k in fresh_notin_closureL)
apply (frule_tac k=k in no_cycles)
apply (rule equalityI)
apply (rule subsetI)
apply (subst (asm) closureV_equals_closureL,force)
apply (erule_tac x="p" in ballE)
prefer 2 apply force
apply (subst (asm) closureV_equals_closureL,force,simp)
apply (erule disjE,simp)
apply (rule disjI2)
apply (elim bexE)
apply (rule_tac x="i" in bexI)
prefer 2 apply simp
apply (elim conjE)
apply (erule_tac x="i" in ballE)
prefer 2 apply simp
apply (erule_tac x="i" in allE,simp)
apply (subst closureV_equals_reuse [where p=p],assumption+)
apply simp
apply (rule conjI)
apply (rule closureL_basic)
apply (rule subsetI)
apply (subst closureV_equals_closureL,force)
apply (erule_tac x="p" in ballE)
prefer 2 apply force
apply (subst (asm) closureV_equals_closureL,force,simp)
apply (rule disjI2)
apply (elim bexE)
apply (rule_tac x="i" in bexI)
prefer 2 apply simp
apply (elim conjE)
apply (erule_tac x="i" in ballE)
prefer 2 apply simp
apply (erule_tac x="i" in allE,simp)
by (subst (asm) closureV_equals_reuse [where p=p],assumption+)
lemma P9_REUSE:
"[| E1 x = Some (Loc p); h p = Some c; fresh q h;
closed (E1, E2) {x} (h, k)|]
==> closed_f (Loc q) (h(p := None)(q \<mapsto> c), k)"
apply (case_tac c)
apply (case_tac b)
apply simp
apply (rename_tac j b C vn)
apply (simp add: closed_def)
apply (simp add: live_def)
apply (simp add: closureLS_def)
apply (simp add: closure_def)
apply (simp add: closed_f_def)
apply (simp add: domHeap_def)
apply (subst closureL_reuse_closureV,assumption+)
apply (subst (asm) closureV_equals_closureL,force)
by blast
text{*
Lemma for COPY
*}
axioms P9_COPY:
"[| E1 x = Some (Loc p);
copy (h, k) p j = ((h', k), p'); def_copy p (h, k);
closed (E1, E2) {x} (h, k) |]
==> closed_f (Loc p') (h', k)"
text{*
Lemmas for LET1 and LET2
*}
lemma P9_LET:
"[|closed_f v1 (h', k'); closed_f v (hh, kk)|]
==> closed_f v (hh, kk)"
by simp
text{*
Lemmas for LET1C and LET2C
*}
axioms none_notequal_p:
"the None ≠ Loc p"
lemma closed_e1_closureV_subseteq_dom_h:
"[| closed (E1, E2) (set (map atom2var as)) (h, k);
∀a∈set as. atom a |]
==> (\<Union>i < length as closureV (map (atom2val E1) as ! i) (h, k)) ⊆
dom h"
apply (simp add: closed_def)
apply (simp add: live_def)
apply (simp add: closureLS_def)
apply (simp add: closure_def)
apply (simp add: closureV_def)
apply (rule subsetI)
apply (erule UN_E)
apply (erule_tac x="as!i" in ballE)
prefer 2 apply simp
apply (case_tac "as!i",simp_all)
apply (case_tac "atom2val E1 (as!i)",simp_all)
apply (subgoal_tac "as!i ∈ set as")
prefer 2 apply (subst set_conv_nth,force)
apply (subgoal_tac
"(case E1 (atom2var (as!i)) of None => {} | Some (Loc p) => closureL p (h, k) | Some _ => {}) ⊆
domHeap (h, k)")
prefer 2 apply blast
apply (simp add: domHeap_def)
apply (subgoal_tac
"x ∈ (case E1 list of None => {} | Some (Loc p) => closureL p (h, k) | Some _ => {})")
apply blast
apply (case_tac "E1 list",simp_all)
by (insert none_notequal_p,force)
lemma closureV_upt_subset_closureV:
"fresh p h
==> (\<Union>i < length (map (atom2val E1) as) closureV (map (atom2val E1) as ! i)
(h(p \<mapsto> (j, C, map (atom2val E1) as)), k)) ⊆
(\<Union>i < length (map (atom2val E1) as) closureV (map (atom2val E1) as ! i)
(h, k)) ∪ {p}"
apply (rule subsetI)
apply (erule UN_E)
apply (subgoal_tac
"(h(p \<mapsto> (j, C, map (atom2val E1) as))) p =
Some (j,C, map (atom2val E1) as)")
prefer 2 apply force
apply (frule_tac k=k and h="(h(p \<mapsto> (j, C, map (atom2val E1) as)))" in no_cycles)
apply (simp add: closureV_def)
apply (erule_tac x="i" in allE,simp)
apply (case_tac "atom2val E1 (as ! i)",simp_all)
apply (rule disjI2)
apply (rule_tac x="i" in bexI,simp)
prefer 2 apply simp
apply (erule closureL.induct)
apply (rule closureL_basic)
apply (rule closureL_step,simp)
apply (simp add: descendants_def)
by (case_tac "q = p",simp_all)
lemma P9_LETC_e1:
"[| ∀a∈set as. atom a; fresh p h;
closed (E1, E2) (set (map atom2var as)) (h, k) |]
==> closed_f (Loc p) (h(p \<mapsto> (j, C, map (atom2val E1) as)), k)"
apply (drule closed_e1_closureV_subseteq_dom_h,assumption+)
apply (simp add: closed_f_def)
apply (subst closureV_equals_closureL)
apply force
apply (subgoal_tac
"(\<Union>i < length (map (atom2val E1) as) closureV (map (atom2val E1) as ! i) (h(p \<mapsto> (j, C, map (atom2val E1) as)), k)) ⊆
(\<Union>i < length (map (atom2val E1) as) closureV (map (atom2val E1) as ! i) (h, k)) ∪ {p}")
apply (simp add: domHeap_def)
apply blast
by (rule closureV_upt_subset_closureV,assumption)
text{*
Lemmas for APP
*}
axioms extend_heaps_P9:
"(h', Suc k) \<sqsubseteq> (h' |` {p ∈ dom h'. fst (the (h' p)) ≤ k}, k)"
lemma P9_APP_1:
"[| x ∈ domHeap (h', Suc k); h x = h' x |]
==> x ∈ domHeap (h,k)"
apply (simp only: domHeap_def)
by (simp add: dom_def)
axioms Lemma4_consistent_v:
"(h,k) \<sqsubseteq> (h',k')
==> ∀ t η p.
consistent_v t η (Loc p) h
--> consistent_v t η (Loc p) h'"
axioms consistent_v_identityClosure:
"consistent_v t η (Loc p) h
--> consistent_v t η (Loc p) h'
==> closureL p (h,k) = closureL p (h',k') ∧ (∀ x ∈ closureL p (h,k). h x = h' x)"
lemma P9_APP:
"[| hh = h' |` {p ∈ dom h'. fst (the (h' p)) ≤ k};
closed_f v (h', Suc k) |]
==> closed_f v (hh, k)"
apply (simp add: closed_f_def)
apply (case_tac v, simp_all)
apply (rename_tac q)
apply (subgoal_tac
"(h', Suc k) \<sqsubseteq>
(h' |` {p ∈ dom h'. fst (the (h' p)) ≤ k}, k)")
prefer 2 apply (rule extend_heaps_P9)
apply (frule Lemma4_consistent_v)
apply (erule_tac x="t" in allE)
apply (erule_tac x="η" in allE)
apply (erule_tac x="q" in allE)
apply (drule consistent_v_identityClosure [where k="Suc k" and k'="k"])
apply (elim conjE)
apply (rule subsetI)
apply (subgoal_tac "x ∈ domHeap (h',Suc k)")
prefer 2 apply blast
apply (erule_tac x="x" in ballE)
apply (frule P9_APP_1 [where h="h' |` {p ∈ dom h'. fst (the (h' p)) ≤ k}"])
apply (rule sym, assumption+)
by blast
axioms P9_APP:
"[| hh = h' |` {p ∈ dom h'. fst (the (h' p)) ≤ k}|]
==> closed_f v (hh, k)"
text{*
Lemmas for APP-PRIMOP
*}
lemma P9_APP_PRIMOP:
"closed_f (execOp oper (atom2val E1 a1) (atom2val E1 a2)) (h, k)"
apply (simp only: closed_f_def)
by (case_tac oper,simp_all)
end
lemma closureV_equals_reuse:
[| p ∉ closureV v (h, k); q ∉ closureV v (h, k) |]
==> closureV v (h, k) = closureV v (h(p := None)(q |-> (j, C, vn)), k)
lemma closureL_reuse_closureV:
[| E1.0 x = Some (Loc p); h p = Some (j, C, vn); fresh q h |]
==> closureL q (h(p := None)(q |-> (j, C, vn)), k) =
(UN i<length vn. closureV (vn ! i) (h, k)) - {p} ∪ {q}
lemma P9_REUSE:
[| E1.0 x = Some (Loc p); h p = Some c; fresh q h;
closed (E1.0, E2.0) {x} (h, k) |]
==> closed_f (Loc q) (h(p := None)(q |-> c), k)
lemma P9_LET:
[| closed_f v1.0 (h', k'); closed_f v (hh, kk) |] ==> closed_f v (hh, kk)
lemma closed_e1_closureV_subseteq_dom_h:
[| closed (E1.0, E2.0) (set (map atom2var as)) (h, k); ∀a∈set as. atom a |]
==> (UN i<length as. closureV (map (atom2val E1.0) as ! i) (h, k)) ⊆ dom h
lemma closureV_upt_subset_closureV:
fresh p h
==> (UN i<length (map (atom2val E1.0) as).
closureV (map (atom2val E1.0) as ! i)
(h(p |-> (j, C, map (atom2val E1.0) as)), k))
⊆ (UN i<length (map (atom2val E1.0) as).
closureV (map (atom2val E1.0) as ! i) (h, k)) ∪
{p}
lemma P9_LETC_e1:
[| ∀a∈set as. atom a; fresh p h;
closed (E1.0, E2.0) (set (map atom2var as)) (h, k) |]
==> closed_f (Loc p) (h(p |-> (j, C, map (atom2val E1.0) as)), k)
lemma P9_APP_1:
[| x ∈ domHeap (h', Suc k); h x = h' x |] ==> x ∈ domHeap (h, k)
lemma P9_APP:
[| hh = h' |` {p : dom h'. fst (the (h' p)) ≤ k}; closed_f v (h', Suc k) |]
==> closed_f v (hh, k)
lemma P9_APP_PRIMOP:
closed_f (execOp oper (atom2val E1.0 a1.0) (atom2val E1.0 a2.0)) (h, k)