Theory AList-Utils-Nominal
theory "AList-Utils-Nominal"
imports "AList-Utils" "Nominal-Utils"
begin
subsubsection ‹Freshness lemmas related to associative lists›
lemma domA_not_fresh:
"x ∈ domA Γ ⟹ ¬(atom x ♯ Γ)"
by (induct Γ, auto simp add: fresh_Cons fresh_Pair)
lemma fresh_delete:
assumes "a ♯ Γ"
shows "a ♯ delete v Γ"
using assms
by(induct Γ)(auto simp add: fresh_Cons)
lemma fresh_star_delete:
assumes "S ♯* Γ"
shows "S ♯* delete v Γ"
using assms fresh_delete unfolding fresh_star_def by fastforce
lemma fv_delete_subset:
"fv (delete v Γ) ⊆ fv Γ"
using fresh_delete unfolding fresh_def fv_def by auto
lemma fresh_heap_expr:
assumes "a ♯ Γ"
and "(x,e) ∈ set Γ"
shows "a ♯ e"
using assms
by (metis fresh_list_elem fresh_Pair)
lemma fresh_heap_expr':
assumes "a ♯ Γ"
and "e ∈ snd ` set Γ"
shows "a ♯ e"
using assms
by (induct Γ, auto simp add: fresh_Cons fresh_Pair)
lemma fresh_star_heap_expr':
assumes "S ♯* Γ"
and "e ∈ snd ` set Γ"
shows "S ♯* e"
using assms
by (metis fresh_star_def fresh_heap_expr')
lemma fresh_map_of:
assumes "x ∈ domA Γ"
assumes "a ♯ Γ"
shows "a ♯ the (map_of Γ x)"
using assms
by (induct Γ)(auto simp add: fresh_Cons fresh_Pair)
lemma fresh_star_map_of:
assumes "x ∈ domA Γ"
assumes "a ♯* Γ"
shows "a ♯* the (map_of Γ x)"
using assms by (simp add: fresh_star_def fresh_map_of)
lemma domA_fv_subset: "domA Γ ⊆ fv Γ"
by (induction Γ) auto
lemma map_of_fv_subset: "x ∈ domA Γ ⟹ fv (the (map_of Γ x)) ⊆ fv Γ"
by (induction Γ) auto
lemma map_of_Some_fv_subset: "map_of Γ x = Some e ⟹ fv e ⊆ fv Γ"
by (metis domA_from_set map_of_fv_subset map_of_SomeD option.sel)
subsubsection ‹Equivariance lemmas›
lemma domA[eqvt]:
"π ∙ domA Γ = domA (π ∙ Γ)"
by (simp add: domA_def)
lemma mapCollect[eqvt]:
"π ∙ mapCollect f m = mapCollect (π ∙ f) (π ∙ m)"
unfolding mapCollect_def
by perm_simp rule
subsubsection ‹Freshness and distinctness›
lemma fresh_distinct:
assumes "atom ` S ♯* Γ"
shows "S ∩ domA Γ = {}"
proof-
{ fix x
assume "x ∈ S"
moreover
assume "x ∈ domA Γ"
hence "atom x ∈ supp Γ"
by (induct Γ)(auto simp add: supp_Cons domA_def supp_Pair supp_at_base)
ultimately
have False
using assms
by (simp add: fresh_star_def fresh_def)
}
thus "S ∩ domA Γ = {}" by auto
qed
lemma fresh_distinct_list:
assumes "atom ` S ♯* l"
shows "S ∩ set l = {}"
using assms
by (metis disjoint_iff_not_equal fresh_list_elem fresh_star_def image_eqI not_self_fresh)
lemma fresh_distinct_fv:
assumes "atom ` S ♯* l"
shows "S ∩ fv l = {}"
using assms
by (metis disjoint_iff_not_equal fresh_star_def fv_not_fresh image_eqI)
subsubsection ‹Pure codomains›
lemma domA_fv_pure:
fixes Γ :: "('a::at_base × 'b::pure) list"
shows "fv Γ = domA Γ"
apply (induct Γ)
apply simp
apply (case_tac a)
apply (simp)
done
lemma domA_fresh_pure:
fixes Γ :: "('a::at_base × 'b::pure) list"
shows "x ∈ domA Γ ⟷ ¬(atom x ♯ Γ)"
unfolding domA_fv_pure[symmetric]
by (auto simp add: fv_def fresh_def)
end