Up to index of Isabelle/HOL/CoreSafe
theory SafeDAss_P4(* Title: Safe DAss P4
Author: Javier de Dios and Ricardo Peņa
Copyright: June 2008, Universidad Complutense de Madrid
*)
header {* Derived Assertions. P4. fv e $\subseteq$ L *}
theory SafeDAss_P4 imports SafeDAssBasic
begin
text{*
Lemmas for LET
*}
lemma fvs_as_subseteq_L1:
"∀a∈set as. atom a
==> fvs as ⊆ atom2var ` set as"
apply (induct as,simp_all)
apply (rule conjI)
apply (case_tac a,simp_all)
by blast
lemma P4_LET:
"[|fv e1 ⊆ L1; fv e2 ⊆ L2|]
==> fv (Let x1 = e1 In e2 a) ⊆ L1 ∪ (L2 - {x1})"
by (clarsimp,blast)
text{*
Lemmas for CASE
*}
lemma P4_CASE_aux [rule_format]:
"x ∈ fvAlts alts
--> length alts > 0
--> (∃i < length alts. x ∈ fv (snd (alts ! i)) ∧
x ∉ set (snd (extractP (fst (alts ! i)))))"
apply (induct alts,simp)
apply (rule impI,simp)
apply (erule disjE)
apply (case_tac a, simp_all)
apply (elim conjE)
apply (rule_tac x="0" in exI,simp)
apply (case_tac alts,simp_all)
apply (erule exE)
apply (case_tac i,simp_all)
apply (rule_tac x="Suc 0" in exI,simp)
apply (rule_tac x="Suc (Suc nat)" in exI)
by simp
lemma P4_CASE:
"[| ∀i < length alts. x ∈ fst (assert ! i) ∧
x ∉ set (snd (extractP (fst (alts ! i))));
∀i < length alts. fv (snd (alts ! i)) ⊆ fst (assert ! i);
length alts > 0 |]
==> fv (Case VarE x a Of alts a') ⊆
(\<Union>i< length alts. fst (assert ! i) - set (snd (extractP (fst (alts ! i))))) ∪ {x}"
apply auto
apply (subgoal_tac "length alts > 0")
prefer 2 apply simp
apply (frule P4_CASE_aux,assumption+)
apply (erule exE)
apply (erule_tac x="i" in allE,simp)
apply (elim conjE)
apply (erule_tac x="i" in ballE,simp)
apply blast
by simp
text{*
Lemmas for CASED
*}
lemma P4_CASED_aux [rule_format]:
"x ∈ fvAlts' alts -->
length alts > 0 -->
(∃i < length alts. x ∈ fv (snd (alts ! i)) ∧
x ∉ set (snd (extractP (fst (alts ! i)))))"
apply (induct alts,simp)
apply (rule impI,simp)
apply (erule disjE)
apply (case_tac a)
apply (simp,elim conjE)
apply (rule_tac x="0" in exI,simp)
apply simp
apply (case_tac alts,simp)
apply (simp, erule exE)
apply (case_tac i,simp)
apply (rule_tac x="Suc 0" in exI,simp)
by (rule_tac x="Suc (Suc nat)" in exI,simp)
lemma P4_CASED:
"[| ∀i < length alts. fv (snd (alts ! i)) ⊆ fst (assert ! i);
length alts > 0 |]
==> fv (CaseD VarE x a Of alts a) ⊆
insert x (\<Union>i < length alts fst (assert ! i) - set (snd (extractP (fst (alts ! i)))))"
apply clarsimp
apply (subgoal_tac "length alts > 0")
prefer 2 apply simp
apply (frule P4_CASED_aux,assumption+)
by blast
(**** P4_PRIMOP ***)
lemma P4_APP_PRIMOP:
"[| atom a1; atom a2 |]
==> fv (AppE f [a1, a2] rs' a) ⊆ {atom2var a1, atom2var a2}"
apply (simp,rule conjI)
apply (case_tac a1,simp_all)
by (case_tac a2,simp_all)
end
lemma fvs_as_subseteq_L1:
∀a∈set as. atom a ==> fvs as ⊆ atom2var ` set as
lemma P4_LET:
[| fv e1.0 ⊆ L1.0; fv e2.0 ⊆ L2.0 |]
==> fv (Let x1.0 = e1.0 In e2.0 a) ⊆ L1.0 ∪ (L2.0 - {x1.0})
lemma P4_CASE_aux:
[| x ∈ fvAlts alts; 0 < length alts |]
==> ∃i<length alts.
x ∈ fv (snd (alts ! i)) ∧ x ∉ set (snd (extractP (fst (alts ! i))))
lemma P4_CASE:
[| ∀i<length alts.
x ∈ fst (assert ! i) ∧ x ∉ set (snd (extractP (fst (alts ! i))));
∀i<length alts. fv (snd (alts ! i)) ⊆ fst (assert ! i); 0 < length alts |]
==> fv (Case VarE x a Of alts a')
⊆ (UN i<length alts.
fst (assert ! i) - set (snd (extractP (fst (alts ! i))))) ∪
{x}
lemma P4_CASED_aux:
[| x ∈ fvAlts' alts; 0 < length alts |]
==> ∃i<length alts.
x ∈ fv (snd (alts ! i)) ∧ x ∉ set (snd (extractP (fst (alts ! i))))
lemma P4_CASED:
[| ∀i<length alts. fv (snd (alts ! i)) ⊆ fst (assert ! i); 0 < length alts |]
==> fv (CaseD VarE x a Of alts a)
⊆ insert x
(UN i<length alts.
fst (assert ! i) - set (snd (extractP (fst (alts ! i)))))
lemma P4_APP_PRIMOP:
[| atom a1.0; atom a2.0 |]
==> fv (AppE f [a1.0, a2.0] rs' a) ⊆ {atom2var a1.0, atom2var a2.0}