diff -r 385add25dedf -r 3ebc7ecfb0dd Nominal/Ex/Foo2.thy --- a/Nominal/Ex/Foo2.thy Fri Nov 26 22:43:26 2010 +0000 +++ b/Nominal/Ex/Foo2.thy Sat Nov 27 22:55:29 2010 +0000 @@ -314,6 +314,82 @@ apply(simp) done +lemma abs_rename_set1: + fixes x::"'a::fs" + assumes "(p \ b) \ x" + shows "\y. [{b}]set. x = [{p \ b}]set. y" +apply(rule_tac x="(b \ (p \ b)) \ x" in exI) +apply(subst Abs_swap1[where a="b" and b="p \ b"]) +apply(simp) +using assms +apply(simp add: fresh_def) +apply(perm_simp) +apply(simp) +done + +lemma yy: + assumes "finite bs" + and "bs \ p \ bs = {}" + shows "\q. q \ bs = p \ bs \ supp q \ bs \ (p \ bs)" +using assms +apply(induct) +apply(simp add: permute_set_eq) +apply(rule_tac x="0" in exI) +apply(simp add: supp_perm) +apply(perm_simp) +apply(drule meta_mp) +apply(auto)[1] +apply(erule exE) +apply(simp) +apply(case_tac "q \ x = p \ x") +apply(rule_tac x="q" in exI) +apply(auto)[1] +apply(rule_tac x="((q \ x) \ (p \ x)) + q" in exI) +apply(subgoal_tac "p \ x \ p \ F") +apply(subgoal_tac "q \ x \ p \ F") +apply(simp add: swap_set_not_in) +apply(rule subset_trans) +apply(rule supp_plus_perm) +apply(simp) +apply(rule conjI) +apply(simp add: supp_swap) +defer +apply(auto)[1] +apply(erule conjE)+ +apply(drule sym) +apply(auto)[1] +apply(simp add: mem_permute_iff) +apply(simp add: mem_permute_iff) +apply(auto)[1] +apply(simp add: supp_perm) +apply(auto)[1] +done + +lemma zz: + fixes bs::"atom list" + assumes "set bs \ (set (p \ bs)) = {}" + shows "\q. q \ bs = p \ bs \ supp q \ (set bs) \ (set (p \ bs))" +sorry + +lemma abs_rename_set2: + fixes x::"'a::fs" + assumes "(p \ bs) \* x" "bs \ p \ bs ={}" "finite bs" + shows "\y. [bs]set. x = [p \ bs]set. y" +using yy assms +apply - +apply(drule_tac x="bs" in meta_spec) +apply(drule_tac x="p" in meta_spec) +apply(auto) +apply(rule_tac x="q \ x" in exI) +apply(subgoal_tac "(q \ ([bs]set. x)) = [bs]set. x") +apply(simp add: permute_Abs) +apply(rule supp_perm_eq) +apply(rule fresh_star_supp_conv) +apply(simp add: fresh_star_def) +apply(simp add: Abs_fresh_iff) +apply(auto) +done + lemma abs_rename_list: fixes x::"'a::fs" assumes "b' \ x" "sort_of b = sort_of b'" @@ -328,6 +404,26 @@ apply(simp) done +lemma abs_rename_list2: + fixes x::"'a::fs" + assumes "(set (p \ bs)) \* x" "(set bs) \ (set (p \ bs)) ={}" + shows "\y. [bs]lst. x = [p \ bs]lst. y" +using zz assms +apply - +apply(drule_tac x="bs" in meta_spec) +apply(drule_tac x="p" in meta_spec) +apply(auto simp add: set_eqvt) +apply(rule_tac x="q \ x" in exI) +apply(subgoal_tac "(q \ ([bs]lst. x)) = [bs]lst. x") +apply(simp) +apply(rule supp_perm_eq) +apply(rule fresh_star_supp_conv) +apply(simp add: fresh_star_def) +apply(simp add: Abs_fresh_iff) +apply(auto) +done + + lemma test3: fixes c::"'a::fs" assumes a: "y = Let2 x1 x2 trm1 trm2" @@ -338,62 +434,30 @@ apply(subgoal_tac "\q::perm. (q \ {atom x1, atom x2}) \* (c, x1, x2, trm1, trm2)") apply(erule exE) apply(perm_simp) +apply(simp only: foo.eq_iff) apply(drule_tac x="q \ x1" in spec) apply(drule_tac x="q \ x2" in spec) -apply(simp only: foo.eq_iff) apply(simp) apply(erule mp) apply(rule conjI) apply(simp add: fresh_star_prod) apply(rule conjI) -prefer 2 -apply(rule abs_rename_list) -apply(simp add: fresh_star_prod) -apply(simp add: fresh_star_def) -apply(simp) -apply(case_tac "x1=x2") -apply(simp) -apply(subst Abs_swap2[where a="atom x2" and b="atom (q \ x2)"]) -apply(simp) -apply(simp add: fresh_star_def) -apply(simp add: fresh_def supp_Pair) -apply(simp) -apply(rule exI) -apply(rule refl) -apply(subst Abs_swap2[where a="atom x2" and b="atom (q \ x2)"]) -apply(simp) -apply(simp add: fresh_star_def) -apply(simp add: fresh_def supp_Pair) -apply(simp) -apply(simp add: flip_def[symmetric] atom_eqvt) -apply(subgoal_tac "q \ x2 \ x1") -apply(simp) -apply(subst Abs_swap2[where a="atom x1" and b="atom (q \ x1)"]) -apply(simp) -apply(subgoal_tac " atom (q \ x1) \ supp ((x2 \ q \ x2) \ trm1)") -apply(simp add: fresh_star_def) -apply(simp add: fresh_star_def) -apply(simp add: fresh_def supp_Pair) -apply(erule conjE)+ -apply(rule_tac p="(x2 \ q \ x2)" in permute_boolE) -apply(simp add: mem_eqvt Not_eqvt atom_eqvt supp_eqvt) -apply(subgoal_tac "q \ x2 \ q \ x1") -apply(subgoal_tac "x2 \ q \ x1") -apply(simp) -apply(simp add: supp_at_base) -apply(simp) -apply(simp) -apply(rule exI) -apply(rule refl) -apply(simp add: fresh_star_def) -apply(simp add: fresh_def supp_Pair) -apply(simp add: supp_at_base) -apply(rule at_set_avoiding3[where x="()", simplified]) -apply(simp) -apply(simp add: finite_supp) -apply(simp add: finite_supp) -apply(simp add: fresh_star_def fresh_Unit) -done +apply(simp add: atom_eqvt[symmetric]) +apply(subst (2) permute_list.simps(1)[where p="q", symmetric]) +apply(subst permute_list.simps(2)[symmetric]) +apply(subst permute_list.simps(2)[symmetric]) +apply(rule abs_rename_list2) +apply(simp add: atom_eqvt fresh_star_prod) +apply(simp add: atom_eqvt fresh_star_prod fresh_star_def fresh_Pair fresh_def supp_Pair supp_at_base) +apply(simp add: atom_eqvt[symmetric]) +apply(subst (2) permute_list.simps(1)[where p="q", symmetric]) +apply(subst permute_list.simps(2)[symmetric]) +apply(rule abs_rename_list2) +apply(simp add: atom_eqvt fresh_star_prod) +apply(simp add: atom_eqvt fresh_star_prod fresh_star_def fresh_Pair fresh_def supp_Pair supp_at_base) +apply(simp add: atom_eqvt[symmetric]) +apply(simp add: atom_eqvt fresh_star_prod fresh_star_def fresh_Pair fresh_def supp_Pair supp_at_base) +sorry lemma test4: fixes c::"'a::fs"