1theory Class2
2imports Class1
3begin
4
5text \<open>Reduction\<close>
6
7lemma fin_not_Cut:
8  assumes a: "fin M x"
9  shows "\<not>(\<exists>a M' x N'. M = Cut <a>.M' (x).N')"
10using a
11by (induct) (auto)
12
13lemma fresh_not_fin:
14  assumes a: "x\<sharp>M"
15  shows "\<not>fin M x"
16proof -
17  have "fin M x \<Longrightarrow> x\<sharp>M \<Longrightarrow> False" by (induct rule: fin.induct) (auto simp add: abs_fresh fresh_atm)
18  with a show "\<not>fin M x" by blast
19qed
20
21lemma fresh_not_fic:
22  assumes a: "a\<sharp>M"
23  shows "\<not>fic M a"
24proof -
25  have "fic M a \<Longrightarrow> a\<sharp>M \<Longrightarrow> False" by (induct rule: fic.induct) (auto simp add: abs_fresh fresh_atm)
26  with a show "\<not>fic M a" by blast
27qed
28
29lemma c_redu_subst1:
30  assumes a: "M \<longrightarrow>\<^sub>c M'" "c\<sharp>M" "y\<sharp>P"
31  shows "M{y:=<c>.P} \<longrightarrow>\<^sub>c M'{y:=<c>.P}"
32using a
33proof(nominal_induct avoiding: y c P rule: c_redu.strong_induct)
34  case (left M a N x)
35  then show ?case
36    apply -
37    apply(simp)
38    apply(rule conjI)
39    apply(force)
40    apply(auto)
41    apply(subgoal_tac "M{a:=(x).N}{y:=<c>.P} = M{y:=<c>.P}{a:=(x).(N{y:=<c>.P})}")(*A*)
42    apply(simp)
43    apply(rule c_redu.intros)
44    apply(rule not_fic_subst1)
45    apply(simp)
46    apply(simp add: subst_fresh)
47    apply(simp add: subst_fresh)
48    apply(simp add: abs_fresh fresh_atm)
49    apply(rule subst_subst2)
50    apply(simp add: fresh_prod fresh_atm)
51    apply(simp add: fresh_prod fresh_atm)
52    apply(simp add: fresh_prod fresh_atm)
53    apply(simp)
54    done
55next
56  case (right N x a M)
57  then show ?case
58    apply -
59    apply(simp)
60    apply(rule conjI)
61    (* case M = Ax y a *)
62    apply(rule impI)
63    apply(subgoal_tac "N{x:=<a>.Ax y a}{y:=<c>.P} = N{y:=<c>.P}{x:=<c>.P}")
64    apply(simp)
65    apply(rule c_redu.right)
66    apply(rule not_fin_subst2)
67    apply(simp)
68    apply(rule subst_fresh)
69    apply(simp add: abs_fresh)
70    apply(simp add: abs_fresh)
71    apply(rule sym)
72    apply(rule interesting_subst1')
73    apply(simp add: fresh_atm)
74    apply(simp)
75    apply(simp)
76    (* case M \<noteq> Ax y a*)
77    apply(rule impI)
78    apply(subgoal_tac "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}")
79    apply(simp)
80    apply(rule c_redu.right)
81    apply(rule not_fin_subst2)
82    apply(simp)
83    apply(simp add: subst_fresh)
84    apply(simp add: subst_fresh)
85    apply(simp add: abs_fresh fresh_atm)
86    apply(rule subst_subst3)
87    apply(simp_all add: fresh_atm fresh_prod)
88    done
89qed
90
91lemma c_redu_subst2:
92  assumes a: "M \<longrightarrow>\<^sub>c M'" "c\<sharp>P" "y\<sharp>M"
93  shows "M{c:=(y).P} \<longrightarrow>\<^sub>c M'{c:=(y).P}"
94using a
95proof(nominal_induct avoiding: y c P rule: c_redu.strong_induct)
96  case (right N x a M)
97  then show ?case
98    apply -
99    apply(simp)
100    apply(rule conjI)
101    apply(force)
102    apply(auto)
103    apply(subgoal_tac "N{x:=<a>.M}{c:=(y).P} = N{c:=(y).P}{x:=<a>.(M{c:=(y).P})}")(*A*)
104    apply(simp)
105    apply(rule c_redu.intros)
106    apply(rule not_fin_subst1)
107    apply(simp)
108    apply(simp add: subst_fresh)
109    apply(simp add: subst_fresh)
110    apply(simp add: abs_fresh fresh_atm)
111    apply(rule subst_subst1)
112    apply(simp add: fresh_prod fresh_atm)
113    apply(simp add: fresh_prod fresh_atm)
114    apply(simp add: fresh_prod fresh_atm)
115    apply(simp)
116    done
117next
118  case (left M a N x)
119  then show ?case
120    apply -
121    apply(simp)
122    apply(rule conjI)
123    (* case N = Ax x c *)
124    apply(rule impI)
125    apply(subgoal_tac "M{a:=(x).Ax x c}{c:=(y).P} = M{c:=(y).P}{a:=(y).P}")
126    apply(simp)
127    apply(rule c_redu.left)
128    apply(rule not_fic_subst2)
129    apply(simp)
130    apply(simp)
131    apply(rule subst_fresh)
132    apply(simp add: abs_fresh)
133    apply(rule sym)
134    apply(rule interesting_subst2')
135    apply(simp add: fresh_atm)
136    apply(simp)
137    apply(simp)
138    (* case M \<noteq> Ax y a*)
139    apply(rule impI)
140    apply(subgoal_tac "M{a:=(x).N}{c:=(y).P} = M{c:=(y).P}{a:=(x).(N{c:=(y).P})}")
141    apply(simp)
142    apply(rule c_redu.left)
143    apply(rule not_fic_subst2)
144    apply(simp)
145    apply(simp add: subst_fresh)
146    apply(simp add: subst_fresh)
147    apply(simp add: abs_fresh fresh_atm)
148    apply(rule subst_subst4)
149    apply(simp add: fresh_prod fresh_atm)
150    apply(simp add: fresh_prod fresh_atm)
151    apply(simp add: fresh_prod fresh_atm)
152    apply(simp add: fresh_prod fresh_atm)
153    apply(simp)
154    done
155qed
156
157lemma c_redu_subst1':
158  assumes a: "M \<longrightarrow>\<^sub>c M'" 
159  shows "M{y:=<c>.P} \<longrightarrow>\<^sub>c M'{y:=<c>.P}"
160using a
161proof -
162  obtain y'::"name"   where fs1: "y'\<sharp>(M,M',P,P,y)" by (rule exists_fresh(1), rule fin_supp, blast)
163  obtain c'::"coname" where fs2: "c'\<sharp>(M,M',P,P,c)" by (rule exists_fresh(2), rule fin_supp, blast)
164  have "M{y:=<c>.P} = ([(y',y)]\<bullet>M){y':=<c'>.([(c',c)]\<bullet>P)}" using fs1 fs2
165    apply -
166    apply(rule trans)
167    apply(rule_tac y="y'" in subst_rename(3))
168    apply(simp)
169    apply(rule subst_rename(4))
170    apply(simp)
171    done
172  also have "\<dots> \<longrightarrow>\<^sub>c ([(y',y)]\<bullet>M'){y':=<c'>.([(c',c)]\<bullet>P)}" using fs1 fs2
173    apply -
174    apply(rule c_redu_subst1)
175    apply(simp add: c_redu.eqvt a)
176    apply(simp_all add: fresh_left calc_atm fresh_prod)
177    done
178  also have "\<dots> = M'{y:=<c>.P}" using fs1 fs2
179    apply -
180    apply(rule sym)
181    apply(rule trans)
182    apply(rule_tac y="y'" in subst_rename(3))
183    apply(simp)
184    apply(rule subst_rename(4))
185    apply(simp)
186    done
187  finally show ?thesis by simp
188qed
189
190lemma c_redu_subst2':
191  assumes a: "M \<longrightarrow>\<^sub>c M'" 
192  shows "M{c:=(y).P} \<longrightarrow>\<^sub>c M'{c:=(y).P}"
193using a
194proof -
195  obtain y'::"name"   where fs1: "y'\<sharp>(M,M',P,P,y)" by (rule exists_fresh(1), rule fin_supp, blast)
196  obtain c'::"coname" where fs2: "c'\<sharp>(M,M',P,P,c)" by (rule exists_fresh(2), rule fin_supp, blast)
197  have "M{c:=(y).P} = ([(c',c)]\<bullet>M){c':=(y').([(y',y)]\<bullet>P)}" using fs1 fs2
198    apply -
199    apply(rule trans)
200    apply(rule_tac c="c'" in subst_rename(1))
201    apply(simp)
202    apply(rule subst_rename(2))
203    apply(simp)
204    done
205  also have "\<dots> \<longrightarrow>\<^sub>c ([(c',c)]\<bullet>M'){c':=(y').([(y',y)]\<bullet>P)}" using fs1 fs2
206    apply -
207    apply(rule c_redu_subst2)
208    apply(simp add: c_redu.eqvt a)
209    apply(simp_all add: fresh_left calc_atm fresh_prod)
210    done
211  also have "\<dots> = M'{c:=(y).P}" using fs1 fs2
212    apply -
213    apply(rule sym)
214    apply(rule trans)
215    apply(rule_tac c="c'" in subst_rename(1))
216    apply(simp)
217    apply(rule subst_rename(2))
218    apply(simp)
219    done
220
221  finally show ?thesis by simp
222qed
223
224lemma aux1:
225  assumes a: "M = M'" "M' \<longrightarrow>\<^sub>l M''"
226  shows "M \<longrightarrow>\<^sub>l M''"
227using a by simp
228  
229lemma aux2:
230  assumes a: "M \<longrightarrow>\<^sub>l M'" "M' = M''"
231  shows "M \<longrightarrow>\<^sub>l M''"
232using a by simp
233
234lemma aux3:
235  assumes a: "M = M'" "M' \<longrightarrow>\<^sub>a* M''"
236  shows "M \<longrightarrow>\<^sub>a* M''"
237using a by simp
238
239lemma aux4:
240  assumes a: "M = M'"
241  shows "M \<longrightarrow>\<^sub>a* M'"
242using a by blast
243
244lemma l_redu_subst1:
245  assumes a: "M \<longrightarrow>\<^sub>l M'" 
246  shows "M{y:=<c>.P} \<longrightarrow>\<^sub>a* M'{y:=<c>.P}"
247using a
248proof(nominal_induct M M' avoiding: y c P rule: l_redu.strong_induct)
249  case LAxR
250  then show ?case
251    apply -
252    apply(rule aux3)
253    apply(rule better_Cut_substn)
254    apply(simp add: abs_fresh)
255    apply(simp)
256    apply(simp add: fresh_atm)
257    apply(auto)
258    apply(rule aux4)
259    apply(simp add: trm.inject alpha calc_atm fresh_atm)
260    apply(rule a_star_trans)
261    apply(rule a_starI)
262    apply(rule al_redu)
263    apply(rule l_redu.intros)
264    apply(simp add: subst_fresh)
265    apply(simp add: fresh_atm)
266    apply(rule fic_subst2)
267    apply(simp_all)
268    apply(rule aux4)
269    apply(rule subst_comm')
270    apply(simp_all)
271    done
272next
273  case LAxL
274  then show ?case
275    apply -
276    apply(rule aux3)
277    apply(rule better_Cut_substn)
278    apply(simp add: abs_fresh)
279    apply(simp)
280    apply(simp add: trm.inject fresh_atm)
281    apply(auto)
282    apply(rule aux4)
283    apply(rule sym)
284    apply(rule fin_substn_nrename)
285    apply(simp_all)
286    apply(rule a_starI)
287    apply(rule al_redu)
288    apply(rule aux2)
289    apply(rule l_redu.intros)
290    apply(simp add: subst_fresh)
291    apply(simp add: fresh_atm)
292    apply(rule fin_subst1)
293    apply(simp_all)
294    apply(rule subst_comm')
295    apply(simp_all)
296    done
297next
298  case (LNot v M N u a b)
299  then show ?case
300  proof -
301    { assume asm: "N\<noteq>Ax y b"
302      have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){y:=<c>.P} = 
303        (Cut <a>.NotR (u).(M{y:=<c>.P}) a (v).NotL <b>.(N{y:=<c>.P}) v)" using LNot
304        by (simp add: subst_fresh abs_fresh fresh_atm)
305      also have "\<dots> \<longrightarrow>\<^sub>l (Cut <b>.(N{y:=<c>.P}) (u).(M{y:=<c>.P}))" using LNot
306        by (auto intro: l_redu.intros simp add: subst_fresh)
307      also have "\<dots> = (Cut <b>.N (u).M){y:=<c>.P}" using LNot asm
308        by (simp add: subst_fresh abs_fresh fresh_atm)
309      finally have ?thesis by auto
310    }
311    moreover
312    { assume asm: "N=Ax y b"
313      have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){y:=<c>.P} = 
314        (Cut <a>.NotR (u).(M{y:=<c>.P}) a (v).NotL <b>.(N{y:=<c>.P}) v)" using LNot
315        by (simp add: subst_fresh abs_fresh fresh_atm)
316      also have "\<dots> \<longrightarrow>\<^sub>a* (Cut <b>.(N{y:=<c>.P}) (u).(M{y:=<c>.P}))" using LNot
317        apply -
318        apply(rule a_starI)
319        apply(rule al_redu)
320        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
321        done
322      also have "\<dots> = (Cut <b>.(Cut <c>.P (y).Ax y b) (u).(M{y:=<c>.P}))" using LNot asm
323        by simp
324      also have "\<dots> \<longrightarrow>\<^sub>a* (Cut <b>.(P[c\<turnstile>c>b]) (u).(M{y:=<c>.P}))" 
325      proof (cases "fic P c")
326        case True 
327        assume "fic P c"
328        then show ?thesis using LNot
329          apply -
330          apply(rule a_starI)
331          apply(rule better_CutL_intro)
332          apply(rule al_redu)
333          apply(rule better_LAxR_intro)
334          apply(simp)
335          done
336      next
337        case False 
338        assume "\<not>fic P c" 
339        then show ?thesis
340          apply -
341          apply(rule a_star_CutL)
342          apply(rule a_star_trans)
343          apply(rule a_starI)
344          apply(rule ac_redu)
345          apply(rule better_left)
346          apply(simp)
347          apply(simp add: subst_with_ax2)
348          done
349      qed
350      also have "\<dots> = (Cut <b>.N (u).M){y:=<c>.P}" using LNot asm
351        apply -
352        apply(auto simp add: subst_fresh abs_fresh)
353        apply(simp add: trm.inject)
354        apply(simp add: alpha fresh_atm)
355        apply(rule sym)
356        apply(rule crename_swap)
357        apply(simp)
358        done
359      finally have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <b>.N (u).M){y:=<c>.P}" 
360        by simp
361    }
362    ultimately show ?thesis by blast
363  qed
364next
365  case (LAnd1 b a1 M1 a2 M2 N z u)
366  then show ?case
367  proof -
368    { assume asm: "M1\<noteq>Ax y a1"
369      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} = 
370        Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL1 (u).(N{y:=<c>.P}) z" 
371        using LAnd1 by (simp add: subst_fresh abs_fresh fresh_atm)
372      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a1>.(M1{y:=<c>.P}) (u).(N{y:=<c>.P})"
373        using LAnd1
374        apply -
375        apply(rule a_starI)
376        apply(rule al_redu)
377        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
378        done
379      also have "\<dots> = (Cut <a1>.M1 (u).N){y:=<c>.P}" using LAnd1 asm
380        by (simp add: subst_fresh abs_fresh fresh_atm)
381      finally 
382      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a1>.M1 (u).N){y:=<c>.P}"
383        by simp
384    } 
385    moreover
386    { assume asm: "M1=Ax y a1"
387      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} = 
388        Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL1 (u).(N{y:=<c>.P}) z" 
389        using LAnd1 by (simp add: subst_fresh abs_fresh fresh_atm)
390      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a1>.(M1{y:=<c>.P}) (u).(N{y:=<c>.P})"
391        using LAnd1
392        apply -
393        apply(rule a_starI)
394        apply(rule al_redu)
395        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
396        done
397      also have "\<dots> = Cut <a1>.(Cut <c>.P (y). Ax y a1) (u).(N{y:=<c>.P})" 
398        using LAnd1 asm by simp
399      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a1>.P[c\<turnstile>c>a1] (u).(N{y:=<c>.P})"
400      proof (cases "fic P c")
401        case True 
402        assume "fic P c"
403        then show ?thesis using LAnd1
404          apply -
405          apply(rule a_starI)
406          apply(rule better_CutL_intro)
407          apply(rule al_redu)
408          apply(rule better_LAxR_intro)
409          apply(simp)
410          done
411      next
412        case False 
413        assume "\<not>fic P c" 
414        then show ?thesis
415          apply -
416          apply(rule a_star_CutL)
417          apply(rule a_star_trans)
418          apply(rule a_starI)
419          apply(rule ac_redu)
420          apply(rule better_left)
421          apply(simp)
422          apply(simp add: subst_with_ax2)
423          done
424      qed
425      also have "\<dots> = (Cut <a1>.M1 (u).N){y:=<c>.P}" using LAnd1 asm
426        apply -
427        apply(auto simp add: subst_fresh abs_fresh)
428        apply(simp add: trm.inject)
429        apply(simp add: alpha fresh_atm)
430        apply(rule sym)
431        apply(rule crename_swap)
432        apply(simp)
433        done
434      finally 
435      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a1>.M1 (u).N){y:=<c>.P}"
436        by simp
437    }
438    ultimately show ?thesis by blast
439  qed
440next
441  case (LAnd2 b a1 M1 a2 M2 N z u)
442  then show ?case
443  proof -
444    { assume asm: "M2\<noteq>Ax y a2"
445      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} = 
446        Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL2 (u).(N{y:=<c>.P}) z" 
447        using LAnd2 by (simp add: subst_fresh abs_fresh fresh_atm)
448      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a2>.(M2{y:=<c>.P}) (u).(N{y:=<c>.P})"
449        using LAnd2
450        apply -
451        apply(rule a_starI)
452        apply(rule al_redu)
453        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
454        done
455      also have "\<dots> = (Cut <a2>.M2 (u).N){y:=<c>.P}" using LAnd2 asm
456        by (simp add: subst_fresh abs_fresh fresh_atm)
457      finally 
458      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a2>.M2 (u).N){y:=<c>.P}"
459        by simp
460    } 
461    moreover
462    { assume asm: "M2=Ax y a2"
463      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} = 
464        Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL2 (u).(N{y:=<c>.P}) z" 
465        using LAnd2 by (simp add: subst_fresh abs_fresh fresh_atm)
466      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a2>.(M2{y:=<c>.P}) (u).(N{y:=<c>.P})"
467        using LAnd2
468        apply -
469        apply(rule a_starI)
470        apply(rule al_redu)
471        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
472        done
473      also have "\<dots> = Cut <a2>.(Cut <c>.P (y). Ax y a2) (u).(N{y:=<c>.P})" 
474        using LAnd2 asm by simp
475      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a2>.P[c\<turnstile>c>a2] (u).(N{y:=<c>.P})"
476      proof (cases "fic P c")
477        case True 
478        assume "fic P c"
479        then show ?thesis using LAnd2 asm
480          apply -
481          apply(rule a_starI)
482          apply(rule better_CutL_intro)
483          apply(rule al_redu)
484          apply(rule better_LAxR_intro)
485          apply(simp)
486          done
487      next
488        case False 
489        assume "\<not>fic P c" 
490        then show ?thesis
491          apply -
492          apply(rule a_star_CutL)
493          apply(rule a_star_trans)
494          apply(rule a_starI)
495          apply(rule ac_redu)
496          apply(rule better_left)
497          apply(simp)
498          apply(simp add: subst_with_ax2)
499          done
500      qed
501      also have "\<dots> = (Cut <a2>.M2 (u).N){y:=<c>.P}" using LAnd2 asm
502        apply -
503        apply(auto simp add: subst_fresh abs_fresh)
504        apply(simp add: trm.inject)
505        apply(simp add: alpha fresh_atm)
506        apply(rule sym)
507        apply(rule crename_swap)
508        apply(simp)
509        done
510      finally 
511      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a2>.M2 (u).N){y:=<c>.P}"
512        by simp
513    }
514    ultimately show ?thesis by blast
515  qed
516next
517  case (LOr1 b a M N1 N2 z x1 x2 y c P)
518  then show ?case
519  proof -
520    { assume asm: "M\<noteq>Ax y a"
521      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = 
522        Cut <b>.OrR1 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" 
523        using LOr1 by (simp add: subst_fresh abs_fresh fresh_atm)
524      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{y:=<c>.P}) (x1).(N1{y:=<c>.P})"
525        using LOr1
526        apply -
527        apply(rule a_starI)
528        apply(rule al_redu)
529        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
530        done
531      also have "\<dots> = (Cut <a>.M (x1).N1){y:=<c>.P}" using LOr1 asm
532        by (simp add: subst_fresh abs_fresh fresh_atm)
533      finally 
534      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x1).N1){y:=<c>.P}"
535        by simp
536    } 
537    moreover
538    { assume asm: "M=Ax y a"
539      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = 
540        Cut <b>.OrR1 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" 
541        using LOr1 by (simp add: subst_fresh abs_fresh fresh_atm)
542      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{y:=<c>.P}) (x1).(N1{y:=<c>.P})"
543        using LOr1
544        apply -
545        apply(rule a_starI)
546        apply(rule al_redu)
547        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
548        done
549      also have "\<dots> = Cut <a>.(Cut <c>.P (y). Ax y a) (x1).(N1{y:=<c>.P})" 
550        using LOr1 asm by simp
551      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.P[c\<turnstile>c>a] (x1).(N1{y:=<c>.P})"
552      proof (cases "fic P c")
553        case True 
554        assume "fic P c"
555        then show ?thesis using LOr1
556          apply -
557          apply(rule a_starI)
558          apply(rule better_CutL_intro)
559          apply(rule al_redu)
560          apply(rule better_LAxR_intro)
561          apply(simp)
562          done
563      next
564        case False 
565        assume "\<not>fic P c" 
566        then show ?thesis
567          apply -
568          apply(rule a_star_CutL)
569          apply(rule a_star_trans)
570          apply(rule a_starI)
571          apply(rule ac_redu)
572          apply(rule better_left)
573          apply(simp)
574          apply(simp add: subst_with_ax2)
575          done
576      qed
577      also have "\<dots> = (Cut <a>.M (x1).N1){y:=<c>.P}" using LOr1 asm
578        apply -
579        apply(auto simp add: subst_fresh abs_fresh)
580        apply(simp add: trm.inject)
581        apply(simp add: alpha fresh_atm)
582        apply(rule sym)
583        apply(rule crename_swap)
584        apply(simp)
585        done
586      finally 
587      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x1).N1){y:=<c>.P}"
588        by simp
589    }
590    ultimately show ?thesis by blast
591  qed
592next
593  case (LOr2 b a M N1 N2 z x1 x2 y c P)
594  then show ?case
595  proof -
596    { assume asm: "M\<noteq>Ax y a"
597      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = 
598        Cut <b>.OrR2 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" 
599        using LOr2 by (simp add: subst_fresh abs_fresh fresh_atm)
600      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{y:=<c>.P}) (x2).(N2{y:=<c>.P})"
601        using LOr2
602        apply -
603        apply(rule a_starI)
604        apply(rule al_redu)
605        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
606        done
607      also have "\<dots> = (Cut <a>.M (x2).N2){y:=<c>.P}" using LOr2 asm
608        by (simp add: subst_fresh abs_fresh fresh_atm)
609      finally 
610      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x2).N2){y:=<c>.P}"
611        by simp
612    } 
613    moreover
614    { assume asm: "M=Ax y a"
615      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = 
616        Cut <b>.OrR2 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" 
617        using LOr2 by (simp add: subst_fresh abs_fresh fresh_atm)
618      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{y:=<c>.P}) (x2).(N2{y:=<c>.P})"
619        using LOr2
620        apply -
621        apply(rule a_starI)
622        apply(rule al_redu)
623        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
624        done
625      also have "\<dots> = Cut <a>.(Cut <c>.P (y). Ax y a) (x2).(N2{y:=<c>.P})" 
626        using LOr2 asm by simp
627      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.P[c\<turnstile>c>a] (x2).(N2{y:=<c>.P})"
628      proof (cases "fic P c")
629        case True 
630        assume "fic P c"
631        then show ?thesis using LOr2
632          apply -
633          apply(rule a_starI)
634          apply(rule better_CutL_intro)
635          apply(rule al_redu)
636          apply(rule better_LAxR_intro)
637          apply(simp)
638          done
639      next
640        case False 
641        assume "\<not>fic P c" 
642        then show ?thesis
643          apply -
644          apply(rule a_star_CutL)
645          apply(rule a_star_trans)
646          apply(rule a_starI)
647          apply(rule ac_redu)
648          apply(rule better_left)
649          apply(simp)
650          apply(simp add: subst_with_ax2)
651          done
652      qed
653      also have "\<dots> = (Cut <a>.M (x2).N2){y:=<c>.P}" using LOr2 asm
654        apply -
655        apply(auto simp add: subst_fresh abs_fresh)
656        apply(simp add: trm.inject)
657        apply(simp add: alpha fresh_atm)
658        apply(rule sym)
659        apply(rule crename_swap)
660        apply(simp)
661        done
662      finally 
663      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x2).N2){y:=<c>.P}"
664        by simp
665    }
666    ultimately show ?thesis by blast
667  qed
668next
669  case (LImp z N u Q x M b a d y c P)
670  then show ?case
671  proof -
672    { assume asm: "N\<noteq>Ax y d"
673      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} = 
674        Cut <b>.ImpR (x).<a>.(M{y:=<c>.P}) b (z).ImpL <d>.(N{y:=<c>.P}) (u).(Q{y:=<c>.P}) z" 
675        using LImp by (simp add: fresh_prod abs_fresh fresh_atm)
676      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{y:=<c>.P})  (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})"
677        using LImp
678        apply -
679        apply(rule a_starI)
680        apply(rule al_redu)
681        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
682        done
683      also have "\<dots> = (Cut <a>.(Cut <d>.N  (x).M) (u).Q){y:=<c>.P}" using LImp asm
684        by (simp add: subst_fresh abs_fresh fresh_atm)
685      finally 
686      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} \<longrightarrow>\<^sub>a* 
687                     (Cut <a>.(Cut <d>.N  (x).M) (u).Q){y:=<c>.P}"
688        by simp
689    } 
690    moreover
691    { assume asm: "N=Ax y d"
692      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} = 
693        Cut <b>.ImpR (x).<a>.(M{y:=<c>.P}) b (z).ImpL <d>.(N{y:=<c>.P}) (u).(Q{y:=<c>.P}) z" 
694        using LImp by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod)
695      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{y:=<c>.P})  (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})"
696        using LImp
697        apply -
698        apply(rule a_starI)
699        apply(rule al_redu)
700        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
701        done
702      also have "\<dots> = Cut <a>.(Cut <d>.(Cut <c>.P (y).Ax y d)  (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})"
703        using LImp asm by simp
704      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(P[c\<turnstile>c>d]) (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})"
705      proof (cases "fic P c")
706        case True 
707        assume "fic P c"
708        then show ?thesis using LImp
709          apply -
710          apply(rule a_starI)
711          apply(rule better_CutL_intro)
712          apply(rule a_Cut_l)
713          apply(simp add: subst_fresh abs_fresh)
714          apply(simp add: abs_fresh fresh_atm)
715          apply(rule al_redu)
716          apply(rule better_LAxR_intro)
717          apply(simp)
718          done
719      next
720        case False 
721        assume "\<not>fic P c" 
722        then show ?thesis using LImp
723          apply -
724          apply(rule a_star_CutL)
725          apply(rule a_star_CutL)
726          apply(rule a_star_trans)
727          apply(rule a_starI)
728          apply(rule ac_redu)
729          apply(rule better_left)
730          apply(simp)
731          apply(simp add: subst_with_ax2)
732          done
733      qed
734      also have "\<dots> = (Cut <a>.(Cut <d>.N (x).M) (u).Q){y:=<c>.P}" using LImp asm
735        apply -
736        apply(auto simp add: subst_fresh abs_fresh)
737        apply(simp add: trm.inject)
738        apply(simp add: alpha fresh_atm)
739        apply(simp add: trm.inject)
740        apply(simp add: alpha)
741        apply(rule sym)
742        apply(rule crename_swap)
743        apply(simp)
744        done
745      finally 
746      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} \<longrightarrow>\<^sub>a* 
747               (Cut <a>.(Cut <d>.N (x).M) (u).Q){y:=<c>.P}"
748        by simp
749    }
750    ultimately show ?thesis by blast
751  qed
752qed
753
754lemma l_redu_subst2:
755  assumes a: "M \<longrightarrow>\<^sub>l M'" 
756  shows "M{c:=(y).P} \<longrightarrow>\<^sub>a* M'{c:=(y).P}"
757using a
758proof(nominal_induct M M' avoiding: y c P rule: l_redu.strong_induct)
759  case LAxR
760  then show ?case
761    apply -
762    apply(rule aux3)
763    apply(rule better_Cut_substc)
764    apply(simp add: abs_fresh)
765    apply(simp add: abs_fresh)
766    apply(simp add: trm.inject fresh_atm)
767    apply(auto)
768    apply(rule aux4)
769    apply(rule sym)
770    apply(rule fic_substc_crename)
771    apply(simp_all)
772    apply(rule a_starI)
773    apply(rule al_redu)
774    apply(rule aux2)
775    apply(rule l_redu.intros)
776    apply(simp add: subst_fresh)
777    apply(simp add: fresh_atm)
778    apply(rule fic_subst1)
779    apply(simp_all)
780    apply(rule subst_comm')
781    apply(simp_all)
782    done
783next
784  case LAxL
785  then show ?case
786    apply -
787    apply(rule aux3)
788    apply(rule better_Cut_substc)
789    apply(simp)
790    apply(simp add: abs_fresh)
791    apply(simp add: fresh_atm)
792    apply(auto)
793    apply(rule aux4)
794    apply(simp add: trm.inject alpha calc_atm fresh_atm)
795    apply(rule a_star_trans)
796    apply(rule a_starI)
797    apply(rule al_redu)
798    apply(rule l_redu.intros)
799    apply(simp add: subst_fresh)
800    apply(simp add: fresh_atm)
801    apply(rule fin_subst2)
802    apply(simp_all)
803    apply(rule aux4)
804    apply(rule subst_comm')
805    apply(simp_all)
806    done
807next
808  case (LNot v M N u a b)
809  then show ?case
810  proof -
811    { assume asm: "M\<noteq>Ax u c"
812      have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){c:=(y).P} = 
813        (Cut <a>.NotR (u).(M{c:=(y).P}) a (v).NotL <b>.(N{c:=(y).P}) v)" using LNot
814        by (simp add: subst_fresh abs_fresh fresh_atm)
815      also have "\<dots> \<longrightarrow>\<^sub>l (Cut <b>.(N{c:=(y).P}) (u).(M{c:=(y).P}))" using LNot
816        by (auto intro: l_redu.intros simp add: subst_fresh)
817      also have "\<dots> = (Cut <b>.N (u).M){c:=(y).P}" using LNot asm
818        by (simp add: subst_fresh abs_fresh fresh_atm)
819      finally have ?thesis by auto
820    }
821    moreover
822    { assume asm: "M=Ax u c"
823      have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){c:=(y).P} = 
824        (Cut <a>.NotR (u).(M{c:=(y).P}) a (v).NotL <b>.(N{c:=(y).P}) v)" using LNot
825        by (simp add: subst_fresh abs_fresh fresh_atm)
826      also have "\<dots> \<longrightarrow>\<^sub>a* (Cut <b>.(N{c:=(y).P}) (u).(M{c:=(y).P}))" using LNot
827        apply -
828        apply(rule a_starI)
829        apply(rule al_redu)
830        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
831        done
832      also have "\<dots> = (Cut <b>.(N{c:=(y).P}) (u).(Cut <c>.(Ax u c) (y).P))" using LNot asm
833        by simp
834      also have "\<dots> \<longrightarrow>\<^sub>a* (Cut <b>.(N{c:=(y).P})  (u).(P[y\<turnstile>n>u]))" 
835      proof (cases "fin P y")
836        case True 
837        assume "fin P y"
838        then show ?thesis using LNot
839          apply -
840          apply(rule a_starI)
841          apply(rule better_CutR_intro)
842          apply(rule al_redu)
843          apply(rule better_LAxL_intro)
844          apply(simp)
845          done
846      next
847        case False 
848        assume "\<not>fin P y" 
849        then show ?thesis
850          apply -
851          apply(rule a_star_CutR)
852          apply(rule a_star_trans)
853          apply(rule a_starI)
854          apply(rule ac_redu)
855          apply(rule better_right)
856          apply(simp)
857          apply(simp add: subst_with_ax1)
858          done
859      qed
860      also have "\<dots> = (Cut <b>.N (u).M){c:=(y).P}" using LNot asm
861        apply -
862        apply(auto simp add: subst_fresh abs_fresh)
863        apply(simp add: trm.inject)
864        apply(simp add: alpha fresh_atm)
865        apply(rule sym)
866        apply(rule nrename_swap)
867        apply(simp)
868        done
869      finally have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <b>.N (u).M){c:=(y).P}" 
870        by simp
871    }
872    ultimately show ?thesis by blast
873  qed
874next
875  case (LAnd1 b a1 M1 a2 M2 N z u)
876  then show ?case
877  proof -
878    { assume asm: "N\<noteq>Ax u c"
879      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} = 
880        Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL1 (u).(N{c:=(y).P}) z" 
881        using LAnd1 by (simp add: subst_fresh abs_fresh fresh_atm)
882      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a1>.(M1{c:=(y).P}) (u).(N{c:=(y).P})"
883        using LAnd1
884        apply -
885        apply(rule a_starI)
886        apply(rule al_redu)
887        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
888        done
889      also have "\<dots> = (Cut <a1>.M1 (u).N){c:=(y).P}" using LAnd1 asm
890        by (simp add: subst_fresh abs_fresh fresh_atm)
891      finally 
892      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a1>.M1 (u).N){c:=(y).P}"
893        by simp
894    } 
895    moreover
896    { assume asm: "N=Ax u c"
897      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} = 
898        Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL1 (u).(N{c:=(y).P}) z" 
899        using LAnd1 by (simp add: subst_fresh abs_fresh fresh_atm)
900      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a1>.(M1{c:=(y).P}) (u).(N{c:=(y).P})"
901        using LAnd1
902        apply -
903        apply(rule a_starI)
904        apply(rule al_redu)
905        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
906        done
907      also have "\<dots> = Cut <a1>.(M1{c:=(y).P}) (u).(Cut <c>.(Ax u c) (y).P)" 
908        using LAnd1 asm by simp
909      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a1>.(M1{c:=(y).P}) (u).(P[y\<turnstile>n>u])"
910      proof (cases "fin P y")
911        case True 
912        assume "fin P y"
913        then show ?thesis using LAnd1
914          apply -
915          apply(rule a_starI)
916          apply(rule better_CutR_intro)
917          apply(rule al_redu)
918          apply(rule better_LAxL_intro)
919          apply(simp)
920          done
921      next
922        case False 
923        assume "\<not>fin P y" 
924        then show ?thesis
925          apply -
926          apply(rule a_star_CutR)
927          apply(rule a_star_trans)
928          apply(rule a_starI)
929          apply(rule ac_redu)
930          apply(rule better_right)
931          apply(simp)
932          apply(simp add: subst_with_ax1)
933          done
934      qed
935      also have "\<dots> = (Cut <a1>.M1 (u).N){c:=(y).P}" using LAnd1 asm
936        apply -
937        apply(auto simp add: subst_fresh abs_fresh)
938        apply(simp add: trm.inject)
939        apply(simp add: alpha fresh_atm)
940        apply(rule sym)
941        apply(rule nrename_swap)
942        apply(simp)
943        done
944      finally 
945      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a1>.M1 (u).N){c:=(y).P}"
946        by simp
947    }
948    ultimately show ?thesis by blast
949  qed
950next
951  case (LAnd2 b a1 M1 a2 M2 N z u)
952  then show ?case
953  proof -
954    { assume asm: "N\<noteq>Ax u c"
955      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} = 
956        Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL2 (u).(N{c:=(y).P}) z" 
957        using LAnd2 by (simp add: subst_fresh abs_fresh fresh_atm)
958      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a2>.(M2{c:=(y).P}) (u).(N{c:=(y).P})"
959        using LAnd2
960        apply -
961        apply(rule a_starI)
962        apply(rule al_redu)
963        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
964        done
965      also have "\<dots> = (Cut <a2>.M2 (u).N){c:=(y).P}" using LAnd2 asm
966        by (simp add: subst_fresh abs_fresh fresh_atm)
967      finally 
968      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a2>.M2 (u).N){c:=(y).P}"
969        by simp
970    } 
971    moreover
972    { assume asm: "N=Ax u c"
973      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} = 
974        Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL2 (u).(N{c:=(y).P}) z" 
975        using LAnd2 by (simp add: subst_fresh abs_fresh fresh_atm)
976      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a2>.(M2{c:=(y).P}) (u).(N{c:=(y).P})"
977        using LAnd2
978        apply -
979        apply(rule a_starI)
980        apply(rule al_redu)
981        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
982        done
983      also have "\<dots> = Cut <a2>.(M2{c:=(y).P}) (u).(Cut <c>.(Ax u c) (y).P)" 
984        using LAnd2 asm by simp
985      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a2>.(M2{c:=(y).P}) (u).(P[y\<turnstile>n>u])"
986      proof (cases "fin P y")
987        case True 
988        assume "fin P y"
989        then show ?thesis using LAnd2
990          apply -
991          apply(rule a_starI)
992          apply(rule better_CutR_intro)
993          apply(rule al_redu)
994          apply(rule better_LAxL_intro)
995          apply(simp)
996          done
997      next
998        case False 
999        assume "\<not>fin P y" 
1000        then show ?thesis
1001          apply -
1002          apply(rule a_star_CutR)
1003          apply(rule a_star_trans)
1004          apply(rule a_starI)
1005          apply(rule ac_redu)
1006          apply(rule better_right)
1007          apply(simp)
1008          apply(simp add: subst_with_ax1)
1009          done
1010      qed
1011      also have "\<dots> = (Cut <a2>.M2 (u).N){c:=(y).P}" using LAnd2 asm
1012        apply -
1013        apply(auto simp add: subst_fresh abs_fresh)
1014        apply(simp add: trm.inject)
1015        apply(simp add: alpha fresh_atm)
1016        apply(rule sym)
1017        apply(rule nrename_swap)
1018        apply(simp)
1019        done
1020      finally 
1021      have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a2>.M2 (u).N){c:=(y).P}"
1022        by simp
1023    }
1024    ultimately show ?thesis by blast
1025  qed
1026next
1027  case (LOr1 b a M N1 N2 z x1 x2 y c P)
1028  then show ?case
1029  proof -
1030    { assume asm: "N1\<noteq>Ax x1 c"
1031      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = 
1032        Cut <b>.OrR1 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" 
1033        using LOr1 by (simp add: subst_fresh abs_fresh fresh_atm)
1034      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{c:=(y).P}) (x1).(N1{c:=(y).P})"
1035        using LOr1
1036        apply -
1037        apply(rule a_starI)
1038        apply(rule al_redu)
1039        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1040        done
1041      also have "\<dots> = (Cut <a>.M (x1).N1){c:=(y).P}" using LOr1 asm
1042        by (simp add: subst_fresh abs_fresh fresh_atm)
1043      finally 
1044      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x1).N1){c:=(y).P}"
1045        by simp
1046    } 
1047    moreover
1048    { assume asm: "N1=Ax x1 c"
1049      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = 
1050        Cut <b>.OrR1 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" 
1051        using LOr1 by (simp add: subst_fresh abs_fresh fresh_atm)
1052      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{c:=(y).P}) (x1).(N1{c:=(y).P})"
1053        using LOr1
1054        apply -
1055        apply(rule a_starI)
1056        apply(rule al_redu)
1057        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1058        done
1059      also have "\<dots> = Cut <a>.(M{c:=(y).P}) (x1).(Cut <c>.(Ax x1 c) (y).P)" 
1060        using LOr1 asm by simp
1061      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{c:=(y).P})   (x1).(P[y\<turnstile>n>x1])"
1062      proof (cases "fin P y")
1063        case True 
1064        assume "fin P y"
1065        then show ?thesis using LOr1
1066          apply -
1067          apply(rule a_starI)
1068          apply(rule better_CutR_intro)
1069          apply(rule al_redu)
1070          apply(rule better_LAxL_intro)
1071          apply(simp)
1072          done
1073      next
1074        case False 
1075        assume "\<not>fin P y" 
1076        then show ?thesis
1077          apply -
1078          apply(rule a_star_CutR)
1079          apply(rule a_star_trans)
1080          apply(rule a_starI)
1081          apply(rule ac_redu)
1082          apply(rule better_right)
1083          apply(simp)
1084          apply(simp add: subst_with_ax1)
1085          done
1086      qed
1087      also have "\<dots> = (Cut <a>.M (x1).N1){c:=(y).P}" using LOr1 asm
1088        apply -
1089        apply(auto simp add: subst_fresh abs_fresh)
1090        apply(simp add: trm.inject)
1091        apply(simp add: alpha fresh_atm)
1092        apply(rule sym)
1093        apply(rule nrename_swap)
1094        apply(simp)
1095        done
1096      finally 
1097      have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x1).N1){c:=(y).P}"
1098        by simp
1099    }
1100    ultimately show ?thesis by blast
1101  qed
1102next
1103  case (LOr2 b a M N1 N2 z x1 x2 y c P)
1104  then show ?case
1105  proof -
1106    { assume asm: "N2\<noteq>Ax x2 c"
1107      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = 
1108        Cut <b>.OrR2 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" 
1109        using LOr2 by (simp add: subst_fresh abs_fresh fresh_atm)
1110      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{c:=(y).P}) (x2).(N2{c:=(y).P})"
1111        using LOr2
1112        apply -
1113        apply(rule a_starI)
1114        apply(rule al_redu)
1115        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1116        done
1117      also have "\<dots> = (Cut <a>.M (x2).N2){c:=(y).P}" using LOr2 asm
1118        by (simp add: subst_fresh abs_fresh fresh_atm)
1119      finally 
1120      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x2).N2){c:=(y).P}"
1121        by simp
1122    } 
1123    moreover
1124    { assume asm: "N2=Ax x2 c"
1125      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = 
1126        Cut <b>.OrR2 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" 
1127        using LOr2 by (simp add: subst_fresh abs_fresh fresh_atm)
1128      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{c:=(y).P}) (x2).(N2{c:=(y).P})"
1129        using LOr2
1130        apply -
1131        apply(rule a_starI)
1132        apply(rule al_redu)
1133        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1134        done
1135      also have "\<dots> = Cut <a>.(M{c:=(y).P}) (x2).(Cut <c>.(Ax x2 c) (y).P)" 
1136        using LOr2 asm by simp
1137      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(M{c:=(y).P}) (x2).(P[y\<turnstile>n>x2])"
1138      proof (cases "fin P y")
1139        case True 
1140        assume "fin P y"
1141        then show ?thesis using LOr2
1142          apply -
1143          apply(rule a_starI)
1144          apply(rule better_CutR_intro)
1145          apply(rule al_redu)
1146          apply(rule better_LAxL_intro)
1147          apply(simp)
1148          done
1149      next
1150        case False 
1151        assume "\<not>fin P y" 
1152        then show ?thesis
1153          apply -
1154          apply(rule a_star_CutR)
1155          apply(rule a_star_trans)
1156          apply(rule a_starI)
1157          apply(rule ac_redu)
1158          apply(rule better_right)
1159          apply(simp)
1160          apply(simp add: subst_with_ax1)
1161          done
1162      qed
1163      also have "\<dots> = (Cut <a>.M (x2).N2){c:=(y).P}" using LOr2 asm
1164        apply -
1165        apply(auto simp add: subst_fresh abs_fresh)
1166        apply(simp add: trm.inject)
1167        apply(simp add: alpha fresh_atm)
1168        apply(rule sym)
1169        apply(rule nrename_swap)
1170        apply(simp)
1171        done
1172      finally 
1173      have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} \<longrightarrow>\<^sub>a* (Cut <a>.M (x2).N2){c:=(y).P}"
1174        by simp
1175    }
1176    ultimately show ?thesis by blast
1177  qed
1178next
1179  case (LImp z N u Q x M b a d y c P)
1180  then show ?case
1181  proof -
1182    { assume asm: "M\<noteq>Ax x c \<and> Q\<noteq>Ax u c"
1183      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = 
1184        Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" 
1185        using LImp by (simp add: fresh_prod abs_fresh fresh_atm)
1186      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})"
1187        using LImp
1188        apply -
1189        apply(rule a_starI)
1190        apply(rule al_redu)
1191        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1192        done
1193      also have "\<dots> = (Cut <a>.(Cut <d>.N  (x).M) (u).Q){c:=(y).P}" using LImp asm
1194        by (simp add: subst_fresh abs_fresh fresh_atm)
1195      finally 
1196      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} \<longrightarrow>\<^sub>a* 
1197                     (Cut <a>.(Cut <d>.N  (x).M) (u).Q){c:=(y).P}"
1198        by simp
1199    } 
1200    moreover
1201    { assume asm: "M=Ax x c \<and> Q\<noteq>Ax u c"
1202      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = 
1203        Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" 
1204        using LImp by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod)
1205      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})"
1206        using LImp
1207        apply -
1208        apply(rule a_starI)
1209        apply(rule al_redu)
1210        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1211        done
1212      also have "\<dots> = Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(Cut <c>.Ax x c (y).P)) (u).(Q{c:=(y).P})"
1213        using LImp asm by simp
1214      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(P[y\<turnstile>n>x])) (u).(Q{c:=(y).P})"
1215      proof (cases "fin P y")
1216        case True 
1217        assume "fin P y"
1218        then show ?thesis using LImp
1219          apply -
1220          apply(rule a_star_CutL)
1221          apply(rule a_star_CutR)
1222          apply(rule a_star_trans)
1223          apply(rule a_starI)
1224          apply(rule al_redu)
1225          apply(rule better_LAxL_intro)
1226          apply(simp)
1227          apply(simp)
1228          done
1229      next
1230        case False 
1231        assume "\<not>fin P y" 
1232        then show ?thesis using LImp
1233          apply -
1234          apply(rule a_star_CutL)
1235          apply(rule a_star_CutR)
1236          apply(rule a_star_trans)
1237          apply(rule a_starI)
1238          apply(rule ac_redu)
1239          apply(rule better_right)
1240          apply(simp)
1241          apply(simp add: subst_with_ax1)
1242          done
1243      qed
1244      also have "\<dots> = (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" using LImp asm
1245        apply -
1246        apply(auto simp add: subst_fresh abs_fresh)
1247        apply(simp add: trm.inject)
1248        apply(simp add: alpha fresh_atm)
1249        apply(simp add: trm.inject)
1250        apply(simp add: alpha)
1251        apply(simp add: nrename_swap)
1252        done
1253      finally 
1254      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} \<longrightarrow>\<^sub>a* 
1255               (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}"
1256        by simp
1257    }
1258     moreover
1259    { assume asm: "M\<noteq>Ax x c \<and> Q=Ax u c"
1260      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = 
1261        Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" 
1262        using LImp by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod)
1263      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})"
1264        using LImp
1265        apply -
1266        apply(rule a_starI)
1267        apply(rule al_redu)
1268        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1269        done
1270      also have "\<dots> = Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(M{c:=(y).P})) (u).(Cut <c>.Ax u c (y).P)"
1271        using LImp asm by simp
1272      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(M{c:=(y).P})) (u).(P[y\<turnstile>n>u])"
1273      proof (cases "fin P y")
1274        case True 
1275        assume "fin P y"
1276        then show ?thesis using LImp
1277          apply -
1278          apply(rule a_star_CutR)
1279          apply(rule a_starI)
1280          apply(rule al_redu)
1281          apply(rule better_LAxL_intro)
1282          apply(simp)
1283          done
1284      next
1285        case False 
1286        assume "\<not>fin P y" 
1287        then show ?thesis using LImp
1288          apply -
1289          apply(rule a_star_CutR)
1290          apply(rule a_star_trans)
1291          apply(rule a_starI)
1292          apply(rule ac_redu)
1293          apply(rule better_right)
1294          apply(simp)
1295          apply(simp add: subst_with_ax1)
1296          done
1297      qed
1298      also have "\<dots> = (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" using LImp asm
1299        apply -
1300        apply(auto simp add: subst_fresh abs_fresh)
1301        apply(simp add: trm.inject)
1302        apply(simp add: alpha fresh_atm)
1303        apply(simp add: nrename_swap)
1304        done
1305      finally 
1306      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} \<longrightarrow>\<^sub>a* 
1307               (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}"
1308        by simp
1309    }
1310     moreover
1311    { assume asm: "M=Ax x c \<and> Q=Ax u c"
1312      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = 
1313        Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" 
1314        using LImp by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod)
1315      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})"
1316        using LImp
1317        apply -
1318        apply(rule a_starI)
1319        apply(rule al_redu)
1320        apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh)
1321        done
1322      also have "\<dots> = Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(Cut <c>.Ax x c (y).P)) (u).(Cut <c>.Ax u c (y).P)"
1323        using LImp asm by simp
1324      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(Cut <c>.Ax x c (y).P)) (u).(P[y\<turnstile>n>u])"
1325      proof (cases "fin P y")
1326        case True 
1327        assume "fin P y"
1328        then show ?thesis using LImp
1329          apply -
1330          apply(rule a_star_CutR)
1331          apply(rule a_starI)
1332          apply(rule al_redu)
1333          apply(rule better_LAxL_intro)
1334          apply(simp)
1335          done
1336      next
1337        case False 
1338        assume "\<not>fin P y" 
1339        then show ?thesis using LImp
1340          apply -
1341          apply(rule a_star_CutR)
1342          apply(rule a_star_trans)
1343          apply(rule a_starI)
1344          apply(rule ac_redu)
1345          apply(rule better_right)
1346          apply(simp)
1347          apply(simp add: subst_with_ax1)
1348          done
1349      qed
1350      also have "\<dots> \<longrightarrow>\<^sub>a* Cut <a>.(Cut <d>.(N{c:=(y).P})  (x).(P[y\<turnstile>n>x])) (u).(P[y\<turnstile>n>u])"
1351      proof (cases "fin P y")
1352        case True 
1353        assume "fin P y"
1354        then show ?thesis using LImp
1355          apply -
1356          apply(rule a_star_CutL)
1357          apply(rule a_star_CutR)
1358          apply(rule a_starI)
1359          apply(rule al_redu)
1360          apply(rule better_LAxL_intro)
1361          apply(simp)
1362          done
1363      next
1364        case False 
1365        assume "\<not>fin P y" 
1366        then show ?thesis using LImp
1367          apply -
1368          apply(rule a_star_CutL)
1369          apply(rule a_star_CutR)
1370          apply(rule a_star_trans)
1371          apply(rule a_starI)
1372          apply(rule ac_redu)
1373          apply(rule better_right)
1374          apply(simp)
1375          apply(simp add: subst_with_ax1)
1376          done
1377      qed
1378      also have "\<dots> = (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" using LImp asm
1379        apply -
1380        apply(auto simp add: subst_fresh abs_fresh)
1381        apply(simp add: trm.inject)
1382        apply(rule conjI)
1383        apply(simp add: alpha fresh_atm trm.inject)
1384        apply(simp add: nrename_swap)
1385        apply(simp add: alpha fresh_atm trm.inject)
1386        apply(simp add: nrename_swap)
1387        done
1388      finally 
1389      have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} \<longrightarrow>\<^sub>a* 
1390               (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}"
1391        by simp
1392    }
1393    ultimately show ?thesis by blast
1394  qed
1395qed
1396
1397lemma a_redu_subst1:
1398  assumes a: "M \<longrightarrow>\<^sub>a M'"
1399  shows "M{y:=<c>.P} \<longrightarrow>\<^sub>a* M'{y:=<c>.P}"
1400using a
1401proof(nominal_induct avoiding: y c P rule: a_redu.strong_induct)
1402  case al_redu
1403  then show ?case by (simp only: l_redu_subst1)
1404next
1405  case ac_redu
1406  then show ?case
1407    apply -
1408    apply(rule a_starI)
1409    apply(rule a_redu.ac_redu)
1410    apply(simp only: c_redu_subst1')
1411    done
1412next
1413  case (a_Cut_l a N x M M' y c P)
1414  then show ?case
1415    apply(simp add: subst_fresh fresh_a_redu)
1416    apply(rule conjI)
1417    apply(rule impI)+
1418    apply(simp)
1419    apply(drule ax_do_not_a_reduce)
1420    apply(simp)
1421    apply(rule impI)
1422    apply(rule conjI)
1423    apply(rule impI)
1424    apply(simp)
1425    apply(drule_tac x="y" in meta_spec)
1426    apply(drule_tac x="c" in meta_spec)
1427    apply(drule_tac x="P" in meta_spec)
1428    apply(simp)
1429    apply(rule a_star_trans)
1430    apply(rule a_star_CutL)
1431    apply(assumption)
1432    apply(rule a_star_trans)
1433    apply(rule_tac M'="P[c\<turnstile>c>a]" in a_star_CutL)
1434    apply(case_tac "fic P c")
1435    apply(rule a_starI)
1436    apply(rule al_redu)
1437    apply(rule better_LAxR_intro)
1438    apply(simp)
1439    apply(rule a_star_trans)
1440    apply(rule a_starI)
1441    apply(rule ac_redu)
1442    apply(rule better_left)
1443    apply(simp)
1444    apply(rule subst_with_ax2)
1445    apply(rule aux4)
1446    apply(simp add: trm.inject)
1447    apply(simp add: alpha fresh_atm)
1448    apply(simp add: crename_swap)
1449    apply(rule impI)
1450    apply(rule a_star_CutL)
1451    apply(auto)
1452    done
1453next
1454  case (a_Cut_r a N x M M' y c P)
1455  then show ?case
1456    apply(auto simp add: subst_fresh fresh_a_redu)
1457    apply(rule a_star_CutR)
1458    apply(auto)[1]
1459    apply(rule a_star_CutR)
1460    apply(auto)[1]
1461    done
1462next
1463  case a_NotL
1464  then show ?case 
1465    apply(auto)
1466    apply(generate_fresh "name")
1467    apply(fresh_fun_simp)
1468    apply(fresh_fun_simp)
1469    apply(simp add: subst_fresh)
1470    apply(rule a_star_CutR)
1471    apply(rule a_star_NotL)
1472    apply(auto)[1]
1473    apply(rule a_star_NotL)
1474    apply(auto)[1]
1475    done
1476next
1477  case a_NotR
1478  then show ?case 
1479    apply(auto)
1480    apply(rule a_star_NotR)
1481    apply(auto)[1]
1482    done
1483next
1484  case a_AndR_l
1485  then show ?case
1486    apply(auto simp add: subst_fresh fresh_a_redu)
1487    apply(rule a_star_AndR)
1488    apply(auto)
1489    done
1490next
1491  case a_AndR_r
1492  then show ?case
1493    apply(auto simp add: subst_fresh fresh_a_redu)
1494    apply(rule a_star_AndR)
1495    apply(auto)
1496    done
1497next
1498  case a_AndL1
1499  then show ?case 
1500    apply(auto)
1501    apply(generate_fresh "name")
1502    apply(fresh_fun_simp)
1503    apply(fresh_fun_simp)
1504    apply(simp add: subst_fresh)
1505    apply(rule a_star_CutR)
1506    apply(rule a_star_AndL1)
1507    apply(auto)[1]
1508    apply(rule a_star_AndL1)
1509    apply(auto)[1]
1510    done
1511next
1512  case a_AndL2
1513  then show ?case 
1514    apply(auto)
1515    apply(generate_fresh "name")
1516    apply(fresh_fun_simp)
1517    apply(fresh_fun_simp)
1518    apply(simp add: subst_fresh)
1519    apply(rule a_star_CutR)
1520    apply(rule a_star_AndL2)
1521    apply(auto)[1]
1522    apply(rule a_star_AndL2)
1523    apply(auto)[1]
1524    done
1525next
1526  case a_OrR1
1527  then show ?case
1528    apply(auto simp add: subst_fresh fresh_a_redu)
1529    apply(rule a_star_OrR1)
1530    apply(auto)
1531    done
1532next
1533  case a_OrR2
1534  then show ?case
1535    apply(auto simp add: subst_fresh fresh_a_redu)
1536    apply(rule a_star_OrR2)
1537    apply(auto)
1538    done
1539next
1540  case a_OrL_l
1541  then show ?case 
1542    apply(auto simp add: subst_fresh fresh_a_redu)
1543    apply(generate_fresh "name")
1544    apply(fresh_fun_simp)
1545    apply(fresh_fun_simp)
1546    apply(simp add: subst_fresh)
1547    apply(rule a_star_CutR)
1548    apply(rule a_star_OrL)
1549    apply(auto)
1550    apply(rule a_star_OrL)
1551    apply(auto)
1552    done
1553next
1554  case a_OrL_r
1555  then show ?case 
1556    apply(auto simp add: subst_fresh fresh_a_redu)
1557    apply(generate_fresh "name")
1558    apply(fresh_fun_simp)
1559    apply(fresh_fun_simp)
1560    apply(simp add: subst_fresh)
1561    apply(rule a_star_CutR)
1562    apply(rule a_star_OrL)
1563    apply(auto)
1564    apply(rule a_star_OrL)
1565    apply(auto)
1566    done
1567next
1568  case a_ImpR
1569  then show ?case
1570    apply(auto simp add: subst_fresh fresh_a_redu)
1571    apply(rule a_star_ImpR)
1572    apply(auto)
1573    done
1574next
1575  case a_ImpL_r
1576  then show ?case 
1577    apply(auto simp add: subst_fresh fresh_a_redu)
1578    apply(generate_fresh "name")
1579    apply(fresh_fun_simp)
1580    apply(fresh_fun_simp)
1581    apply(simp add: subst_fresh)
1582    apply(rule a_star_CutR)
1583    apply(rule a_star_ImpL)
1584    apply(auto)
1585    apply(rule a_star_ImpL)
1586    apply(auto)
1587    done
1588next
1589  case a_ImpL_l
1590  then show ?case 
1591    apply(auto simp add: subst_fresh fresh_a_redu)
1592    apply(generate_fresh "name")
1593    apply(fresh_fun_simp)
1594    apply(fresh_fun_simp)
1595    apply(simp add: subst_fresh)
1596    apply(rule a_star_CutR)
1597    apply(rule a_star_ImpL)
1598    apply(auto)
1599    apply(rule a_star_ImpL)
1600    apply(auto)
1601    done
1602qed
1603
1604lemma a_redu_subst2:
1605  assumes a: "M \<longrightarrow>\<^sub>a M'"
1606  shows "M{c:=(y).P} \<longrightarrow>\<^sub>a* M'{c:=(y).P}"
1607using a
1608proof(nominal_induct avoiding: y c P rule: a_redu.strong_induct)
1609  case al_redu
1610  then show ?case by (simp only: l_redu_subst2)
1611next
1612  case ac_redu
1613  then show ?case
1614    apply -
1615    apply(rule a_starI)
1616    apply(rule a_redu.ac_redu)
1617    apply(simp only: c_redu_subst2')
1618    done
1619next
1620  case (a_Cut_r a N x M M' y c P)
1621  then show ?case
1622    apply(simp add: subst_fresh fresh_a_redu)
1623    apply(rule conjI)
1624    apply(rule impI)+
1625    apply(simp)
1626    apply(drule ax_do_not_a_reduce)
1627    apply(simp)
1628    apply(rule impI)
1629    apply(rule conjI)
1630    apply(rule impI)
1631    apply(simp)
1632    apply(drule_tac x="c" in meta_spec)
1633    apply(drule_tac x="y" in meta_spec)
1634    apply(drule_tac x="P" in meta_spec)
1635    apply(simp)
1636    apply(rule a_star_trans)
1637    apply(rule a_star_CutR)
1638    apply(assumption)
1639    apply(rule a_star_trans)
1640    apply(rule_tac N'="P[y\<turnstile>n>x]" in a_star_CutR)
1641    apply(case_tac "fin P y")
1642    apply(rule a_starI)
1643    apply(rule al_redu)
1644    apply(rule better_LAxL_intro)
1645    apply(simp)
1646    apply(rule a_star_trans)
1647    apply(rule a_starI)
1648    apply(rule ac_redu)
1649    apply(rule better_right)
1650    apply(simp)
1651    apply(rule subst_with_ax1)
1652    apply(rule aux4)
1653    apply(simp add: trm.inject)
1654    apply(simp add: alpha fresh_atm)
1655    apply(simp add: nrename_swap)
1656    apply(rule impI)
1657    apply(rule a_star_CutR)
1658    apply(auto)
1659    done
1660next
1661  case (a_Cut_l a N x M M' y c P)
1662  then show ?case
1663    apply(auto simp add: subst_fresh fresh_a_redu)
1664    apply(rule a_star_CutL)
1665    apply(auto)[1]
1666    apply(rule a_star_CutL)
1667    apply(auto)[1]
1668    done
1669next
1670  case a_NotR
1671  then show ?case 
1672    apply(auto)
1673    apply(generate_fresh "coname")
1674    apply(fresh_fun_simp)
1675    apply(fresh_fun_simp)
1676    apply(simp add: subst_fresh)
1677    apply(rule a_star_CutL)
1678    apply(rule a_star_NotR)
1679    apply(auto)[1]
1680    apply(rule a_star_NotR)
1681    apply(auto)[1]
1682    done
1683next
1684  case a_NotL
1685  then show ?case 
1686    apply(auto)
1687    apply(rule a_star_NotL)
1688    apply(auto)[1]
1689    done
1690next
1691  case a_AndR_l
1692  then show ?case
1693    apply(auto simp add: subst_fresh fresh_a_redu)
1694    apply(generate_fresh "coname")
1695    apply(fresh_fun_simp)
1696    apply(fresh_fun_simp)
1697    apply(simp add: subst_fresh)
1698    apply(rule a_star_CutL)
1699    apply(rule a_star_AndR)
1700    apply(auto)
1701    apply(rule a_star_AndR)
1702    apply(auto)
1703    done
1704next
1705  case a_AndR_r
1706  then show ?case
1707    apply(auto simp add: subst_fresh fresh_a_redu)
1708    apply(generate_fresh "coname")
1709    apply(fresh_fun_simp)
1710    apply(fresh_fun_simp)
1711    apply(simp add: subst_fresh)
1712    apply(rule a_star_CutL)
1713    apply(rule a_star_AndR)
1714    apply(auto)
1715    apply(rule a_star_AndR)
1716    apply(auto)
1717    done
1718next
1719  case a_AndL1
1720  then show ?case
1721    apply(auto simp add: subst_fresh fresh_a_redu)
1722    apply(rule a_star_AndL1)
1723    apply(auto)
1724    done
1725next
1726  case a_AndL2
1727  then show ?case
1728    apply(auto simp add: subst_fresh fresh_a_redu)
1729    apply(rule a_star_AndL2)
1730    apply(auto)
1731    done
1732next
1733  case a_OrR1
1734  then show ?case 
1735    apply(auto)
1736    apply(generate_fresh "coname")
1737    apply(fresh_fun_simp)
1738    apply(fresh_fun_simp)
1739    apply(simp add: subst_fresh)
1740    apply(rule a_star_CutL)
1741    apply(rule a_star_OrR1)
1742    apply(auto)[1]
1743    apply(rule a_star_OrR1)
1744    apply(auto)[1]
1745    done
1746next
1747  case a_OrR2
1748  then show ?case 
1749    apply(auto)
1750    apply(generate_fresh "coname")
1751    apply(fresh_fun_simp)
1752    apply(fresh_fun_simp)
1753    apply(simp add: subst_fresh)
1754    apply(rule a_star_CutL)
1755    apply(rule a_star_OrR2)
1756    apply(auto)[1]
1757    apply(rule a_star_OrR2)
1758    apply(auto)[1]
1759    done
1760next
1761  case a_OrL_l
1762  then show ?case
1763    apply(auto simp add: subst_fresh fresh_a_redu)
1764    apply(rule a_star_OrL)
1765    apply(auto)
1766    done
1767next
1768  case a_OrL_r
1769  then show ?case
1770    apply(auto simp add: subst_fresh fresh_a_redu)
1771    apply(rule a_star_OrL)
1772    apply(auto)
1773    done
1774next
1775  case a_ImpR
1776  then show ?case 
1777    apply(auto simp add: subst_fresh fresh_a_redu)
1778    apply(generate_fresh "coname")
1779    apply(fresh_fun_simp)
1780    apply(fresh_fun_simp)
1781    apply(simp add: subst_fresh)
1782    apply(rule a_star_CutL)
1783    apply(rule a_star_ImpR)
1784    apply(auto)
1785    apply(rule a_star_ImpR)
1786    apply(auto)
1787    done
1788next
1789  case a_ImpL_l
1790  then show ?case
1791    apply(auto simp add: subst_fresh fresh_a_redu)
1792    apply(rule a_star_ImpL)
1793    apply(auto)
1794    done
1795next
1796  case a_ImpL_r
1797  then show ?case
1798    apply(auto simp add: subst_fresh fresh_a_redu)
1799    apply(rule a_star_ImpL)
1800    apply(auto)
1801    done
1802qed
1803
1804lemma a_star_subst1:
1805  assumes a: "M \<longrightarrow>\<^sub>a* M'"
1806  shows "M{y:=<c>.P} \<longrightarrow>\<^sub>a* M'{y:=<c>.P}"
1807using a
1808apply(induct)
1809apply(blast)
1810apply(drule_tac y="y" and c="c" and P="P" in a_redu_subst1)
1811apply(auto)
1812done
1813
1814lemma a_star_subst2:
1815  assumes a: "M \<longrightarrow>\<^sub>a* M'"
1816  shows "M{c:=(y).P} \<longrightarrow>\<^sub>a* M'{c:=(y).P}"
1817using a
1818apply(induct)
1819apply(blast)
1820apply(drule_tac y="y" and c="c" and P="P" in a_redu_subst2)
1821apply(auto)
1822done
1823
1824text \<open>Candidates and SN\<close>
1825
1826text \<open>SNa\<close>
1827
1828inductive 
1829  SNa :: "trm \<Rightarrow> bool"
1830where
1831  SNaI: "(\<And>M'. M \<longrightarrow>\<^sub>a M' \<Longrightarrow> SNa M') \<Longrightarrow> SNa M"
1832
1833lemma SNa_induct[consumes 1]:
1834  assumes major: "SNa M"
1835  assumes hyp: "\<And>M'. SNa M' \<Longrightarrow> (\<forall>M''. M'\<longrightarrow>\<^sub>a M'' \<longrightarrow> P M'' \<Longrightarrow> P M')"
1836  shows "P M"
1837  apply (rule major[THEN SNa.induct])
1838  apply (rule hyp)
1839  apply (rule SNaI)
1840  apply (blast)+
1841  done
1842
1843
1844lemma double_SNa_aux:
1845  assumes a_SNa: "SNa a"
1846  and b_SNa: "SNa b"
1847  and hyp: "\<And>x z.
1848    (\<And>y. x\<longrightarrow>\<^sub>a y \<Longrightarrow> SNa y) \<Longrightarrow>
1849    (\<And>y. x\<longrightarrow>\<^sub>a y \<Longrightarrow> P y z) \<Longrightarrow>
1850    (\<And>u. z\<longrightarrow>\<^sub>a u \<Longrightarrow> SNa u) \<Longrightarrow>
1851    (\<And>u. z\<longrightarrow>\<^sub>a u \<Longrightarrow> P x u) \<Longrightarrow> P x z"
1852  shows "P a b"
1853proof -
1854  from a_SNa
1855  have r: "\<And>b. SNa b \<Longrightarrow> P a b"
1856  proof (induct a rule: SNa.induct)
1857    case (SNaI x)
1858    note SNa' = this
1859    have "SNa b" by fact
1860    thus ?case
1861    proof (induct b rule: SNa.induct)
1862      case (SNaI y)
1863      show ?case
1864        apply (rule hyp)
1865        apply (erule SNa')
1866        apply (erule SNa')
1867        apply (rule SNa.SNaI)
1868        apply (erule SNaI)+
1869        done
1870    qed
1871  qed
1872  from b_SNa show ?thesis by (rule r)
1873qed
1874
1875lemma double_SNa:
1876  "\<lbrakk>SNa a; SNa b; \<forall>x z. ((\<forall>y. x\<longrightarrow>\<^sub>ay \<longrightarrow> P y z) \<and> (\<forall>u. z\<longrightarrow>\<^sub>a u \<longrightarrow> P x u)) \<longrightarrow> P x z\<rbrakk> \<Longrightarrow> P a b"
1877apply(rule_tac double_SNa_aux)
1878apply(assumption)+
1879apply(blast)
1880done
1881
1882lemma a_preserves_SNa:
1883  assumes a: "SNa M" "M\<longrightarrow>\<^sub>a M'"
1884  shows "SNa M'"
1885using a 
1886by (erule_tac SNa.cases) (simp)
1887
1888lemma a_star_preserves_SNa:
1889  assumes a: "SNa M" and b: "M\<longrightarrow>\<^sub>a* M'"
1890  shows "SNa M'"
1891using b a
1892by (induct) (auto simp add: a_preserves_SNa)
1893
1894lemma Ax_in_SNa:
1895  shows "SNa (Ax x a)"
1896apply(rule SNaI)
1897apply(erule a_redu.cases, auto)
1898apply(erule l_redu.cases, auto)
1899apply(erule c_redu.cases, auto)
1900done
1901
1902lemma NotL_in_SNa:
1903  assumes a: "SNa M"
1904  shows "SNa (NotL <a>.M x)"
1905using a
1906apply(induct)
1907apply(rule SNaI)
1908apply(erule a_redu.cases, auto)
1909apply(erule l_redu.cases, auto)
1910apply(erule c_redu.cases, auto)
1911apply(auto simp add: trm.inject alpha)
1912apply(rotate_tac 1)
1913apply(drule_tac x="[(a,aa)]\<bullet>M'a" in meta_spec)
1914apply(simp add: a_redu.eqvt)
1915apply(subgoal_tac "NotL <a>.([(a,aa)]\<bullet>M'a) x = NotL <aa>.M'a x")
1916apply(simp)
1917apply(simp add: trm.inject alpha fresh_a_redu)
1918done
1919
1920lemma NotR_in_SNa:
1921  assumes a: "SNa M"
1922  shows "SNa (NotR (x).M a)"
1923using a
1924apply(induct)
1925apply(rule SNaI)
1926apply(erule a_redu.cases, auto)
1927apply(erule l_redu.cases, auto)
1928apply(erule c_redu.cases, auto)
1929apply(auto simp add: trm.inject alpha)
1930apply(rotate_tac 1)
1931apply(drule_tac x="[(x,xa)]\<bullet>M'a" in meta_spec)
1932apply(simp add: a_redu.eqvt)
1933apply(rule_tac s="NotR (x).([(x,xa)]\<bullet>M'a) a" in subst)
1934apply(simp add: trm.inject alpha fresh_a_redu)
1935apply(simp)
1936done
1937
1938lemma AndL1_in_SNa:
1939  assumes a: "SNa M"
1940  shows "SNa (AndL1 (x).M y)"
1941using a
1942apply(induct)
1943apply(rule SNaI)
1944apply(erule a_redu.cases, auto)
1945apply(erule l_redu.cases, auto)
1946apply(erule c_redu.cases, auto)
1947apply(auto simp add: trm.inject alpha)
1948apply(rotate_tac 1)
1949apply(drule_tac x="[(x,xa)]\<bullet>M'a" in meta_spec)
1950apply(simp add: a_redu.eqvt)
1951apply(rule_tac s="AndL1 x.([(x,xa)]\<bullet>M'a) y" in subst)
1952apply(simp add: trm.inject alpha fresh_a_redu)
1953apply(simp)
1954done
1955
1956lemma AndL2_in_SNa:
1957  assumes a: "SNa M"
1958  shows "SNa (AndL2 (x).M y)"
1959using a
1960apply(induct)
1961apply(rule SNaI)
1962apply(erule a_redu.cases, auto)
1963apply(erule l_redu.cases, auto)
1964apply(erule c_redu.cases, auto)
1965apply(auto simp add: trm.inject alpha)
1966apply(rotate_tac 1)
1967apply(drule_tac x="[(x,xa)]\<bullet>M'a" in meta_spec)
1968apply(simp add: a_redu.eqvt)
1969apply(rule_tac s="AndL2 x.([(x,xa)]\<bullet>M'a) y" in subst)
1970apply(simp add: trm.inject alpha fresh_a_redu)
1971apply(simp)
1972done
1973
1974lemma OrR1_in_SNa:
1975  assumes a: "SNa M"
1976  shows "SNa (OrR1 <a>.M b)"
1977using a
1978apply(induct)
1979apply(rule SNaI)
1980apply(erule a_redu.cases, auto)
1981apply(erule l_redu.cases, auto)
1982apply(erule c_redu.cases, auto)
1983apply(auto simp add: trm.inject alpha)
1984apply(rotate_tac 1)
1985apply(drule_tac x="[(a,aa)]\<bullet>M'a" in meta_spec)
1986apply(simp add: a_redu.eqvt)
1987apply(rule_tac s="OrR1 <a>.([(a,aa)]\<bullet>M'a) b" in subst)
1988apply(simp add: trm.inject alpha fresh_a_redu)
1989apply(simp)
1990done
1991
1992lemma OrR2_in_SNa:
1993  assumes a: "SNa M"
1994  shows "SNa (OrR2 <a>.M b)"
1995using a
1996apply(induct)
1997apply(rule SNaI)
1998apply(erule a_redu.cases, auto)
1999apply(erule l_redu.cases, auto)
2000apply(erule c_redu.cases, auto)
2001apply(auto simp add: trm.inject alpha)
2002apply(rotate_tac 1)
2003apply(drule_tac x="[(a,aa)]\<bullet>M'a" in meta_spec)
2004apply(simp add: a_redu.eqvt)
2005apply(rule_tac s="OrR2 <a>.([(a,aa)]\<bullet>M'a) b" in subst)
2006apply(simp add: trm.inject alpha fresh_a_redu)
2007apply(simp)
2008done
2009
2010lemma ImpR_in_SNa:
2011  assumes a: "SNa M"
2012  shows "SNa (ImpR (x).<a>.M b)"
2013using a
2014apply(induct)
2015apply(rule SNaI)
2016apply(erule a_redu.cases, auto)
2017apply(erule l_redu.cases, auto)
2018apply(erule c_redu.cases, auto)
2019apply(auto simp add: trm.inject alpha abs_fresh abs_perm calc_atm)
2020apply(rotate_tac 1)
2021apply(drule_tac x="[(a,aa)]\<bullet>M'a" in meta_spec)
2022apply(simp add: a_redu.eqvt)
2023apply(rule_tac s="ImpR (x).<a>.([(a,aa)]\<bullet>M'a) b" in subst)
2024apply(simp add: trm.inject alpha fresh_a_redu)
2025apply(simp)
2026apply(rotate_tac 1)
2027apply(drule_tac x="[(x,xa)]\<bullet>M'a" in meta_spec)
2028apply(simp add: a_redu.eqvt)
2029apply(rule_tac s="ImpR (x).<a>.([(x,xa)]\<bullet>M'a) b" in subst)
2030apply(simp add: trm.inject alpha fresh_a_redu abs_fresh abs_perm calc_atm)
2031apply(simp)
2032apply(rotate_tac 1)
2033apply(drule_tac x="[(a,aa)]\<bullet>[(x,xa)]\<bullet>M'a" in meta_spec)
2034apply(simp add: a_redu.eqvt)
2035apply(rule_tac s="ImpR (x).<a>.([(a,aa)]\<bullet>[(x,xa)]\<bullet>M'a) b" in subst)
2036apply(simp add: trm.inject alpha fresh_a_redu abs_fresh abs_perm calc_atm)
2037apply(simp add: fresh_left calc_atm fresh_a_redu)
2038apply(simp)
2039done
2040
2041lemma AndR_in_SNa:
2042  assumes a: "SNa M" "SNa N"
2043  shows "SNa (AndR <a>.M <b>.N c)"
2044apply(rule_tac a="M" and b="N" in double_SNa)
2045apply(rule a)+
2046apply(auto)
2047apply(rule SNaI)
2048apply(drule a_redu_AndR_elim)
2049apply(auto)
2050done
2051
2052lemma OrL_in_SNa:
2053  assumes a: "SNa M" "SNa N"
2054  shows "SNa (OrL (x).M (y).N z)"
2055apply(rule_tac a="M" and b="N" in double_SNa)
2056apply(rule a)+
2057apply(auto)
2058apply(rule SNaI)
2059apply(drule a_redu_OrL_elim)
2060apply(auto)
2061done
2062
2063lemma ImpL_in_SNa:
2064  assumes a: "SNa M" "SNa N"
2065  shows "SNa (ImpL <a>.M (y).N z)"
2066apply(rule_tac a="M" and b="N" in double_SNa)
2067apply(rule a)+
2068apply(auto)
2069apply(rule SNaI)
2070apply(drule a_redu_ImpL_elim)
2071apply(auto)
2072done
2073
2074lemma SNa_eqvt:
2075  fixes pi1::"name prm"
2076  and   pi2::"coname prm"
2077  shows "SNa M \<Longrightarrow> SNa (pi1\<bullet>M)"
2078  and   "SNa M \<Longrightarrow> SNa (pi2\<bullet>M)"
2079apply -
2080apply(induct rule: SNa.induct)
2081apply(rule SNaI)
2082apply(drule_tac pi="(rev pi1)" in a_redu.eqvt(1))
2083apply(rotate_tac 1)
2084apply(drule_tac x="(rev pi1)\<bullet>M'" in meta_spec)
2085apply(perm_simp)
2086apply(induct rule: SNa.induct)
2087apply(rule SNaI)
2088apply(drule_tac pi="(rev pi2)" in a_redu.eqvt(2))
2089apply(rotate_tac 1)
2090apply(drule_tac x="(rev pi2)\<bullet>M'" in meta_spec)
2091apply(perm_simp)
2092done
2093
2094text \<open>set operators\<close>
2095
2096definition AXIOMSn :: "ty \<Rightarrow> ntrm set" where
2097  "AXIOMSn B \<equiv> { (x):(Ax y b) | x y b. True }"
2098
2099definition AXIOMSc::"ty \<Rightarrow> ctrm set" where
2100  "AXIOMSc B \<equiv> { <a>:(Ax y b) | a y b. True }"
2101
2102definition BINDINGn::"ty \<Rightarrow> ctrm set \<Rightarrow> ntrm set" where
2103  "BINDINGn B X \<equiv> { (x):M | x M. \<forall>a P. <a>:P\<in>X \<longrightarrow> SNa (M{x:=<a>.P})}"
2104
2105definition BINDINGc::"ty \<Rightarrow> ntrm set \<Rightarrow> ctrm set" where
2106  "BINDINGc B X \<equiv> { <a>:M | a M. \<forall>x P. (x):P\<in>X \<longrightarrow> SNa (M{a:=(x).P})}"
2107
2108lemma BINDINGn_decreasing:
2109  shows "X\<subseteq>Y \<Longrightarrow> BINDINGn B Y \<subseteq> BINDINGn B X"
2110by (simp add: BINDINGn_def) (blast) 
2111
2112lemma BINDINGc_decreasing:
2113  shows "X\<subseteq>Y \<Longrightarrow> BINDINGc B Y \<subseteq> BINDINGc B X"
2114by (simp add: BINDINGc_def) (blast) 
2115  
2116nominal_primrec
2117  NOTRIGHT :: "ty \<Rightarrow> ntrm set \<Rightarrow> ctrm set"
2118where
2119 "NOTRIGHT (NOT B) X = { <a>:NotR (x).M a | a x M. fic (NotR (x).M a) a \<and> (x):M \<in> X }"
2120apply(rule TrueI)+
2121done
2122
2123lemma NOTRIGHT_eqvt_name:
2124  fixes pi::"name prm"
2125  shows "(pi\<bullet>(NOTRIGHT (NOT B) X)) = NOTRIGHT (NOT B) (pi\<bullet>X)"
2126apply(auto simp add: perm_set_def)
2127apply(rule_tac x="pi\<bullet>a" in exI) 
2128apply(rule_tac x="pi\<bullet>xb" in exI) 
2129apply(rule_tac x="pi\<bullet>M" in exI)
2130apply(simp)
2131apply(rule conjI)
2132apply(drule_tac pi="pi" in fic.eqvt(1))
2133apply(simp)
2134apply(rule_tac x="(xb):M" in exI)
2135apply(simp)
2136apply(rule_tac x="(rev pi)\<bullet>(<a>:NotR (xa).M a)" in exI)
2137apply(perm_simp)
2138apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2139apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2140apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2141apply(simp add: swap_simps)
2142apply(drule_tac pi="rev pi" in fic.eqvt(1))
2143apply(simp)
2144apply(drule sym)
2145apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2146apply(simp add: swap_simps)
2147done
2148
2149lemma NOTRIGHT_eqvt_coname:
2150  fixes pi::"coname prm"
2151  shows "(pi\<bullet>(NOTRIGHT (NOT B) X)) = NOTRIGHT (NOT B) (pi\<bullet>X)"
2152apply(auto simp add: perm_set_def)
2153apply(rule_tac x="pi\<bullet>a" in exI) 
2154apply(rule_tac x="pi\<bullet>xb" in exI) 
2155apply(rule_tac x="pi\<bullet>M" in exI)
2156apply(simp)
2157apply(rule conjI)
2158apply(drule_tac pi="pi" in fic.eqvt(2))
2159apply(simp)
2160apply(rule_tac x="(xb):M" in exI)
2161apply(simp)
2162apply(rule_tac x="<((rev pi)\<bullet>a)>:NotR ((rev pi)\<bullet>xa).((rev pi)\<bullet>M) ((rev pi)\<bullet>a)" in exI)
2163apply(perm_simp)
2164apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2165apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2166apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2167apply(simp add: swap_simps)
2168apply(drule_tac pi="rev pi" in fic.eqvt(2))
2169apply(simp)
2170apply(drule sym)
2171apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2172apply(simp add: swap_simps)
2173done
2174  
2175nominal_primrec
2176  NOTLEFT :: "ty \<Rightarrow> ctrm set \<Rightarrow> ntrm set"
2177where
2178 "NOTLEFT (NOT B) X = { (x):NotL <a>.M x | a x M. fin (NotL <a>.M x) x \<and> <a>:M \<in> X }"
2179apply(rule TrueI)+
2180done
2181
2182lemma NOTLEFT_eqvt_name:
2183  fixes pi::"name prm"
2184  shows "(pi\<bullet>(NOTLEFT (NOT B) X)) = NOTLEFT (NOT B) (pi\<bullet>X)"
2185apply(auto simp add: perm_set_def)
2186apply(rule_tac x="pi\<bullet>a" in exI) 
2187apply(rule_tac x="pi\<bullet>xb" in exI) 
2188apply(rule_tac x="pi\<bullet>M" in exI)
2189apply(simp)
2190apply(rule conjI)
2191apply(drule_tac pi="pi" in fin.eqvt(1))
2192apply(simp)
2193apply(rule_tac x="<a>:M" in exI)
2194apply(simp)
2195apply(rule_tac x="(((rev pi)\<bullet>xa)):NotL <((rev pi)\<bullet>a)>.((rev pi)\<bullet>M) ((rev pi)\<bullet>xa)" in exI)
2196apply(perm_simp)
2197apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2198apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2199apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2200apply(simp add: swap_simps)
2201apply(drule_tac pi="rev pi" in fin.eqvt(1))
2202apply(simp)
2203apply(drule sym)
2204apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2205apply(simp add: swap_simps)
2206done
2207
2208lemma NOTLEFT_eqvt_coname:
2209  fixes pi::"coname prm"
2210  shows "(pi\<bullet>(NOTLEFT (NOT B) X)) = NOTLEFT (NOT B) (pi\<bullet>X)"
2211apply(auto simp add: perm_set_def)
2212apply(rule_tac x="pi\<bullet>a" in exI) 
2213apply(rule_tac x="pi\<bullet>xb" in exI) 
2214apply(rule_tac x="pi\<bullet>M" in exI)
2215apply(simp)
2216apply(rule conjI)
2217apply(drule_tac pi="pi" in fin.eqvt(2))
2218apply(simp)
2219apply(rule_tac x="<a>:M" in exI)
2220apply(simp)
2221apply(rule_tac x="(((rev pi)\<bullet>xa)):NotL <((rev pi)\<bullet>a)>.((rev pi)\<bullet>M) ((rev pi)\<bullet>xa)" in exI)
2222apply(perm_simp)
2223apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2224apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2225apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2226apply(simp add: swap_simps)
2227apply(drule_tac pi="rev pi" in fin.eqvt(2))
2228apply(simp)
2229apply(drule sym)
2230apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2231apply(simp add: swap_simps)
2232done
2233  
2234nominal_primrec
2235  ANDRIGHT :: "ty \<Rightarrow> ctrm set \<Rightarrow> ctrm set \<Rightarrow> ctrm set"
2236where
2237 "ANDRIGHT (B AND C) X Y = 
2238            { <c>:AndR <a>.M <b>.N c | c a b M N. fic (AndR <a>.M <b>.N c) c \<and> <a>:M \<in> X \<and> <b>:N \<in> Y }"
2239apply(rule TrueI)+
2240done
2241
2242lemma ANDRIGHT_eqvt_name:
2243  fixes pi::"name prm"
2244  shows "(pi\<bullet>(ANDRIGHT (A AND B) X Y)) = ANDRIGHT (A AND B) (pi\<bullet>X) (pi\<bullet>Y)"
2245apply(auto simp add: perm_set_def)
2246apply(rule_tac x="pi\<bullet>c" in exI)
2247apply(rule_tac x="pi\<bullet>a" in exI)
2248apply(rule_tac x="pi\<bullet>b" in exI)
2249apply(rule_tac x="pi\<bullet>M" in exI)
2250apply(rule_tac x="pi\<bullet>N" in exI)
2251apply(simp)
2252apply(rule conjI)
2253apply(drule_tac pi="pi" in fic.eqvt(1))
2254apply(simp)
2255apply(rule conjI)
2256apply(rule_tac x="<a>:M" in exI)
2257apply(simp)
2258apply(rule_tac x="<b>:N" in exI)
2259apply(simp)
2260apply(rule_tac x="(rev pi)\<bullet>(<c>:AndR <a>.M <b>.N c)" in exI)
2261apply(perm_simp)
2262apply(rule_tac x="(rev pi)\<bullet>c" in exI)
2263apply(rule_tac x="(rev pi)\<bullet>a" in exI)
2264apply(rule_tac x="(rev pi)\<bullet>b" in exI)
2265apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2266apply(rule_tac x="(rev pi)\<bullet>N" in exI)
2267apply(simp add: swap_simps)
2268apply(drule_tac pi="rev pi" in fic.eqvt(1))
2269apply(simp)
2270apply(drule sym)
2271apply(drule sym)
2272apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2273apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2274apply(simp add: swap_simps)
2275done
2276
2277lemma ANDRIGHT_eqvt_coname:
2278  fixes pi::"coname prm"
2279  shows "(pi\<bullet>(ANDRIGHT (A AND B) X Y)) = ANDRIGHT (A AND B) (pi\<bullet>X) (pi\<bullet>Y)"
2280apply(auto simp add: perm_set_def)
2281apply(rule_tac x="pi\<bullet>c" in exI)
2282apply(rule_tac x="pi\<bullet>a" in exI)
2283apply(rule_tac x="pi\<bullet>b" in exI)
2284apply(rule_tac x="pi\<bullet>M" in exI)
2285apply(rule_tac x="pi\<bullet>N" in exI)
2286apply(simp)
2287apply(rule conjI)
2288apply(drule_tac pi="pi" in fic.eqvt(2))
2289apply(simp)
2290apply(rule conjI)
2291apply(rule_tac x="<a>:M" in exI)
2292apply(simp)
2293apply(rule_tac x="<b>:N" in exI)
2294apply(simp)
2295apply(rule_tac x="(rev pi)\<bullet>(<c>:AndR <a>.M <b>.N c)" in exI)
2296apply(perm_simp)
2297apply(rule_tac x="(rev pi)\<bullet>c" in exI)
2298apply(rule_tac x="(rev pi)\<bullet>a" in exI)
2299apply(rule_tac x="(rev pi)\<bullet>b" in exI)
2300apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2301apply(rule_tac x="(rev pi)\<bullet>N" in exI)
2302apply(simp)
2303apply(drule_tac pi="rev pi" in fic.eqvt(2))
2304apply(simp)
2305apply(drule sym)
2306apply(drule sym)
2307apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2308apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2309apply(simp)
2310done
2311
2312nominal_primrec
2313  ANDLEFT1 :: "ty \<Rightarrow> ntrm set \<Rightarrow> ntrm set"
2314where
2315 "ANDLEFT1 (B AND C) X = { (y):AndL1 (x).M y | x y M. fin (AndL1 (x).M y) y \<and> (x):M \<in> X }"
2316apply(rule TrueI)+
2317done
2318
2319lemma ANDLEFT1_eqvt_name:
2320  fixes pi::"name prm"
2321  shows "(pi\<bullet>(ANDLEFT1 (A AND B) X)) = ANDLEFT1 (A AND B) (pi\<bullet>X)"
2322apply(auto simp add: perm_set_def)
2323apply(rule_tac x="pi\<bullet>xb" in exI) 
2324apply(rule_tac x="pi\<bullet>y" in exI) 
2325apply(rule_tac x="pi\<bullet>M" in exI)
2326apply(simp)
2327apply(rule conjI)
2328apply(drule_tac pi="pi" in fin.eqvt(1))
2329apply(simp)
2330apply(rule_tac x="(xb):M" in exI)
2331apply(simp)
2332apply(rule_tac x="(rev pi)\<bullet>((y):AndL1 (xa).M y)" in exI)
2333apply(perm_simp)
2334apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2335apply(rule_tac x="(rev pi)\<bullet>y" in exI) 
2336apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2337apply(simp)
2338apply(drule_tac pi="rev pi" in fin.eqvt(1))
2339apply(simp)
2340apply(drule sym)
2341apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2342apply(simp)
2343done
2344
2345lemma ANDLEFT1_eqvt_coname:
2346  fixes pi::"coname prm"
2347  shows "(pi\<bullet>(ANDLEFT1 (A AND B) X)) = ANDLEFT1 (A AND B) (pi\<bullet>X)"
2348apply(auto simp add: perm_set_def)
2349apply(rule_tac x="pi\<bullet>xb" in exI) 
2350apply(rule_tac x="pi\<bullet>y" in exI) 
2351apply(rule_tac x="pi\<bullet>M" in exI)
2352apply(simp)
2353apply(rule conjI)
2354apply(drule_tac pi="pi" in fin.eqvt(2))
2355apply(simp)
2356apply(rule_tac x="(xb):M" in exI)
2357apply(simp)
2358apply(rule_tac x="(rev pi)\<bullet>((y):AndL1 (xa).M y)" in exI)
2359apply(perm_simp)
2360apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2361apply(rule_tac x="(rev pi)\<bullet>y" in exI) 
2362apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2363apply(simp add: swap_simps)
2364apply(drule_tac pi="rev pi" in fin.eqvt(2))
2365apply(simp)
2366apply(drule sym)
2367apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2368apply(simp add: swap_simps)
2369done
2370
2371nominal_primrec
2372  ANDLEFT2 :: "ty \<Rightarrow> ntrm set \<Rightarrow> ntrm set"
2373where
2374 "ANDLEFT2 (B AND C) X = { (y):AndL2 (x).M y | x y M. fin (AndL2 (x).M y) y \<and> (x):M \<in> X }"
2375apply(rule TrueI)+
2376done
2377
2378lemma ANDLEFT2_eqvt_name:
2379  fixes pi::"name prm"
2380  shows "(pi\<bullet>(ANDLEFT2 (A AND B) X)) = ANDLEFT2 (A AND B) (pi\<bullet>X)"
2381apply(auto simp add: perm_set_def)
2382apply(rule_tac x="pi\<bullet>xb" in exI) 
2383apply(rule_tac x="pi\<bullet>y" in exI) 
2384apply(rule_tac x="pi\<bullet>M" in exI)
2385apply(simp)
2386apply(rule conjI)
2387apply(drule_tac pi="pi" in fin.eqvt(1))
2388apply(simp)
2389apply(rule_tac x="(xb):M" in exI)
2390apply(simp)
2391apply(rule_tac x="(rev pi)\<bullet>((y):AndL2 (xa).M y)" in exI)
2392apply(perm_simp)
2393apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2394apply(rule_tac x="(rev pi)\<bullet>y" in exI) 
2395apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2396apply(simp)
2397apply(drule_tac pi="rev pi" in fin.eqvt(1))
2398apply(simp)
2399apply(drule sym)
2400apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2401apply(simp)
2402done
2403
2404lemma ANDLEFT2_eqvt_coname:
2405  fixes pi::"coname prm"
2406  shows "(pi\<bullet>(ANDLEFT2 (A AND B) X)) = ANDLEFT2 (A AND B) (pi\<bullet>X)"
2407apply(auto simp add: perm_set_def)
2408apply(rule_tac x="pi\<bullet>xb" in exI) 
2409apply(rule_tac x="pi\<bullet>y" in exI) 
2410apply(rule_tac x="pi\<bullet>M" in exI)
2411apply(simp)
2412apply(rule conjI)
2413apply(drule_tac pi="pi" in fin.eqvt(2))
2414apply(simp)
2415apply(rule_tac x="(xb):M" in exI)
2416apply(simp)
2417apply(rule_tac x="(rev pi)\<bullet>((y):AndL2 (xa).M y)" in exI)
2418apply(perm_simp)
2419apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2420apply(rule_tac x="(rev pi)\<bullet>y" in exI) 
2421apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2422apply(simp add: swap_simps)
2423apply(drule_tac pi="rev pi" in fin.eqvt(2))
2424apply(simp)
2425apply(drule sym)
2426apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2427apply(simp add: swap_simps)
2428done
2429
2430nominal_primrec
2431  ORLEFT :: "ty \<Rightarrow> ntrm set \<Rightarrow> ntrm set \<Rightarrow> ntrm set"
2432where
2433 "ORLEFT (B OR C) X Y = 
2434            { (z):OrL (x).M (y).N z | x y z M N. fin (OrL (x).M (y).N z) z \<and> (x):M \<in> X \<and> (y):N \<in> Y }"
2435apply(rule TrueI)+
2436done
2437
2438lemma ORLEFT_eqvt_name:
2439  fixes pi::"name prm"
2440  shows "(pi\<bullet>(ORLEFT (A OR B) X Y)) = ORLEFT (A OR B) (pi\<bullet>X) (pi\<bullet>Y)"
2441apply(auto simp add: perm_set_def)
2442apply(rule_tac x="pi\<bullet>xb" in exI)
2443apply(rule_tac x="pi\<bullet>y" in exI)
2444apply(rule_tac x="pi\<bullet>z" in exI)
2445apply(rule_tac x="pi\<bullet>M" in exI)
2446apply(rule_tac x="pi\<bullet>N" in exI)
2447apply(simp)
2448apply(rule conjI)
2449apply(drule_tac pi="pi" in fin.eqvt(1))
2450apply(simp)
2451apply(rule conjI)
2452apply(rule_tac x="(xb):M" in exI)
2453apply(simp)
2454apply(rule_tac x="(y):N" in exI)
2455apply(simp)
2456apply(rule_tac x="(rev pi)\<bullet>((z):OrL (xa).M (y).N z)" in exI)
2457apply(perm_simp)
2458apply(rule_tac x="(rev pi)\<bullet>xa" in exI)
2459apply(rule_tac x="(rev pi)\<bullet>y" in exI)
2460apply(rule_tac x="(rev pi)\<bullet>z" in exI)
2461apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2462apply(rule_tac x="(rev pi)\<bullet>N" in exI)
2463apply(simp)
2464apply(drule_tac pi="rev pi" in fin.eqvt(1))
2465apply(simp)
2466apply(drule sym)
2467apply(drule sym)
2468apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2469apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2470apply(simp)
2471done
2472
2473lemma ORLEFT_eqvt_coname:
2474  fixes pi::"coname prm"
2475  shows "(pi\<bullet>(ORLEFT (A OR B) X Y)) = ORLEFT (A OR B) (pi\<bullet>X) (pi\<bullet>Y)"
2476apply(auto simp add: perm_set_def)
2477apply(rule_tac x="pi\<bullet>xb" in exI)
2478apply(rule_tac x="pi\<bullet>y" in exI)
2479apply(rule_tac x="pi\<bullet>z" in exI)
2480apply(rule_tac x="pi\<bullet>M" in exI)
2481apply(rule_tac x="pi\<bullet>N" in exI)
2482apply(simp)
2483apply(rule conjI)
2484apply(drule_tac pi="pi" in fin.eqvt(2))
2485apply(simp)
2486apply(rule conjI)
2487apply(rule_tac x="(xb):M" in exI)
2488apply(simp)
2489apply(rule_tac x="(y):N" in exI)
2490apply(simp)
2491apply(rule_tac x="(rev pi)\<bullet>((z):OrL (xa).M (y).N z)" in exI)
2492apply(perm_simp)
2493apply(rule_tac x="(rev pi)\<bullet>xa" in exI)
2494apply(rule_tac x="(rev pi)\<bullet>y" in exI)
2495apply(rule_tac x="(rev pi)\<bullet>z" in exI)
2496apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2497apply(rule_tac x="(rev pi)\<bullet>N" in exI)
2498apply(simp add: swap_simps)
2499apply(drule_tac pi="rev pi" in fin.eqvt(2))
2500apply(simp)
2501apply(drule sym)
2502apply(drule sym)
2503apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2504apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2505apply(simp add: swap_simps)
2506done
2507
2508nominal_primrec
2509  ORRIGHT1 :: "ty \<Rightarrow> ctrm set \<Rightarrow> ctrm set"
2510where
2511 "ORRIGHT1 (B OR C) X = { <b>:OrR1 <a>.M b | a b M. fic (OrR1 <a>.M b) b \<and> <a>:M \<in> X }"
2512apply(rule TrueI)+
2513done
2514
2515lemma ORRIGHT1_eqvt_name:
2516  fixes pi::"name prm"
2517  shows "(pi\<bullet>(ORRIGHT1 (A OR B) X)) = ORRIGHT1 (A OR B) (pi\<bullet>X)"
2518apply(auto simp add: perm_set_def)
2519apply(rule_tac x="pi\<bullet>a" in exI) 
2520apply(rule_tac x="pi\<bullet>b" in exI) 
2521apply(rule_tac x="pi\<bullet>M" in exI)
2522apply(simp)
2523apply(rule conjI)
2524apply(drule_tac pi="pi" in fic.eqvt(1))
2525apply(simp)
2526apply(rule_tac x="<a>:M" in exI)
2527apply(perm_simp)
2528apply(rule_tac x="(rev pi)\<bullet>(<b>:OrR1 <a>.M b)" in exI)
2529apply(perm_simp)
2530apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2531apply(rule_tac x="(rev pi)\<bullet>b" in exI) 
2532apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2533apply(simp add: swap_simps)
2534apply(drule_tac pi="rev pi" in fic.eqvt(1))
2535apply(simp)
2536apply(drule sym)
2537apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2538apply(simp add: swap_simps)
2539done
2540
2541lemma ORRIGHT1_eqvt_coname:
2542  fixes pi::"coname prm"
2543  shows "(pi\<bullet>(ORRIGHT1 (A OR B) X)) = ORRIGHT1 (A OR B) (pi\<bullet>X)"
2544apply(auto simp add: perm_set_def)
2545apply(rule_tac x="pi\<bullet>a" in exI) 
2546apply(rule_tac x="pi\<bullet>b" in exI) 
2547apply(rule_tac x="pi\<bullet>M" in exI)
2548apply(simp)
2549apply(rule conjI)
2550apply(drule_tac pi="pi" in fic.eqvt(2))
2551apply(simp)
2552apply(rule_tac x="<a>:M" in exI)
2553apply(perm_simp)
2554apply(rule_tac x="(rev pi)\<bullet>(<b>:OrR1 <a>.M b)" in exI)
2555apply(perm_simp)
2556apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2557apply(rule_tac x="(rev pi)\<bullet>b" in exI) 
2558apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2559apply(simp)
2560apply(drule_tac pi="rev pi" in fic.eqvt(2))
2561apply(simp)
2562apply(drule sym)
2563apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2564apply(simp)
2565done
2566
2567nominal_primrec
2568  ORRIGHT2 :: "ty \<Rightarrow> ctrm set \<Rightarrow> ctrm set"
2569where
2570 "ORRIGHT2 (B OR C) X = { <b>:OrR2 <a>.M b | a b M. fic (OrR2 <a>.M b) b \<and> <a>:M \<in> X }"
2571apply(rule TrueI)+
2572done
2573
2574lemma ORRIGHT2_eqvt_name:
2575  fixes pi::"name prm"
2576  shows "(pi\<bullet>(ORRIGHT2 (A OR B) X)) = ORRIGHT2 (A OR B) (pi\<bullet>X)"
2577apply(auto simp add: perm_set_def)
2578apply(rule_tac x="pi\<bullet>a" in exI) 
2579apply(rule_tac x="pi\<bullet>b" in exI) 
2580apply(rule_tac x="pi\<bullet>M" in exI)
2581apply(simp)
2582apply(rule conjI)
2583apply(drule_tac pi="pi" in fic.eqvt(1))
2584apply(simp)
2585apply(rule_tac x="<a>:M" in exI)
2586apply(perm_simp)
2587apply(rule_tac x="(rev pi)\<bullet>(<b>:OrR2 <a>.M b)" in exI)
2588apply(perm_simp)
2589apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2590apply(rule_tac x="(rev pi)\<bullet>b" in exI) 
2591apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2592apply(simp add: swap_simps)
2593apply(drule_tac pi="rev pi" in fic.eqvt(1))
2594apply(simp)
2595apply(drule sym)
2596apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2597apply(simp add: swap_simps)
2598done
2599
2600lemma ORRIGHT2_eqvt_coname:
2601  fixes pi::"coname prm"
2602  shows "(pi\<bullet>(ORRIGHT2 (A OR B) X)) = ORRIGHT2 (A OR B) (pi\<bullet>X)"
2603apply(auto simp add: perm_set_def)
2604apply(rule_tac x="pi\<bullet>a" in exI) 
2605apply(rule_tac x="pi\<bullet>b" in exI) 
2606apply(rule_tac x="pi\<bullet>M" in exI)
2607apply(simp)
2608apply(rule conjI)
2609apply(drule_tac pi="pi" in fic.eqvt(2))
2610apply(simp)
2611apply(rule_tac x="<a>:M" in exI)
2612apply(perm_simp)
2613apply(rule_tac x="(rev pi)\<bullet>(<b>:OrR2 <a>.M b)" in exI)
2614apply(perm_simp)
2615apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2616apply(rule_tac x="(rev pi)\<bullet>b" in exI) 
2617apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2618apply(simp)
2619apply(drule_tac pi="rev pi" in fic.eqvt(2))
2620apply(simp)
2621apply(drule sym)
2622apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2623apply(simp)
2624done
2625
2626nominal_primrec
2627  IMPRIGHT :: "ty \<Rightarrow> ntrm set \<Rightarrow> ctrm set \<Rightarrow> ntrm set \<Rightarrow> ctrm set \<Rightarrow> ctrm set"
2628where
2629 "IMPRIGHT (B IMP C) X Y Z U= 
2630        { <b>:ImpR (x).<a>.M b | x a b M. fic (ImpR (x).<a>.M b) b 
2631                                        \<and> (\<forall>z P. x\<sharp>(z,P) \<and> (z):P \<in> Z \<longrightarrow> (x):(M{a:=(z).P}) \<in> X)
2632                                        \<and> (\<forall>c Q. a\<sharp>(c,Q) \<and> <c>:Q \<in> U \<longrightarrow> <a>:(M{x:=<c>.Q}) \<in> Y)}"
2633apply(rule TrueI)+
2634done
2635
2636lemma IMPRIGHT_eqvt_name:
2637  fixes pi::"name prm"
2638  shows "(pi\<bullet>(IMPRIGHT (A IMP B) X Y Z U)) = IMPRIGHT (A IMP B) (pi\<bullet>X) (pi\<bullet>Y) (pi\<bullet>Z) (pi\<bullet>U)"
2639apply(auto simp add: perm_set_def)
2640apply(rule_tac x="pi\<bullet>xb" in exI)
2641apply(rule_tac x="pi\<bullet>a" in exI)
2642apply(rule_tac x="pi\<bullet>b" in exI)
2643apply(rule_tac x="pi\<bullet>M" in exI)
2644apply(simp)
2645apply(rule conjI)
2646apply(drule_tac pi="pi" in fic.eqvt(1))
2647apply(simp)
2648apply(rule conjI)
2649apply(auto)[1]
2650apply(rule_tac x="(xb):(M{a:=((rev pi)\<bullet>z).((rev pi)\<bullet>P)})" in exI)
2651apply(perm_simp add: csubst_eqvt)
2652apply(drule sym)
2653apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2654apply(simp)
2655apply(simp add: fresh_right)
2656apply(auto)[1]
2657apply(rule_tac x="<a>:(M{xb:=<((rev pi)\<bullet>c)>.((rev pi)\<bullet>Q)})" in exI)
2658apply(perm_simp add: nsubst_eqvt)
2659apply(drule sym)
2660apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2661apply(simp add: swap_simps fresh_left)
2662apply(rule_tac x="(rev pi)\<bullet>(<b>:ImpR xa.<a>.M b)" in exI)
2663apply(perm_simp)
2664apply(rule_tac x="(rev pi)\<bullet>xa" in exI)
2665apply(rule_tac x="(rev pi)\<bullet>a" in exI)
2666apply(rule_tac x="(rev pi)\<bullet>b" in exI)
2667apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2668apply(simp add: swap_simps)
2669apply(drule_tac pi="rev pi" in fic.eqvt(1))
2670apply(simp add: swap_simps)
2671apply(rule conjI)
2672apply(auto)[1]
2673apply(drule_tac x="pi\<bullet>z" in spec)
2674apply(drule_tac x="pi\<bullet>P" in spec)
2675apply(drule mp)
2676apply(simp add: fresh_right)
2677apply(rule_tac x="(z):P" in exI)
2678apply(simp)
2679apply(auto)[1]
2680apply(drule sym)
2681apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2682apply(perm_simp add: csubst_eqvt fresh_right)
2683apply(auto)[1]
2684apply(drule_tac x="pi\<bullet>c" in spec)
2685apply(drule_tac x="pi\<bullet>Q" in spec)
2686apply(drule mp)
2687apply(simp add: swap_simps fresh_left)
2688apply(rule_tac x="<c>:Q" in exI)
2689apply(simp add: swap_simps)
2690apply(auto)[1]
2691apply(drule sym)
2692apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2693apply(perm_simp add: nsubst_eqvt)
2694done
2695
2696lemma IMPRIGHT_eqvt_coname:
2697  fixes pi::"coname prm"
2698  shows "(pi\<bullet>(IMPRIGHT (A IMP B) X Y Z U)) = IMPRIGHT (A IMP B) (pi\<bullet>X) (pi\<bullet>Y) (pi\<bullet>Z) (pi\<bullet>U)"
2699apply(auto simp add: perm_set_def)
2700apply(rule_tac x="pi\<bullet>xb" in exI)
2701apply(rule_tac x="pi\<bullet>a" in exI)
2702apply(rule_tac x="pi\<bullet>b" in exI)
2703apply(rule_tac x="pi\<bullet>M" in exI)
2704apply(simp)
2705apply(rule conjI)
2706apply(drule_tac pi="pi" in fic.eqvt(2))
2707apply(simp)
2708apply(rule conjI)
2709apply(auto)[1]
2710apply(rule_tac x="(xb):(M{a:=((rev pi)\<bullet>z).((rev pi)\<bullet>P)})" in exI)
2711apply(perm_simp add: csubst_eqvt)
2712apply(drule sym)
2713apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2714apply(simp add: swap_simps fresh_left)
2715apply(auto)[1]
2716apply(rule_tac x="<a>:(M{xb:=<((rev pi)\<bullet>c)>.((rev pi)\<bullet>Q)})" in exI)
2717apply(perm_simp add: nsubst_eqvt)
2718apply(drule sym)
2719apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2720apply(simp add: fresh_right)
2721apply(rule_tac x="(rev pi)\<bullet>(<b>:ImpR xa.<a>.M b)" in exI)
2722apply(perm_simp)
2723apply(rule_tac x="(rev pi)\<bullet>xa" in exI)
2724apply(rule_tac x="(rev pi)\<bullet>a" in exI)
2725apply(rule_tac x="(rev pi)\<bullet>b" in exI)
2726apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2727apply(simp add: swap_simps)
2728apply(drule_tac pi="rev pi" in fic.eqvt(2))
2729apply(simp add: swap_simps)
2730apply(rule conjI)
2731apply(auto)[1]
2732apply(drule_tac x="pi\<bullet>z" in spec)
2733apply(drule_tac x="pi\<bullet>P" in spec)
2734apply(simp add: swap_simps fresh_left)
2735apply(drule mp)
2736apply(rule_tac x="(z):P" in exI)
2737apply(simp add: swap_simps)
2738apply(auto)[1]
2739apply(drule sym)
2740apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2741apply(perm_simp add: csubst_eqvt fresh_right)
2742apply(auto)[1]
2743apply(drule_tac x="pi\<bullet>c" in spec)
2744apply(drule_tac x="pi\<bullet>Q" in spec)
2745apply(simp add: fresh_right)
2746apply(drule mp)
2747apply(rule_tac x="<c>:Q" in exI)
2748apply(simp)
2749apply(auto)[1]
2750apply(drule sym)
2751apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2752apply(perm_simp add: nsubst_eqvt fresh_right)
2753done
2754
2755nominal_primrec
2756  IMPLEFT :: "ty \<Rightarrow> ctrm set \<Rightarrow> ntrm set \<Rightarrow> ntrm set"
2757where
2758 "IMPLEFT (B IMP C) X Y = 
2759        { (y):ImpL <a>.M (x).N y | x a y M N. fin (ImpL <a>.M (x).N y) y \<and> <a>:M \<in> X \<and> (x):N \<in> Y }"
2760apply(rule TrueI)+
2761done
2762
2763lemma IMPLEFT_eqvt_name:
2764  fixes pi::"name prm"
2765  shows "(pi\<bullet>(IMPLEFT (A IMP B) X Y)) = IMPLEFT (A IMP B) (pi\<bullet>X) (pi\<bullet>Y)"
2766apply(auto simp add: perm_set_def)
2767apply(rule_tac x="pi\<bullet>xb" in exI) 
2768apply(rule_tac x="pi\<bullet>a" in exI)
2769apply(rule_tac x="pi\<bullet>y" in exI) 
2770apply(rule_tac x="pi\<bullet>M" in exI) 
2771apply(rule_tac x="pi\<bullet>N" in exI)
2772apply(simp)
2773apply(rule conjI)
2774apply(drule_tac pi="pi" in fin.eqvt(1))
2775apply(simp)
2776apply(rule conjI)
2777apply(rule_tac x="<a>:M" in exI)
2778apply(simp)
2779apply(rule_tac x="(xb):N" in exI)
2780apply(simp)
2781apply(rule_tac x="(rev pi)\<bullet>((y):ImpL <a>.M (xa).N y)" in exI)
2782apply(perm_simp)
2783apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2784apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2785apply(rule_tac x="(rev pi)\<bullet>y" in exI) 
2786apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2787apply(rule_tac x="(rev pi)\<bullet>N" in exI)
2788apply(simp add: swap_simps)
2789apply(drule_tac pi="rev pi" in fin.eqvt(1))
2790apply(simp)
2791apply(drule sym)
2792apply(drule sym)
2793apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2794apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
2795apply(simp add: swap_simps)
2796done
2797
2798lemma IMPLEFT_eqvt_coname:
2799  fixes pi::"coname prm"
2800  shows "(pi\<bullet>(IMPLEFT (A IMP B) X Y)) = IMPLEFT (A IMP B) (pi\<bullet>X) (pi\<bullet>Y)"
2801apply(auto simp add: perm_set_def)
2802apply(rule_tac x="pi\<bullet>xb" in exI) 
2803apply(rule_tac x="pi\<bullet>a" in exI)
2804apply(rule_tac x="pi\<bullet>y" in exI) 
2805apply(rule_tac x="pi\<bullet>M" in exI) 
2806apply(rule_tac x="pi\<bullet>N" in exI)
2807apply(simp)
2808apply(rule conjI)
2809apply(drule_tac pi="pi" in fin.eqvt(2))
2810apply(simp)
2811apply(rule conjI)
2812apply(rule_tac x="<a>:M" in exI)
2813apply(simp)
2814apply(rule_tac x="(xb):N" in exI)
2815apply(simp)
2816apply(rule_tac x="(rev pi)\<bullet>((y):ImpL <a>.M (xa).N y)" in exI)
2817apply(perm_simp)
2818apply(rule_tac x="(rev pi)\<bullet>xa" in exI) 
2819apply(rule_tac x="(rev pi)\<bullet>a" in exI) 
2820apply(rule_tac x="(rev pi)\<bullet>y" in exI) 
2821apply(rule_tac x="(rev pi)\<bullet>M" in exI)
2822apply(rule_tac x="(rev pi)\<bullet>N" in exI)
2823apply(simp add: swap_simps)
2824apply(drule_tac pi="rev pi" in fin.eqvt(2))
2825apply(simp)
2826apply(drule sym)
2827apply(drule sym)
2828apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2829apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
2830apply(simp add: swap_simps)
2831done
2832
2833lemma sum_cases:
2834 shows "(\<exists>y. x=Inl y) \<or> (\<exists>y. x=Inr y)"
2835apply(rule_tac s="x" in sumE)
2836apply(auto)
2837done
2838
2839function
2840  NEGc::"ty \<Rightarrow> ntrm set \<Rightarrow> ctrm set"
2841and
2842  NEGn::"ty \<Rightarrow> ctrm set \<Rightarrow> ntrm set"
2843where
2844  "NEGc (PR A)    X = AXIOMSc (PR A) \<union> BINDINGc (PR A) X"  
2845| "NEGc (NOT C)   X = AXIOMSc (NOT C) \<union> BINDINGc (NOT C) X 
2846                         \<union> NOTRIGHT (NOT C) (lfp (NEGn C \<circ> NEGc C))"  
2847| "NEGc (C AND D) X = AXIOMSc (C AND D) \<union> BINDINGc (C AND D) X 
2848                     \<union> ANDRIGHT (C AND D) (NEGc C (lfp (NEGn C \<circ> NEGc C))) (NEGc D (lfp (NEGn D \<circ> NEGc D)))"
2849| "NEGc (C OR D)  X = AXIOMSc (C OR D) \<union> BINDINGc (C OR D) X  
2850                         \<union> ORRIGHT1 (C OR D) (NEGc C (lfp (NEGn C \<circ> NEGc C))) 
2851                         \<union> ORRIGHT2 (C OR D) (NEGc D (lfp (NEGn D \<circ> NEGc D)))"
2852| "NEGc (C IMP D) X = AXIOMSc (C IMP D) \<union> BINDINGc (C IMP D) X 
2853    \<union> IMPRIGHT (C IMP D) (lfp (NEGn C \<circ> NEGc C)) (NEGc D (lfp (NEGn D \<circ> NEGc D))) 
2854                          (lfp (NEGn D \<circ> NEGc D)) (NEGc C (lfp (NEGn C \<circ> NEGc C)))"
2855| "NEGn (PR A)    X = AXIOMSn (PR A) \<union> BINDINGn (PR A) X"   
2856| "NEGn (NOT C)   X = AXIOMSn (NOT C) \<union> BINDINGn (NOT C) X 
2857                         \<union> NOTLEFT (NOT C) (NEGc C (lfp (NEGn C \<circ> NEGc C)))"  
2858| "NEGn (C AND D) X = AXIOMSn (C AND D) \<union> BINDINGn (C AND D) X 
2859                         \<union> ANDLEFT1 (C AND D) (lfp (NEGn C \<circ> NEGc C)) 
2860                         \<union> ANDLEFT2 (C AND D) (lfp (NEGn D \<circ> NEGc D))"
2861| "NEGn (C OR D)  X = AXIOMSn (C OR D) \<union> BINDINGn (C OR D) X 
2862                         \<union> ORLEFT (C OR D) (lfp (NEGn C \<circ> NEGc C)) (lfp (NEGn D \<circ> NEGc D))"
2863| "NEGn (C IMP D) X = AXIOMSn (C IMP D) \<union> BINDINGn (C IMP D) X 
2864                         \<union> IMPLEFT (C IMP D) (NEGc C (lfp (NEGn C \<circ> NEGc C))) (lfp (NEGn D \<circ> NEGc D))"
2865using ty_cases sum_cases 
2866apply(auto simp add: ty.inject)
2867apply(drule_tac x="x" in meta_spec)
2868apply(fastforce simp add: ty.inject)
2869done
2870
2871termination
2872apply(relation "measure (case_sum (size\<circ>fst) (size\<circ>fst))")
2873apply(simp_all)
2874done
2875
2876text \<open>Candidates\<close>
2877
2878lemma test1:
2879  shows "x\<in>(X\<union>Y) = (x\<in>X \<or> x\<in>Y)"
2880by blast
2881
2882lemma test2:
2883  shows "x\<in>(X\<inter>Y) = (x\<in>X \<and> x\<in>Y)"
2884by blast
2885
2886lemma big_inter_eqvt:
2887  fixes pi1::"name prm"
2888  and   X::"('a::pt_name) set set"
2889  and   pi2::"coname prm"
2890  and   Y::"('b::pt_coname) set set"
2891  shows "(pi1\<bullet>(\<Inter>X)) = \<Inter>(pi1\<bullet>X)"
2892  and   "(pi2\<bullet>(\<Inter>Y)) = \<Inter>(pi2\<bullet>Y)"
2893apply(auto simp add: perm_set_def)
2894apply(rule_tac x="(rev pi1)\<bullet>x" in exI)
2895apply(perm_simp)
2896apply(rule ballI)
2897apply(drule_tac x="pi1\<bullet>xa" in spec)
2898apply(auto)
2899apply(drule_tac x="xa" in spec)
2900apply(auto)[1]
2901apply(rule_tac x="(rev pi1)\<bullet>xb" in exI)
2902apply(perm_simp)
2903apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst])
2904apply(simp add: pt_set_bij[OF pt_name_inst, OF at_name_inst])
2905apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst])
2906apply(rule_tac x="(rev pi2)\<bullet>x" in exI)
2907apply(perm_simp)
2908apply(rule ballI)
2909apply(drule_tac x="pi2\<bullet>xa" in spec)
2910apply(auto)
2911apply(drule_tac x="xa" in spec)
2912apply(auto)[1]
2913apply(rule_tac x="(rev pi2)\<bullet>xb" in exI)
2914apply(perm_simp)
2915apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst])
2916apply(simp add: pt_set_bij[OF pt_coname_inst, OF at_coname_inst])
2917apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst])
2918done
2919
2920lemma lfp_eqvt:
2921  fixes pi1::"name prm"
2922  and   f::"'a set \<Rightarrow> ('a::pt_name) set"
2923  and   pi2::"coname prm"
2924  and   g::"'b set \<Rightarrow> ('b::pt_coname) set"
2925  shows "pi1\<bullet>(lfp f) = lfp (pi1\<bullet>f)"
2926  and   "pi2\<bullet>(lfp g) = lfp (pi2\<bullet>g)"
2927apply(simp add: lfp_def)
2928apply(simp add: big_inter_eqvt)
2929apply(simp add: pt_Collect_eqvt[OF pt_name_inst, OF at_name_inst])
2930apply(subgoal_tac "{u. (pi1\<bullet>f) u \<subseteq> u} = {u. ((rev pi1)\<bullet>((pi1\<bullet>f) u)) \<subseteq> ((rev pi1)\<bullet>u)}")
2931apply(perm_simp)
2932apply(rule Collect_cong)
2933apply(rule iffI)
2934apply(rule subseteq_eqvt(1)[THEN iffD1])
2935apply(simp add: perm_bool)
2936apply(drule subseteq_eqvt(1)[THEN iffD2])
2937apply(simp add: perm_bool)
2938apply(simp add: lfp_def)
2939apply(simp add: big_inter_eqvt)
2940apply(simp add: pt_Collect_eqvt[OF pt_coname_inst, OF at_coname_inst])
2941apply(subgoal_tac "{u. (pi2\<bullet>g) u \<subseteq> u} = {u. ((rev pi2)\<bullet>((pi2\<bullet>g) u)) \<subseteq> ((rev pi2)\<bullet>u)}")
2942apply(perm_simp)
2943apply(rule Collect_cong)
2944apply(rule iffI)
2945apply(rule subseteq_eqvt(2)[THEN iffD1])
2946apply(simp add: perm_bool)
2947apply(drule subseteq_eqvt(2)[THEN iffD2])
2948apply(simp add: perm_bool)
2949done
2950
2951abbreviation
2952  CANDn::"ty \<Rightarrow> ntrm set"  ("\<parallel>'(_')\<parallel>" [60] 60) 
2953where
2954  "\<parallel>(B)\<parallel> \<equiv> lfp (NEGn B \<circ> NEGc B)" 
2955
2956abbreviation
2957  CANDc::"ty \<Rightarrow> ctrm set"  ("\<parallel><_>\<parallel>" [60] 60)
2958where
2959  "\<parallel><B>\<parallel> \<equiv> NEGc B (\<parallel>(B)\<parallel>)"
2960
2961lemma NEGn_decreasing:
2962  shows "X\<subseteq>Y \<Longrightarrow> NEGn B Y \<subseteq> NEGn B X"
2963by (nominal_induct B rule: ty.strong_induct)
2964   (auto dest: BINDINGn_decreasing)
2965
2966lemma NEGc_decreasing:
2967  shows "X\<subseteq>Y \<Longrightarrow> NEGc B Y \<subseteq> NEGc B X"
2968by (nominal_induct B rule: ty.strong_induct)
2969   (auto dest: BINDINGc_decreasing)
2970
2971lemma mono_NEGn_NEGc:
2972  shows "mono (NEGn B \<circ> NEGc B)"
2973  and   "mono (NEGc B \<circ> NEGn B)"
2974proof -
2975  have "\<forall>X Y. X\<subseteq>Y \<longrightarrow> NEGn B (NEGc B X) \<subseteq> NEGn B (NEGc B Y)"
2976  proof (intro strip)
2977    fix X::"ntrm set" and Y::"ntrm set"
2978    assume "X\<subseteq>Y"
2979    then have "NEGc B Y \<subseteq> NEGc B X" by (simp add: NEGc_decreasing)
2980    then show "NEGn B (NEGc B X) \<subseteq> NEGn B (NEGc B Y)" by (simp add: NEGn_decreasing)
2981  qed
2982  then show "mono (NEGn B \<circ> NEGc B)" by (simp add: mono_def)
2983next
2984  have "\<forall>X Y. X\<subseteq>Y \<longrightarrow> NEGc B (NEGn B X) \<subseteq> NEGc B (NEGn B Y)"
2985  proof (intro strip)
2986    fix X::"ctrm set" and Y::"ctrm set"
2987    assume "X\<subseteq>Y"
2988    then have "NEGn B Y \<subseteq> NEGn B X" by (simp add: NEGn_decreasing)
2989    then show "NEGc B (NEGn B X) \<subseteq> NEGc B (NEGn B Y)" by (simp add: NEGc_decreasing)
2990  qed
2991  then show "mono (NEGc B \<circ> NEGn B)" by (simp add: mono_def)
2992qed
2993
2994lemma NEG_simp:
2995  shows "\<parallel><B>\<parallel> = NEGc B (\<parallel>(B)\<parallel>)"
2996  and   "\<parallel>(B)\<parallel> = NEGn B (\<parallel><B>\<parallel>)"
2997proof -
2998  show "\<parallel><B>\<parallel> = NEGc B (\<parallel>(B)\<parallel>)" by simp
2999next
3000  have "\<parallel>(B)\<parallel> \<equiv> lfp (NEGn B \<circ> NEGc B)" by simp
3001  then have "\<parallel>(B)\<parallel> = (NEGn B \<circ> NEGc B) (\<parallel>(B)\<parallel>)" using mono_NEGn_NEGc def_lfp_unfold by blast
3002  then show "\<parallel>(B)\<parallel> = NEGn B (\<parallel><B>\<parallel>)" by simp
3003qed
3004
3005lemma NEG_elim:
3006  shows "M \<in> \<parallel><B>\<parallel> \<Longrightarrow> M \<in> NEGc B (\<parallel>(B)\<parallel>)"
3007  and   "N \<in> \<parallel>(B)\<parallel> \<Longrightarrow> N \<in> NEGn B (\<parallel><B>\<parallel>)"
3008using NEG_simp by (blast)+
3009
3010lemma NEG_intro:
3011  shows "M \<in> NEGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> M \<in> \<parallel><B>\<parallel>"
3012  and   "N \<in> NEGn B (\<parallel><B>\<parallel>) \<Longrightarrow> N \<in> \<parallel>(B)\<parallel>"
3013using NEG_simp by (blast)+
3014
3015lemma NEGc_simps:
3016  shows "NEGc (PR A) (\<parallel>(PR A)\<parallel>) = AXIOMSc (PR A) \<union> BINDINGc (PR A) (\<parallel>(PR A)\<parallel>)"  
3017  and   "NEGc (NOT C) (\<parallel>(NOT C)\<parallel>) = AXIOMSc (NOT C) \<union> BINDINGc (NOT C) (\<parallel>(NOT C)\<parallel>) 
3018                                        \<union> (NOTRIGHT (NOT C) (\<parallel>(C)\<parallel>))"  
3019  and   "NEGc (C AND D) (\<parallel>(C AND D)\<parallel>) = AXIOMSc (C AND D) \<union> BINDINGc (C AND D) (\<parallel>(C AND D)\<parallel>) 
3020                                        \<union> (ANDRIGHT (C AND D) (\<parallel><C>\<parallel>) (\<parallel><D>\<parallel>))"
3021  and   "NEGc (C OR D) (\<parallel>(C OR D)\<parallel>) = AXIOMSc (C OR D) \<union> BINDINGc (C OR D)  (\<parallel>(C OR D)\<parallel>)
3022                                        \<union> (ORRIGHT1 (C OR D) (\<parallel><C>\<parallel>)) \<union> (ORRIGHT2 (C OR D) (\<parallel><D>\<parallel>))"
3023  and   "NEGc (C IMP D) (\<parallel>(C IMP D)\<parallel>) = AXIOMSc (C IMP D) \<union> BINDINGc (C IMP D) (\<parallel>(C IMP D)\<parallel>) 
3024          \<union> (IMPRIGHT (C IMP D) (\<parallel>(C)\<parallel>) (\<parallel><D>\<parallel>) (\<parallel>(D)\<parallel>) (\<parallel><C>\<parallel>))"
3025by (simp_all only: NEGc.simps)
3026
3027lemma AXIOMS_in_CANDs:
3028  shows "AXIOMSn B \<subseteq> (\<parallel>(B)\<parallel>)"
3029  and   "AXIOMSc B \<subseteq> (\<parallel><B>\<parallel>)"
3030proof -
3031  have "AXIOMSn B \<subseteq> NEGn B (\<parallel><B>\<parallel>)"
3032    by (nominal_induct B rule: ty.strong_induct) (auto)
3033  then show "AXIOMSn B \<subseteq> \<parallel>(B)\<parallel>" using NEG_simp by blast
3034next
3035  have "AXIOMSc B \<subseteq> NEGc B (\<parallel>(B)\<parallel>)"
3036    by (nominal_induct B rule: ty.strong_induct) (auto)
3037  then show "AXIOMSc B \<subseteq> \<parallel><B>\<parallel>" using NEG_simp by blast
3038qed
3039
3040lemma Ax_in_CANDs:
3041  shows "(y):Ax x a \<in> \<parallel>(B)\<parallel>"
3042  and   "<b>:Ax x a \<in> \<parallel><B>\<parallel>"
3043proof -
3044  have "(y):Ax x a \<in> AXIOMSn B" by (auto simp add: AXIOMSn_def)
3045  also have "AXIOMSn B \<subseteq> \<parallel>(B)\<parallel>" by (rule AXIOMS_in_CANDs)
3046  finally show "(y):Ax x a \<in> \<parallel>(B)\<parallel>" by simp
3047next
3048  have "<b>:Ax x a \<in> AXIOMSc B" by (auto simp add: AXIOMSc_def)
3049  also have "AXIOMSc B \<subseteq> \<parallel><B>\<parallel>" by (rule AXIOMS_in_CANDs)
3050  finally show "<b>:Ax x a \<in> \<parallel><B>\<parallel>" by simp
3051qed
3052
3053lemma AXIOMS_eqvt_aux_name:
3054  fixes pi::"name prm"
3055  shows "M \<in> AXIOMSn B \<Longrightarrow> (pi\<bullet>M) \<in> AXIOMSn B" 
3056  and   "N \<in> AXIOMSc B \<Longrightarrow> (pi\<bullet>N) \<in> AXIOMSc B"
3057apply(auto simp add: AXIOMSn_def AXIOMSc_def)
3058apply(rule_tac x="pi\<bullet>x" in exI)
3059apply(rule_tac x="pi\<bullet>y" in exI)
3060apply(rule_tac x="pi\<bullet>b" in exI)
3061apply(simp)
3062apply(rule_tac x="pi\<bullet>a" in exI)
3063apply(rule_tac x="pi\<bullet>y" in exI)
3064apply(rule_tac x="pi\<bullet>b" in exI)
3065apply(simp)
3066done
3067
3068lemma AXIOMS_eqvt_aux_coname:
3069  fixes pi::"coname prm"
3070  shows "M \<in> AXIOMSn B \<Longrightarrow> (pi\<bullet>M) \<in> AXIOMSn B" 
3071  and   "N \<in> AXIOMSc B \<Longrightarrow> (pi\<bullet>N) \<in> AXIOMSc B"
3072apply(auto simp add: AXIOMSn_def AXIOMSc_def)
3073apply(rule_tac x="pi\<bullet>x" in exI)
3074apply(rule_tac x="pi\<bullet>y" in exI)
3075apply(rule_tac x="pi\<bullet>b" in exI)
3076apply(simp)
3077apply(rule_tac x="pi\<bullet>a" in exI)
3078apply(rule_tac x="pi\<bullet>y" in exI)
3079apply(rule_tac x="pi\<bullet>b" in exI)
3080apply(simp)
3081done
3082
3083lemma AXIOMS_eqvt_name:
3084  fixes pi::"name prm"
3085  shows "(pi\<bullet>AXIOMSn B) = AXIOMSn B" 
3086  and   "(pi\<bullet>AXIOMSc B) = AXIOMSc B"
3087apply(auto)
3088apply(simp add: pt_set_bij1a[OF pt_name_inst, OF at_name_inst])
3089apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_name(1))
3090apply(perm_simp)
3091apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_name(1))
3092apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst])
3093apply(simp add: pt_set_bij1a[OF pt_name_inst, OF at_name_inst])
3094apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_name(2))
3095apply(perm_simp)
3096apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_name(2))
3097apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst])
3098done
3099
3100lemma AXIOMS_eqvt_coname:
3101  fixes pi::"coname prm"
3102  shows "(pi\<bullet>AXIOMSn B) = AXIOMSn B" 
3103  and   "(pi\<bullet>AXIOMSc B) = AXIOMSc B"
3104apply(auto)
3105apply(simp add: pt_set_bij1a[OF pt_coname_inst, OF at_coname_inst])
3106apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_coname(1))
3107apply(perm_simp)
3108apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_coname(1))
3109apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst])
3110apply(simp add: pt_set_bij1a[OF pt_coname_inst, OF at_coname_inst])
3111apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_coname(2))
3112apply(perm_simp)
3113apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_coname(2))
3114apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst])
3115done
3116
3117lemma BINDING_eqvt_name:
3118  fixes pi::"name prm"
3119  shows "(pi\<bullet>(BINDINGn B X)) = BINDINGn B (pi\<bullet>X)" 
3120  and   "(pi\<bullet>(BINDINGc B Y)) = BINDINGc B (pi\<bullet>Y)" 
3121apply(auto simp add: BINDINGn_def BINDINGc_def perm_set_def)
3122apply(rule_tac x="pi\<bullet>xb" in exI)
3123apply(rule_tac x="pi\<bullet>M" in exI)
3124apply(simp)
3125apply(auto)[1]
3126apply(drule_tac x="(rev pi)\<bullet>a" in spec)
3127apply(drule_tac x="(rev pi)\<bullet>P" in spec)
3128apply(drule mp)
3129apply(drule sym)
3130apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
3131apply(simp)
3132apply(drule_tac ?pi1.0="pi" in SNa_eqvt(1))
3133apply(perm_simp add: nsubst_eqvt)
3134apply(rule_tac x="(rev pi\<bullet>xa):(rev pi\<bullet>M)" in exI)
3135apply(perm_simp)
3136apply(rule_tac x="rev pi\<bullet>xa" in exI)
3137apply(rule_tac x="rev pi\<bullet>M" in exI)
3138apply(simp)
3139apply(auto)[1]
3140apply(drule_tac x="pi\<bullet>a" in spec)
3141apply(drule_tac x="pi\<bullet>P" in spec)
3142apply(drule mp)
3143apply(force)
3144apply(drule_tac ?pi1.0="rev pi" in SNa_eqvt(1))
3145apply(perm_simp add: nsubst_eqvt)
3146apply(rule_tac x="pi\<bullet>a" in exI)
3147apply(rule_tac x="pi\<bullet>M" in exI)
3148apply(simp)
3149apply(auto)[1]
3150apply(drule_tac x="(rev pi)\<bullet>x" in spec)
3151apply(drule_tac x="(rev pi)\<bullet>P" in spec)
3152apply(drule mp)
3153apply(drule sym)
3154apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
3155apply(simp)
3156apply(drule_tac ?pi1.0="pi" in SNa_eqvt(1))
3157apply(perm_simp add: csubst_eqvt)
3158apply(rule_tac x="<(rev pi\<bullet>a)>:(rev pi\<bullet>M)" in exI)
3159apply(perm_simp)
3160apply(rule_tac x="rev pi\<bullet>a" in exI)
3161apply(rule_tac x="rev pi\<bullet>M" in exI)
3162apply(simp add: swap_simps)
3163apply(auto)[1]
3164apply(drule_tac x="pi\<bullet>x" in spec)
3165apply(drule_tac x="pi\<bullet>P" in spec)
3166apply(drule mp)
3167apply(force)
3168apply(drule_tac ?pi1.0="rev pi" in SNa_eqvt(1))
3169apply(perm_simp add: csubst_eqvt)
3170done
3171
3172lemma BINDING_eqvt_coname:
3173  fixes pi::"coname prm"
3174  shows "(pi\<bullet>(BINDINGn B X)) = BINDINGn B (pi\<bullet>X)" 
3175  and   "(pi\<bullet>(BINDINGc B Y)) = BINDINGc B (pi\<bullet>Y)" 
3176apply(auto simp add: BINDINGn_def BINDINGc_def perm_set_def)
3177apply(rule_tac x="pi\<bullet>xb" in exI)
3178apply(rule_tac x="pi\<bullet>M" in exI)
3179apply(simp)
3180apply(auto)[1]
3181apply(drule_tac x="(rev pi)\<bullet>a" in spec)
3182apply(drule_tac x="(rev pi)\<bullet>P" in spec)
3183apply(drule mp)
3184apply(drule sym)
3185apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
3186apply(simp)
3187apply(drule_tac ?pi2.0="pi" in SNa_eqvt(2))
3188apply(perm_simp add: nsubst_eqvt)
3189apply(rule_tac x="(rev pi\<bullet>xa):(rev pi\<bullet>M)" in exI)
3190apply(perm_simp)
3191apply(rule_tac x="rev pi\<bullet>xa" in exI)
3192apply(rule_tac x="rev pi\<bullet>M" in exI)
3193apply(simp add: swap_simps)
3194apply(auto)[1]
3195apply(drule_tac x="pi\<bullet>a" in spec)
3196apply(drule_tac x="pi\<bullet>P" in spec)
3197apply(drule mp)
3198apply(force)
3199apply(drule_tac ?pi2.0="rev pi" in SNa_eqvt(2))
3200apply(perm_simp add: nsubst_eqvt)
3201apply(rule_tac x="pi\<bullet>a" in exI)
3202apply(rule_tac x="pi\<bullet>M" in exI)
3203apply(simp)
3204apply(auto)[1]
3205apply(drule_tac x="(rev pi)\<bullet>x" in spec)
3206apply(drule_tac x="(rev pi)\<bullet>P" in spec)
3207apply(drule mp)
3208apply(drule sym)
3209apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
3210apply(simp)
3211apply(drule_tac ?pi2.0="pi" in SNa_eqvt(2))
3212apply(perm_simp add: csubst_eqvt)
3213apply(rule_tac x="<(rev pi\<bullet>a)>:(rev pi\<bullet>M)" in exI)
3214apply(perm_simp)
3215apply(rule_tac x="rev pi\<bullet>a" in exI)
3216apply(rule_tac x="rev pi\<bullet>M" in exI)
3217apply(simp)
3218apply(auto)[1]
3219apply(drule_tac x="pi\<bullet>x" in spec)
3220apply(drule_tac x="pi\<bullet>P" in spec)
3221apply(drule mp)
3222apply(force)
3223apply(drule_tac ?pi2.0="rev pi" in SNa_eqvt(2))
3224apply(perm_simp add: csubst_eqvt)
3225done
3226
3227lemma CAND_eqvt_name:
3228  fixes pi::"name prm"
3229  shows   "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)"
3230  and     "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)"
3231proof (nominal_induct B rule: ty.strong_induct)
3232  case (PR X)
3233  { case 1 show ?case 
3234      apply -
3235      apply(simp add: lfp_eqvt)
3236      apply(simp add: perm_fun_def)
3237      apply(simp add: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name)
3238      apply(perm_simp)
3239    done
3240  next
3241    case 2 show ?case
3242      apply -
3243      apply(simp only: NEGc_simps)
3244      apply(simp add: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name)
3245      apply(simp add: lfp_eqvt)
3246      apply(simp add: comp_def)
3247      apply(simp add: perm_fun_def)
3248      apply(simp add: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name)
3249      apply(perm_simp)
3250      done
3251  }
3252next
3253  case (NOT B)
3254  have ih1: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3255  have ih2: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3256  have g: "pi\<bullet>(\<parallel>(NOT B)\<parallel>) = (\<parallel>(NOT B)\<parallel>)"
3257    apply -
3258    apply(simp only: lfp_eqvt)
3259    apply(simp only: comp_def)
3260    apply(simp only: perm_fun_def)
3261    apply(simp only: NEGc.simps NEGn.simps)
3262    apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name NOTRIGHT_eqvt_name NOTLEFT_eqvt_name)
3263    apply(perm_simp add: ih1 ih2)
3264    done
3265  { case 1 show ?case by (rule g)
3266  next 
3267    case 2 show ?case
3268      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name NOTRIGHT_eqvt_name ih1 ih2 g)
3269  }
3270next
3271  case (AND A B)
3272  have ih1: "pi\<bullet>(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact
3273  have ih2: "pi\<bullet>(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact
3274  have ih3: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3275  have ih4: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3276  have g: "pi\<bullet>(\<parallel>(A AND B)\<parallel>) = (\<parallel>(A AND B)\<parallel>)"
3277    apply -
3278    apply(simp only: lfp_eqvt)
3279    apply(simp only: comp_def)
3280    apply(simp only: perm_fun_def)
3281    apply(simp only: NEGc.simps NEGn.simps)
3282    apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name ANDRIGHT_eqvt_name 
3283                     ANDLEFT2_eqvt_name ANDLEFT1_eqvt_name)
3284    apply(perm_simp add: ih1 ih2 ih3 ih4)
3285    done
3286  { case 1 show ?case by (rule g)
3287  next 
3288    case 2 show ?case
3289      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name 
3290                     ANDRIGHT_eqvt_name ANDLEFT1_eqvt_name ANDLEFT2_eqvt_name ih1 ih2 ih3 ih4 g)
3291  }
3292next
3293  case (OR A B)
3294  have ih1: "pi\<bullet>(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact
3295  have ih2: "pi\<bullet>(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact
3296  have ih3: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3297  have ih4: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3298  have g: "pi\<bullet>(\<parallel>(A OR B)\<parallel>) = (\<parallel>(A OR B)\<parallel>)"
3299    apply -
3300    apply(simp only: lfp_eqvt)
3301    apply(simp only: comp_def)
3302    apply(simp only: perm_fun_def)
3303    apply(simp only: NEGc.simps NEGn.simps)
3304    apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name ORRIGHT1_eqvt_name 
3305                     ORRIGHT2_eqvt_name ORLEFT_eqvt_name)
3306    apply(perm_simp add: ih1 ih2 ih3 ih4)
3307    done
3308  { case 1 show ?case by (rule g)
3309  next 
3310    case 2 show ?case
3311      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name 
3312                     ORRIGHT1_eqvt_name ORRIGHT2_eqvt_name ORLEFT_eqvt_name ih1 ih2 ih3 ih4 g)
3313  }
3314next
3315  case (IMP A B)
3316  have ih1: "pi\<bullet>(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact
3317  have ih2: "pi\<bullet>(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact
3318  have ih3: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3319  have ih4: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3320  have g: "pi\<bullet>(\<parallel>(A IMP B)\<parallel>) = (\<parallel>(A IMP B)\<parallel>)"
3321    apply -
3322    apply(simp only: lfp_eqvt)
3323    apply(simp only: comp_def)
3324    apply(simp only: perm_fun_def)
3325    apply(simp only: NEGc.simps NEGn.simps)
3326    apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name IMPRIGHT_eqvt_name IMPLEFT_eqvt_name)
3327    apply(perm_simp add: ih1 ih2 ih3 ih4)
3328    done
3329  { case 1 show ?case by (rule g)
3330  next 
3331    case 2 show ?case
3332      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name 
3333                     IMPRIGHT_eqvt_name IMPLEFT_eqvt_name ih1 ih2 ih3 ih4 g)
3334  }
3335qed
3336
3337lemma CAND_eqvt_coname:
3338  fixes pi::"coname prm"
3339  shows   "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)"
3340  and     "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)"
3341proof (nominal_induct B rule: ty.strong_induct)
3342  case (PR X)
3343  { case 1 show ?case 
3344      apply -
3345      apply(simp add: lfp_eqvt)
3346      apply(simp add: perm_fun_def)
3347      apply(simp add: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname)
3348      apply(perm_simp)
3349    done
3350  next
3351    case 2 show ?case
3352      apply -
3353      apply(simp only: NEGc_simps)
3354      apply(simp add: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname)
3355      apply(simp add: lfp_eqvt)
3356      apply(simp add: comp_def)
3357      apply(simp add: perm_fun_def)
3358      apply(simp add: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname)
3359      apply(perm_simp)
3360      done
3361  }
3362next
3363  case (NOT B)
3364  have ih1: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3365  have ih2: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3366  have g: "pi\<bullet>(\<parallel>(NOT B)\<parallel>) = (\<parallel>(NOT B)\<parallel>)"
3367    apply -
3368    apply(simp only: lfp_eqvt)
3369    apply(simp only: comp_def)
3370    apply(simp only: perm_fun_def)
3371    apply(simp only: NEGc.simps NEGn.simps)
3372    apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname 
3373            NOTRIGHT_eqvt_coname NOTLEFT_eqvt_coname)
3374    apply(perm_simp add: ih1 ih2)
3375    done
3376  { case 1 show ?case by (rule g)
3377  next 
3378    case 2 show ?case
3379      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname 
3380              NOTRIGHT_eqvt_coname ih1 ih2 g)
3381  }
3382next
3383  case (AND A B)
3384  have ih1: "pi\<bullet>(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact
3385  have ih2: "pi\<bullet>(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact
3386  have ih3: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3387  have ih4: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3388  have g: "pi\<bullet>(\<parallel>(A AND B)\<parallel>) = (\<parallel>(A AND B)\<parallel>)"
3389    apply -
3390    apply(simp only: lfp_eqvt)
3391    apply(simp only: comp_def)
3392    apply(simp only: perm_fun_def)
3393    apply(simp only: NEGc.simps NEGn.simps)
3394    apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname ANDRIGHT_eqvt_coname 
3395                     ANDLEFT2_eqvt_coname ANDLEFT1_eqvt_coname)
3396    apply(perm_simp add: ih1 ih2 ih3 ih4)
3397    done
3398  { case 1 show ?case by (rule g)
3399  next 
3400    case 2 show ?case
3401      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname 
3402                     ANDRIGHT_eqvt_coname ANDLEFT1_eqvt_coname ANDLEFT2_eqvt_coname ih1 ih2 ih3 ih4 g)
3403  }
3404next
3405  case (OR A B)
3406  have ih1: "pi\<bullet>(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact
3407  have ih2: "pi\<bullet>(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact
3408  have ih3: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3409  have ih4: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3410  have g: "pi\<bullet>(\<parallel>(A OR B)\<parallel>) = (\<parallel>(A OR B)\<parallel>)"
3411    apply -
3412    apply(simp only: lfp_eqvt)
3413    apply(simp only: comp_def)
3414    apply(simp only: perm_fun_def)
3415    apply(simp only: NEGc.simps NEGn.simps)
3416    apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname ORRIGHT1_eqvt_coname 
3417                     ORRIGHT2_eqvt_coname ORLEFT_eqvt_coname)
3418    apply(perm_simp add: ih1 ih2 ih3 ih4)
3419    done
3420  { case 1 show ?case by (rule g)
3421  next 
3422    case 2 show ?case
3423      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname 
3424                     ORRIGHT1_eqvt_coname ORRIGHT2_eqvt_coname ORLEFT_eqvt_coname ih1 ih2 ih3 ih4 g)
3425  }
3426next
3427  case (IMP A B)
3428  have ih1: "pi\<bullet>(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact
3429  have ih2: "pi\<bullet>(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact
3430  have ih3: "pi\<bullet>(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact
3431  have ih4: "pi\<bullet>(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact
3432  have g: "pi\<bullet>(\<parallel>(A IMP B)\<parallel>) = (\<parallel>(A IMP B)\<parallel>)"
3433    apply -
3434    apply(simp only: lfp_eqvt)
3435    apply(simp only: comp_def)
3436    apply(simp only: perm_fun_def)
3437    apply(simp only: NEGc.simps NEGn.simps)
3438    apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname IMPRIGHT_eqvt_coname 
3439         IMPLEFT_eqvt_coname)
3440    apply(perm_simp add: ih1 ih2 ih3 ih4)
3441    done
3442  { case 1 show ?case by (rule g)
3443  next 
3444    case 2 show ?case
3445      by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname 
3446                     IMPRIGHT_eqvt_coname IMPLEFT_eqvt_coname ih1 ih2 ih3 ih4 g)
3447  }
3448qed
3449
3450text \<open>Elimination rules for the set-operators\<close>
3451
3452lemma BINDINGc_elim:
3453  assumes a: "<a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>)"
3454  shows "\<forall>x P. ((x):P)\<in>(\<parallel>(B)\<parallel>) \<longrightarrow> SNa (M{a:=(x).P})"
3455using a
3456apply(auto simp add: BINDINGc_def)
3457apply(auto simp add: ctrm.inject alpha)
3458apply(drule_tac x="[(a,aa)]\<bullet>x" in spec)
3459apply(drule_tac x="[(a,aa)]\<bullet>P" in spec)
3460apply(drule mp)
3461apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3462apply(simp add: CAND_eqvt_coname)
3463apply(drule_tac ?pi2.0="[(a,aa)]" in SNa_eqvt(2))
3464apply(perm_simp add: csubst_eqvt)
3465done
3466
3467lemma BINDINGn_elim:
3468  assumes a: "(x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)"
3469  shows "\<forall>c P. (<c>:P)\<in>(\<parallel><B>\<parallel>) \<longrightarrow> SNa (M{x:=<c>.P})"
3470using a
3471apply(auto simp add: BINDINGn_def)
3472apply(auto simp add: ntrm.inject alpha)
3473apply(drule_tac x="[(x,xa)]\<bullet>c" in spec)
3474apply(drule_tac x="[(x,xa)]\<bullet>P" in spec)
3475apply(drule mp)
3476apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3477apply(simp add: CAND_eqvt_name)
3478apply(drule_tac ?pi1.0="[(x,xa)]" in SNa_eqvt(1))
3479apply(perm_simp add: nsubst_eqvt)
3480done
3481
3482lemma NOTRIGHT_elim:
3483  assumes a: "<a>:M \<in> NOTRIGHT (NOT B) (\<parallel>(B)\<parallel>)"
3484  obtains x' M' where "M = NotR (x').M' a" and "fic (NotR (x').M' a) a" and "(x'):M' \<in> (\<parallel>(B)\<parallel>)"
3485using a
3486apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm)
3487apply(drule_tac x="x" in meta_spec)
3488apply(drule_tac x="[(a,aa)]\<bullet>Ma" in meta_spec)
3489apply(simp)
3490apply(drule meta_mp)
3491apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2))
3492apply(simp add: calc_atm)
3493apply(drule meta_mp)
3494apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3495apply(simp add: calc_atm CAND_eqvt_coname)
3496apply(simp)
3497done
3498
3499lemma NOTLEFT_elim:
3500  assumes a: "(x):M \<in> NOTLEFT (NOT B) (\<parallel><B>\<parallel>)"
3501  obtains a' M' where "M = NotL <a'>.M' x" and "fin (NotL <a'>.M' x) x" and "<a'>:M' \<in> (\<parallel><B>\<parallel>)"
3502using a
3503apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm)
3504apply(drule_tac x="a" in meta_spec)
3505apply(drule_tac x="[(x,xa)]\<bullet>Ma" in meta_spec)
3506apply(simp)
3507apply(drule meta_mp)
3508apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1))
3509apply(simp add: calc_atm)
3510apply(drule meta_mp)
3511apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3512apply(simp add: calc_atm CAND_eqvt_name)
3513apply(simp)
3514done
3515
3516lemma ANDRIGHT_elim:
3517  assumes a: "<a>:M \<in> ANDRIGHT (B AND C) (\<parallel><B>\<parallel>) (\<parallel><C>\<parallel>)"
3518  obtains d' M' e' N' where "M = AndR <d'>.M' <e'>.N' a" and "fic (AndR <d'>.M' <e'>.N' a) a" 
3519                      and "<d'>:M' \<in> (\<parallel><B>\<parallel>)" and "<e'>:N' \<in> (\<parallel><C>\<parallel>)"
3520using a
3521apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm fresh_atm)
3522apply(drule_tac x="c" in meta_spec)
3523apply(drule_tac x="[(a,c)]\<bullet>Ma" in meta_spec)
3524apply(drule_tac x="c" in meta_spec)
3525apply(drule_tac x="[(a,c)]\<bullet>N" in meta_spec)
3526apply(simp)
3527apply(drule meta_mp)
3528apply(drule_tac pi="[(a,c)]" in fic.eqvt(2))
3529apply(simp add: calc_atm)
3530apply(drule meta_mp)
3531apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3532apply(simp add: calc_atm CAND_eqvt_coname)
3533apply(drule meta_mp)
3534apply(drule_tac pi="[(a,c)]" and x="<a>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3535apply(simp add: calc_atm CAND_eqvt_coname)
3536apply(simp)
3537apply(case_tac "a=b")
3538apply(simp)
3539apply(drule_tac x="c" in meta_spec)
3540apply(drule_tac x="[(b,c)]\<bullet>Ma" in meta_spec)
3541apply(drule_tac x="c" in meta_spec)
3542apply(drule_tac x="[(b,c)]\<bullet>N" in meta_spec)
3543apply(simp)
3544apply(drule meta_mp)
3545apply(drule_tac pi="[(b,c)]" in fic.eqvt(2))
3546apply(simp add: calc_atm)
3547apply(drule meta_mp)
3548apply(drule_tac pi="[(b,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3549apply(simp add: calc_atm CAND_eqvt_coname)
3550apply(drule meta_mp)
3551apply(drule_tac pi="[(b,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3552apply(simp add: calc_atm CAND_eqvt_coname)
3553apply(simp)
3554apply(simp)
3555apply(case_tac "c=b")
3556apply(simp)
3557apply(drule_tac x="b" in meta_spec)
3558apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
3559apply(drule_tac x="a" in meta_spec)
3560apply(drule_tac x="[(a,b)]\<bullet>N" in meta_spec)
3561apply(simp)
3562apply(drule meta_mp)
3563apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
3564apply(simp add: calc_atm)
3565apply(drule meta_mp)
3566apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3567apply(simp add: calc_atm CAND_eqvt_coname)
3568apply(drule meta_mp)
3569apply(drule_tac pi="[(a,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3570apply(simp add: calc_atm CAND_eqvt_coname)
3571apply(simp)
3572apply(simp)
3573apply(drule_tac x="c" in meta_spec)
3574apply(drule_tac x="[(a,c)]\<bullet>Ma" in meta_spec)
3575apply(drule_tac x="b" in meta_spec)
3576apply(drule_tac x="[(a,c)]\<bullet>N" in meta_spec)
3577apply(simp)
3578apply(drule meta_mp)
3579apply(drule_tac pi="[(a,c)]" in fic.eqvt(2))
3580apply(simp add: calc_atm)
3581apply(drule meta_mp)
3582apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3583apply(simp add: calc_atm CAND_eqvt_coname)
3584apply(drule meta_mp)
3585apply(drule_tac pi="[(a,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3586apply(simp add: calc_atm CAND_eqvt_coname)
3587apply(simp)
3588apply(case_tac "a=aa")
3589apply(simp)
3590apply(drule_tac x="c" in meta_spec)
3591apply(drule_tac x="[(aa,c)]\<bullet>Ma" in meta_spec)
3592apply(drule_tac x="c" in meta_spec)
3593apply(drule_tac x="[(aa,c)]\<bullet>N" in meta_spec)
3594apply(simp)
3595apply(drule meta_mp)
3596apply(drule_tac pi="[(aa,c)]" in fic.eqvt(2))
3597apply(simp add: calc_atm)
3598apply(drule meta_mp)
3599apply(drule_tac pi="[(aa,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3600apply(simp add: calc_atm CAND_eqvt_coname)
3601apply(drule meta_mp)
3602apply(drule_tac pi="[(aa,c)]" and x="<aa>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3603apply(simp add: calc_atm CAND_eqvt_coname)
3604apply(simp)
3605apply(simp)
3606apply(case_tac "c=aa")
3607apply(simp)
3608apply(drule_tac x="a" in meta_spec)
3609apply(drule_tac x="[(a,aa)]\<bullet>Ma" in meta_spec)
3610apply(drule_tac x="aa" in meta_spec)
3611apply(drule_tac x="[(a,aa)]\<bullet>N" in meta_spec)
3612apply(simp)
3613apply(drule meta_mp)
3614apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2))
3615apply(simp add: calc_atm)
3616apply(drule meta_mp)
3617apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3618apply(simp add: calc_atm CAND_eqvt_coname)
3619apply(drule meta_mp)
3620apply(drule_tac pi="[(a,aa)]" and x="<a>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3621apply(simp add: calc_atm CAND_eqvt_coname)
3622apply(simp)
3623apply(simp)
3624apply(drule_tac x="aa" in meta_spec)
3625apply(drule_tac x="[(a,c)]\<bullet>Ma" in meta_spec)
3626apply(drule_tac x="c" in meta_spec)
3627apply(drule_tac x="[(a,c)]\<bullet>N" in meta_spec)
3628apply(simp)
3629apply(drule meta_mp)
3630apply(drule_tac pi="[(a,c)]" in fic.eqvt(2))
3631apply(simp add: calc_atm)
3632apply(drule meta_mp)
3633apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3634apply(simp add: calc_atm CAND_eqvt_coname)
3635apply(drule meta_mp)
3636apply(drule_tac pi="[(a,c)]" and x="<a>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3637apply(simp add: calc_atm CAND_eqvt_coname)
3638apply(simp)
3639apply(case_tac "a=aa")
3640apply(simp)
3641apply(case_tac "aa=b")
3642apply(simp)
3643apply(drule_tac x="c" in meta_spec)
3644apply(drule_tac x="[(b,c)]\<bullet>Ma" in meta_spec)
3645apply(drule_tac x="c" in meta_spec)
3646apply(drule_tac x="[(b,c)]\<bullet>N" in meta_spec)
3647apply(simp)
3648apply(drule meta_mp)
3649apply(drule_tac pi="[(b,c)]" in fic.eqvt(2))
3650apply(simp add: calc_atm)
3651apply(drule meta_mp)
3652apply(drule_tac pi="[(b,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3653apply(simp add: calc_atm CAND_eqvt_coname)
3654apply(drule meta_mp)
3655apply(drule_tac pi="[(b,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3656apply(simp add: calc_atm CAND_eqvt_coname)
3657apply(simp)
3658apply(simp)
3659apply(case_tac "c=b")
3660apply(simp)
3661apply(drule_tac x="b" in meta_spec)
3662apply(drule_tac x="[(aa,b)]\<bullet>Ma" in meta_spec)
3663apply(drule_tac x="aa" in meta_spec)
3664apply(drule_tac x="[(aa,b)]\<bullet>N" in meta_spec)
3665apply(simp)
3666apply(drule meta_mp)
3667apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2))
3668apply(simp add: calc_atm)
3669apply(drule meta_mp)
3670apply(drule_tac pi="[(aa,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3671apply(simp add: calc_atm CAND_eqvt_coname)
3672apply(drule meta_mp)
3673apply(drule_tac pi="[(aa,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3674apply(simp add: calc_atm CAND_eqvt_coname)
3675apply(simp)
3676apply(simp)
3677apply(drule_tac x="c" in meta_spec)
3678apply(drule_tac x="[(aa,c)]\<bullet>Ma" in meta_spec)
3679apply(drule_tac x="b" in meta_spec)
3680apply(drule_tac x="[(aa,c)]\<bullet>N" in meta_spec)
3681apply(simp)
3682apply(drule meta_mp)
3683apply(drule_tac pi="[(aa,c)]" in fic.eqvt(2))
3684apply(simp add: calc_atm)
3685apply(drule meta_mp)
3686apply(drule_tac pi="[(aa,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3687apply(simp add: calc_atm CAND_eqvt_coname)
3688apply(drule meta_mp)
3689apply(drule_tac pi="[(aa,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3690apply(simp add: calc_atm CAND_eqvt_coname)
3691apply(simp)
3692apply(simp)
3693apply(case_tac "c=aa")
3694apply(simp)
3695apply(case_tac "a=b")
3696apply(simp)
3697apply(drule_tac x="b" in meta_spec)
3698apply(drule_tac x="[(b,aa)]\<bullet>Ma" in meta_spec)
3699apply(drule_tac x="aa" in meta_spec)
3700apply(drule_tac x="[(b,aa)]\<bullet>N" in meta_spec)
3701apply(simp)
3702apply(drule meta_mp)
3703apply(drule_tac pi="[(b,aa)]" in fic.eqvt(2))
3704apply(simp add: calc_atm)
3705apply(drule meta_mp)
3706apply(drule_tac pi="[(b,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3707apply(simp add: calc_atm CAND_eqvt_coname)
3708apply(drule meta_mp)
3709apply(drule_tac pi="[(b,aa)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3710apply(simp add: calc_atm CAND_eqvt_coname)
3711apply(simp)
3712apply(simp)
3713apply(case_tac "aa=b")
3714apply(simp)
3715apply(drule_tac x="a" in meta_spec)
3716apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
3717apply(drule_tac x="a" in meta_spec)
3718apply(drule_tac x="[(a,b)]\<bullet>N" in meta_spec)
3719apply(simp)
3720apply(drule meta_mp)
3721apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
3722apply(simp add: calc_atm)
3723apply(drule meta_mp)
3724apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3725apply(simp add: calc_atm CAND_eqvt_coname)
3726apply(drule meta_mp)
3727apply(drule_tac pi="[(a,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3728apply(simp add: calc_atm CAND_eqvt_coname)
3729apply(simp)
3730apply(simp)
3731apply(drule_tac x="a" in meta_spec)
3732apply(drule_tac x="[(a,aa)]\<bullet>Ma" in meta_spec)
3733apply(drule_tac x="b" in meta_spec)
3734apply(drule_tac x="[(a,aa)]\<bullet>N" in meta_spec)
3735apply(simp)
3736apply(drule meta_mp)
3737apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2))
3738apply(simp add: calc_atm)
3739apply(drule meta_mp)
3740apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3741apply(simp add: calc_atm CAND_eqvt_coname)
3742apply(drule meta_mp)
3743apply(drule_tac pi="[(a,aa)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3744apply(simp add: calc_atm CAND_eqvt_coname)
3745apply(simp)
3746apply(simp)
3747apply(case_tac "a=b")
3748apply(simp)
3749apply(drule_tac x="aa" in meta_spec)
3750apply(drule_tac x="[(b,c)]\<bullet>Ma" in meta_spec)
3751apply(drule_tac x="c" in meta_spec)
3752apply(drule_tac x="[(b,c)]\<bullet>N" in meta_spec)
3753apply(simp)
3754apply(drule meta_mp)
3755apply(drule_tac pi="[(b,c)]" in fic.eqvt(2))
3756apply(simp add: calc_atm)
3757apply(drule meta_mp)
3758apply(drule_tac pi="[(b,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3759apply(simp add: calc_atm CAND_eqvt_coname)
3760apply(drule meta_mp)
3761apply(drule_tac pi="[(b,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3762apply(simp add: calc_atm CAND_eqvt_coname)
3763apply(simp)
3764apply(simp)
3765apply(case_tac "c=b")
3766apply(simp)
3767apply(drule_tac x="aa" in meta_spec)
3768apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
3769apply(drule_tac x="a" in meta_spec)
3770apply(drule_tac x="[(a,b)]\<bullet>N" in meta_spec)
3771apply(simp)
3772apply(drule meta_mp)
3773apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
3774apply(simp add: calc_atm)
3775apply(drule meta_mp)
3776apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3777apply(simp add: calc_atm CAND_eqvt_coname)
3778apply(drule meta_mp)
3779apply(drule_tac pi="[(a,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3780apply(simp add: calc_atm CAND_eqvt_coname)
3781apply(simp)
3782apply(simp)
3783apply(drule_tac x="aa" in meta_spec)
3784apply(drule_tac x="[(a,c)]\<bullet>Ma" in meta_spec)
3785apply(drule_tac x="b" in meta_spec)
3786apply(drule_tac x="[(a,c)]\<bullet>N" in meta_spec)
3787apply(simp)
3788apply(drule meta_mp)
3789apply(drule_tac pi="[(a,c)]" in fic.eqvt(2))
3790apply(simp add: calc_atm)
3791apply(drule meta_mp)
3792apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3793apply(simp add: calc_atm CAND_eqvt_coname)
3794apply(drule meta_mp)
3795apply(drule_tac pi="[(a,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3796apply(simp add: calc_atm CAND_eqvt_coname)
3797apply(simp)
3798done 
3799
3800lemma ANDLEFT1_elim:
3801  assumes a: "(x):M \<in> ANDLEFT1 (B AND C) (\<parallel>(B)\<parallel>)"
3802  obtains x' M' where "M = AndL1 (x').M' x" and "fin (AndL1 (x').M' x) x" and "(x'):M' \<in> (\<parallel>(B)\<parallel>)"
3803using a [[ hypsubst_thin = true ]]
3804apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm)
3805apply(drule_tac x="y" in meta_spec)
3806apply(drule_tac x="[(x,y)]\<bullet>M" in meta_spec)
3807apply(simp)
3808apply(drule meta_mp)
3809apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
3810apply(simp add: calc_atm)
3811apply(drule meta_mp)
3812apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3813apply(simp add: calc_atm CAND_eqvt_name)
3814apply(simp)
3815apply(case_tac "x=xa")
3816apply(simp)
3817apply(drule_tac x="y" in meta_spec)
3818apply(drule_tac x="[(xa,y)]\<bullet>M" in meta_spec)
3819apply(simp)
3820apply(drule meta_mp)
3821apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1))
3822apply(simp add: calc_atm)
3823apply(drule meta_mp)
3824apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3825apply(simp add: calc_atm CAND_eqvt_name)
3826apply(simp)
3827apply(simp)
3828apply(case_tac "y=xa")
3829apply(simp)
3830apply(drule_tac x="x" in meta_spec)
3831apply(drule_tac x="[(x,xa)]\<bullet>M" in meta_spec)
3832apply(simp)
3833apply(drule meta_mp)
3834apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1))
3835apply(simp add: calc_atm)
3836apply(drule meta_mp)
3837apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3838apply(simp add: calc_atm CAND_eqvt_name)
3839apply(simp)
3840apply(simp)
3841apply(drule_tac x="xa" in meta_spec)
3842apply(drule_tac x="[(x,y)]\<bullet>M" in meta_spec)
3843apply(simp)
3844apply(drule meta_mp)
3845apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
3846apply(simp add: calc_atm)
3847apply(drule meta_mp)
3848apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3849apply(simp add: calc_atm CAND_eqvt_name)
3850apply(simp)
3851done
3852
3853lemma ANDLEFT2_elim:
3854  assumes a: "(x):M \<in> ANDLEFT2 (B AND C) (\<parallel>(C)\<parallel>)"
3855  obtains x' M' where "M = AndL2 (x').M' x" and "fin (AndL2 (x').M' x) x" and "(x'):M' \<in> (\<parallel>(C)\<parallel>)"
3856using a [[ hypsubst_thin = true ]]
3857apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm)
3858apply(drule_tac x="y" in meta_spec)
3859apply(drule_tac x="[(x,y)]\<bullet>M" in meta_spec)
3860apply(simp)
3861apply(drule meta_mp)
3862apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
3863apply(simp add: calc_atm)
3864apply(drule meta_mp)
3865apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3866apply(simp add: calc_atm CAND_eqvt_name)
3867apply(simp)
3868apply(case_tac "x=xa")
3869apply(simp)
3870apply(drule_tac x="y" in meta_spec)
3871apply(drule_tac x="[(xa,y)]\<bullet>M" in meta_spec)
3872apply(simp)
3873apply(drule meta_mp)
3874apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1))
3875apply(simp add: calc_atm)
3876apply(drule meta_mp)
3877apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3878apply(simp add: calc_atm CAND_eqvt_name)
3879apply(simp)
3880apply(simp)
3881apply(case_tac "y=xa")
3882apply(simp)
3883apply(drule_tac x="x" in meta_spec)
3884apply(drule_tac x="[(x,xa)]\<bullet>M" in meta_spec)
3885apply(simp)
3886apply(drule meta_mp)
3887apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1))
3888apply(simp add: calc_atm)
3889apply(drule meta_mp)
3890apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3891apply(simp add: calc_atm CAND_eqvt_name)
3892apply(simp)
3893apply(simp)
3894apply(drule_tac x="xa" in meta_spec)
3895apply(drule_tac x="[(x,y)]\<bullet>M" in meta_spec)
3896apply(simp)
3897apply(drule meta_mp)
3898apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
3899apply(simp add: calc_atm)
3900apply(drule meta_mp)
3901apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
3902apply(simp add: calc_atm CAND_eqvt_name)
3903apply(simp)
3904done
3905
3906lemma ORRIGHT1_elim:
3907  assumes a: "<a>:M \<in> ORRIGHT1 (B OR C) (\<parallel><B>\<parallel>)"
3908  obtains a' M' where "M = OrR1 <a'>.M' a" and "fic (OrR1 <a'>.M' a) a" and "<a'>:M' \<in> (\<parallel><B>\<parallel>)"
3909using a
3910apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm)
3911apply(drule_tac x="b" in meta_spec)
3912apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
3913apply(simp)
3914apply(drule meta_mp)
3915apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
3916apply(simp add: calc_atm)
3917apply(drule meta_mp)
3918apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3919apply(simp add: calc_atm CAND_eqvt_coname)
3920apply(simp)
3921apply(case_tac "a=aa")
3922apply(simp)
3923apply(drule_tac x="b" in meta_spec)
3924apply(drule_tac x="[(aa,b)]\<bullet>Ma" in meta_spec)
3925apply(simp)
3926apply(drule meta_mp)
3927apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2))
3928apply(simp add: calc_atm)
3929apply(drule meta_mp)
3930apply(drule_tac pi="[(aa,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3931apply(simp add: calc_atm CAND_eqvt_coname)
3932apply(simp)
3933apply(simp)
3934apply(case_tac "b=aa")
3935apply(simp)
3936apply(drule_tac x="a" in meta_spec)
3937apply(drule_tac x="[(a,aa)]\<bullet>Ma" in meta_spec)
3938apply(simp)
3939apply(drule meta_mp)
3940apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2))
3941apply(simp add: calc_atm)
3942apply(drule meta_mp)
3943apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3944apply(simp add: calc_atm CAND_eqvt_coname)
3945apply(simp)
3946apply(simp)
3947apply(drule_tac x="aa" in meta_spec)
3948apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
3949apply(simp)
3950apply(drule meta_mp)
3951apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
3952apply(simp add: calc_atm)
3953apply(drule meta_mp)
3954apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3955apply(simp add: calc_atm CAND_eqvt_coname)
3956apply(simp)
3957done
3958
3959lemma ORRIGHT2_elim:
3960  assumes a: "<a>:M \<in> ORRIGHT2 (B OR C) (\<parallel><C>\<parallel>)"
3961  obtains a' M' where "M = OrR2 <a'>.M' a" and "fic (OrR2 <a'>.M' a) a" and "<a'>:M' \<in> (\<parallel><C>\<parallel>)"
3962using a
3963apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm)
3964apply(drule_tac x="b" in meta_spec)
3965apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
3966apply(simp)
3967apply(drule meta_mp)
3968apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
3969apply(simp add: calc_atm)
3970apply(drule meta_mp)
3971apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3972apply(simp add: calc_atm CAND_eqvt_coname)
3973apply(simp)
3974apply(case_tac "a=aa")
3975apply(simp)
3976apply(drule_tac x="b" in meta_spec)
3977apply(drule_tac x="[(aa,b)]\<bullet>Ma" in meta_spec)
3978apply(simp)
3979apply(drule meta_mp)
3980apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2))
3981apply(simp add: calc_atm)
3982apply(drule meta_mp)
3983apply(drule_tac pi="[(aa,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3984apply(simp add: calc_atm CAND_eqvt_coname)
3985apply(simp)
3986apply(simp)
3987apply(case_tac "b=aa")
3988apply(simp)
3989apply(drule_tac x="a" in meta_spec)
3990apply(drule_tac x="[(a,aa)]\<bullet>Ma" in meta_spec)
3991apply(simp)
3992apply(drule meta_mp)
3993apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2))
3994apply(simp add: calc_atm)
3995apply(drule meta_mp)
3996apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
3997apply(simp add: calc_atm CAND_eqvt_coname)
3998apply(simp)
3999apply(simp)
4000apply(drule_tac x="aa" in meta_spec)
4001apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
4002apply(simp)
4003apply(drule meta_mp)
4004apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
4005apply(simp add: calc_atm)
4006apply(drule meta_mp)
4007apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4008apply(simp add: calc_atm CAND_eqvt_coname)
4009apply(simp)
4010done
4011
4012lemma ORLEFT_elim:
4013  assumes a: "(x):M \<in> ORLEFT (B OR C) (\<parallel>(B)\<parallel>) (\<parallel>(C)\<parallel>)"
4014  obtains y' M' z' N' where "M = OrL (y').M' (z').N' x" and "fin (OrL (y').M' (z').N' x) x" 
4015                      and "(y'):M' \<in> (\<parallel>(B)\<parallel>)" and "(z'):N' \<in> (\<parallel>(C)\<parallel>)"
4016using a
4017apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm fresh_atm)
4018apply(drule_tac x="z" in meta_spec)
4019apply(drule_tac x="[(x,z)]\<bullet>Ma" in meta_spec)
4020apply(drule_tac x="z" in meta_spec)
4021apply(drule_tac x="[(x,z)]\<bullet>N" in meta_spec)
4022apply(simp)
4023apply(drule meta_mp)
4024apply(drule_tac pi="[(x,z)]" in fin.eqvt(1))
4025apply(simp add: calc_atm)
4026apply(drule meta_mp)
4027apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4028apply(simp add: calc_atm CAND_eqvt_name)
4029apply(drule meta_mp)
4030apply(drule_tac pi="[(x,z)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4031apply(simp add: calc_atm CAND_eqvt_name)
4032apply(simp)
4033apply(case_tac "x=y")
4034apply(simp)
4035apply(drule_tac x="z" in meta_spec)
4036apply(drule_tac x="[(y,z)]\<bullet>Ma" in meta_spec)
4037apply(drule_tac x="z" in meta_spec)
4038apply(drule_tac x="[(y,z)]\<bullet>N" in meta_spec)
4039apply(simp)
4040apply(drule meta_mp)
4041apply(drule_tac pi="[(y,z)]" in fin.eqvt(1))
4042apply(simp add: calc_atm)
4043apply(drule meta_mp)
4044apply(drule_tac pi="[(y,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4045apply(simp add: calc_atm CAND_eqvt_name)
4046apply(drule meta_mp)
4047apply(drule_tac pi="[(y,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4048apply(simp add: calc_atm CAND_eqvt_name)
4049apply(simp)
4050apply(simp)
4051apply(case_tac "z=y")
4052apply(simp)
4053apply(drule_tac x="y" in meta_spec)
4054apply(drule_tac x="[(x,y)]\<bullet>Ma" in meta_spec)
4055apply(drule_tac x="x" in meta_spec)
4056apply(drule_tac x="[(x,y)]\<bullet>N" in meta_spec)
4057apply(simp)
4058apply(drule meta_mp)
4059apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
4060apply(simp add: calc_atm)
4061apply(drule meta_mp)
4062apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4063apply(simp add: calc_atm CAND_eqvt_name)
4064apply(drule meta_mp)
4065apply(drule_tac pi="[(x,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4066apply(simp add: calc_atm CAND_eqvt_name)
4067apply(simp)
4068apply(simp)
4069apply(drule_tac x="z" in meta_spec)
4070apply(drule_tac x="[(x,z)]\<bullet>Ma" in meta_spec)
4071apply(drule_tac x="y" in meta_spec)
4072apply(drule_tac x="[(x,z)]\<bullet>N" in meta_spec)
4073apply(simp)
4074apply(drule meta_mp)
4075apply(drule_tac pi="[(x,z)]" in fin.eqvt(1))
4076apply(simp add: calc_atm)
4077apply(drule meta_mp)
4078apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4079apply(simp add: calc_atm CAND_eqvt_name)
4080apply(drule meta_mp)
4081apply(drule_tac pi="[(x,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4082apply(simp add: calc_atm CAND_eqvt_name)
4083apply(simp)
4084apply(case_tac "x=xa")
4085apply(simp)
4086apply(drule_tac x="z" in meta_spec)
4087apply(drule_tac x="[(xa,z)]\<bullet>Ma" in meta_spec)
4088apply(drule_tac x="z" in meta_spec)
4089apply(drule_tac x="[(xa,z)]\<bullet>N" in meta_spec)
4090apply(simp)
4091apply(drule meta_mp)
4092apply(drule_tac pi="[(xa,z)]" in fin.eqvt(1))
4093apply(simp add: calc_atm)
4094apply(drule meta_mp)
4095apply(drule_tac pi="[(xa,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4096apply(simp add: calc_atm CAND_eqvt_name)
4097apply(drule meta_mp)
4098apply(drule_tac pi="[(xa,z)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4099apply(simp add: calc_atm CAND_eqvt_name)
4100apply(simp)
4101apply(simp)
4102apply(case_tac "z=xa")
4103apply(simp)
4104apply(drule_tac x="x" in meta_spec)
4105apply(drule_tac x="[(x,xa)]\<bullet>Ma" in meta_spec)
4106apply(drule_tac x="xa" in meta_spec)
4107apply(drule_tac x="[(x,xa)]\<bullet>N" in meta_spec)
4108apply(simp)
4109apply(drule meta_mp)
4110apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1))
4111apply(simp add: calc_atm)
4112apply(drule meta_mp)
4113apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4114apply(simp add: calc_atm CAND_eqvt_name)
4115apply(drule meta_mp)
4116apply(drule_tac pi="[(x,xa)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4117apply(simp add: calc_atm CAND_eqvt_name)
4118apply(simp)
4119apply(simp)
4120apply(drule_tac x="xa" in meta_spec)
4121apply(drule_tac x="[(x,z)]\<bullet>Ma" in meta_spec)
4122apply(drule_tac x="z" in meta_spec)
4123apply(drule_tac x="[(x,z)]\<bullet>N" in meta_spec)
4124apply(simp)
4125apply(drule meta_mp)
4126apply(drule_tac pi="[(x,z)]" in fin.eqvt(1))
4127apply(simp add: calc_atm)
4128apply(drule meta_mp)
4129apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4130apply(simp add: calc_atm CAND_eqvt_name)
4131apply(drule meta_mp)
4132apply(drule_tac pi="[(x,z)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4133apply(simp add: calc_atm CAND_eqvt_name)
4134apply(simp)
4135apply(case_tac "x=xa")
4136apply(simp)
4137apply(case_tac "xa=y")
4138apply(simp)
4139apply(drule_tac x="z" in meta_spec)
4140apply(drule_tac x="[(y,z)]\<bullet>Ma" in meta_spec)
4141apply(drule_tac x="z" in meta_spec)
4142apply(drule_tac x="[(y,z)]\<bullet>N" in meta_spec)
4143apply(simp)
4144apply(drule meta_mp)
4145apply(drule_tac pi="[(y,z)]" in fin.eqvt(1))
4146apply(simp add: calc_atm)
4147apply(drule meta_mp)
4148apply(drule_tac pi="[(y,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4149apply(simp add: calc_atm CAND_eqvt_name)
4150apply(drule meta_mp)
4151apply(drule_tac pi="[(y,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4152apply(simp add: calc_atm CAND_eqvt_name)
4153apply(simp)
4154apply(simp)
4155apply(case_tac "z=y")
4156apply(simp)
4157apply(drule_tac x="y" in meta_spec)
4158apply(drule_tac x="[(xa,y)]\<bullet>Ma" in meta_spec)
4159apply(drule_tac x="xa" in meta_spec)
4160apply(drule_tac x="[(xa,y)]\<bullet>N" in meta_spec)
4161apply(simp)
4162apply(drule meta_mp)
4163apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1))
4164apply(simp add: calc_atm)
4165apply(drule meta_mp)
4166apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4167apply(simp add: calc_atm CAND_eqvt_name)
4168apply(drule meta_mp)
4169apply(drule_tac pi="[(xa,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4170apply(simp add: calc_atm CAND_eqvt_name)
4171apply(simp)
4172apply(simp)
4173apply(drule_tac x="z" in meta_spec)
4174apply(drule_tac x="[(xa,z)]\<bullet>Ma" in meta_spec)
4175apply(drule_tac x="y" in meta_spec)
4176apply(drule_tac x="[(xa,z)]\<bullet>N" in meta_spec)
4177apply(simp)
4178apply(drule meta_mp)
4179apply(drule_tac pi="[(xa,z)]" in fin.eqvt(1))
4180apply(simp add: calc_atm)
4181apply(drule meta_mp)
4182apply(drule_tac pi="[(xa,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4183apply(simp add: calc_atm CAND_eqvt_name)
4184apply(drule meta_mp)
4185apply(drule_tac pi="[(xa,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4186apply(simp add: calc_atm CAND_eqvt_name)
4187apply(simp)
4188apply(simp)
4189apply(case_tac "z=xa")
4190apply(simp)
4191apply(case_tac "x=y")
4192apply(simp)
4193apply(drule_tac x="y" in meta_spec)
4194apply(drule_tac x="[(y,xa)]\<bullet>Ma" in meta_spec)
4195apply(drule_tac x="xa" in meta_spec)
4196apply(drule_tac x="[(y,xa)]\<bullet>N" in meta_spec)
4197apply(simp)
4198apply(drule meta_mp)
4199apply(drule_tac pi="[(y,xa)]" in fin.eqvt(1))
4200apply(simp add: calc_atm)
4201apply(drule meta_mp)
4202apply(drule_tac pi="[(y,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4203apply(simp add: calc_atm CAND_eqvt_name)
4204apply(drule meta_mp)
4205apply(drule_tac pi="[(y,xa)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4206apply(simp add: calc_atm CAND_eqvt_name)
4207apply(simp)
4208apply(simp)
4209apply(case_tac "xa=y")
4210apply(simp)
4211apply(drule_tac x="x" in meta_spec)
4212apply(drule_tac x="[(x,y)]\<bullet>Ma" in meta_spec)
4213apply(drule_tac x="x" in meta_spec)
4214apply(drule_tac x="[(x,y)]\<bullet>N" in meta_spec)
4215apply(simp)
4216apply(drule meta_mp)
4217apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
4218apply(simp add: calc_atm)
4219apply(drule meta_mp)
4220apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4221apply(simp add: calc_atm CAND_eqvt_name)
4222apply(drule meta_mp)
4223apply(drule_tac pi="[(x,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4224apply(simp add: calc_atm CAND_eqvt_name)
4225apply(simp)
4226apply(simp)
4227apply(drule_tac x="x" in meta_spec)
4228apply(drule_tac x="[(x,xa)]\<bullet>Ma" in meta_spec)
4229apply(drule_tac x="y" in meta_spec)
4230apply(drule_tac x="[(x,xa)]\<bullet>N" in meta_spec)
4231apply(simp)
4232apply(drule meta_mp)
4233apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1))
4234apply(simp add: calc_atm)
4235apply(drule meta_mp)
4236apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4237apply(simp add: calc_atm CAND_eqvt_name)
4238apply(drule meta_mp)
4239apply(drule_tac pi="[(x,xa)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4240apply(simp add: calc_atm CAND_eqvt_name)
4241apply(simp)
4242apply(simp)
4243apply(case_tac "x=y")
4244apply(simp)
4245apply(drule_tac x="xa" in meta_spec)
4246apply(drule_tac x="[(y,z)]\<bullet>Ma" in meta_spec)
4247apply(drule_tac x="z" in meta_spec)
4248apply(drule_tac x="[(y,z)]\<bullet>N" in meta_spec)
4249apply(simp)
4250apply(drule meta_mp)
4251apply(drule_tac pi="[(y,z)]" in fin.eqvt(1))
4252apply(simp add: calc_atm)
4253apply(drule meta_mp)
4254apply(drule_tac pi="[(y,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4255apply(simp add: calc_atm CAND_eqvt_name)
4256apply(drule meta_mp)
4257apply(drule_tac pi="[(y,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4258apply(simp add: calc_atm CAND_eqvt_name)
4259apply(simp)
4260apply(simp)
4261apply(case_tac "z=y")
4262apply(simp)
4263apply(drule_tac x="xa" in meta_spec)
4264apply(drule_tac x="[(x,y)]\<bullet>Ma" in meta_spec)
4265apply(drule_tac x="x" in meta_spec)
4266apply(drule_tac x="[(x,y)]\<bullet>N" in meta_spec)
4267apply(simp)
4268apply(drule meta_mp)
4269apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
4270apply(simp add: calc_atm)
4271apply(drule meta_mp)
4272apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4273apply(simp add: calc_atm CAND_eqvt_name)
4274apply(drule meta_mp)
4275apply(drule_tac pi="[(x,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4276apply(simp add: calc_atm CAND_eqvt_name)
4277apply(simp)
4278apply(simp)
4279apply(drule_tac x="xa" in meta_spec)
4280apply(drule_tac x="[(x,z)]\<bullet>Ma" in meta_spec)
4281apply(drule_tac x="y" in meta_spec)
4282apply(drule_tac x="[(x,z)]\<bullet>N" in meta_spec)
4283apply(simp)
4284apply(drule meta_mp)
4285apply(drule_tac pi="[(x,z)]" in fin.eqvt(1))
4286apply(simp add: calc_atm)
4287apply(drule meta_mp)
4288apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4289apply(simp add: calc_atm CAND_eqvt_name)
4290apply(drule meta_mp)
4291apply(drule_tac pi="[(x,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4292apply(simp add: calc_atm CAND_eqvt_name)
4293apply(simp)
4294done
4295
4296lemma IMPRIGHT_elim:
4297  assumes a: "<a>:M \<in> IMPRIGHT (B IMP C) (\<parallel>(B)\<parallel>) (\<parallel><C>\<parallel>) (\<parallel>(C)\<parallel>) (\<parallel><B>\<parallel>)"
4298  obtains x' a' M' where "M = ImpR (x').<a'>.M' a" and "fic (ImpR (x').<a'>.M' a) a" 
4299                   and "\<forall>z P. x'\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(C)\<parallel> \<longrightarrow> (x'):(M'{a':=(z).P}) \<in> \<parallel>(B)\<parallel>" 
4300                   and "\<forall>c Q. a'\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><B>\<parallel> \<longrightarrow> <a'>:(M'{x':=<c>.Q}) \<in> \<parallel><C>\<parallel>"
4301using a
4302apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm)
4303apply(drule_tac x="x" in meta_spec)
4304apply(drule_tac x="b" in meta_spec)
4305apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
4306apply(simp)
4307apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
4308apply(simp add: calc_atm)
4309apply(drule meta_mp)
4310apply(auto)[1]
4311apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4312apply(simp add: calc_atm CAND_eqvt_coname)
4313apply(drule_tac x="z" in spec)
4314apply(drule_tac x="[(a,b)]\<bullet>P" in spec)
4315apply(simp add: fresh_prod fresh_left calc_atm)
4316apply(drule_tac pi="[(a,b)]" and x="(x):Ma{a:=(z).([(a,b)]\<bullet>P)}" 
4317                                     in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4318apply(perm_simp add: calc_atm csubst_eqvt CAND_eqvt_coname)
4319apply(drule meta_mp)
4320apply(auto)[1]
4321apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4322apply(simp add:  CAND_eqvt_coname)
4323apply(rotate_tac 2)
4324apply(drule_tac x="[(a,b)]\<bullet>c" in spec)
4325apply(drule_tac x="[(a,b)]\<bullet>Q" in spec)
4326apply(simp add: fresh_prod fresh_left)
4327apply(drule mp)
4328apply(simp add: calc_atm)
4329apply(drule_tac pi="[(a,b)]" and x="<a>:Ma{x:=<([(a,b)]\<bullet>c)>.([(a,b)]\<bullet>Q)}" 
4330                                        in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4331apply(perm_simp add: nsubst_eqvt CAND_eqvt_coname)
4332apply(simp add: calc_atm)
4333apply(case_tac "a=aa")
4334apply(simp)
4335apply(drule_tac x="x" in meta_spec)
4336apply(drule_tac x="b" in meta_spec)
4337apply(drule_tac x="[(aa,b)]\<bullet>Ma" in meta_spec)
4338apply(simp)
4339apply(drule meta_mp)
4340apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2))
4341apply(simp add: calc_atm)
4342apply(drule meta_mp)
4343apply(auto)[1]
4344apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4345apply(simp add: calc_atm CAND_eqvt_coname)
4346apply(drule_tac x="z" in spec)
4347apply(drule_tac x="[(a,b)]\<bullet>P" in spec)
4348apply(simp add: fresh_prod fresh_left calc_atm)
4349apply(drule_tac pi="[(a,b)]" and x="(x):Ma{a:=(z).([(a,b)]\<bullet>P)}" 
4350                                     in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4351apply(perm_simp add: calc_atm csubst_eqvt  CAND_eqvt_coname)
4352apply(drule meta_mp)
4353apply(auto)[1]
4354apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4355apply(simp add: CAND_eqvt_coname)
4356apply(drule_tac x="[(a,b)]\<bullet>c" in spec)
4357apply(drule_tac x="[(a,b)]\<bullet>Q" in spec)
4358apply(simp)
4359apply(simp add: fresh_prod fresh_left)
4360apply(drule mp)
4361apply(simp add: calc_atm)
4362apply(drule_tac pi="[(a,b)]" and x="<a>:Ma{x:=<([(a,b)]\<bullet>c)>.([(a,b)]\<bullet>Q)}" 
4363                                      in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4364apply(perm_simp add: nsubst_eqvt CAND_eqvt_coname)
4365apply(simp add: calc_atm)
4366apply(simp)
4367apply(case_tac "b=aa")
4368apply(simp)
4369apply(drule_tac x="x" in meta_spec)
4370apply(drule_tac x="a" in meta_spec)
4371apply(drule_tac x="[(a,aa)]\<bullet>Ma" in meta_spec)
4372apply(simp)
4373apply(drule meta_mp)
4374apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2))
4375apply(simp add: calc_atm)
4376apply(drule meta_mp)
4377apply(auto)[1]
4378apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4379apply(simp add: calc_atm CAND_eqvt_coname)
4380apply(drule_tac x="z" in spec)
4381apply(drule_tac x="[(a,aa)]\<bullet>P" in spec)
4382apply(simp add: fresh_prod fresh_left calc_atm)
4383apply(drule_tac pi="[(a,aa)]" and x="(x):Ma{aa:=(z).([(a,aa)]\<bullet>P)}" 
4384                                    in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4385apply(perm_simp add: calc_atm csubst_eqvt  CAND_eqvt_coname)
4386apply(drule meta_mp)
4387apply(auto)[1]
4388apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4389apply(simp add:  CAND_eqvt_coname)
4390apply(drule_tac x="[(a,aa)]\<bullet>c" in spec)
4391apply(drule_tac x="[(a,aa)]\<bullet>Q" in spec)
4392apply(simp)
4393apply(simp add: fresh_prod fresh_left)
4394apply(drule mp)
4395apply(simp add: calc_atm)
4396apply(drule_tac pi="[(a,aa)]" and x="<aa>:Ma{x:=<([(a,aa)]\<bullet>c)>.([(a,aa)]\<bullet>Q)}" 
4397                                    in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4398apply(perm_simp add: nsubst_eqvt  CAND_eqvt_coname)
4399apply(simp add: calc_atm)
4400apply(simp)
4401apply(drule_tac x="x" in meta_spec)
4402apply(drule_tac x="aa" in meta_spec)
4403apply(drule_tac x="[(a,b)]\<bullet>Ma" in meta_spec)
4404apply(simp)
4405apply(drule meta_mp)
4406apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
4407apply(simp add: calc_atm)
4408apply(drule meta_mp)
4409apply(auto)[1]
4410apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4411apply(simp add: calc_atm  CAND_eqvt_coname)
4412apply(drule_tac x="z" in spec)
4413apply(drule_tac x="[(a,b)]\<bullet>P" in spec)
4414apply(simp add: fresh_prod fresh_left calc_atm)
4415apply(drule_tac pi="[(a,b)]" and x="(x):Ma{aa:=(z).([(a,b)]\<bullet>P)}" 
4416                                          in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4417apply(perm_simp add: calc_atm csubst_eqvt  CAND_eqvt_coname)
4418apply(drule meta_mp)
4419apply(auto)[1]
4420apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4421apply(simp add:  CAND_eqvt_coname)
4422apply(drule_tac x="[(a,b)]\<bullet>c" in spec)
4423apply(drule_tac x="[(a,b)]\<bullet>Q" in spec)
4424apply(simp add: fresh_prod fresh_left)
4425apply(drule mp)
4426apply(simp add: calc_atm)
4427apply(drule_tac pi="[(a,b)]" and x="<aa>:Ma{x:=<([(a,b)]\<bullet>c)>.([(a,b)]\<bullet>Q)}" 
4428                                        in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4429apply(perm_simp add: nsubst_eqvt  CAND_eqvt_coname)
4430apply(simp add: calc_atm)
4431done
4432
4433lemma IMPLEFT_elim:
4434  assumes a: "(x):M \<in> IMPLEFT (B IMP C) (\<parallel><B>\<parallel>) (\<parallel>(C)\<parallel>)"
4435  obtains x' a' M' N' where "M = ImpL <a'>.M' (x').N' x" and "fin (ImpL <a'>.M' (x').N' x) x" 
4436                   and "<a'>:M' \<in> \<parallel><B>\<parallel>" and "(x'):N' \<in> \<parallel>(C)\<parallel>"
4437using a
4438apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm)
4439apply(drule_tac x="a" in meta_spec)
4440apply(drule_tac x="[(x,y)]\<bullet>Ma" in meta_spec)
4441apply(drule_tac x="y" in meta_spec)
4442apply(drule_tac x="[(x,y)]\<bullet>N" in meta_spec)
4443apply(simp)
4444apply(drule meta_mp)
4445apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
4446apply(simp add: calc_atm)
4447apply(drule meta_mp)
4448apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4449apply(simp add: calc_atm CAND_eqvt_name)
4450apply(drule meta_mp)
4451apply(drule_tac pi="[(x,y)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4452apply(perm_simp add: calc_atm  CAND_eqvt_name)
4453apply(simp)
4454apply(case_tac "x=xa")
4455apply(simp)
4456apply(drule_tac x="a" in meta_spec)
4457apply(drule_tac x="[(xa,y)]\<bullet>Ma" in meta_spec)
4458apply(drule_tac x="y" in meta_spec)
4459apply(drule_tac x="[(xa,y)]\<bullet>N" in meta_spec)
4460apply(simp)
4461apply(drule meta_mp)
4462apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1))
4463apply(simp add: calc_atm)
4464apply(drule meta_mp)
4465apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4466apply(simp add: calc_atm CAND_eqvt_name)
4467apply(drule meta_mp)
4468apply(drule_tac pi="[(xa,y)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4469apply(simp add: calc_atm CAND_eqvt_name)
4470apply(simp)
4471apply(simp)
4472apply(case_tac "y=xa")
4473apply(simp)
4474apply(drule_tac x="a" in meta_spec)
4475apply(drule_tac x="[(x,xa)]\<bullet>Ma" in meta_spec)
4476apply(drule_tac x="x" in meta_spec)
4477apply(drule_tac x="[(x,xa)]\<bullet>N" in meta_spec)
4478apply(simp)
4479apply(drule meta_mp)
4480apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1))
4481apply(simp add: calc_atm)
4482apply(drule meta_mp)
4483apply(drule_tac pi="[(x,xa)]" and x="<a>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4484apply(simp add: calc_atm  CAND_eqvt_name)
4485apply(drule meta_mp)
4486apply(drule_tac pi="[(x,xa)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4487apply(simp add: calc_atm CAND_eqvt_name)
4488apply(simp)
4489apply(simp)
4490apply(drule_tac x="a" in meta_spec)
4491apply(drule_tac x="[(x,y)]\<bullet>Ma" in meta_spec)
4492apply(drule_tac x="xa" in meta_spec)
4493apply(drule_tac x="[(x,y)]\<bullet>N" in meta_spec)
4494apply(simp)
4495apply(drule meta_mp)
4496apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
4497apply(simp add: calc_atm)
4498apply(drule meta_mp)
4499apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4500apply(simp add: calc_atm CAND_eqvt_name)
4501apply(drule meta_mp)
4502apply(drule_tac pi="[(x,y)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4503apply(simp add: calc_atm CAND_eqvt_name)
4504apply(simp)
4505done
4506
4507lemma CANDs_alpha:
4508  shows "<a>:M \<in> (\<parallel><B>\<parallel>) \<Longrightarrow> [a].M = [b].N \<Longrightarrow> <b>:N \<in> (\<parallel><B>\<parallel>)"
4509  and   "(x):M \<in> (\<parallel>(B)\<parallel>) \<Longrightarrow> [x].M = [y].N \<Longrightarrow> (y):N \<in> (\<parallel>(B)\<parallel>)"
4510apply(auto simp add: alpha)
4511apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4512apply(perm_simp add: CAND_eqvt_coname calc_atm)
4513apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4514apply(perm_simp add: CAND_eqvt_name calc_atm)
4515done
4516
4517lemma CAND_NotR_elim:
4518  assumes a: "<a>:NotR (x).M a \<in> (\<parallel><B>\<parallel>)" "<a>:NotR (x).M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
4519  shows "\<exists>B'. B = NOT B' \<and> (x):M \<in> (\<parallel>(B')\<parallel>)" 
4520using a
4521apply(nominal_induct B rule: ty.strong_induct)
4522apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
4523apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4524apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4525apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4526done
4527
4528lemma CAND_NotL_elim_aux:
4529  assumes a: "(x):NotL <a>.M x \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):NotL <a>.M x \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
4530  shows "\<exists>B'. B = NOT B' \<and> <a>:M \<in> (\<parallel><B'>\<parallel>)" 
4531using a
4532apply(nominal_induct B rule: ty.strong_induct)
4533apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
4534apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4535apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4536apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4537done
4538
4539lemmas CAND_NotL_elim = CAND_NotL_elim_aux[OF NEG_elim(2)]
4540
4541lemma CAND_AndR_elim:
4542  assumes a: "<a>:AndR <b>.M <c>.N a \<in> (\<parallel><B>\<parallel>)" "<a>:AndR <b>.M <c>.N a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
4543  shows "\<exists>B1 B2. B = B1 AND B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>) \<and> <c>:N \<in> (\<parallel><B2>\<parallel>)" 
4544using a
4545apply(nominal_induct B rule: ty.strong_induct)
4546apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
4547apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4548apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4549apply(simp add: CAND_eqvt_coname calc_atm)
4550apply(auto intro: CANDs_alpha)[1]
4551apply(drule_tac pi="[(a,ca)]" and x="<a>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4552apply(simp add: CAND_eqvt_coname calc_atm)
4553apply(auto intro: CANDs_alpha)[1]
4554apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4555apply(simp add: CAND_eqvt_coname calc_atm)
4556apply(auto intro: CANDs_alpha)[1]
4557apply(case_tac "a=ba")
4558apply(simp)
4559apply(drule_tac pi="[(ba,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4560apply(simp add: CAND_eqvt_coname calc_atm)
4561apply(auto intro: CANDs_alpha)[1]
4562apply(simp)
4563apply(case_tac "ca=ba")
4564apply(simp)
4565apply(drule_tac pi="[(a,ba)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4566apply(simp add: CAND_eqvt_coname calc_atm)
4567apply(auto intro: CANDs_alpha)[1]
4568apply(simp)
4569apply(drule_tac pi="[(a,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4570apply(simp add: CAND_eqvt_coname calc_atm)
4571apply(auto intro: CANDs_alpha)[1]
4572apply(case_tac "a=aa")
4573apply(simp)
4574apply(drule_tac pi="[(aa,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4575apply(simp add: CAND_eqvt_coname calc_atm)
4576apply(auto intro: CANDs_alpha)[1]
4577apply(simp)
4578apply(case_tac "ca=aa")
4579apply(simp)
4580apply(drule_tac pi="[(a,aa)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4581apply(simp add: CAND_eqvt_coname calc_atm)
4582apply(auto intro: CANDs_alpha)[1]
4583apply(simp)
4584apply(drule_tac pi="[(a,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4585apply(simp add: CAND_eqvt_coname calc_atm)
4586apply(auto intro: CANDs_alpha)[1]
4587apply(drule_tac pi="[(a,ca)]" and x="<a>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4588apply(simp add: CAND_eqvt_coname calc_atm)
4589apply(auto intro: CANDs_alpha)[1]
4590apply(case_tac "a=aa")
4591apply(simp)
4592apply(drule_tac pi="[(aa,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4593apply(simp add: CAND_eqvt_coname calc_atm)
4594apply(auto intro: CANDs_alpha)[1]
4595apply(simp)
4596apply(case_tac "ca=aa")
4597apply(simp)
4598apply(drule_tac pi="[(a,aa)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4599apply(simp add: CAND_eqvt_coname calc_atm)
4600apply(auto intro: CANDs_alpha)[1]
4601apply(simp)
4602apply(drule_tac pi="[(a,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4603apply(simp add: CAND_eqvt_coname calc_atm)
4604apply(auto intro: CANDs_alpha)[1]
4605apply(case_tac "a=ba")
4606apply(simp)
4607apply(drule_tac pi="[(ba,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4608apply(simp add: CAND_eqvt_coname calc_atm)
4609apply(auto intro: CANDs_alpha)[1]
4610apply(simp)
4611apply(case_tac "ca=ba")
4612apply(simp)
4613apply(drule_tac pi="[(a,ba)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4614apply(simp add: CAND_eqvt_coname calc_atm)
4615apply(auto intro: CANDs_alpha)[1]
4616apply(simp)
4617apply(drule_tac pi="[(a,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4618apply(simp add: CAND_eqvt_coname calc_atm)
4619apply(auto intro: CANDs_alpha)[1]
4620done
4621
4622lemma CAND_OrR1_elim:
4623  assumes a: "<a>:OrR1 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR1 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
4624  shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>)" 
4625using a
4626apply(nominal_induct B rule: ty.strong_induct)
4627apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
4628apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4629apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4630apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4631apply(case_tac "a=aa")
4632apply(simp)
4633apply(drule_tac pi="[(aa,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4634apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4635apply(case_tac "ba=aa")
4636apply(simp)
4637apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4638apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4639apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4640apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4641done
4642
4643lemma CAND_OrR2_elim:
4644  assumes a: "<a>:OrR2 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR2 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
4645  shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B2>\<parallel>)" 
4646using a
4647apply(nominal_induct B rule: ty.strong_induct)
4648apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
4649apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4650apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4651apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4652apply(case_tac "a=aa")
4653apply(simp)
4654apply(drule_tac pi="[(aa,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4655apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4656apply(case_tac "ba=aa")
4657apply(simp)
4658apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4659apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4660apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4661apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
4662done
4663
4664lemma CAND_OrL_elim_aux:
4665  assumes a: "(x):(OrL (y).M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(OrL (y).M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
4666  shows "\<exists>B1 B2. B = B1 OR B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" 
4667using a
4668apply(nominal_induct B rule: ty.strong_induct)
4669apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
4670apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4671apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4672apply(simp add: CAND_eqvt_name calc_atm)
4673apply(auto intro: CANDs_alpha)[1]
4674apply(drule_tac pi="[(x,za)]" and x="(x):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4675apply(simp add: CAND_eqvt_name calc_atm)
4676apply(auto intro: CANDs_alpha)[1]
4677apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4678apply(simp add: CAND_eqvt_name calc_atm)
4679apply(auto intro: CANDs_alpha)[1]
4680apply(case_tac "x=ya")
4681apply(simp)
4682apply(drule_tac pi="[(ya,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4683apply(simp add: CAND_eqvt_name calc_atm)
4684apply(auto intro: CANDs_alpha)[1]
4685apply(simp)
4686apply(case_tac "za=ya")
4687apply(simp)
4688apply(drule_tac pi="[(x,ya)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4689apply(simp add: CAND_eqvt_name calc_atm)
4690apply(auto intro: CANDs_alpha)[1]
4691apply(simp)
4692apply(drule_tac pi="[(x,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4693apply(simp add: CAND_eqvt_name calc_atm)
4694apply(auto intro: CANDs_alpha)[1]
4695apply(case_tac "x=xa")
4696apply(simp)
4697apply(drule_tac pi="[(xa,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4698apply(simp add: CAND_eqvt_name calc_atm)
4699apply(auto intro: CANDs_alpha)[1]
4700apply(simp)
4701apply(case_tac "za=xa")
4702apply(simp)
4703apply(drule_tac pi="[(x,xa)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4704apply(simp add: CAND_eqvt_name calc_atm)
4705apply(auto intro: CANDs_alpha)[1]
4706apply(simp)
4707apply(drule_tac pi="[(x,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4708apply(simp add: CAND_eqvt_name calc_atm)
4709apply(auto intro: CANDs_alpha)[1]
4710apply(drule_tac pi="[(x,za)]" and x="(x):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4711apply(simp add: CAND_eqvt_name calc_atm)
4712apply(auto intro: CANDs_alpha)[1]
4713apply(case_tac "x=xa")
4714apply(simp)
4715apply(drule_tac pi="[(xa,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4716apply(simp add: CAND_eqvt_name calc_atm)
4717apply(auto intro: CANDs_alpha)[1]
4718apply(simp)
4719apply(case_tac "za=xa")
4720apply(simp)
4721apply(drule_tac pi="[(x,xa)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4722apply(simp add: CAND_eqvt_name calc_atm)
4723apply(auto intro: CANDs_alpha)[1]
4724apply(simp)
4725apply(drule_tac pi="[(x,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4726apply(simp add: CAND_eqvt_name calc_atm)
4727apply(auto intro: CANDs_alpha)[1]
4728apply(case_tac "x=ya")
4729apply(simp)
4730apply(drule_tac pi="[(ya,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4731apply(simp add: CAND_eqvt_name calc_atm)
4732apply(auto intro: CANDs_alpha)[1]
4733apply(simp)
4734apply(case_tac "za=ya")
4735apply(simp)
4736apply(drule_tac pi="[(x,ya)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4737apply(simp add: CAND_eqvt_name calc_atm)
4738apply(auto intro: CANDs_alpha)[1]
4739apply(simp)
4740apply(drule_tac pi="[(x,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4741apply(simp add: CAND_eqvt_name calc_atm)
4742apply(auto intro: CANDs_alpha)[1]
4743done
4744
4745lemmas CAND_OrL_elim = CAND_OrL_elim_aux[OF NEG_elim(2)]
4746
4747lemma CAND_AndL1_elim_aux:
4748  assumes a: "(x):(AndL1 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL1 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
4749  shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>)" 
4750using a
4751apply(nominal_induct B rule: ty.strong_induct)
4752apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
4753apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4754apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4755apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4756apply(case_tac "x=xa")
4757apply(simp)
4758apply(drule_tac pi="[(xa,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4759apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4760apply(case_tac "ya=xa")
4761apply(simp)
4762apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4763apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4764apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4765apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4766done
4767
4768lemmas CAND_AndL1_elim = CAND_AndL1_elim_aux[OF NEG_elim(2)]
4769
4770lemma CAND_AndL2_elim_aux:
4771  assumes a: "(x):(AndL2 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL2 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
4772  shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B2)\<parallel>)" 
4773using a
4774apply(nominal_induct B rule: ty.strong_induct)
4775apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
4776apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4777apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4778apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4779apply(case_tac "x=xa")
4780apply(simp)
4781apply(drule_tac pi="[(xa,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4782apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4783apply(case_tac "ya=xa")
4784apply(simp)
4785apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4786apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4787apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4788apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
4789done
4790
4791lemmas CAND_AndL2_elim = CAND_AndL2_elim_aux[OF NEG_elim(2)]
4792
4793lemma CAND_ImpL_elim_aux:
4794  assumes a: "(x):(ImpL <a>.M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(ImpL <a>.M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
4795  shows "\<exists>B1 B2. B = B1 IMP B2 \<and> <a>:M \<in> (\<parallel><B1>\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" 
4796using a
4797apply(nominal_induct B rule: ty.strong_induct)
4798apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
4799apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
4800apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4801apply(simp add: CAND_eqvt_name calc_atm)
4802apply(auto intro: CANDs_alpha)[1]
4803apply(drule_tac pi="[(x,y)]" and x="(x):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4804apply(simp add: CAND_eqvt_name calc_atm)
4805apply(auto intro: CANDs_alpha)[1]
4806apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4807apply(simp add: CAND_eqvt_name calc_atm)
4808apply(auto intro: CANDs_alpha)[1]
4809apply(case_tac "x=xa")
4810apply(simp)
4811apply(drule_tac pi="[(xa,y)]" and x="(xa):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4812apply(simp add: CAND_eqvt_name calc_atm)
4813apply(auto intro: CANDs_alpha)[1]
4814apply(simp)
4815apply(case_tac "y=xa")
4816apply(simp)
4817apply(drule_tac pi="[(x,xa)]" and x="(xa):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4818apply(simp add: CAND_eqvt_name calc_atm)
4819apply(auto intro: CANDs_alpha)[1]
4820apply(simp)
4821apply(drule_tac pi="[(x,y)]" and x="(xa):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4822apply(simp add: CAND_eqvt_name calc_atm)
4823apply(auto intro: CANDs_alpha)[1]
4824done
4825
4826lemmas CAND_ImpL_elim = CAND_ImpL_elim_aux[OF NEG_elim(2)]
4827
4828lemma CAND_ImpR_elim:
4829  assumes a: "<a>:ImpR (x).<b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:ImpR (x).<b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
4830  shows "\<exists>B1 B2. B = B1 IMP B2 \<and> 
4831                 (\<forall>z P. x\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B2)\<parallel> \<longrightarrow> (x):(M{b:=(z).P}) \<in> \<parallel>(B1)\<parallel>) \<and>
4832                 (\<forall>c Q. b\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><B1>\<parallel> \<longrightarrow> <b>:(M{x:=<c>.Q}) \<in> \<parallel><B2>\<parallel>)" 
4833using a
4834apply(nominal_induct B rule: ty.strong_induct)
4835apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
4836apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm fresh_prod fresh_bij)
4837apply(generate_fresh "name") 
4838apply(generate_fresh "coname")
4839apply(drule_tac a="ca" and z="c" in alpha_name_coname)
4840apply(simp) 
4841apply(simp) 
4842apply(simp) 
4843apply(drule_tac x="[(xa,c)]\<bullet>[(aa,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>z" in spec)
4844apply(drule_tac x="[(xa,c)]\<bullet>[(aa,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>P" in spec)
4845apply(drule mp)
4846apply(rule conjI)
4847apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
4848apply(rule conjI)
4849apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
4850apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4851apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4852apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4853apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4854apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4855apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4856apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4857apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4858apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4859apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4860apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4861apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4862apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4863apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4864apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4865apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4866apply(generate_fresh "name")
4867apply(generate_fresh "coname")
4868apply(drule_tac a="cb" and z="ca" in alpha_name_coname)
4869apply(simp)
4870apply(simp)
4871apply(simp)
4872apply(drule_tac x="[(xa,ca)]\<bullet>[(aa,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>c" in spec)
4873apply(drule_tac x="[(xa,ca)]\<bullet>[(aa,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>Q" in spec)
4874apply(drule mp)
4875apply(rule conjI)
4876apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
4877apply(rule conjI)
4878apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
4879apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4880apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4881apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4882apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4883apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4884apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4885apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4886apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4887apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4888apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4889apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4890apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4891apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4892apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4893apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4894apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4895apply(generate_fresh "name")
4896apply(generate_fresh "coname")
4897apply(drule_tac a="ca" and z="c" in alpha_name_coname)
4898apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
4899apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
4900apply(auto)[1]
4901apply(simp)
4902apply(drule_tac x="[(a,ba)]\<bullet>[(xa,c)]\<bullet>[(ba,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>z" in spec)
4903apply(drule_tac x="[(a,ba)]\<bullet>[(xa,c)]\<bullet>[(ba,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>P" in spec)
4904apply(drule mp)
4905apply(rule conjI)
4906apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
4907apply(rule conjI)
4908apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
4909apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4910apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4911apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4912apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4913apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4914apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4915apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4916apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4917apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4918apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4919apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4920apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4921apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4922apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4923apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4924apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4925apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4926apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4927apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4928apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4929apply(generate_fresh "name")
4930apply(generate_fresh "coname")
4931apply(drule_tac a="cb" and z="ca" in alpha_name_coname)
4932apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
4933apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
4934apply(auto)[1]
4935apply(simp)
4936apply(drule_tac x="[(a,ba)]\<bullet>[(xa,ca)]\<bullet>[(ba,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>c" in spec)
4937apply(drule_tac x="[(a,ba)]\<bullet>[(xa,ca)]\<bullet>[(ba,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>Q" in spec)
4938apply(drule mp)
4939apply(rule conjI)
4940apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
4941apply(rule conjI)
4942apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
4943apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4944apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4945apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4946apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4947apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4948apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4949apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4950apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4951apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4952apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4953apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4954apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4955apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4956apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4957apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4958apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4959apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4960apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4961apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4962apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4963apply(case_tac "a=aa")
4964apply(simp)
4965apply(generate_fresh "name")
4966apply(generate_fresh "coname")
4967apply(drule_tac a="ca" and z="c" in alpha_name_coname)
4968apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
4969apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
4970apply(auto)[1]
4971apply(simp)
4972apply(drule_tac x="[(aa,ba)]\<bullet>[(xa,c)]\<bullet>[(ba,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>z" in spec)
4973apply(drule_tac x="[(aa,ba)]\<bullet>[(xa,c)]\<bullet>[(ba,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>P" in spec)
4974apply(drule mp)
4975apply(rule conjI)
4976apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
4977apply(rule conjI)
4978apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
4979apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4980apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4981apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4982apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4983apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4984apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4985apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4986apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4987apply(drule_tac pi="[(aa,ba)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4988apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4989apply(drule_tac pi="[(aa,ba)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4990apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4991apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4992apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4993apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4994apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4995apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
4996apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
4997apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
4998apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
4999apply(simp)
5000apply(case_tac "ba=aa")
5001apply(simp)
5002apply(generate_fresh "name")
5003apply(generate_fresh "coname")
5004apply(drule_tac a="ca" and z="c" in alpha_name_coname)
5005apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5006apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5007apply(auto)[1]
5008apply(simp)
5009apply(drule_tac x="[(a,aa)]\<bullet>[(xa,c)]\<bullet>[(a,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>z" in spec)
5010apply(drule_tac x="[(a,aa)]\<bullet>[(xa,c)]\<bullet>[(a,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>P" in spec)
5011apply(drule mp)
5012apply(rule conjI)
5013apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
5014apply(rule conjI)
5015apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
5016apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5017apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5018apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5019apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5020apply(drule_tac pi="[(a,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5021apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5022apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5023apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5024apply(drule_tac pi="[(a,aa)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5025apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5026apply(drule_tac pi="[(a,aa)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5027apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5028apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5029apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5030apply(drule_tac pi="[(a,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5031apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5032apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5033apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5034apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5035apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5036apply(simp)
5037apply(generate_fresh "name")
5038apply(generate_fresh "coname")
5039apply(drule_tac a="ca" and z="c" in alpha_name_coname)
5040apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5041apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5042apply(auto)[1]
5043apply(simp)
5044apply(drule_tac x="[(a,ba)]\<bullet>[(xa,c)]\<bullet>[(aa,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>z" in spec)
5045apply(drule_tac x="[(a,ba)]\<bullet>[(xa,c)]\<bullet>[(aa,ca)]\<bullet>[(b,ca)]\<bullet>[(x,c)]\<bullet>P" in spec)
5046apply(drule mp)
5047apply(rule conjI)
5048apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
5049apply(rule conjI)
5050apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
5051apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5052apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5053apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5054apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5055apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5056apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5057apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5058apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5059apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5060apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5061apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5062apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5063apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5064apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5065apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5066apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5067apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5068apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5069apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5070apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5071apply(case_tac "a=aa")
5072apply(simp)
5073apply(generate_fresh "name")
5074apply(generate_fresh "coname")
5075apply(drule_tac a="cb" and z="ca" in alpha_name_coname)
5076apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5077apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5078apply(auto)[1]
5079apply(simp)
5080apply(drule_tac x="[(aa,ba)]\<bullet>[(xa,ca)]\<bullet>[(ba,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>c" in spec)
5081apply(drule_tac x="[(aa,ba)]\<bullet>[(xa,ca)]\<bullet>[(ba,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>Q" in spec)
5082apply(drule mp)
5083apply(rule conjI)
5084apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
5085apply(rule conjI)
5086apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
5087apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5088apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5089apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5090apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5091apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5092apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5093apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5094apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5095apply(drule_tac pi="[(aa,ba)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5096apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5097apply(drule_tac pi="[(aa,ba)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5098apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5099apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5100apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5101apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5102apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5103apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5104apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5105apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5106apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5107apply(simp)
5108apply(case_tac "ba=aa")
5109apply(simp)
5110apply(generate_fresh "name")
5111apply(generate_fresh "coname")
5112apply(drule_tac a="cb" and z="ca" in alpha_name_coname)
5113apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5114apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5115apply(auto)[1]
5116apply(simp)
5117apply(drule_tac x="[(a,aa)]\<bullet>[(xa,ca)]\<bullet>[(a,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>c" in spec)
5118apply(drule_tac x="[(a,aa)]\<bullet>[(xa,ca)]\<bullet>[(a,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>Q" in spec)
5119apply(drule mp)
5120apply(rule conjI)
5121apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
5122apply(rule conjI)
5123apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
5124apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5125apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5126apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5127apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5128apply(drule_tac pi="[(a,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5129apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5130apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5131apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5132apply(drule_tac pi="[(a,aa)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5133apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5134apply(drule_tac pi="[(a,aa)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5135apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5136apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5137apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5138apply(drule_tac pi="[(a,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5139apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5140apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5141apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5142apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5143apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5144apply(simp)
5145apply(generate_fresh "name")
5146apply(generate_fresh "coname")
5147apply(drule_tac a="cb" and z="ca" in alpha_name_coname)
5148apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5149apply(simp add: fresh_left calc_atm fresh_prod fresh_atm)
5150apply(auto)[1]
5151apply(simp)
5152apply(drule_tac x="[(a,ba)]\<bullet>[(xa,ca)]\<bullet>[(aa,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>c" in spec)
5153apply(drule_tac x="[(a,ba)]\<bullet>[(xa,ca)]\<bullet>[(aa,cb)]\<bullet>[(b,cb)]\<bullet>[(x,ca)]\<bullet>Q" in spec)
5154apply(drule mp)
5155apply(rule conjI)
5156apply(auto simp add: calc_atm fresh_prod fresh_atm)[1]
5157apply(rule conjI)
5158apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
5159apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5160apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5161apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5162apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5163apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5164apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5165apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5166apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5167apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5168apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5169apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5170apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5171apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5172apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5173apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5174apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5175apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
5176apply(simp add: CAND_eqvt_name CAND_eqvt_coname)
5177apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
5178apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt)
5179done
5180
5181text \<open>Main lemma 1\<close>
5182
5183lemma AXIOMS_imply_SNa:
5184  shows "<a>:M \<in> AXIOMSc B \<Longrightarrow> SNa M"
5185  and   "(x):M \<in> AXIOMSn B \<Longrightarrow> SNa M"
5186apply -
5187apply(auto simp add: AXIOMSn_def AXIOMSc_def ntrm.inject ctrm.inject alpha)
5188apply(rule Ax_in_SNa)+
5189done
5190
5191lemma BINDING_imply_SNa:
5192  shows "<a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> SNa M"
5193  and   "(x):M \<in> BINDINGn B (\<parallel><B>\<parallel>) \<Longrightarrow> SNa M"
5194apply -
5195apply(auto simp add: BINDINGn_def BINDINGc_def ntrm.inject ctrm.inject alpha)
5196apply(drule_tac x="x" in spec)
5197apply(drule_tac x="Ax x a" in spec)
5198apply(drule mp)
5199apply(rule Ax_in_CANDs)
5200apply(drule a_star_preserves_SNa)
5201apply(rule subst_with_ax2)
5202apply(simp add: crename_id)
5203apply(drule_tac x="x" in spec)
5204apply(drule_tac x="Ax x aa" in spec)
5205apply(drule mp)
5206apply(rule Ax_in_CANDs)
5207apply(drule a_star_preserves_SNa)
5208apply(rule subst_with_ax2)
5209apply(simp add: crename_id SNa_eqvt)
5210apply(drule_tac x="a" in spec)
5211apply(drule_tac x="Ax x a" in spec)
5212apply(drule mp)
5213apply(rule Ax_in_CANDs)
5214apply(drule a_star_preserves_SNa)
5215apply(rule subst_with_ax1)
5216apply(simp add: nrename_id)
5217apply(drule_tac x="a" in spec)
5218apply(drule_tac x="Ax xa a" in spec)
5219apply(drule mp)
5220apply(rule Ax_in_CANDs)
5221apply(drule a_star_preserves_SNa)
5222apply(rule subst_with_ax1)
5223apply(simp add: nrename_id SNa_eqvt)
5224done
5225
5226lemma CANDs_imply_SNa:
5227  shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M"
5228  and   "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M"
5229proof(induct B arbitrary: a x M rule: ty.induct)
5230  case (PR X)
5231  { case 1 
5232    have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact
5233    then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
5234    then have "<a>:M \<in> AXIOMSc (PR X) \<union> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
5235    moreover
5236    { assume "<a>:M \<in> AXIOMSc (PR X)"
5237      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5238    }
5239    moreover
5240    { assume "<a>:M \<in> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)"
5241      then have "SNa M" by (simp add: BINDING_imply_SNa)
5242    }
5243    ultimately show "SNa M" by blast 
5244  next
5245    case 2
5246    have "(x):M \<in> (\<parallel>(PR X)\<parallel>)" by fact
5247    then have "(x):M \<in> NEGn (PR X) (\<parallel><PR X>\<parallel>)" using NEG_simp by blast
5248    then have "(x):M \<in> AXIOMSn (PR X) \<union> BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" by simp
5249    moreover
5250    { assume "(x):M \<in> AXIOMSn (PR X)"
5251      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5252    }
5253    moreover
5254    { assume "(x):M \<in> BINDINGn (PR X) (\<parallel><PR X>\<parallel>)"
5255      then have "SNa M" by (simp only: BINDING_imply_SNa)
5256    }
5257    ultimately show "SNa M" by blast
5258  }
5259next
5260  case (NOT B)
5261  have ih1: "\<And>a M. <a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M" by fact
5262  have ih2: "\<And>x M. (x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M" by fact
5263  { case 1
5264    have "<a>:M \<in> (\<parallel><NOT B>\<parallel>)" by fact
5265    then have "<a>:M \<in> NEGc (NOT B) (\<parallel>(NOT B)\<parallel>)" by simp
5266    then have "<a>:M \<in> AXIOMSc (NOT B) \<union> BINDINGc (NOT B) (\<parallel>(NOT B)\<parallel>) \<union> NOTRIGHT (NOT B) (\<parallel>(B)\<parallel>)" by simp
5267     moreover
5268    { assume "<a>:M \<in> AXIOMSc (NOT B)"
5269      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5270    }
5271    moreover
5272    { assume "<a>:M \<in> BINDINGc (NOT B) (\<parallel>(NOT B)\<parallel>)"
5273      then have "SNa M" by (simp only: BINDING_imply_SNa)
5274    }
5275     moreover
5276    { assume "<a>:M \<in> NOTRIGHT (NOT B) (\<parallel>(B)\<parallel>)"
5277      then obtain x' M' where eq: "M = NotR (x').M' a" and "(x'):M' \<in> (\<parallel>(B)\<parallel>)"
5278        using NOTRIGHT_elim by blast
5279      then have "SNa M'" using ih2 by blast
5280      then have "SNa M" using eq by (simp add: NotR_in_SNa)
5281    }
5282    ultimately show "SNa M" by blast
5283  next
5284    case 2
5285    have "(x):M \<in> (\<parallel>(NOT B)\<parallel>)" by fact
5286    then have "(x):M \<in> NEGn (NOT B) (\<parallel><NOT B>\<parallel>)" using NEG_simp by blast
5287    then have "(x):M \<in> AXIOMSn (NOT B) \<union> BINDINGn (NOT B) (\<parallel><NOT B>\<parallel>) \<union> NOTLEFT (NOT B) (\<parallel><B>\<parallel>)" 
5288      by (simp only: NEGn.simps)
5289     moreover
5290    { assume "(x):M \<in> AXIOMSn (NOT B)"
5291      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5292    }
5293    moreover
5294    { assume "(x):M \<in> BINDINGn (NOT B) (\<parallel><NOT B>\<parallel>)"
5295      then have "SNa M" by (simp only: BINDING_imply_SNa)
5296    }
5297     moreover
5298    { assume "(x):M \<in> NOTLEFT (NOT B) (\<parallel><B>\<parallel>)"
5299      then obtain a' M' where eq: "M = NotL <a'>.M' x" and "<a'>:M' \<in> (\<parallel><B>\<parallel>)"
5300        using NOTLEFT_elim by blast
5301      then have "SNa M'" using ih1 by blast
5302      then have "SNa M" using eq by (simp add: NotL_in_SNa)
5303    }
5304    ultimately show "SNa M" by blast
5305  }
5306next
5307  case (AND A B)
5308  have ih1: "\<And>a M. <a>:M \<in> \<parallel><A>\<parallel> \<Longrightarrow> SNa M" by fact
5309  have ih2: "\<And>x M. (x):M \<in> \<parallel>(A)\<parallel> \<Longrightarrow> SNa M" by fact
5310  have ih3: "\<And>a M. <a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M" by fact
5311  have ih4: "\<And>x M. (x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M" by fact
5312  { case 1
5313    have "<a>:M \<in> (\<parallel><A AND B>\<parallel>)" by fact
5314    then have "<a>:M \<in> NEGc (A AND B) (\<parallel>(A AND B)\<parallel>)" by simp
5315    then have "<a>:M \<in> AXIOMSc (A AND B) \<union> BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>) 
5316                                  \<union> ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" by simp
5317     moreover
5318    { assume "<a>:M \<in> AXIOMSc (A AND B)"
5319      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5320    }
5321    moreover
5322    { assume "<a>:M \<in> BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>)"
5323      then have "SNa M" by (simp only: BINDING_imply_SNa)
5324    }
5325     moreover
5326    { assume "<a>:M \<in> ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)"
5327      then obtain a' M' b' N' where eq: "M = AndR <a'>.M' <b'>.N' a" 
5328                                and "<a'>:M' \<in> (\<parallel><A>\<parallel>)" and "<b'>:N' \<in> (\<parallel><B>\<parallel>)"
5329        by (erule_tac ANDRIGHT_elim, blast)
5330      then have "SNa M'" and "SNa N'" using ih1 ih3 by blast+
5331      then have "SNa M" using eq by (simp add: AndR_in_SNa)
5332    }
5333    ultimately show "SNa M" by blast
5334  next
5335    case 2
5336    have "(x):M \<in> (\<parallel>(A AND B)\<parallel>)" by fact
5337    then have "(x):M \<in> NEGn (A AND B) (\<parallel><A AND B>\<parallel>)" using NEG_simp by blast
5338    then have "(x):M \<in> AXIOMSn (A AND B) \<union> BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>) 
5339                       \<union> ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>) \<union> ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" 
5340      by (simp only: NEGn.simps)
5341     moreover
5342    { assume "(x):M \<in> AXIOMSn (A AND B)"
5343      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5344    }
5345    moreover
5346    { assume "(x):M \<in> BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>)"
5347      then have "SNa M" by (simp only: BINDING_imply_SNa)
5348    }
5349     moreover
5350    { assume "(x):M \<in> ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>)"
5351      then obtain x' M' where eq: "M = AndL1 (x').M' x" and "(x'):M' \<in> (\<parallel>(A)\<parallel>)"
5352        using ANDLEFT1_elim by blast
5353      then have "SNa M'" using ih2 by blast
5354      then have "SNa M" using eq by (simp add: AndL1_in_SNa)
5355    }
5356    moreover
5357    { assume "(x):M \<in> ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)"
5358      then obtain x' M' where eq: "M = AndL2 (x').M' x" and "(x'):M' \<in> (\<parallel>(B)\<parallel>)"
5359        using ANDLEFT2_elim by blast
5360      then have "SNa M'" using ih4 by blast
5361      then have "SNa M" using eq by (simp add: AndL2_in_SNa)
5362    }
5363    ultimately show "SNa M" by blast
5364  }
5365next
5366  case (OR A B)
5367  have ih1: "\<And>a M. <a>:M \<in> \<parallel><A>\<parallel> \<Longrightarrow> SNa M" by fact
5368  have ih2: "\<And>x M. (x):M \<in> \<parallel>(A)\<parallel> \<Longrightarrow> SNa M" by fact
5369  have ih3: "\<And>a M. <a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M" by fact
5370  have ih4: "\<And>x M. (x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M" by fact
5371  { case 1
5372    have "<a>:M \<in> (\<parallel><A OR B>\<parallel>)" by fact
5373    then have "<a>:M \<in> NEGc (A OR B) (\<parallel>(A OR B)\<parallel>)" by simp
5374    then have "<a>:M \<in> AXIOMSc (A OR B) \<union> BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>) 
5375                                  \<union> ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>) \<union> ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" by simp
5376     moreover
5377    { assume "<a>:M \<in> AXIOMSc (A OR B)"
5378      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5379    }
5380    moreover
5381    { assume "<a>:M \<in> BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>)"
5382      then have "SNa M" by (simp only: BINDING_imply_SNa)
5383    }
5384     moreover
5385    { assume "<a>:M \<in> ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>)"
5386      then obtain a' M' where eq: "M = OrR1 <a'>.M' a" 
5387                                and "<a'>:M' \<in> (\<parallel><A>\<parallel>)" 
5388        by (erule_tac ORRIGHT1_elim, blast)
5389      then have "SNa M'" using ih1 by blast
5390      then have "SNa M" using eq by (simp add: OrR1_in_SNa)
5391    }
5392     moreover
5393    { assume "<a>:M \<in> ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)"
5394      then obtain a' M' where eq: "M = OrR2 <a'>.M' a" and "<a'>:M' \<in> (\<parallel><B>\<parallel>)" 
5395        using ORRIGHT2_elim by blast
5396      then have "SNa M'" using ih3 by blast
5397      then have "SNa M" using eq by (simp add: OrR2_in_SNa)
5398    }
5399    ultimately show "SNa M" by blast
5400  next
5401    case 2
5402    have "(x):M \<in> (\<parallel>(A OR B)\<parallel>)" by fact
5403    then have "(x):M \<in> NEGn (A OR B) (\<parallel><A OR B>\<parallel>)" using NEG_simp by blast
5404    then have "(x):M \<in> AXIOMSn (A OR B) \<union> BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>) 
5405                       \<union> ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" 
5406      by (simp only: NEGn.simps)
5407     moreover
5408    { assume "(x):M \<in> AXIOMSn (A OR B)"
5409      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5410    }
5411    moreover
5412    { assume "(x):M \<in> BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>)"
5413      then have "SNa M" by (simp only: BINDING_imply_SNa)
5414    }
5415     moreover
5416    { assume "(x):M \<in> ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)"
5417      then obtain x' M' y' N' where eq: "M = OrL (x').M' (y').N' x" 
5418                                and "(x'):M' \<in> (\<parallel>(A)\<parallel>)" and  "(y'):N' \<in> (\<parallel>(B)\<parallel>)"
5419        by (erule_tac ORLEFT_elim, blast)
5420      then have "SNa M'" and "SNa N'" using ih2 ih4 by blast+
5421      then have "SNa M" using eq by (simp add: OrL_in_SNa)
5422    }
5423    ultimately show "SNa M" by blast
5424  }
5425next 
5426  case (IMP A B)
5427  have ih1: "\<And>a M. <a>:M \<in> \<parallel><A>\<parallel> \<Longrightarrow> SNa M" by fact
5428  have ih2: "\<And>x M. (x):M \<in> \<parallel>(A)\<parallel> \<Longrightarrow> SNa M" by fact
5429  have ih3: "\<And>a M. <a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M" by fact
5430  have ih4: "\<And>x M. (x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M" by fact
5431  { case 1
5432    have "<a>:M \<in> (\<parallel><A IMP B>\<parallel>)" by fact
5433    then have "<a>:M \<in> NEGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" by simp
5434    then have "<a>:M \<in> AXIOMSc (A IMP B) \<union> BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>) 
5435                                  \<union> IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" by simp
5436     moreover
5437    { assume "<a>:M \<in> AXIOMSc (A IMP B)"
5438      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5439    }
5440    moreover
5441    { assume "<a>:M \<in> BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)"
5442      then have "SNa M" by (simp only: BINDING_imply_SNa)
5443    }
5444     moreover
5445    { assume "<a>:M \<in> IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)"
5446      then obtain x' a' M' where eq: "M = ImpR (x').<a'>.M' a" 
5447                           and imp: "\<forall>z P. x'\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B)\<parallel> \<longrightarrow> (x'):(M'{a':=(z).P}) \<in> \<parallel>(A)\<parallel>"    
5448        by (erule_tac IMPRIGHT_elim, blast)
5449      obtain z::"name" where fs: "z\<sharp>x'" by (rule_tac exists_fresh, rule fin_supp, blast)
5450      have "(z):Ax z a'\<in> \<parallel>(B)\<parallel>" by (simp add: Ax_in_CANDs)
5451      with imp fs have "(x'):(M'{a':=(z).Ax z a'}) \<in> \<parallel>(A)\<parallel>" by (simp add: fresh_prod fresh_atm)
5452      then have "SNa (M'{a':=(z).Ax z a'})" using ih2 by blast
5453      moreover 
5454      have "M'{a':=(z).Ax z a'} \<longrightarrow>\<^sub>a* M'[a'\<turnstile>c>a']" by (simp add: subst_with_ax2)
5455      ultimately have "SNa (M'[a'\<turnstile>c>a'])" by (simp add: a_star_preserves_SNa)
5456      then have "SNa M'" by (simp add: crename_id)
5457      then have "SNa M" using eq by (simp add: ImpR_in_SNa)
5458    }
5459    ultimately show "SNa M" by blast
5460  next
5461    case 2
5462    have "(x):M \<in> (\<parallel>(A IMP B)\<parallel>)" by fact
5463    then have "(x):M \<in> NEGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" using NEG_simp by blast
5464    then have "(x):M \<in> AXIOMSn (A IMP B) \<union> BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>) 
5465                       \<union> IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" 
5466      by (simp only: NEGn.simps)
5467     moreover
5468    { assume "(x):M \<in> AXIOMSn (A IMP B)"
5469      then have "SNa M" by (simp add: AXIOMS_imply_SNa)
5470    }
5471    moreover
5472    { assume "(x):M \<in> BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>)"
5473      then have "SNa M" by (simp only: BINDING_imply_SNa)
5474    }
5475     moreover
5476    { assume "(x):M \<in> IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)"
5477      then obtain a' M' y' N' where eq: "M = ImpL <a'>.M' (y').N' x" 
5478                                and "<a'>:M' \<in> (\<parallel><A>\<parallel>)" and  "(y'):N' \<in> (\<parallel>(B)\<parallel>)"
5479        by (erule_tac IMPLEFT_elim, blast)
5480      then have "SNa M'" and "SNa N'" using ih1 ih4 by blast+
5481      then have "SNa M" using eq by (simp add: ImpL_in_SNa)
5482    }
5483    ultimately show "SNa M" by blast
5484  }
5485qed 
5486
5487text \<open>Main lemma 2\<close>
5488
5489lemma AXIOMS_preserved:
5490  shows "<a>:M \<in> AXIOMSc B \<Longrightarrow> M \<longrightarrow>\<^sub>a* M' \<Longrightarrow> <a>:M' \<in> AXIOMSc B"
5491  and   "(x):M \<in> AXIOMSn B \<Longrightarrow> M \<longrightarrow>\<^sub>a* M' \<Longrightarrow> (x):M' \<in> AXIOMSn B"
5492  apply(simp_all add: AXIOMSc_def AXIOMSn_def)
5493  apply(auto simp add: ntrm.inject ctrm.inject alpha)
5494  apply(drule ax_do_not_a_star_reduce)
5495  apply(auto)
5496  apply(drule ax_do_not_a_star_reduce)
5497  apply(auto)
5498  apply(drule ax_do_not_a_star_reduce)
5499  apply(auto)
5500  apply(drule ax_do_not_a_star_reduce)
5501  apply(auto)
5502  done  
5503
5504lemma BINDING_preserved:
5505  shows "<a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> M \<longrightarrow>\<^sub>a* M' \<Longrightarrow> <a>:M' \<in> BINDINGc B (\<parallel>(B)\<parallel>)"
5506  and   "(x):M \<in> BINDINGn B (\<parallel><B>\<parallel>) \<Longrightarrow> M \<longrightarrow>\<^sub>a* M' \<Longrightarrow> (x):M' \<in> BINDINGn B (\<parallel><B>\<parallel>)"
5507proof -
5508  assume red: "M \<longrightarrow>\<^sub>a* M'"
5509  assume asm: "<a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>)"
5510  {
5511    fix x::"name" and  P::"trm"
5512    from asm have "((x):P) \<in> (\<parallel>(B)\<parallel>) \<Longrightarrow> SNa (M{a:=(x).P})" by (simp add: BINDINGc_elim)
5513    moreover
5514    have "M{a:=(x).P} \<longrightarrow>\<^sub>a* M'{a:=(x).P}" using red by (simp add: a_star_subst2)
5515    ultimately 
5516    have "((x):P) \<in> (\<parallel>(B)\<parallel>) \<Longrightarrow> SNa (M'{a:=(x).P})" by (simp add: a_star_preserves_SNa)
5517  }
5518  then show "<a>:M' \<in> BINDINGc B (\<parallel>(B)\<parallel>)" by (auto simp add: BINDINGc_def)
5519next
5520  assume red: "M \<longrightarrow>\<^sub>a* M'"
5521  assume asm: "(x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)"
5522  {
5523    fix c::"coname" and  P::"trm"
5524    from asm have "(<c>:P) \<in> (\<parallel><B>\<parallel>) \<Longrightarrow> SNa (M{x:=<c>.P})" by (simp add: BINDINGn_elim)
5525    moreover
5526    have "M{x:=<c>.P} \<longrightarrow>\<^sub>a* M'{x:=<c>.P}" using red by (simp add: a_star_subst1)
5527    ultimately 
5528    have "(<c>:P) \<in> (\<parallel><B>\<parallel>) \<Longrightarrow> SNa (M'{x:=<c>.P})" by (simp add: a_star_preserves_SNa)
5529  }
5530  then show "(x):M' \<in> BINDINGn B (\<parallel><B>\<parallel>)" by (auto simp add: BINDINGn_def)
5531qed
5532    
5533lemma CANDs_preserved:
5534  shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> M \<longrightarrow>\<^sub>a* M' \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>"
5535  and   "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> M \<longrightarrow>\<^sub>a* M' \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" 
5536proof(nominal_induct B arbitrary: a x M M' rule: ty.strong_induct) 
5537  case (PR X)
5538  { case 1 
5539    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5540    have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact
5541    then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
5542    then have "<a>:M \<in> AXIOMSc (PR X) \<union> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
5543    moreover
5544    { assume "<a>:M \<in> AXIOMSc (PR X)"
5545      then have "<a>:M' \<in> AXIOMSc (PR X)" using asm by (simp only: AXIOMS_preserved)
5546    }
5547    moreover
5548    { assume "<a>:M \<in> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)"
5549      then have "<a>:M' \<in> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" using asm by (simp add: BINDING_preserved)
5550    }
5551    ultimately have "<a>:M' \<in> AXIOMSc (PR X) \<union> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by blast
5552    then have "<a>:M' \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
5553    then show "<a>:M' \<in> (\<parallel><PR X>\<parallel>)" using NEG_simp by blast
5554  next
5555    case 2
5556    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5557    have "(x):M \<in> \<parallel>(PR X)\<parallel>" by fact
5558    then have "(x):M \<in> NEGn (PR X) (\<parallel><PR X>\<parallel>)" using NEG_simp by blast
5559    then have "(x):M \<in> AXIOMSn (PR X) \<union> BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" by simp
5560    moreover
5561    { assume "(x):M \<in> AXIOMSn (PR X)"
5562      then have "(x):M' \<in> AXIOMSn (PR X)" using asm by (simp only: AXIOMS_preserved) 
5563    }
5564    moreover
5565    { assume "(x):M \<in> BINDINGn (PR X) (\<parallel><PR X>\<parallel>)"
5566      then have "(x):M' \<in> BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" using asm by (simp only: BINDING_preserved)
5567    }
5568    ultimately have "(x):M' \<in> AXIOMSn (PR X) \<union> BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" by blast
5569    then have "(x):M' \<in> NEGn (PR X) (\<parallel><PR X>\<parallel>)" by simp
5570    then show "(x):M' \<in> (\<parallel>(PR X)\<parallel>)" using NEG_simp by blast
5571  }
5572next
5573  case (IMP A B)
5574  have ih1: "\<And>a M M'. \<lbrakk><a>:M \<in> \<parallel><A>\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> <a>:M' \<in> \<parallel><A>\<parallel>" by fact
5575  have ih2: "\<And>x M M'. \<lbrakk>(x):M \<in> \<parallel>(A)\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> (x):M' \<in> \<parallel>(A)\<parallel>" by fact
5576  have ih3: "\<And>a M M'. \<lbrakk><a>:M \<in> \<parallel><B>\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>" by fact
5577  have ih4: "\<And>x M M'. \<lbrakk>(x):M \<in> \<parallel>(B)\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" by fact
5578  { case 1 
5579    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5580    have "<a>:M \<in> \<parallel><A IMP B>\<parallel>" by fact
5581    then have "<a>:M \<in> NEGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" by simp
5582    then have "<a>:M \<in> AXIOMSc (A IMP B) \<union> BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>) 
5583                            \<union> IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" by simp
5584    moreover
5585    { assume "<a>:M \<in> AXIOMSc (A IMP B)"
5586      then have "<a>:M' \<in> AXIOMSc (A IMP B)" using asm by (simp only: AXIOMS_preserved)
5587    }
5588    moreover
5589    { assume "<a>:M \<in> BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)"
5590      then have "<a>:M' \<in> BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" using asm by (simp only: BINDING_preserved)
5591    }
5592    moreover
5593    { assume "<a>:M \<in> IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)"
5594      then obtain x' a' N' where eq: "M = ImpR (x').<a'>.N' a" and fic: "fic (ImpR (x').<a'>.N' a) a"
5595                           and imp1: "\<forall>z P. x'\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B)\<parallel> \<longrightarrow> (x'):(N'{a':=(z).P}) \<in> \<parallel>(A)\<parallel>" 
5596                           and imp2: "\<forall>c Q. a'\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><A>\<parallel> \<longrightarrow> <a'>:(N'{x':=<c>.Q}) \<in> \<parallel><B>\<parallel>"
5597        using IMPRIGHT_elim by blast
5598      from eq asm obtain N'' where eq': "M' = ImpR (x').<a'>.N'' a" and red: "N' \<longrightarrow>\<^sub>a* N''" 
5599        using a_star_redu_ImpR_elim by (blast)
5600      from imp1 have "\<forall>z P. x'\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B)\<parallel> \<longrightarrow> (x'):(N''{a':=(z).P}) \<in> \<parallel>(A)\<parallel>" using red ih2
5601        apply(auto)
5602        apply(drule_tac x="z" in spec)
5603        apply(drule_tac x="P" in spec)
5604        apply(simp)
5605        apply(drule_tac a_star_subst2)
5606        apply(blast)
5607        done
5608      moreover
5609      from imp2 have "\<forall>c Q. a'\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><A>\<parallel> \<longrightarrow> <a'>:(N''{x':=<c>.Q}) \<in> \<parallel><B>\<parallel>" using red ih3
5610        apply(auto)
5611        apply(drule_tac x="c" in spec)
5612        apply(drule_tac x="Q" in spec)
5613        apply(simp)
5614        apply(drule_tac a_star_subst1)
5615        apply(blast)
5616        done
5617      moreover
5618      from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce)
5619      ultimately have "<a>:M' \<in> IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" using eq' by auto
5620    }
5621    ultimately have "<a>:M' \<in> AXIOMSc (A IMP B) \<union> BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)
5622                                            \<union> IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" by blast
5623    then have "<a>:M' \<in> NEGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" by simp
5624    then show "<a>:M' \<in> (\<parallel><A IMP B>\<parallel>)" using NEG_simp by blast
5625  next
5626    case 2
5627    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5628    have "(x):M \<in> \<parallel>(A IMP B)\<parallel>" by fact
5629    then have "(x):M \<in> NEGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" using NEG_simp by blast
5630    then have "(x):M \<in> AXIOMSn (A IMP B) \<union> BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>) 
5631                                              \<union> IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" by simp
5632    moreover
5633    { assume "(x):M \<in> AXIOMSn (A IMP B)"
5634      then have "(x):M' \<in> AXIOMSn (A IMP B)" using asm by (simp only: AXIOMS_preserved)
5635    }
5636    moreover
5637    { assume "(x):M \<in> BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>)"
5638      then have "(x):M' \<in> BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" using asm by (simp only: BINDING_preserved)
5639    }
5640    moreover
5641    { assume "(x):M \<in> IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)"
5642      then obtain a' T' y' N' where eq: "M = ImpL <a'>.T' (y').N' x" 
5643                             and fin: "fin (ImpL <a'>.T' (y').N' x) x"
5644                             and imp1: "<a'>:T' \<in> \<parallel><A>\<parallel>" and imp2: "(y'):N' \<in> \<parallel>(B)\<parallel>"
5645        by (erule_tac IMPLEFT_elim, blast)
5646      from eq asm obtain T'' N'' where eq': "M' = ImpL <a'>.T'' (y').N'' x" 
5647                                 and red1: "T' \<longrightarrow>\<^sub>a* T''"  and red2: "N' \<longrightarrow>\<^sub>a* N''"
5648        using a_star_redu_ImpL_elim by blast
5649      from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce)
5650      moreover
5651      from imp1 red1 have "<a'>:T'' \<in> \<parallel><A>\<parallel>" using ih1 by simp
5652      moreover
5653      from imp2 red2 have "(y'):N'' \<in> \<parallel>(B)\<parallel>" using ih4 by simp
5654      ultimately have "(x):M' \<in> IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" using eq' by (simp, blast) 
5655    }
5656    ultimately have "(x):M' \<in> AXIOMSn (A IMP B) \<union> BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>)
5657                                              \<union> IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" by blast
5658    then have "(x):M' \<in> NEGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" by simp
5659    then show "(x):M' \<in> (\<parallel>(A IMP B)\<parallel>)" using NEG_simp by blast
5660  }
5661next
5662  case (AND A B)
5663  have ih1: "\<And>a M M'. \<lbrakk><a>:M \<in> \<parallel><A>\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> <a>:M' \<in> \<parallel><A>\<parallel>" by fact
5664  have ih2: "\<And>x M M'. \<lbrakk>(x):M \<in> \<parallel>(A)\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> (x):M' \<in> \<parallel>(A)\<parallel>" by fact
5665  have ih3: "\<And>a M M'. \<lbrakk><a>:M \<in> \<parallel><B>\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>" by fact
5666  have ih4: "\<And>x M M'. \<lbrakk>(x):M \<in> \<parallel>(B)\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" by fact
5667  { case 1 
5668    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5669    have "<a>:M \<in> \<parallel><A AND B>\<parallel>" by fact
5670    then have "<a>:M \<in> NEGc (A AND B) (\<parallel>(A AND B)\<parallel>)" by simp
5671    then have "<a>:M \<in> AXIOMSc (A AND B) \<union> BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>) 
5672                                              \<union> ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" by simp
5673    moreover
5674    { assume "<a>:M \<in> AXIOMSc (A AND B)"
5675      then have "<a>:M' \<in> AXIOMSc (A AND B)" using asm by (simp only: AXIOMS_preserved)
5676    }
5677    moreover
5678    { assume "<a>:M \<in> BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>)"
5679      then have "<a>:M' \<in> BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>)" using asm by (simp only: BINDING_preserved)
5680    }
5681    moreover
5682    { assume "<a>:M \<in> ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)"
5683      then obtain a' T' b' N' where eq: "M = AndR <a'>.T' <b'>.N' a" 
5684                              and fic: "fic (AndR <a'>.T' <b'>.N' a) a"
5685                           and imp1: "<a'>:T' \<in> \<parallel><A>\<parallel>" and imp2: "<b'>:N' \<in> \<parallel><B>\<parallel>"
5686        using ANDRIGHT_elim by blast
5687      from eq asm obtain T'' N'' where eq': "M' = AndR <a'>.T'' <b'>.N'' a" 
5688                          and red1: "T' \<longrightarrow>\<^sub>a* T''" and red2: "N' \<longrightarrow>\<^sub>a* N''" 
5689        using a_star_redu_AndR_elim by blast
5690      from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce)
5691      moreover
5692      from imp1 red1 have "<a'>:T'' \<in> \<parallel><A>\<parallel>" using ih1 by simp
5693      moreover
5694      from imp2 red2 have "<b'>:N'' \<in> \<parallel><B>\<parallel>" using ih3 by simp
5695      ultimately have "<a>:M' \<in> ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" using eq' by (simp, blast) 
5696    }
5697    ultimately have "<a>:M' \<in> AXIOMSc (A AND B) \<union> BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>)
5698                                              \<union> ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" by blast
5699    then have "<a>:M' \<in> NEGc (A AND B) (\<parallel>(A AND B)\<parallel>)" by simp
5700    then show "<a>:M' \<in> (\<parallel><A AND B>\<parallel>)" using NEG_simp by blast
5701  next
5702    case 2
5703    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5704    have "(x):M \<in> \<parallel>(A AND B)\<parallel>" by fact
5705    then have "(x):M \<in> NEGn (A AND B) (\<parallel><A AND B>\<parallel>)" using NEG_simp by blast
5706    then have "(x):M \<in> AXIOMSn (A AND B) \<union> BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>) 
5707                                     \<union> ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>) \<union> ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" by simp
5708    moreover
5709    { assume "(x):M \<in> AXIOMSn (A AND B)"
5710      then have "(x):M' \<in> AXIOMSn (A AND B)" using asm by (simp only: AXIOMS_preserved)
5711    }
5712    moreover
5713    { assume "(x):M \<in> BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>)"
5714      then have "(x):M' \<in> BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>)" using asm by (simp only: BINDING_preserved)
5715    }
5716    moreover
5717    { assume "(x):M \<in> ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>)"
5718      then obtain y' N' where eq: "M = AndL1 (y').N' x" 
5719                             and fin: "fin (AndL1 (y').N' x) x" and imp: "(y'):N' \<in> \<parallel>(A)\<parallel>"
5720        by (erule_tac ANDLEFT1_elim, blast)
5721      from eq asm obtain N'' where eq': "M' = AndL1 (y').N'' x" and red1: "N' \<longrightarrow>\<^sub>a* N''"
5722        using a_star_redu_AndL1_elim by blast
5723      from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce)
5724      moreover
5725      from imp red1 have "(y'):N'' \<in> \<parallel>(A)\<parallel>" using ih2 by simp
5726      ultimately have "(x):M' \<in> ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>)" using eq' by (simp, blast) 
5727    }
5728     moreover
5729    { assume "(x):M \<in> ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)"
5730      then obtain y' N' where eq: "M = AndL2 (y').N' x" 
5731                             and fin: "fin (AndL2 (y').N' x) x" and imp: "(y'):N' \<in> \<parallel>(B)\<parallel>"
5732        by (erule_tac ANDLEFT2_elim, blast)
5733      from eq asm obtain N'' where eq': "M' = AndL2 (y').N'' x" and red1: "N' \<longrightarrow>\<^sub>a* N''"
5734        using a_star_redu_AndL2_elim by blast
5735      from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce)
5736      moreover
5737      from imp red1 have "(y'):N'' \<in> \<parallel>(B)\<parallel>" using ih4 by simp
5738      ultimately have "(x):M' \<in> ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" using eq' by (simp, blast) 
5739    }
5740    ultimately have "(x):M' \<in> AXIOMSn (A AND B) \<union> BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>)
5741                               \<union> ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>) \<union> ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" by blast
5742    then have "(x):M' \<in> NEGn (A AND B) (\<parallel><A AND B>\<parallel>)" by simp
5743    then show "(x):M' \<in> (\<parallel>(A AND B)\<parallel>)" using NEG_simp by blast
5744  }
5745next    
5746 case (OR A B)
5747  have ih1: "\<And>a M M'. \<lbrakk><a>:M \<in> \<parallel><A>\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> <a>:M' \<in> \<parallel><A>\<parallel>" by fact
5748  have ih2: "\<And>x M M'. \<lbrakk>(x):M \<in> \<parallel>(A)\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> (x):M' \<in> \<parallel>(A)\<parallel>" by fact
5749  have ih3: "\<And>a M M'. \<lbrakk><a>:M \<in> \<parallel><B>\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>" by fact
5750  have ih4: "\<And>x M M'. \<lbrakk>(x):M \<in> \<parallel>(B)\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" by fact
5751  { case 1 
5752    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5753    have "<a>:M \<in> \<parallel><A OR B>\<parallel>" by fact
5754    then have "<a>:M \<in> NEGc (A OR B) (\<parallel>(A OR B)\<parallel>)" by simp
5755    then have "<a>:M \<in> AXIOMSc (A OR B) \<union> BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>) 
5756                          \<union> ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>) \<union> ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" by simp
5757    moreover
5758    { assume "<a>:M \<in> AXIOMSc (A OR B)"
5759      then have "<a>:M' \<in> AXIOMSc (A OR B)" using asm by (simp only: AXIOMS_preserved)
5760    }
5761    moreover
5762    { assume "<a>:M \<in> BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>)"
5763      then have "<a>:M' \<in> BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>)" using asm by (simp only: BINDING_preserved)
5764    }
5765    moreover
5766    { assume "<a>:M \<in> ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>)"
5767      then obtain a' N' where eq: "M = OrR1 <a'>.N' a" 
5768                              and fic: "fic (OrR1 <a'>.N' a) a" and imp1: "<a'>:N' \<in> \<parallel><A>\<parallel>"
5769        using ORRIGHT1_elim by blast
5770      from eq asm obtain N'' where eq': "M' = OrR1 <a'>.N'' a" and red1: "N' \<longrightarrow>\<^sub>a* N''" 
5771        using a_star_redu_OrR1_elim by blast
5772      from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce)
5773      moreover
5774      from imp1 red1 have "<a'>:N'' \<in> \<parallel><A>\<parallel>" using ih1 by simp
5775      ultimately have "<a>:M' \<in> ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>)" using eq' by (simp, blast) 
5776    }
5777    moreover
5778    { assume "<a>:M \<in> ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)"
5779      then obtain a' N' where eq: "M = OrR2 <a'>.N' a" 
5780                              and fic: "fic (OrR2 <a'>.N' a) a" and imp1: "<a'>:N' \<in> \<parallel><B>\<parallel>"
5781        using ORRIGHT2_elim by blast
5782      from eq asm obtain N'' where eq': "M' = OrR2 <a'>.N'' a" and red1: "N' \<longrightarrow>\<^sub>a* N''" 
5783        using a_star_redu_OrR2_elim by blast
5784      from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce)
5785      moreover
5786      from imp1 red1 have "<a'>:N'' \<in> \<parallel><B>\<parallel>" using ih3 by simp
5787      ultimately have "<a>:M' \<in> ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" using eq' by (simp, blast) 
5788    }
5789    ultimately have "<a>:M' \<in> AXIOMSc (A OR B) \<union> BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>)
5790                                \<union> ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>) \<union> ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" by blast
5791    then have "<a>:M' \<in> NEGc (A OR B) (\<parallel>(A OR B)\<parallel>)" by simp
5792    then show "<a>:M' \<in> (\<parallel><A OR B>\<parallel>)" using NEG_simp by blast
5793  next
5794    case 2
5795    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5796    have "(x):M \<in> \<parallel>(A OR B)\<parallel>" by fact
5797    then have "(x):M \<in> NEGn (A OR B) (\<parallel><A OR B>\<parallel>)" using NEG_simp by blast
5798    then have "(x):M \<in> AXIOMSn (A OR B) \<union> BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>) 
5799                                     \<union> ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" by simp
5800    moreover
5801    { assume "(x):M \<in> AXIOMSn (A OR B)"
5802      then have "(x):M' \<in> AXIOMSn (A OR B)" using asm by (simp only: AXIOMS_preserved)
5803    }
5804    moreover
5805    { assume "(x):M \<in> BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>)"
5806      then have "(x):M' \<in> BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>)" using asm by (simp only: BINDING_preserved)
5807    }
5808    moreover
5809    { assume "(x):M \<in> ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)"
5810      then obtain y' T' z' N' where eq: "M = OrL (y').T' (z').N' x" 
5811                             and fin: "fin (OrL (y').T' (z').N' x) x" 
5812                             and imp1: "(y'):T' \<in> \<parallel>(A)\<parallel>" and imp2: "(z'):N' \<in> \<parallel>(B)\<parallel>"
5813        by (erule_tac ORLEFT_elim, blast)
5814      from eq asm obtain T'' N'' where eq': "M' = OrL (y').T'' (z').N'' x" 
5815                and red1: "T' \<longrightarrow>\<^sub>a* T''" and red2: "N' \<longrightarrow>\<^sub>a* N''"
5816        using a_star_redu_OrL_elim by blast
5817      from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce)
5818      moreover
5819      from imp1 red1 have "(y'):T'' \<in> \<parallel>(A)\<parallel>" using ih2 by simp
5820      moreover
5821      from imp2 red2 have "(z'):N'' \<in> \<parallel>(B)\<parallel>" using ih4 by simp
5822      ultimately have "(x):M' \<in> ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" using eq' by (simp, blast) 
5823    }
5824    ultimately have "(x):M' \<in> AXIOMSn (A OR B) \<union> BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>)
5825                               \<union> ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" by blast
5826    then have "(x):M' \<in> NEGn (A OR B) (\<parallel><A OR B>\<parallel>)" by simp
5827    then show "(x):M' \<in> (\<parallel>(A OR B)\<parallel>)" using NEG_simp by blast
5828  }
5829next
5830  case (NOT A)
5831  have ih1: "\<And>a M M'. \<lbrakk><a>:M \<in> \<parallel><A>\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> <a>:M' \<in> \<parallel><A>\<parallel>" by fact
5832  have ih2: "\<And>x M M'. \<lbrakk>(x):M \<in> \<parallel>(A)\<parallel>; M \<longrightarrow>\<^sub>a* M'\<rbrakk> \<Longrightarrow> (x):M' \<in> \<parallel>(A)\<parallel>" by fact
5833  { case 1 
5834    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5835    have "<a>:M \<in> \<parallel><NOT A>\<parallel>" by fact
5836    then have "<a>:M \<in> NEGc (NOT A) (\<parallel>(NOT A)\<parallel>)" by simp
5837    then have "<a>:M \<in> AXIOMSc (NOT A) \<union> BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>) 
5838                                              \<union> NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)" by simp
5839    moreover
5840    { assume "<a>:M \<in> AXIOMSc (NOT A)"
5841      then have "<a>:M' \<in> AXIOMSc (NOT A)" using asm by (simp only: AXIOMS_preserved)
5842    }
5843    moreover
5844    { assume "<a>:M \<in> BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>)"
5845      then have "<a>:M' \<in> BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>)" using asm by (simp only: BINDING_preserved)
5846    }
5847    moreover
5848    { assume "<a>:M \<in> NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)"
5849      then obtain y' N' where eq: "M = NotR (y').N' a" 
5850                              and fic: "fic (NotR (y').N' a) a" and imp: "(y'):N' \<in> \<parallel>(A)\<parallel>"
5851        using NOTRIGHT_elim by blast
5852      from eq asm obtain N'' where eq': "M' = NotR (y').N'' a" and red: "N' \<longrightarrow>\<^sub>a* N''" 
5853        using a_star_redu_NotR_elim by blast
5854      from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce)
5855      moreover
5856      from imp red have "(y'):N'' \<in> \<parallel>(A)\<parallel>" using ih2 by simp
5857      ultimately have "<a>:M' \<in> NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)" using eq' by (simp, blast) 
5858    }
5859    ultimately have "<a>:M' \<in> AXIOMSc (NOT A) \<union> BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>)
5860                                              \<union> NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)" by blast
5861    then have "<a>:M' \<in> NEGc (NOT A) (\<parallel>(NOT A)\<parallel>)" by simp
5862    then show "<a>:M' \<in> (\<parallel><NOT A>\<parallel>)" using NEG_simp by blast
5863  next
5864    case 2
5865    have asm: "M \<longrightarrow>\<^sub>a* M'" by fact
5866    have "(x):M \<in> \<parallel>(NOT A)\<parallel>" by fact
5867    then have "(x):M \<in> NEGn (NOT A) (\<parallel><NOT A>\<parallel>)" using NEG_simp by blast
5868    then have "(x):M \<in> AXIOMSn (NOT A) \<union> BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>) 
5869                                     \<union> NOTLEFT (NOT A) (\<parallel><A>\<parallel>)" by simp
5870    moreover
5871    { assume "(x):M \<in> AXIOMSn (NOT A)"
5872      then have "(x):M' \<in> AXIOMSn (NOT A)" using asm by (simp only: AXIOMS_preserved)
5873    }
5874    moreover
5875    { assume "(x):M \<in> BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>)"
5876      then have "(x):M' \<in> BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>)" using asm by (simp only: BINDING_preserved)
5877    }
5878    moreover
5879    { assume "(x):M \<in> NOTLEFT (NOT A) (\<parallel><A>\<parallel>)"
5880      then obtain a' N' where eq: "M = NotL <a'>.N' x" 
5881                             and fin: "fin (NotL <a'>.N' x) x" and imp: "<a'>:N' \<in> \<parallel><A>\<parallel>"
5882        by (erule_tac NOTLEFT_elim, blast)
5883      from eq asm obtain N'' where eq': "M' = NotL <a'>.N'' x" and red1: "N' \<longrightarrow>\<^sub>a* N''"
5884        using a_star_redu_NotL_elim by blast
5885      from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce)
5886      moreover
5887      from imp red1 have "<a'>:N'' \<in> \<parallel><A>\<parallel>" using ih1 by simp
5888      ultimately have "(x):M' \<in> NOTLEFT (NOT A) (\<parallel><A>\<parallel>)" using eq' by (simp, blast) 
5889    }
5890    ultimately have "(x):M' \<in> AXIOMSn (NOT A) \<union> BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>)
5891                               \<union> NOTLEFT (NOT A) (\<parallel><A>\<parallel>)" by blast
5892    then have "(x):M' \<in> NEGn (NOT A) (\<parallel><NOT A>\<parallel>)" by simp
5893    then show "(x):M' \<in> (\<parallel>(NOT A)\<parallel>)" using NEG_simp by blast
5894  }
5895qed
5896
5897lemma CANDs_preserved_single:
5898  shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> M \<longrightarrow>\<^sub>a M' \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>"
5899  and   "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> M \<longrightarrow>\<^sub>a M' \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>"
5900by (auto simp add: a_starI CANDs_preserved)
5901
5902lemma fic_CANDS:
5903  assumes a: "\<not>fic M a"
5904  and     b: "<a>:M \<in> \<parallel><B>\<parallel>"
5905  shows "<a>:M \<in> AXIOMSc B \<or> <a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>)"
5906using a b
5907apply(nominal_induct B rule: ty.strong_induct)
5908apply(simp)
5909apply(simp)
5910apply(erule disjE)
5911apply(simp)
5912apply(erule disjE)
5913apply(simp)
5914apply(auto simp add: ctrm.inject)[1]
5915apply(simp add: alpha)
5916apply(erule disjE)
5917apply(simp)
5918apply(auto simp add: calc_atm)[1]
5919apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2))
5920apply(simp add: calc_atm)
5921apply(simp)
5922apply(erule disjE)
5923apply(simp)
5924apply(erule disjE)
5925apply(simp)
5926apply(auto simp add: ctrm.inject)[1]
5927apply(simp add: alpha)
5928apply(erule disjE)
5929apply(simp)
5930apply(erule conjE)+
5931apply(simp)
5932apply(drule_tac pi="[(a,c)]" in fic.eqvt(2))
5933apply(simp add: calc_atm)
5934apply(simp)
5935apply(erule disjE)
5936apply(simp)
5937apply(erule disjE)
5938apply(simp)
5939apply(auto simp add: ctrm.inject)[1]
5940apply(simp add: alpha)
5941apply(erule disjE)
5942apply(simp)
5943apply(erule conjE)+
5944apply(simp)
5945apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
5946apply(simp add: calc_atm)
5947apply(simp add: alpha)
5948apply(erule disjE)
5949apply(simp)
5950apply(erule conjE)+
5951apply(simp)
5952apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
5953apply(simp add: calc_atm)
5954apply(simp)
5955apply(erule disjE)
5956apply(simp)
5957apply(erule disjE)
5958apply(simp)
5959apply(auto simp add: ctrm.inject)[1]
5960apply(simp add: alpha)
5961apply(erule disjE)
5962apply(simp)
5963apply(erule conjE)+
5964apply(simp)
5965apply(drule_tac pi="[(a,b)]" in fic.eqvt(2))
5966apply(simp add: calc_atm)
5967done
5968
5969lemma fin_CANDS_aux:
5970  assumes a: "\<not>fin M x"
5971  and     b: "(x):M \<in> (NEGn B (\<parallel><B>\<parallel>))"
5972  shows "(x):M \<in> AXIOMSn B \<or> (x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)"
5973using a b
5974apply(nominal_induct B rule: ty.strong_induct)
5975apply(simp)
5976apply(simp)
5977apply(erule disjE)
5978apply(simp)
5979apply(erule disjE)
5980apply(simp)
5981apply(auto simp add: ntrm.inject)[1]
5982apply(simp add: alpha)
5983apply(erule disjE)
5984apply(simp)
5985apply(auto simp add: calc_atm)[1]
5986apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1))
5987apply(simp add: calc_atm)
5988apply(simp)
5989apply(erule disjE)
5990apply(simp)
5991apply(erule disjE)
5992apply(simp)
5993apply(auto simp add: ntrm.inject)[1]
5994apply(simp add: alpha)
5995apply(erule disjE)
5996apply(simp)
5997apply(erule conjE)+
5998apply(simp)
5999apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
6000apply(simp add: calc_atm)
6001apply(simp add: alpha)
6002apply(erule disjE)
6003apply(simp)
6004apply(erule conjE)+
6005apply(simp)
6006apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
6007apply(simp add: calc_atm)
6008apply(simp)
6009apply(erule disjE)
6010apply(simp)
6011apply(erule disjE)
6012apply(simp)
6013apply(auto simp add: ntrm.inject)[1]
6014apply(simp add: alpha)
6015apply(erule disjE)
6016apply(simp)
6017apply(erule conjE)+
6018apply(simp)
6019apply(drule_tac pi="[(x,z)]" in fin.eqvt(1))
6020apply(simp add: calc_atm)
6021apply(simp)
6022apply(erule disjE)
6023apply(simp)
6024apply(erule disjE)
6025apply(simp)
6026apply(auto simp add: ntrm.inject)[1]
6027apply(simp add: alpha)
6028apply(erule disjE)
6029apply(simp)
6030apply(erule conjE)+
6031apply(simp)
6032apply(drule_tac pi="[(x,y)]" in fin.eqvt(1))
6033apply(simp add: calc_atm)
6034done
6035
6036lemma fin_CANDS:
6037  assumes a: "\<not>fin M x"
6038  and     b: "(x):M \<in> (\<parallel>(B)\<parallel>)"
6039  shows "(x):M \<in> AXIOMSn B \<or> (x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)"
6040apply(rule fin_CANDS_aux)
6041apply(rule a)
6042apply(rule NEG_elim)
6043apply(rule b)
6044done
6045
6046lemma BINDING_implies_CAND:
6047  shows "<c>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> <c>:M \<in> (\<parallel><B>\<parallel>)"
6048  and   "(x):N \<in> BINDINGn B (\<parallel><B>\<parallel>) \<Longrightarrow> (x):N \<in> (\<parallel>(B)\<parallel>)"
6049apply -
6050apply(nominal_induct B rule: ty.strong_induct)
6051apply(auto)
6052apply(rule NEG_intro)
6053apply(nominal_induct B rule: ty.strong_induct)
6054apply(auto)
6055done
6056
6057end
6058