Nominal/Ex/Lambda.thy
changeset 2729 337748e9b6b5
parent 2715 08bc1aa259d9
child 2765 7ac5e5c86c7d
--- a/Nominal/Ex/Lambda.thy	Sat Feb 19 09:31:22 2011 +0900
+++ b/Nominal/Ex/Lambda.thy	Wed Feb 23 11:11:02 2011 +0900
@@ -320,9 +320,9 @@
 
 lemma [eqvt]:
   shows "(p \<bullet> lookup xs n x) = lookup (p \<bullet> xs) (p \<bullet> n) (p \<bullet> x)"
-apply(induct xs arbitrary: n)
-apply(simp_all add: permute_pure)
-done
+  apply(induct xs arbitrary: n)
+  apply(simp_all add: permute_pure)
+  done
 
 nominal_primrec
   trans :: "lam \<Rightarrow> name list \<Rightarrow> ln"
@@ -334,20 +334,16 @@
 apply(case_tac x)
 apply(simp)
 apply(rule_tac y="a" and c="b" in lam.strong_exhaust)
-apply(simp_all)[3]
+apply(simp_all add: fresh_star_def)[3]
 apply(blast)
 apply(blast)
-apply(simp add: fresh_star_def)
 apply(simp_all add: lam.distinct)
 apply(simp add: lam.eq_iff)
 apply(simp add: lam.eq_iff)
 apply(simp add: lam.eq_iff)
 apply(erule conjE)
-apply(subgoal_tac "atom xa \<sharp> [[atom x]]lst. t \<and> atom x \<sharp> [[atom xa]]lst. ta")
+apply(subgoal_tac "atom xa \<sharp> [[atom x]]lst. t")
 prefer 2
-apply(rule conjI)
-apply(simp add: Abs_fresh_iff)
-apply(drule sym)
 apply(simp add: Abs_fresh_iff)
 apply(subst (asm) Abs_eq_iff2)
 apply(auto)
@@ -356,22 +352,92 @@
 apply(clarify)
 apply(rule trans)
 apply(rule_tac p="p" in supp_perm_eq[symmetric])
+prefer 2
+apply (subgoal_tac "p \<bullet> xsa = xsa")
+apply (simp add: eqvt_at_def)
+apply (rule supp_perm_eq)
+apply (rule fresh_star_supp_conv)
+apply (subgoal_tac "{atom (p \<bullet> x), atom x} \<sharp>* xsa")
+apply (simp add: fresh_star_def fresh_def)
+apply blast
+apply (simp add: fresh_star_def fresh_def)
+apply (simp add:  ln.supp)
 apply(rule fresh_star_supp_conv)
-apply(drule fresh_star_perm_set_conv)
-apply(simp add: finite_supp)
-apply(subgoal_tac "{atom (p \<bullet> x), atom x} \<sharp>* LNLam (trans_sumC (t, x # xsa))")
-apply(auto simp add: fresh_star_def)[1]
-apply(simp (no_asm) add: fresh_star_def ln.fresh)
-apply(rule conjI)
+apply (subst (asm) supp_perm_pair)
+apply (elim disjE)
+apply (simp add: fresh_star_def supp_zero_perm)
+apply (simp add: flip_def[symmetric])
+apply(subgoal_tac "supp (x \<leftrightarrow> p \<bullet> x) \<sharp>* trans_sumC (t, x # xsa)")
+apply simp
+apply (subst flip_def)
+apply (simp add: supp_swap)
+apply (simp add: fresh_star_def)
+apply (rule)
+apply rule
+prefer 2
 apply(drule_tac a="atom (p \<bullet> x)" in fresh_eqvt_at)
 apply(simp add: finite_supp)
 apply(simp (no_asm_use) add: fresh_Pair)
 apply(simp add: Abs_fresh_iff fresh_Cons)[1]
-apply(erule disjE)
-apply(erule disjE)
-apply(simp)
+apply (metis Rep_name_inverse atom_name_def fresh_at_base)
+apply assumption
 oops
 
+(* lemma helpr: "atom x \<sharp> ta \<Longrightarrow> Lam [xa]. ta = Lam [x]. ((xa \<leftrightarrow> x) \<bullet> ta)"
+  apply (case_tac "x = xa")
+  apply simp
+  apply (simp add: lam.eq_iff Abs1_eq_iff flip_def[symmetric])
+  by (metis atom_eqvt flip_at_simps(2) fresh_permute_iff)
+
+lemma supp_lookup: "supp (lookup l n name) = {atom name} - supp l"
+  apply (induct l arbitrary: n)
+  apply (simp_all add: ln.supp supp_at_base supp_Nil supp_Cons pure_supp)
+  done
+
+lemma trans_eqvt[eqvt]: "p \<bullet> (trans t l) = trans (p \<bullet> t) (p \<bullet> l)"
+  apply (induct t l rule: trans.induct)
+  apply simp_all
+  apply (simp add: eqvts permute_pure)
+  done
+
+lemma diff_un: "a - (b \<union> c) = a - b - c"
+  by blast
+
+lemma supp_trans: "supp (trans t l) = supp t - supp l"
+  apply (induct t arbitrary: l rule: lam.induct)
+  apply (simp_all add: lam.supp supp_at_base supp_lookup ln.supp)
+  apply blast
+  apply (rule_tac x="(lam, l)" and ?'a="name" in obtain_fresh)
+  apply (simp add: fresh_Pair)
+  apply clarify
+  apply (subgoal_tac "supp (Lambda.trans (Lam [a]. ((name \<leftrightarrow> a) \<bullet> lam)) l) =
+    supp lam - {atom name} - supp l")
+  using helpr
+  apply simp
+  apply (simp add: ln.supp)
+  apply (subgoal_tac "supp ((name \<leftrightarrow> a) \<bullet> (Lambda.trans lam ((name \<leftrightarrow> a) \<bullet> (a # l)))) = supp lam - {atom name} - supp l")
+  apply (simp add: trans_eqvt)
+  apply (simp add: supp_eqvt[symmetric])
+  apply (simp add: Diff_eqvt)
+  apply (simp add: supp_eqvt supp_Cons  union_eqvt)
+  apply (simp add: diff_un)
+  apply (tactic {* Cong_Tac.cong_tac @{thm cong} 1*})
+  apply (tactic {* Cong_Tac.cong_tac @{thm cong} 1*})
+  apply rule
+  prefer 2
+  apply rule
+  apply (simp add: supp_at_base)
+  apply (subgoal_tac "(name \<leftrightarrow> a) \<bullet> (supp lam - {atom name}) = supp lam - {atom name}")
+  apply (simp add: eqvts)
+  unfolding flip_def
+  apply (rule swap_fresh_fresh)
+apply (metis fresh_at_base fresh_def fresh_minus_atom_set lam.fsupp supp_at_base)
+by (metis fresh_def fresh_finite_atom_set fresh_minus_atom_set lam.fsupp)
+
+lemma "atom x \<sharp> trans_sumC (t, x # xsa)"
+  by (simp add: fresh_def meta_eq_to_obj_eq[OF trans_def, symmetric, unfolded fun_eq_iff] supp_trans supp_Cons supp_at_base)
+*)
+
 nominal_datatype db = 
   DBVar nat
 | DBApp db db