451 and b :: "'x" |
451 and b :: "'x" |
452 assumes at: "at TYPE('x)" |
452 assumes at: "at TYPE('x)" |
453 shows "(a\<sharp>b) = (a\<noteq>b)" |
453 shows "(a\<sharp>b) = (a\<noteq>b)" |
454 by (simp add: at_supp[OF at] fresh_def) |
454 by (simp add: at_supp[OF at] fresh_def) |
455 |
455 |
456 lemma at_prm_fresh[rule_format]: |
456 lemma at_prm_fresh: |
457 fixes c :: "'x" |
457 fixes c :: "'x" |
458 and pi:: "'x prm" |
458 and pi:: "'x prm" |
459 assumes at: "at TYPE('x)" |
459 assumes at: "at TYPE('x)" |
460 shows "c\<sharp>pi \<longrightarrow> pi\<bullet>c = c" |
460 and a: "c\<sharp>pi" |
|
461 shows "pi\<bullet>c = c" |
|
462 using a |
461 apply(induct pi) |
463 apply(induct pi) |
462 apply(simp add: at1[OF at]) |
464 apply(simp add: at1[OF at]) |
463 apply(force simp add: fresh_list_cons at2[OF at] fresh_prod at_fresh[OF at] at3[OF at]) |
465 apply(force simp add: fresh_list_cons at2[OF at] fresh_prod at_fresh[OF at] at3[OF at]) |
464 done |
466 done |
465 |
467 |
466 lemma at_prm_rev_eq: |
468 lemma at_prm_rev_eq: |
467 fixes pi1 :: "'x prm" |
469 fixes pi1 :: "'x prm" |
468 and pi2 :: "'x prm" |
470 and pi2 :: "'x prm" |
469 assumes at: "at TYPE('x)" |
471 assumes at: "at TYPE('x)" |
470 shows a: "((rev pi1) \<triangleq> (rev pi2)) = (pi1 \<triangleq> pi2)" |
472 shows "((rev pi1) \<triangleq> (rev pi2)) = (pi1 \<triangleq> pi2)" |
471 proof (simp add: prm_eq_def, auto) |
473 proof (simp add: prm_eq_def, auto) |
472 fix x |
474 fix x |
473 assume "\<forall>x::'x. (rev pi1)\<bullet>x = (rev pi2)\<bullet>x" |
475 assume "\<forall>x::'x. (rev pi1)\<bullet>x = (rev pi2)\<bullet>x" |
474 hence "(rev (pi1::'x prm))\<bullet>(pi2\<bullet>(x::'x)) = (rev (pi2::'x prm))\<bullet>(pi2\<bullet>x)" by simp |
476 hence "(rev (pi1::'x prm))\<bullet>(pi2\<bullet>(x::'x)) = (rev (pi2::'x prm))\<bullet>(pi2\<bullet>x)" by simp |
475 hence "(rev (pi1::'x prm))\<bullet>((pi2::'x prm)\<bullet>x) = (x::'x)" by (simp add: at_rev_pi[OF at]) |
477 hence "(rev (pi1::'x prm))\<bullet>((pi2::'x prm)\<bullet>x) = (x::'x)" by (simp add: at_rev_pi[OF at]) |
481 hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>x) = (pi2::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x))" by simp |
483 hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>x) = (pi2::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x))" by simp |
482 hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x)) = x" by (simp add: at_pi_rev[OF at]) |
484 hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x)) = x" by (simp add: at_pi_rev[OF at]) |
483 hence "(rev pi2)\<bullet>x = (rev pi1)\<bullet>(x::'x)" by (simp add: at_bij1[OF at]) |
485 hence "(rev pi2)\<bullet>x = (rev pi1)\<bullet>(x::'x)" by (simp add: at_bij1[OF at]) |
484 thus "(rev pi1)\<bullet>x = (rev pi2)\<bullet>(x::'x)" by simp |
486 thus "(rev pi1)\<bullet>x = (rev pi2)\<bullet>(x::'x)" by simp |
485 qed |
487 qed |
|
488 |
|
489 lemma at_prm_eq_append: |
|
490 fixes pi1 :: "'x prm" |
|
491 and pi2 :: "'x prm" |
|
492 and pi3 :: "'x prm" |
|
493 assumes at: "at TYPE('x)" |
|
494 and a: "pi1 \<triangleq> pi2" |
|
495 shows "(pi3@pi1) \<triangleq> (pi3@pi2)" |
|
496 using a by (simp add: prm_eq_def at_append[OF at] at_bij[OF at]) |
|
497 |
|
498 lemma at_prm_eq_trans: |
|
499 fixes pi1 :: "'x prm" |
|
500 and pi2 :: "'x prm" |
|
501 and pi3 :: "'x prm" |
|
502 assumes a1: "pi1 \<triangleq> pi2" |
|
503 and a2: "pi2 \<triangleq> pi3" |
|
504 shows "pi1 \<triangleq> pi3" |
|
505 using a1 a2 by (auto simp add: prm_eq_def) |
486 |
506 |
|
507 lemma at_prm_eq_refl: |
|
508 fixes pi :: "'x prm" |
|
509 shows "pi \<triangleq> pi" |
|
510 by (simp add: prm_eq_def) |
|
511 |
487 lemma at_prm_rev_eq1: |
512 lemma at_prm_rev_eq1: |
488 fixes pi1 :: "'x prm" |
513 fixes pi1 :: "'x prm" |
489 and pi2 :: "'x prm" |
514 and pi2 :: "'x prm" |
490 assumes at: "at TYPE('x)" |
515 assumes at: "at TYPE('x)" |
491 shows "pi1 \<triangleq> pi2 \<Longrightarrow> (rev pi1) \<triangleq> (rev pi2)" |
516 shows "pi1 \<triangleq> pi2 \<Longrightarrow> (rev pi1) \<triangleq> (rev pi2)" |
500 lemma at_ds2: |
525 lemma at_ds2: |
501 fixes pi :: "'x prm" |
526 fixes pi :: "'x prm" |
502 and a :: "'x" |
527 and a :: "'x" |
503 and b :: "'x" |
528 and b :: "'x" |
504 assumes at: "at TYPE('x)" |
529 assumes at: "at TYPE('x)" |
505 shows "(pi@[((rev pi)\<bullet>a,(rev pi)\<bullet>b)]) \<triangleq> ([(a,b)]@pi)" |
530 shows "([(a,b)]@pi) \<triangleq> (pi@[((rev pi)\<bullet>a,(rev pi)\<bullet>b)])" |
506 by (force simp add: prm_eq_def at_append[OF at] at_bij[OF at] at_pi_rev[OF at] |
531 by (force simp add: prm_eq_def at_append[OF at] at_bij[OF at] at_pi_rev[OF at] |
507 at_rev_pi[OF at] at_calc[OF at]) |
532 at_rev_pi[OF at] at_calc[OF at]) |
508 |
533 |
509 lemma at_ds3: |
534 lemma at_ds3: |
510 fixes a :: "'x" |
535 fixes a :: "'x" |
589 apply(drule_tac x="swap(pi1\<bullet>a,pi1\<bullet>b) aa" in spec) |
614 apply(drule_tac x="swap(pi1\<bullet>a,pi1\<bullet>b) aa" in spec) |
590 apply(drule sym) |
615 apply(drule sym) |
591 apply(simp) |
616 apply(simp) |
592 apply(simp add: at_ds8_aux[OF at]) |
617 apply(simp add: at_ds8_aux[OF at]) |
593 apply(simp add: at_rev_pi[OF at]) |
618 apply(simp add: at_rev_pi[OF at]) |
|
619 done |
|
620 |
|
621 lemma at_ds10: |
|
622 fixes pi1 :: "'x prm" |
|
623 and pi2 :: "'x prm" |
|
624 and a :: "'x" |
|
625 and b :: "'x" |
|
626 assumes at: "at TYPE('x)" |
|
627 and a: "b\<sharp>(rev pi1)" |
|
628 shows "(pi2@([(pi1\<bullet>a,b)]@pi1)) \<triangleq> (pi2@(pi1@[(a,b)]))" |
|
629 using a |
|
630 apply - |
|
631 apply(rule at_prm_eq_append[OF at]) |
|
632 apply(rule at_prm_eq_trans) |
|
633 apply(rule at_ds2[OF at]) |
|
634 apply(simp add: at_prm_fresh[OF at] at_rev_pi[OF at]) |
|
635 apply(rule at_prm_eq_refl) |
594 done |
636 done |
595 |
637 |
596 --"there always exists an atom not being in a finite set" |
638 --"there always exists an atom not being in a finite set" |
597 lemma ex_in_inf: |
639 lemma ex_in_inf: |
598 fixes A::"'x set" |
640 fixes A::"'x set" |