src/HOL/Nominal/Examples/Class2.thy
author Thomas Sewell <thomas.sewell@nicta.com.au>
Wed, 11 Jun 2014 14:24:23 +1000
changeset 58834 74bf65a1910a
parent 57415 29e308b56d23
child 59324 ec559c6ab5ba
permissions -rw-r--r--
Hypsubst preserves equality hypotheses

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