28 "bv1 (BUnit) = {}" |
28 "bv1 (BUnit) = {}" |
29 | "bv1 (BVr x) = {atom x}" |
29 | "bv1 (BVr x) = {atom x}" |
30 | "bv1 (BPr bp1 bp2) = (bv1 bp1) \<union> (bv1 bp2)" |
30 | "bv1 (BPr bp1 bp2) = (bv1 bp1) \<union> (bv1 bp2)" |
31 |
31 |
32 setup {* snd o define_raw_perms ["rtrm1", "bp"] ["Terms.rtrm1", "Terms.bp"] *} |
32 setup {* snd o define_raw_perms ["rtrm1", "bp"] ["Terms.rtrm1", "Terms.bp"] *} |
|
33 thm permute_rtrm1_permute_bp.simps |
33 |
34 |
34 local_setup {* |
35 local_setup {* |
35 snd o define_fv_alpha "Terms.rtrm1" |
36 snd o define_fv_alpha "Terms.rtrm1" |
36 [[[[]], [[], []], [[(NONE, 0)], [(NONE, 0)]], [[(SOME @{term bv1}, 0)], [], [(SOME @{term bv1}, 0)]]], |
37 [[[[]], [[], []], [[(NONE, 0)], [(NONE, 0)]], [[(SOME @{term bv1}, 0)], [], [(SOME @{term bv1}, 0)]]], |
37 [[], [[]], [[], []]]] *} |
38 [[], [[]], [[], []]]] *} |
38 print_theorems |
|
39 |
39 |
40 notation |
40 notation |
41 alpha_rtrm1 ("_ \<approx>1 _" [100, 100] 100) and |
41 alpha_rtrm1 ("_ \<approx>1 _" [100, 100] 100) and |
42 alpha_bp ("_ \<approx>1b _" [100, 100] 100) |
42 alpha_bp ("_ \<approx>1b _" [100, 100] 100) |
43 thm alpha_rtrm1_alpha_bp.intros |
43 thm alpha_rtrm1_alpha_bp.intros |
566 "permute :: perm \<Rightarrow> rlts \<Rightarrow> rlts" |
566 "permute :: perm \<Rightarrow> rlts \<Rightarrow> rlts" |
567 |
567 |
568 lemma trm5_lts_zero: |
568 lemma trm5_lts_zero: |
569 "0 \<bullet> (x\<Colon>trm5) = x" |
569 "0 \<bullet> (x\<Colon>trm5) = x" |
570 "0 \<bullet> (y\<Colon>lts) = y" |
570 "0 \<bullet> (y\<Colon>lts) = y" |
571 apply(induct x and y rule: trm5_lts_inducts) |
571 apply(induct x and y rule: trm5_lts_inducts) |
572 apply(simp_all add: permute_rtrm5_permute_rlts.simps[quot_lifted]) |
572 apply(simp_all add: permute_rtrm5_permute_rlts.simps[quot_lifted]) |
573 done |
573 done |
574 |
574 |
575 lemma trm5_lts_plus: |
575 lemma trm5_lts_plus: |
576 "(p + q) \<bullet> (x\<Colon>trm5) = p \<bullet> q \<bullet> x" |
576 "(p + q) \<bullet> (x\<Colon>trm5) = p \<bullet> q \<bullet> x" |
577 "(p + q) \<bullet> (y\<Colon>lts) = p \<bullet> q \<bullet> y" |
577 "(p + q) \<bullet> (y\<Colon>lts) = p \<bullet> q \<bullet> y" |
578 apply(induct x and y rule: trm5_lts_inducts) |
578 apply(induct x and y rule: trm5_lts_inducts) |
579 apply(simp_all add: permute_rtrm5_permute_rlts.simps[quot_lifted]) |
579 apply(simp_all add: permute_rtrm5_permute_rlts.simps[quot_lifted]) |
580 done |
580 done |
581 |
581 |
582 instance |
582 instance |
583 apply default |
583 apply default |
584 apply (simp_all add: trm5_lts_zero trm5_lts_plus) |
584 apply (simp_all add: trm5_lts_zero trm5_lts_plus) |
585 done |
585 done |
586 |
586 |
587 end |
587 end |
588 |
588 |
589 lemmas permute_trm5_lts = permute_rtrm5_permute_rlts.simps[quot_lifted] |
589 lemmas |
590 |
590 permute_trm5_lts = permute_rtrm5_permute_rlts.simps[quot_lifted] |
591 lemmas alpha5_INJ = alpha5_inj[unfolded alpha_gen, quot_lifted, folded alpha_gen] |
591 and |
592 |
592 alpha5_INJ = alpha5_inj[unfolded alpha_gen, quot_lifted, folded alpha_gen] |
593 lemmas bv5[simp] = rbv5.simps[quot_lifted] |
593 and |
594 |
594 bv5[simp] = rbv5.simps[quot_lifted] |
595 lemmas fv_trm5_lts[simp] = fv_rtrm5_fv_rlts.simps[quot_lifted] |
595 and |
|
596 fv_trm5_lts[simp] = fv_rtrm5_fv_rlts.simps[quot_lifted] |
596 |
597 |
597 lemma lets_ok: |
598 lemma lets_ok: |
598 "(Lt5 (Lcons x (Vr5 x) Lnil) (Vr5 x)) = (Lt5 (Lcons y (Vr5 y) Lnil) (Vr5 y))" |
599 "(Lt5 (Lcons x (Vr5 x) Lnil) (Vr5 x)) = (Lt5 (Lcons y (Vr5 y) Lnil) (Vr5 y))" |
599 apply (subst alpha5_INJ) |
600 apply (subst alpha5_INJ) |
600 apply (rule conjI) |
601 apply (rule conjI) |
663 setup {* snd o define_raw_perms ["rtrm6"] ["Terms.rtrm6"] *} |
664 setup {* snd o define_raw_perms ["rtrm6"] ["Terms.rtrm6"] *} |
664 print_theorems |
665 print_theorems |
665 |
666 |
666 local_setup {* snd o define_fv_alpha "Terms.rtrm6" [ |
667 local_setup {* snd o define_fv_alpha "Terms.rtrm6" [ |
667 [[[]], [[(NONE, 0)], [(NONE, 0)]], [[(SOME @{term rbv6}, 0)], [(SOME @{term rbv6}, 0)]]]] *} |
668 [[[]], [[(NONE, 0)], [(NONE, 0)]], [[(SOME @{term rbv6}, 0)], [(SOME @{term rbv6}, 0)]]]] *} |
668 notation alpha_rtrm6 ("_ \<approx>6a _" [100, 100] 100) |
669 notation alpha_rtrm6 ("_ \<approx>6 _" [100, 100] 100) |
669 (* HERE THE RULES DIFFER *) |
670 (* HERE THE RULES DIFFER *) |
670 thm alpha_rtrm6.intros |
671 thm alpha_rtrm6.intros |
671 |
672 |
672 inductive |
673 local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha6_inj}, []), (build_alpha_inj @{thms alpha_rtrm6.intros} @{thms rtrm6.distinct rtrm6.inject} @{thms alpha_rtrm6.cases} ctxt)) ctxt)) *} |
673 alpha6 :: "rtrm6 \<Rightarrow> rtrm6 \<Rightarrow> bool" ("_ \<approx>6 _" [100, 100] 100) |
674 thm alpha6_inj |
674 where |
|
675 a1: "a = b \<Longrightarrow> (rVr6 a) \<approx>6 (rVr6 b)" |
|
676 | a2: "(\<exists>pi. (({atom a}, t) \<approx>gen alpha6 fv_rtrm6 pi ({atom b}, s))) \<Longrightarrow> rLm6 a t \<approx>6 rLm6 b s" |
|
677 | a3: "(\<exists>pi. (((rbv6 t1), s1) \<approx>gen alpha6 fv_rtrm6 pi ((rbv6 t2), s2))) \<Longrightarrow> rLt6 t1 s1 \<approx>6 rLt6 t2 s2" |
|
678 |
675 |
679 lemma alpha6_equivps: |
676 lemma alpha6_equivps: |
680 shows "equivp alpha6" |
677 shows "equivp alpha6" |
681 sorry |
678 sorry |
682 |
679 |
683 quotient_type |
680 quotient_type |
684 trm6 = rtrm6 / alpha6 |
681 trm6 = rtrm6 / alpha_rtrm6 |
685 by (auto intro: alpha6_equivps) |
682 by (auto intro: alpha6_equivps) |
686 |
683 |
687 local_setup {* |
684 local_setup {* |
688 (fn ctxt => ctxt |
685 (fn ctxt => ctxt |
689 |> snd o (Quotient_Def.quotient_lift_const ("Vr6", @{term rVr6})) |
686 |> snd o (Quotient_Def.quotient_lift_const ("Vr6", @{term rVr6})) |
693 |> snd o (Quotient_Def.quotient_lift_const ("bv6", @{term rbv6}))) |
690 |> snd o (Quotient_Def.quotient_lift_const ("bv6", @{term rbv6}))) |
694 *} |
691 *} |
695 print_theorems |
692 print_theorems |
696 |
693 |
697 lemma [quot_respect]: |
694 lemma [quot_respect]: |
698 "(op = ===> alpha6 ===> alpha6) permute permute" |
695 "(op = ===> alpha_rtrm6 ===> alpha_rtrm6) permute permute" |
699 apply auto (* will work with eqvt *) |
696 apply auto (* will work with eqvt *) |
700 sorry |
697 sorry |
701 |
698 |
702 (* Definitely not true , see lemma below *) |
699 (* Definitely not true , see lemma below *) |
703 lemma [quot_respect]:"(alpha6 ===> op =) rbv6 rbv6" |
700 lemma [quot_respect]:"(alpha_rtrm6 ===> op =) rbv6 rbv6" |
704 apply simp apply clarify |
701 apply simp apply clarify |
705 apply (erule alpha6.induct) |
702 apply (erule alpha_rtrm6.induct) |
706 oops |
703 oops |
707 |
704 |
708 lemma "(a :: name) \<noteq> b \<Longrightarrow> \<not> (alpha6 ===> op =) rbv6 rbv6" |
705 lemma "(a :: name) \<noteq> b \<Longrightarrow> \<not> (alpha_rtrm6 ===> op =) rbv6 rbv6" |
709 apply simp |
706 apply simp |
710 apply (rule_tac x="rLm6 (a::name) (rVr6 (a :: name))" in exI) |
707 apply (rule_tac x="rLm6 (a::name) (rVr6 (a :: name))" in exI) |
711 apply (rule_tac x="rLm6 (b::name) (rVr6 (b :: name))" in exI) |
708 apply (rule_tac x="rLm6 (b::name) (rVr6 (b :: name))" in exI) |
712 apply simp |
709 apply simp |
713 apply (rule a2) |
710 apply (simp add: alpha6_inj) |
714 apply (rule_tac x="(a \<leftrightarrow> b)" in exI) |
711 apply (rule_tac x="(a \<leftrightarrow> b)" in exI) |
715 apply (simp add: alpha_gen fresh_star_def) |
712 apply (simp add: alpha_gen fresh_star_def) |
716 apply (rule a1) |
713 apply (simp add: alpha6_inj) |
717 apply (rule refl) |
714 done |
718 done |
715 |
719 |
716 lemma fv6_rsp: "x \<approx>6 y \<Longrightarrow> fv_rtrm6 x = fv_rtrm6 y" |
720 lemma [quot_respect]:"(alpha6 ===> op =) fv_rtrm6 fv_rtrm6" |
717 apply (induct_tac x y rule: alpha_rtrm6.induct) |
721 apply simp apply clarify |
|
722 apply (induct_tac x y rule: alpha6.induct) |
|
723 apply simp_all |
718 apply simp_all |
724 apply (erule exE) |
719 apply (erule exE) |
725 apply (simp_all add: alpha_gen) |
720 apply (simp_all add: alpha_gen) |
726 apply (erule conjE)+ |
721 done |
727 apply (erule exE) |
722 |
728 apply (erule conjE)+ |
723 lemma [quot_respect]:"(alpha_rtrm6 ===> op =) fv_rtrm6 fv_rtrm6" |
729 apply (simp) |
724 by (simp add: fv6_rsp) |
730 oops |
|
731 |
|
732 |
|
733 lemma [quot_respect]: "(op = ===> alpha6) rVr6 rVr6" |
|
734 by (simp_all add: a1) |
|
735 |
725 |
736 lemma [quot_respect]: |
726 lemma [quot_respect]: |
737 "(op = ===> alpha6 ===> alpha6) rLm6 rLm6" |
727 "(op = ===> alpha_rtrm6) rVr6 rVr6" |
738 "(alpha6 ===> alpha6 ===> alpha6) rLt6 rLt6" |
728 "(op = ===> alpha_rtrm6 ===> alpha_rtrm6) rLm6 rLm6" |
739 apply simp_all apply (clarify) |
729 apply auto |
740 apply (rule a2) |
730 apply (simp_all add: alpha6_inj) |
741 apply (rule_tac x="0::perm" in exI) |
731 apply (rule_tac x="0::perm" in exI) |
742 apply (simp add: alpha_gen) |
732 apply (simp add: alpha_gen fv6_rsp fresh_star_def fresh_zero_perm) |
743 (* needs rfv6_rsp *) defer |
733 done |
744 apply clarify |
734 |
745 apply (rule a3) |
735 lemma [quot_respect]: |
746 apply (rule_tac x="0::perm" in exI) |
736 "(alpha_rtrm6 ===> alpha_rtrm6 ===> alpha_rtrm6) rLt6 rLt6" |
747 apply (simp add: alpha_gen) |
737 apply auto |
|
738 apply (simp_all add: alpha6_inj) |
|
739 apply (rule conjI) |
|
740 apply (rule_tac [!] x="0::perm" in exI) |
|
741 apply (simp_all add: alpha_gen fresh_star_def fresh_zero_perm) |
748 (* needs rbv6_rsp *) |
742 (* needs rbv6_rsp *) |
749 oops |
743 oops |
750 |
744 |
751 instantiation trm6 :: pt begin |
745 instantiation trm6 :: pt begin |
752 |
746 |
759 apply default |
753 apply default |
760 sorry |
754 sorry |
761 end |
755 end |
762 |
756 |
763 lemma lifted_induct: |
757 lemma lifted_induct: |
764 "\<lbrakk>x1 = x2; \<And>a b. a = b \<Longrightarrow> P (Vr6 a) (Vr6 b); |
758 "\<lbrakk>x1 = x2; \<And>name namea. name = namea \<Longrightarrow> P (Vr6 name) (Vr6 namea); |
765 \<And>a t b s. |
759 \<And>name rtrm6 namea rtrm6a. |
766 \<exists>pi. fv_trm6 t - {atom a} = fv_trm6 s - {atom b} \<and> |
760 \<lbrakk>True; |
767 (fv_trm6 t - {atom a}) \<sharp>* pi \<and> pi \<bullet> t = s \<and> P (pi \<bullet> t) s \<Longrightarrow> |
761 \<exists>pi. fv_trm6 rtrm6 - {atom name} = fv_trm6 rtrm6a - {atom namea} \<and> |
768 P (Lm6 a t) (Lm6 b s); |
762 (fv_trm6 rtrm6 - {atom name}) \<sharp>* pi \<and> pi \<bullet> rtrm6 = rtrm6a \<and> P (pi \<bullet> rtrm6) rtrm6a\<rbrakk> |
769 \<And>t1 s1 t2 s2. |
763 \<Longrightarrow> P (Lm6 name rtrm6) (Lm6 namea rtrm6a); |
770 \<exists>pi. fv_trm6 s1 - bv6 t1 = fv_trm6 s2 - bv6 t2 \<and> |
764 \<And>rtrm61 rtrm61a rtrm62 rtrm62a. |
771 (fv_trm6 s1 - bv6 t1) \<sharp>* pi \<and> pi \<bullet> s1 = s2 \<and> P (pi \<bullet> s1) s2 \<Longrightarrow> |
765 \<lbrakk>\<exists>pi. fv_trm6 rtrm61 - bv6 rtrm61 = fv_trm6 rtrm61a - bv6 rtrm61a \<and> |
772 P (Lt6 t1 s1) (Lt6 t2 s2)\<rbrakk> |
766 (fv_trm6 rtrm61 - bv6 rtrm61) \<sharp>* pi \<and> pi \<bullet> rtrm61 = rtrm61a \<and> P (pi \<bullet> rtrm61) rtrm61a; |
773 \<Longrightarrow> P x1 x2" |
767 \<exists>pi. fv_trm6 rtrm62 - bv6 rtrm61 = fv_trm6 rtrm62a - bv6 rtrm61a \<and> |
774 unfolding alpha_gen |
768 (fv_trm6 rtrm62 - bv6 rtrm61) \<sharp>* pi \<and> pi \<bullet> rtrm62 = rtrm62a \<and> P (pi \<bullet> rtrm62) rtrm62a\<rbrakk> |
775 apply (lifting alpha6.induct[unfolded alpha_gen]) |
769 \<Longrightarrow> P (Lt6 rtrm61 rtrm62) (Lt6 rtrm61a rtrm62a)\<rbrakk> |
|
770 \<Longrightarrow> P x1 x2" |
|
771 apply (lifting alpha_rtrm6.induct[unfolded alpha_gen]) |
776 apply injection |
772 apply injection |
777 (* notice unsolvable goals: (alpha6 ===> op =) rbv6 rbv6 *) |
773 (* notice unsolvable goals: (alpha_rtrm6 ===> op =) rbv6 rbv6 *) |
778 oops |
774 oops |
779 |
775 |
780 lemma lifted_inject_a3: |
776 lemma lifted_inject_a3: |
781 "\<exists>pi. fv_trm6 s1 - bv6 t1 = fv_trm6 s2 - bv6 t2 \<and> |
777 "(Lt6 rtrm61 rtrm62 = Lt6 rtrm61a rtrm62a) = |
782 (fv_trm6 s1 - bv6 t1) \<sharp>* pi \<and> pi \<bullet> s1 = s2 \<Longrightarrow> Lt6 t1 s1 = Lt6 t2 s2" |
778 ((\<exists>pi. fv_trm6 rtrm61 - bv6 rtrm61 = fv_trm6 rtrm61a - bv6 rtrm61a \<and> |
783 apply(lifting a3[unfolded alpha_gen]) |
779 (fv_trm6 rtrm61 - bv6 rtrm61) \<sharp>* pi \<and> pi \<bullet> rtrm61 = rtrm61a) \<and> |
|
780 (\<exists>pi. fv_trm6 rtrm62 - bv6 rtrm61 = fv_trm6 rtrm62a - bv6 rtrm61a \<and> |
|
781 (fv_trm6 rtrm62 - bv6 rtrm61) \<sharp>* pi \<and> pi \<bullet> rtrm62 = rtrm62a))" |
|
782 apply(lifting alpha6_inj(3)[unfolded alpha_gen]) |
784 apply injection |
783 apply injection |
785 (* notice unsolvable goals: (alpha6 ===> op =) rbv6 rbv6 *) |
784 (* notice unsolvable goals: (alpha_rtrm6 ===> op =) rbv6 rbv6 *) |
786 oops |
785 oops |
787 |
786 |
788 |
787 |
789 |
788 |
790 |
789 |
801 "rbv7 (rVr7 n) = {atom n}" |
800 "rbv7 (rVr7 n) = {atom n}" |
802 | "rbv7 (rLm7 n t) = rbv7 t - {atom n}" |
801 | "rbv7 (rLm7 n t) = rbv7 t - {atom n}" |
803 | "rbv7 (rLt7 l r) = rbv7 l \<union> rbv7 r" |
802 | "rbv7 (rLt7 l r) = rbv7 l \<union> rbv7 r" |
804 |
803 |
805 setup {* snd o define_raw_perms ["rtrm7"] ["Terms.rtrm7"] *} |
804 setup {* snd o define_raw_perms ["rtrm7"] ["Terms.rtrm7"] *} |
806 print_theorems |
805 thm permute_rtrm7.simps |
807 |
806 |
808 local_setup {* snd o define_fv_alpha "Terms.rtrm7" [ |
807 local_setup {* snd o define_fv_alpha "Terms.rtrm7" [ |
809 [[[]], [[(NONE, 0)], [(NONE, 0)]], [[(SOME @{term rbv7}, 0)], [(SOME @{term rbv7}, 0)]]]] *} |
808 [[[]], [[(NONE, 0)], [(NONE, 0)]], [[(SOME @{term rbv7}, 0)], [(SOME @{term rbv7}, 0)]]]] *} |
810 print_theorems |
809 print_theorems |
811 notation |
810 notation |