Quot/Nominal/Terms.thy
changeset 1201 6d2200603585
parent 1200 a94c04c4a720
child 1202 ab942ba2d243
equal deleted inserted replaced
1200:a94c04c4a720 1201:6d2200603585
    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
    62 done
    62 done
    63 
    63 
    64 lemma bv1_eqvt[eqvt]:
    64 lemma bv1_eqvt[eqvt]:
    65   shows "(pi \<bullet> bv1 x) = bv1 (pi \<bullet> x)"
    65   shows "(pi \<bullet> bv1 x) = bv1 (pi \<bullet> x)"
    66   apply (induct x)
    66   apply (induct x)
    67 apply (simp_all add: empty_eqvt insert_eqvt atom_eqvt eqvts)
    67   apply (simp_all add: atom_eqvt eqvts)
    68 done
    68   done
    69 
    69 
    70 lemma fv_rtrm1_eqvt[eqvt]:
    70 lemma fv_rtrm1_eqvt[eqvt]:
    71     "(pi\<bullet>fv_rtrm1 t) = fv_rtrm1 (pi\<bullet>t)"
    71     "(pi\<bullet>fv_rtrm1 t) = fv_rtrm1 (pi\<bullet>t)"
    72     "(pi\<bullet>fv_bp b) = fv_bp (pi\<bullet>b)"
    72     "(pi\<bullet>fv_bp b) = fv_bp (pi\<bullet>b)"
    73   apply (induct t and b)
    73   apply (induct t and b)
   132 print_theorems
   132 print_theorems
   133 
   133 
   134 lemma alpha_rfv1:
   134 lemma alpha_rfv1:
   135   shows "t \<approx>1 s \<Longrightarrow> fv_rtrm1 t = fv_rtrm1 s"
   135   shows "t \<approx>1 s \<Longrightarrow> fv_rtrm1 t = fv_rtrm1 s"
   136   apply(induct rule: alpha_rtrm1_alpha_bp.inducts(1))
   136   apply(induct rule: alpha_rtrm1_alpha_bp.inducts(1))
   137   apply(simp_all add: fv_rtrm1_fv_bp.simps alpha_gen.simps)
   137   apply(simp_all add: alpha_gen.simps)
   138   done
   138   done
   139 
   139 
   140 lemma [quot_respect]:
   140 lemma [quot_respect]:
   141  "(op = ===> alpha_rtrm1) rVr1 rVr1"
   141  "(op = ===> alpha_rtrm1) rVr1 rVr1"
   142  "(alpha_rtrm1 ===> alpha_rtrm1 ===> alpha_rtrm1) rAp1 rAp1"
   142  "(alpha_rtrm1 ===> alpha_rtrm1 ===> alpha_rtrm1) rAp1 rAp1"
   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