# HG changeset patch # User Christian Urban # Date 1292745037 0 # Node ID d5713db7e146d01df1b7dc4d16c64b64a0119e53 # Parent 0d7a1703fe28b29dfa859cbbbafda2dac4fb372a one interesting case done diff -r 0d7a1703fe28 -r d5713db7e146 Nominal/Ex/Multi_Recs.thy --- a/Nominal/Ex/Multi_Recs.thy Sun Dec 19 07:43:32 2010 +0000 +++ b/Nominal/Ex/Multi_Recs.thy Sun Dec 19 07:50:37 2010 +0000 @@ -43,6 +43,92 @@ thm multi_recs.fsupp thm multi_recs.supp +thm multi_recs.bn_defs +thm multi_recs.permute_bn +thm multi_recs.perm_bn_alpha +thm multi_recs.perm_bn_simps +thm multi_recs.bn_finite + + +lemma Abs_rename_set2: + fixes x::"'a::fs" + assumes a: "(p \ cs) \* (cs, x)" + and b: "finite cs" + shows "\q. [cs]set. x = [p \ cs]set. (q \ x) \ q \ cs = p \ cs \ supp q \ cs \ (p \ cs)" +proof - + from a b have "p \ cs \ cs = {}" using at_fresh_star_inter by (auto simp add: fresh_star_Pair) + with set_renaming_perm + obtain q where *: "q \ cs = p \ cs" and **: "supp q \ cs \ (p \ cs)" using b by metis + have "[cs]set. x = q \ ([cs]set. x)" + apply(rule perm_supp_eq[symmetric]) + using a ** + unfolding fresh_star_Pair + unfolding Abs_fresh_star_iff + unfolding fresh_star_def + by auto + also have "\ = [q \ cs]set. (q \ x)" by simp + also have "\ = [p \ cs]set. (q \ x)" using * by simp + finally have "[cs]set. x = [p \ cs]set. (q \ x)" . + then show "\q. [cs]set. x = [p \ cs]set. (q \ x) \ q \ cs = p \ cs \ supp q \ cs \ (p \ cs)" + using * ** + by (blast) +qed + +lemma at_set_avoiding5: + assumes "finite xs" + and "finite (supp c)" + shows "\p. (p \ xs) \* c \ supp p = xs \ p \ xs" +using assms +apply(erule_tac c="c" in at_set_avoiding) +apply(auto) +done + +lemma + fixes c::"'a::fs" + assumes a: "\lrbs exp. \bs lrbs \* c; y = LetRec lrbs exp\ \ P" + shows "y = LetRec lrbs exp \ P" +apply - +apply(subgoal_tac "\p. ((p \ (bs lrbs)) \* (c, bs lrbs, lrbs, exp)) \ supp p = bs lrbs \ (p \ (bs lrbs))") +apply(erule exE) +apply(simp add: fresh_star_Pair) +apply(erule conjE)+ +apply(simp add: multi_recs.fv_bn_eqvt) +(* +using Abs_rename_set2 +apply - +apply(drule_tac x="p" in meta_spec) +apply(drule_tac x="bs lrbs" in meta_spec) +apply(drule_tac x="lrbs" in meta_spec) +apply(drule meta_mp) +apply(simp add: multi_recs.fv_bn_eqvt fresh_star_Pair) +apply(drule meta_mp) +apply(simp add: multi_recs.bn_finite) +apply(erule exE) +apply(simp add: multi_recs.fv_bn_eqvt) +*) +apply(rule a) +apply(assumption) +apply(clarify) +apply(simp (no_asm) only: multi_recs.eq_iff) +apply(rule trans) +apply(rule_tac p="p" in supp_perm_eq[symmetric]) +apply(rule fresh_star_supp_conv) +apply(simp (no_asm_use) add: fresh_star_def) +apply(simp (no_asm_use) add: Abs_fresh_iff)[1] +apply(rule ballI) +apply(auto simp add: fresh_Pair)[1] +apply(simp (no_asm_use) only: permute_Abs) +apply(simp (no_asm_use) only: multi_recs.fv_bn_eqvt) +apply(simp) +apply(rule at_set_avoiding5) +apply(simp add: multi_recs.bn_finite) +apply(simp add: supp_Pair finite_supp) +apply(rule finite_sets_supp) +apply(simp add: multi_recs.bn_finite) +done + + + end