Nominal/Nominal2_FCB.thy
changeset 2944 8648ae682442
child 2946 d9c3cc271e62
equal deleted inserted replaced
2943:09834ba7ce59 2944:8648ae682442
       
     1 theory Nominal2_FCB
       
     2 imports "Nominal2_Abs" 
       
     3 begin
       
     4 
       
     5 
       
     6 lemma Abs_lst1_fcb:
       
     7   fixes x y :: "'a :: at_base"
       
     8     and S T :: "'b :: fs"
       
     9   assumes e: "(Abs_lst [atom x] T) = (Abs_lst [atom y] S)"
       
    10   and f1: "\<lbrakk>x \<noteq> y; atom y \<sharp> T; atom x \<sharp> (atom y \<rightleftharpoons> atom x) \<bullet> T\<rbrakk> \<Longrightarrow> atom x \<sharp> f x T"
       
    11   and f2: "\<lbrakk>x \<noteq> y; atom y \<sharp> T; atom x \<sharp> (atom y \<rightleftharpoons> atom x) \<bullet> T\<rbrakk> \<Longrightarrow> atom y \<sharp> f x T"
       
    12   and p: "\<lbrakk>S = (atom x \<rightleftharpoons> atom y) \<bullet> T; x \<noteq> y; atom y \<sharp> T; atom x \<sharp> S\<rbrakk> 
       
    13     \<Longrightarrow> (atom x \<rightleftharpoons> atom y) \<bullet> (f x T) = f y S"
       
    14   and s: "sort_of (atom x) = sort_of (atom y)"
       
    15   shows "f x T = f y S"
       
    16   using e
       
    17   apply(case_tac "atom x \<sharp> S")
       
    18   apply(simp add: Abs1_eq_iff'[OF s s])
       
    19   apply(elim conjE disjE)
       
    20   apply(simp)
       
    21   apply(rule trans)
       
    22   apply(rule_tac p="(atom x \<rightleftharpoons> atom y)" in supp_perm_eq[symmetric])
       
    23   apply(rule fresh_star_supp_conv)
       
    24   apply(simp add: supp_swap fresh_star_def s f1 f2)
       
    25   apply(simp add: swap_commute p)
       
    26   apply(simp add: Abs1_eq_iff[OF s s])
       
    27   done
       
    28 
       
    29 lemma Abs_lst_fcb:
       
    30   fixes xs ys :: "'a :: fs"
       
    31     and S T :: "'b :: fs"
       
    32   assumes e: "(Abs_lst (ba xs) T) = (Abs_lst (ba ys) S)"
       
    33     and f1: "\<And>x. x \<in> set (ba xs) \<Longrightarrow> x \<sharp> f xs T"
       
    34     and f2: "\<And>x. \<lbrakk>supp T - set (ba xs) = supp S - set (ba ys); x \<in> set (ba ys)\<rbrakk> \<Longrightarrow> x \<sharp> f xs T"
       
    35     and eqv: "\<And>p. \<lbrakk>p \<bullet> T = S; p \<bullet> ba xs = ba ys; supp p \<subseteq> set (ba xs) \<union> set (ba ys)\<rbrakk> 
       
    36       \<Longrightarrow> p \<bullet> (f xs T) = f ys S"
       
    37   shows "f xs T = f ys S"
       
    38   using e apply -
       
    39   apply(subst (asm) Abs_eq_iff2)
       
    40   apply(simp add: alphas)
       
    41   apply(elim exE conjE)
       
    42   apply(rule trans)
       
    43   apply(rule_tac p="p" in supp_perm_eq[symmetric])
       
    44   apply(rule fresh_star_supp_conv)
       
    45   apply(drule fresh_star_perm_set_conv)
       
    46   apply(rule finite_Diff)
       
    47   apply(rule finite_supp)
       
    48   apply(subgoal_tac "(set (ba xs) \<union> set (ba ys)) \<sharp>* f xs T")
       
    49   apply(metis Un_absorb2 fresh_star_Un)
       
    50   apply(subst fresh_star_Un)
       
    51   apply(rule conjI)
       
    52   apply(simp add: fresh_star_def f1)
       
    53   apply(simp add: fresh_star_def f2)
       
    54   apply(simp add: eqv)
       
    55   done
       
    56 
       
    57 lemma Abs_set_fcb:
       
    58   fixes xs ys :: "'a :: fs"
       
    59     and S T :: "'b :: fs"
       
    60   assumes e: "(Abs_set (ba xs) T) = (Abs_set (ba ys) S)"
       
    61     and f1: "\<And>x. x \<in> ba xs \<Longrightarrow> x \<sharp> f xs T"
       
    62     and f2: "\<And>x. \<lbrakk>supp T - ba xs = supp S - ba ys; x \<in> ba ys\<rbrakk> \<Longrightarrow> x \<sharp> f xs T"
       
    63     and eqv: "\<And>p. \<lbrakk>p \<bullet> T = S; p \<bullet> ba xs = ba ys; supp p \<subseteq> ba xs \<union> ba ys\<rbrakk> \<Longrightarrow> p \<bullet> (f xs T) = f ys S"
       
    64   shows "f xs T = f ys S"
       
    65   using e apply -
       
    66   apply(subst (asm) Abs_eq_iff2)
       
    67   apply(simp add: alphas)
       
    68   apply(elim exE conjE)
       
    69   apply(rule trans)
       
    70   apply(rule_tac p="p" in supp_perm_eq[symmetric])
       
    71   apply(rule fresh_star_supp_conv)
       
    72   apply(drule fresh_star_perm_set_conv)
       
    73   apply(rule finite_Diff)
       
    74   apply(rule finite_supp)
       
    75   apply(subgoal_tac "(ba xs \<union> ba ys) \<sharp>* f xs T")
       
    76   apply(metis Un_absorb2 fresh_star_Un)
       
    77   apply(subst fresh_star_Un)
       
    78   apply(rule conjI)
       
    79   apply(simp add: fresh_star_def f1)
       
    80   apply(simp add: fresh_star_def f2)
       
    81   apply(simp add: eqv)
       
    82   done
       
    83 
       
    84 lemma Abs_res_fcb:
       
    85   fixes xs ys :: "('a :: at_base) set"
       
    86     and S T :: "'b :: fs"
       
    87   assumes e: "(Abs_res (atom ` xs) T) = (Abs_res (atom ` ys) S)"
       
    88     and f1: "\<And>x. x \<in> atom ` xs \<Longrightarrow> x \<in> supp T \<Longrightarrow> x \<sharp> f xs T"
       
    89     and f2: "\<And>x. \<lbrakk>supp T - atom ` xs = supp S - atom ` ys; x \<in> atom ` ys; x \<in> supp S\<rbrakk> \<Longrightarrow> x \<sharp> f xs T"
       
    90     and eqv: "\<And>p. \<lbrakk>p \<bullet> T = S; supp p \<subseteq> atom ` xs \<inter> supp T \<union> atom ` ys \<inter> supp S;
       
    91       p \<bullet> (atom ` xs \<inter> supp T) = atom ` ys \<inter> supp S\<rbrakk> \<Longrightarrow> p \<bullet> (f xs T) = f ys S"
       
    92   shows "f xs T = f ys S"
       
    93   using e apply -
       
    94   apply(subst (asm) Abs_eq_res_set)
       
    95   apply(subst (asm) Abs_eq_iff2)
       
    96   apply(simp add: alphas)
       
    97   apply(elim exE conjE)
       
    98   apply(rule trans)
       
    99   apply(rule_tac p="p" in supp_perm_eq[symmetric])
       
   100   apply(rule fresh_star_supp_conv)
       
   101   apply(drule fresh_star_perm_set_conv)
       
   102   apply(rule finite_Diff)
       
   103   apply(rule finite_supp)
       
   104   apply(subgoal_tac "(atom ` xs \<inter> supp T \<union> atom ` ys \<inter> supp S) \<sharp>* f xs T")
       
   105   apply(metis Un_absorb2 fresh_star_Un)
       
   106   apply(subst fresh_star_Un)
       
   107   apply(rule conjI)
       
   108   apply(simp add: fresh_star_def f1)
       
   109   apply(subgoal_tac "supp T - atom ` xs = supp S - atom ` ys")
       
   110   apply(simp add: fresh_star_def f2)
       
   111   apply(blast)
       
   112   apply(simp add: eqv)
       
   113   done
       
   114 
       
   115 
       
   116 
       
   117 lemma Abs_set_fcb2:
       
   118   fixes as bs :: "atom set"
       
   119     and x y :: "'b :: fs"
       
   120     and c::"'c::fs"
       
   121   assumes eq: "[as]set. x = [bs]set. y"
       
   122   and fin: "finite as" "finite bs"
       
   123   and fcb1: "as \<sharp>* f as x c"
       
   124   and fresh1: "as \<sharp>* c"
       
   125   and fresh2: "bs \<sharp>* c"
       
   126   and perm1: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f as x c) = f (p \<bullet> as) (p \<bullet> x) c"
       
   127   and perm2: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f bs y c) = f (p \<bullet> bs) (p \<bullet> y) c"
       
   128   shows "f as x c = f bs y c"
       
   129 proof -
       
   130   have "supp (as, x, c) supports (f as x c)"
       
   131     unfolding  supports_def fresh_def[symmetric]
       
   132     by (simp add: fresh_Pair perm1 fresh_star_def supp_swap swap_fresh_fresh)
       
   133   then have fin1: "finite (supp (f as x c))"
       
   134     using fin by (auto intro: supports_finite simp add: finite_supp supp_of_finite_sets supp_Pair)
       
   135   have "supp (bs, y, c) supports (f bs y c)"
       
   136     unfolding  supports_def fresh_def[symmetric]
       
   137     by (simp add: fresh_Pair perm2 fresh_star_def supp_swap swap_fresh_fresh)
       
   138   then have fin2: "finite (supp (f bs y c))"
       
   139     using fin by (auto intro: supports_finite simp add: finite_supp supp_of_finite_sets supp_Pair)
       
   140   obtain q::"perm" where 
       
   141     fr1: "(q \<bullet> as) \<sharp>* (x, c, f as x c, f bs y c)" and 
       
   142     fr2: "supp q \<sharp>* ([as]set. x)" and 
       
   143     inc: "supp q \<subseteq> as \<union> (q \<bullet> as)"
       
   144     using at_set_avoiding3[where xs="as" and c="(x, c, f as x c, f bs y c)" and x="[as]set. x"]  
       
   145       fin1 fin2 fin
       
   146     by (auto simp add: supp_Pair finite_supp Abs_fresh_star dest: fresh_star_supp_conv)
       
   147   have "[q \<bullet> as]set. (q \<bullet> x) = q \<bullet> ([as]set. x)" by simp
       
   148   also have "\<dots> = [as]set. x"
       
   149     by (simp only: fr2 perm_supp_eq)
       
   150   finally have "[q \<bullet> as]set. (q \<bullet> x) = [bs]set. y" using eq by simp
       
   151   then obtain r::perm where 
       
   152     qq1: "q \<bullet> x = r \<bullet> y" and 
       
   153     qq2: "q \<bullet> as = r \<bullet> bs" and 
       
   154     qq3: "supp r \<subseteq> (q \<bullet> as) \<union> bs"
       
   155     apply(drule_tac sym)
       
   156     apply(simp only: Abs_eq_iff2 alphas)
       
   157     apply(erule exE)
       
   158     apply(erule conjE)+
       
   159     apply(drule_tac x="p" in meta_spec)
       
   160     apply(simp add: set_eqvt)
       
   161     apply(blast)
       
   162     done
       
   163   have "as \<sharp>* f as x c" by (rule fcb1)
       
   164   then have "q \<bullet> (as \<sharp>* f as x c)"
       
   165     by (simp add: permute_bool_def)
       
   166   then have "(q \<bullet> as) \<sharp>* f (q \<bullet> as) (q \<bullet> x) c"
       
   167     apply(simp add: fresh_star_eqvt set_eqvt)
       
   168     apply(subst (asm) perm1)
       
   169     using inc fresh1 fr1
       
   170     apply(auto simp add: fresh_star_def fresh_Pair)
       
   171     done
       
   172   then have "(r \<bullet> bs) \<sharp>* f (r \<bullet> bs) (r \<bullet> y) c" using qq1 qq2 by simp
       
   173   then have "r \<bullet> (bs \<sharp>* f bs y c)"
       
   174     apply(simp add: fresh_star_eqvt set_eqvt)
       
   175     apply(subst (asm) perm2[symmetric])
       
   176     using qq3 fresh2 fr1
       
   177     apply(auto simp add: set_eqvt fresh_star_def fresh_Pair)
       
   178     done
       
   179   then have fcb2: "bs \<sharp>* f bs y c" by (simp add: permute_bool_def)
       
   180   have "f as x c = q \<bullet> (f as x c)"
       
   181     apply(rule perm_supp_eq[symmetric])
       
   182     using inc fcb1 fr1 by (auto simp add: fresh_star_def)
       
   183   also have "\<dots> = f (q \<bullet> as) (q \<bullet> x) c" 
       
   184     apply(rule perm1)
       
   185     using inc fresh1 fr1 by (auto simp add: fresh_star_def)
       
   186   also have "\<dots> = f (r \<bullet> bs) (r \<bullet> y) c" using qq1 qq2 by simp
       
   187   also have "\<dots> = r \<bullet> (f bs y c)"
       
   188     apply(rule perm2[symmetric])
       
   189     using qq3 fresh2 fr1 by (auto simp add: fresh_star_def)
       
   190   also have "... = f bs y c"
       
   191     apply(rule perm_supp_eq)
       
   192     using qq3 fr1 fcb2 by (auto simp add: fresh_star_def)
       
   193   finally show ?thesis by simp
       
   194 qed
       
   195 
       
   196 
       
   197 text {* NOT DONE 
       
   198 lemma Abs_res_fcb2:
       
   199   fixes as bs :: "atom set"
       
   200     and x y :: "'b :: fs"
       
   201     and c::"'c::fs"
       
   202   assumes eq: "[as]res. x = [bs]res. y"
       
   203   and fin: "finite as" "finite bs"
       
   204   and fcb1: "as \<sharp>* f as x c"
       
   205   and fresh1: "as \<sharp>* c"
       
   206   and fresh2: "bs \<sharp>* c"
       
   207   and perm1: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f as x c) = f (p \<bullet> as) (p \<bullet> x) c"
       
   208   and perm2: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f bs y c) = f (p \<bullet> bs) (p \<bullet> y) c"
       
   209   shows "f as x c = f bs y c"
       
   210 proof -
       
   211   have "supp (as, x, c) supports (f as x c)"
       
   212     unfolding  supports_def fresh_def[symmetric]
       
   213     by (simp add: fresh_Pair perm1 fresh_star_def supp_swap swap_fresh_fresh)
       
   214   then have fin1: "finite (supp (f as x c))"
       
   215     using fin by (auto intro: supports_finite simp add: finite_supp supp_of_finite_sets supp_Pair)
       
   216   have "supp (bs, y, c) supports (f bs y c)"
       
   217     unfolding  supports_def fresh_def[symmetric]
       
   218     by (simp add: fresh_Pair perm2 fresh_star_def supp_swap swap_fresh_fresh)
       
   219   then have fin2: "finite (supp (f bs y c))"
       
   220     using fin by (auto intro: supports_finite simp add: finite_supp supp_of_finite_sets supp_Pair)
       
   221   obtain q::"perm" where 
       
   222     fr1: "(q \<bullet> as) \<sharp>* (x, c, f as x c, f bs y c)" and 
       
   223     fr2: "supp q \<sharp>* ([as]res. x)" and 
       
   224     inc: "supp q \<subseteq> as \<union> (q \<bullet> as)"
       
   225     using at_set_avoiding3[where xs="as" and c="(x, c, f as x c, f bs y c)" and x="[as]res. x"]  
       
   226       fin1 fin2 fin
       
   227     by (auto simp add: supp_Pair finite_supp Abs_fresh_star dest: fresh_star_supp_conv)
       
   228   have "[q \<bullet> as]res. (q \<bullet> x) = q \<bullet> ([as]res. x)" by simp
       
   229   also have "\<dots> = [as]res. x"
       
   230     by (simp only: fr2 perm_supp_eq)
       
   231   finally have "[q \<bullet> as]res. (q \<bullet> x) = [bs]res. y" using eq by simp
       
   232   then obtain r::perm where 
       
   233     qq1: "q \<bullet> x = r \<bullet> y" and 
       
   234     qq2: "(q \<bullet> as \<inter> supp (q \<bullet> x)) = r \<bullet> (bs \<inter> supp y)" and 
       
   235     qq3: "supp r \<subseteq> bs \<inter> supp y \<union> q \<bullet> as \<inter> supp (q \<bullet> x)"
       
   236     apply(drule_tac sym)
       
   237     apply(subst(asm) Abs_eq_res_set)
       
   238     apply(simp only: Abs_eq_iff2 alphas)
       
   239     apply(erule exE)
       
   240     apply(erule conjE)+
       
   241     apply(drule_tac x="p" in meta_spec)
       
   242     apply(simp add: set_eqvt)
       
   243     done
       
   244   have "(as \<inter> supp x) \<sharp>* f (as \<inter> supp x) x c" sorry (* FCB? *)
       
   245   then have "q \<bullet> ((as \<inter> supp x) \<sharp>* f (as \<inter> supp x) x c)"
       
   246     by (simp add: permute_bool_def)
       
   247   then have "(q \<bullet> (as \<inter> supp x)) \<sharp>* f (q \<bullet> (as \<inter> supp x)) (q \<bullet> x) c"
       
   248     apply(simp add: fresh_star_eqvt set_eqvt)
       
   249     sorry (* perm? *)
       
   250   then have "r \<bullet> (bs \<inter> supp y) \<sharp>* f (r \<bullet> (bs \<inter> supp y)) (r \<bullet> y) c" using qq2 
       
   251     apply (simp add: inter_eqvt)
       
   252     sorry
       
   253   (* rest similar reversing it other way around... *)
       
   254   show ?thesis sorry
       
   255 qed
       
   256 *}
       
   257 
       
   258 
       
   259 lemma Abs_lst_fcb2:
       
   260   fixes as bs :: "atom list"
       
   261     and x y :: "'b :: fs"
       
   262     and c::"'c::fs"
       
   263   assumes eq: "[as]lst. x = [bs]lst. y"
       
   264   and fcb1: "(set as) \<sharp>* f as x c"
       
   265   and fresh1: "set as \<sharp>* c"
       
   266   and fresh2: "set bs \<sharp>* c"
       
   267   and perm1: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f as x c) = f (p \<bullet> as) (p \<bullet> x) c"
       
   268   and perm2: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f bs y c) = f (p \<bullet> bs) (p \<bullet> y) c"
       
   269   shows "f as x c = f bs y c"
       
   270 proof -
       
   271   have "supp (as, x, c) supports (f as x c)"
       
   272     unfolding  supports_def fresh_def[symmetric]
       
   273     by (simp add: fresh_Pair perm1 fresh_star_def supp_swap swap_fresh_fresh)
       
   274   then have fin1: "finite (supp (f as x c))"
       
   275     by (auto intro: supports_finite simp add: finite_supp)
       
   276   have "supp (bs, y, c) supports (f bs y c)"
       
   277     unfolding  supports_def fresh_def[symmetric]
       
   278     by (simp add: fresh_Pair perm2 fresh_star_def supp_swap swap_fresh_fresh)
       
   279   then have fin2: "finite (supp (f bs y c))"
       
   280     by (auto intro: supports_finite simp add: finite_supp)
       
   281   obtain q::"perm" where 
       
   282     fr1: "(q \<bullet> (set as)) \<sharp>* (x, c, f as x c, f bs y c)" and 
       
   283     fr2: "supp q \<sharp>* Abs_lst as x" and 
       
   284     inc: "supp q \<subseteq> (set as) \<union> q \<bullet> (set as)"
       
   285     using at_set_avoiding3[where xs="set as" and c="(x, c, f as x c, f bs y c)" and x="[as]lst. x"]  
       
   286       fin1 fin2
       
   287     by (auto simp add: supp_Pair finite_supp Abs_fresh_star dest: fresh_star_supp_conv)
       
   288   have "Abs_lst (q \<bullet> as) (q \<bullet> x) = q \<bullet> Abs_lst as x" by simp
       
   289   also have "\<dots> = Abs_lst as x"
       
   290     by (simp only: fr2 perm_supp_eq)
       
   291   finally have "Abs_lst (q \<bullet> as) (q \<bullet> x) = Abs_lst bs y" using eq by simp
       
   292   then obtain r::perm where 
       
   293     qq1: "q \<bullet> x = r \<bullet> y" and 
       
   294     qq2: "q \<bullet> as = r \<bullet> bs" and 
       
   295     qq3: "supp r \<subseteq> (q \<bullet> (set as)) \<union> set bs"
       
   296     apply(drule_tac sym)
       
   297     apply(simp only: Abs_eq_iff2 alphas)
       
   298     apply(erule exE)
       
   299     apply(erule conjE)+
       
   300     apply(drule_tac x="p" in meta_spec)
       
   301     apply(simp add: set_eqvt)
       
   302     apply(blast)
       
   303     done
       
   304   have "(set as) \<sharp>* f as x c" by (rule fcb1)
       
   305   then have "q \<bullet> ((set as) \<sharp>* f as x c)"
       
   306     by (simp add: permute_bool_def)
       
   307   then have "set (q \<bullet> as) \<sharp>* f (q \<bullet> as) (q \<bullet> x) c"
       
   308     apply(simp add: fresh_star_eqvt set_eqvt)
       
   309     apply(subst (asm) perm1)
       
   310     using inc fresh1 fr1
       
   311     apply(auto simp add: fresh_star_def fresh_Pair)
       
   312     done
       
   313   then have "set (r \<bullet> bs) \<sharp>* f (r \<bullet> bs) (r \<bullet> y) c" using qq1 qq2 by simp
       
   314   then have "r \<bullet> ((set bs) \<sharp>* f bs y c)"
       
   315     apply(simp add: fresh_star_eqvt set_eqvt)
       
   316     apply(subst (asm) perm2[symmetric])
       
   317     using qq3 fresh2 fr1
       
   318     apply(auto simp add: set_eqvt fresh_star_def fresh_Pair)
       
   319     done
       
   320   then have fcb2: "(set bs) \<sharp>* f bs y c" by (simp add: permute_bool_def)
       
   321   have "f as x c = q \<bullet> (f as x c)"
       
   322     apply(rule perm_supp_eq[symmetric])
       
   323     using inc fcb1 fr1 by (auto simp add: fresh_star_def)
       
   324   also have "\<dots> = f (q \<bullet> as) (q \<bullet> x) c" 
       
   325     apply(rule perm1)
       
   326     using inc fresh1 fr1 by (auto simp add: fresh_star_def)
       
   327   also have "\<dots> = f (r \<bullet> bs) (r \<bullet> y) c" using qq1 qq2 by simp
       
   328   also have "\<dots> = r \<bullet> (f bs y c)"
       
   329     apply(rule perm2[symmetric])
       
   330     using qq3 fresh2 fr1 by (auto simp add: fresh_star_def)
       
   331   also have "... = f bs y c"
       
   332     apply(rule perm_supp_eq)
       
   333     using qq3 fr1 fcb2 by (auto simp add: fresh_star_def)
       
   334   finally show ?thesis by simp
       
   335 qed
       
   336 
       
   337 lemma Abs_lst1_fcb2:
       
   338   fixes a b :: "atom"
       
   339     and x y :: "'b :: fs"
       
   340     and c::"'c :: fs"
       
   341   assumes e: "(Abs_lst [a] x) = (Abs_lst [b] y)"
       
   342   and fcb1: "a \<sharp> f a x c"
       
   343   and fresh: "{a, b} \<sharp>* c"
       
   344   and perm1: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f a x c) = f (p \<bullet> a) (p \<bullet> x) c"
       
   345   and perm2: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f b y c) = f (p \<bullet> b) (p \<bullet> y) c"
       
   346   shows "f a x c = f b y c"
       
   347 using e
       
   348 apply(drule_tac Abs_lst_fcb2[where c="c" and f="\<lambda>(as::atom list) . f (hd as)"])
       
   349 apply(simp_all)
       
   350 using fcb1 fresh perm1 perm2
       
   351 apply(simp_all add: fresh_star_def)
       
   352 done
       
   353 
       
   354 lemma Abs_lst1_fcb2':
       
   355   fixes a b :: "'a::at"
       
   356     and x y :: "'b :: fs"
       
   357     and c::"'c :: fs"
       
   358   assumes e: "(Abs_lst [atom a] x) = (Abs_lst [atom b] y)"
       
   359   and fcb1: "atom a \<sharp> f a x c"
       
   360   and fresh: "{atom a, atom b} \<sharp>* c"
       
   361   and perm1: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f a x c) = f (p \<bullet> a) (p \<bullet> x) c"
       
   362   and perm2: "\<And>p. supp p \<sharp>* c \<Longrightarrow> p \<bullet> (f b y c) = f (p \<bullet> b) (p \<bullet> y) c"
       
   363   shows "f a x c = f b y c"
       
   364 using e
       
   365 apply(drule_tac Abs_lst1_fcb2[where c="c" and f="\<lambda>a . f ((inv atom) a)"])
       
   366 using  fcb1 fresh perm1 perm2
       
   367 apply(simp_all add: fresh_star_def inv_f_f inj_on_def atom_eqvt)
       
   368 done
       
   369 
       
   370 end