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