37 | "rfv_trm1 (rLt1 bp t1 t2) = (rfv_trm1 t1) \<union> (rfv_trm1 t2 - bv1 bp)"  | 
    37 | "rfv_trm1 (rLt1 bp t1 t2) = (rfv_trm1 t1) \<union> (rfv_trm1 t2 - bv1 bp)"  | 
    38 | "rfv_bp (BUnit) = {}" | 
    38 | "rfv_bp (BUnit) = {}" | 
    39 | "rfv_bp (BVr x) = {atom x}" | 
    39 | "rfv_bp (BVr x) = {atom x}" | 
    40 | "rfv_bp (BPr b1 b2) = (rfv_bp b1) \<union> (rfv_bp b2)"  | 
    40 | "rfv_bp (BPr b1 b2) = (rfv_bp b1) \<union> (rfv_bp b2)"  | 
    41   | 
    41   | 
    42 (* needs to be stated by the package *)  | 
    42 setup {* snd o define_raw_perms ["rtrm1", "bp"] ["Terms.rtrm1", "Terms.bp"] *} | 
    43 instantiation   | 
         | 
    44   rtrm1 and bp :: pt  | 
         | 
    45 begin  | 
         | 
    46   | 
         | 
    47 primrec  | 
         | 
    48   permute_rtrm1 and permute_bp  | 
         | 
    49 where  | 
         | 
    50   "permute_rtrm1 pi (rVr1 a) = rVr1 (pi \<bullet> a)"  | 
         | 
    51 | "permute_rtrm1 pi (rAp1 t1 t2) = rAp1 (permute_rtrm1 pi t1) (permute_rtrm1 pi t2)"  | 
         | 
    52 | "permute_rtrm1 pi (rLm1 a t) = rLm1 (pi \<bullet> a) (permute_rtrm1 pi t)"  | 
         | 
    53 | "permute_rtrm1 pi (rLt1 bp t1 t2) = rLt1 (permute_bp pi bp) (permute_rtrm1 pi t1) (permute_rtrm1 pi t2)"  | 
         | 
    54 | "permute_bp pi (BUnit) = BUnit"  | 
         | 
    55 | "permute_bp pi (BVr a) = BVr (pi \<bullet> a)"  | 
         | 
    56 | "permute_bp pi (BPr bp1 bp2) = BPr (permute_bp pi bp1) (permute_bp pi bp2)"  | 
         | 
    57   | 
         | 
    58 lemma pt_rtrm1_bp_zero:  | 
         | 
    59   fixes t::rtrm1  | 
         | 
    60   and   b::bp  | 
         | 
    61   shows "0 \<bullet> t = t"  | 
         | 
    62   and   "0 \<bullet> b = b"  | 
         | 
    63 apply(induct t and b rule: rtrm1_bp.inducts)  | 
         | 
    64 apply(simp_all)  | 
         | 
    65 done  | 
         | 
    66   | 
         | 
    67 lemma pt_rtrm1_bp_plus:  | 
         | 
    68   fixes t::rtrm1  | 
         | 
    69   and   b::bp  | 
         | 
    70   shows "((p + q) \<bullet> t) = p \<bullet> (q \<bullet> t)"  | 
         | 
    71   and   "((p + q) \<bullet> b) = p \<bullet> (q \<bullet> b)"  | 
         | 
    72 apply(induct t and b rule: rtrm1_bp.inducts)  | 
         | 
    73 apply(simp_all)  | 
         | 
    74 done  | 
         | 
    75   | 
         | 
    76 instance  | 
         | 
    77 apply default  | 
         | 
    78 apply(simp_all add: pt_rtrm1_bp_zero pt_rtrm1_bp_plus)  | 
         | 
    79 done  | 
         | 
    80   | 
         | 
    81 end  | 
         | 
    82   | 
    43   | 
    83 inductive  | 
    44 inductive  | 
    84   alpha1 :: "rtrm1 \<Rightarrow> rtrm1 \<Rightarrow> bool" ("_ \<approx>1 _" [100, 100] 100) | 
    45   alpha1 :: "rtrm1 \<Rightarrow> rtrm1 \<Rightarrow> bool" ("_ \<approx>1 _" [100, 100] 100) | 
    85 where  | 
    46 where  | 
    86   a1: "a = b \<Longrightarrow> (rVr1 a) \<approx>1 (rVr1 b)"  | 
    47   a1: "a = b \<Longrightarrow> (rVr1 a) \<approx>1 (rVr1 b)"  | 
   338 | "fv_rtrm2 (rAp2 t1 t2) = (fv_rtrm2 t1) \<union> (fv_rtrm2 t2)"  | 
   299 | "fv_rtrm2 (rAp2 t1 t2) = (fv_rtrm2 t1) \<union> (fv_rtrm2 t2)"  | 
   339 | "fv_rtrm2 (rLm2 x t) = (fv_rtrm2 t) - {atom x}" | 
   300 | "fv_rtrm2 (rLm2 x t) = (fv_rtrm2 t) - {atom x}" | 
   340 | "fv_rtrm2 (rLt2 as t) = (fv_rtrm2 t - rbv2 as) \<union> (fv_rassign as)"  | 
   301 | "fv_rtrm2 (rLt2 as t) = (fv_rtrm2 t - rbv2 as) \<union> (fv_rassign as)"  | 
   341 | "fv_rassign (rAs x t) = fv_rtrm2 t"  | 
   302 | "fv_rassign (rAs x t) = fv_rtrm2 t"  | 
   342   | 
   303   | 
   343 (* needs to be stated by the package *)  | 
   304 setup {* snd o define_raw_perms ["rtrm2", "rassign"] ["Terms.rtrm2", "Terms.rassign"] *} | 
   344 instantiation  | 
         | 
   345   rtrm2 and rassign :: pt  | 
         | 
   346 begin  | 
         | 
   347   | 
         | 
   348 primrec  | 
         | 
   349   permute_rtrm2 and permute_rassign  | 
         | 
   350 where  | 
         | 
   351   "permute_rtrm2 pi (rVr2 a) = rVr2 (pi \<bullet> a)"  | 
         | 
   352 | "permute_rtrm2 pi (rAp2 t1 t2) = rAp2 (permute_rtrm2 pi t1) (permute_rtrm2 pi t2)"  | 
         | 
   353 | "permute_rtrm2 pi (rLm2 a t) = rLm2 (pi \<bullet> a) (permute_rtrm2 pi t)"  | 
         | 
   354 | "permute_rtrm2 pi (rLt2 as t) = rLt2 (permute_rassign pi as) (permute_rtrm2 pi t)"  | 
         | 
   355 | "permute_rassign pi (rAs a t) = rAs (pi \<bullet> a) (permute_rtrm2 pi t)"  | 
         | 
   356   | 
         | 
   357 lemma pt_rtrm2_rassign_zero:  | 
         | 
   358   fixes t::rtrm2  | 
         | 
   359   and   b::rassign  | 
         | 
   360   shows "0 \<bullet> t = t"  | 
         | 
   361   and   "0 \<bullet> b = b"  | 
         | 
   362 apply(induct t and b rule: rtrm2_rassign.inducts)  | 
         | 
   363 apply(simp_all)  | 
         | 
   364 done  | 
         | 
   365   | 
         | 
   366 lemma pt_rtrm2_rassign_plus:  | 
         | 
   367   fixes t::rtrm2  | 
         | 
   368   and   b::rassign  | 
         | 
   369   shows "((p + q) \<bullet> t) = p \<bullet> (q \<bullet> t)"  | 
         | 
   370   and   "((p + q) \<bullet> b) = p \<bullet> (q \<bullet> b)"  | 
         | 
   371 apply(induct t and b rule: rtrm2_rassign.inducts)  | 
         | 
   372 apply(simp_all)  | 
         | 
   373 done  | 
         | 
   374   | 
         | 
   375 instance  | 
         | 
   376 apply default  | 
         | 
   377 apply(simp_all add: pt_rtrm2_rassign_zero pt_rtrm2_rassign_plus)  | 
         | 
   378 done  | 
         | 
   379   | 
         | 
   380   | 
         | 
   381 end  | 
         | 
   382   | 
   305   | 
   383 inductive  | 
   306 inductive  | 
   384   alpha2 :: "rtrm2 \<Rightarrow> rtrm2 \<Rightarrow> bool" ("_ \<approx>2 _" [100, 100] 100) | 
   307   alpha2 :: "rtrm2 \<Rightarrow> rtrm2 \<Rightarrow> bool" ("_ \<approx>2 _" [100, 100] 100) | 
   385 and  | 
   308 and  | 
   386   alpha2a :: "rassign \<Rightarrow> rassign \<Rightarrow> bool" ("_ \<approx>2a _" [100, 100] 100) | 
   309   alpha2a :: "rassign \<Rightarrow> rassign \<Rightarrow> bool" ("_ \<approx>2a _" [100, 100] 100) | 
   432 | "fv_trm3 (Lm3 x t) = (fv_trm3 t) - {atom x}" | 
   355 | "fv_trm3 (Lm3 x t) = (fv_trm3 t) - {atom x}" | 
   433 | "fv_trm3 (Lt3 as t) = (fv_trm3 t - bv3 as) \<union> (fv_assigns as)"  | 
   356 | "fv_trm3 (Lt3 as t) = (fv_trm3 t - bv3 as) \<union> (fv_assigns as)"  | 
   434 | "fv_assigns (ANil) = {}" | 
   357 | "fv_assigns (ANil) = {}" | 
   435 | "fv_assigns (ACons x t as) = (fv_trm3 t) \<union> (fv_assigns as)"  | 
   358 | "fv_assigns (ACons x t as) = (fv_trm3 t) \<union> (fv_assigns as)"  | 
   436   | 
   359   | 
   437 (* needs to be stated by the package *)  | 
   360 setup {* snd o define_raw_perms ["rtrm3", "assigns"] ["Terms.trm3", "Terms.assigns"] *} | 
   438 instantiation  | 
         | 
   439  trm3 and assigns :: pt  | 
         | 
   440 begin  | 
         | 
   441   | 
         | 
   442 primrec  | 
         | 
   443   permute_trm3 and permute_assigns  | 
         | 
   444 where  | 
         | 
   445   "permute_trm3 pi (Vr3 a) = Vr3 (pi \<bullet> a)"  | 
         | 
   446 | "permute_trm3 pi (Ap3 t1 t2) = Ap3 (permute_trm3 pi t1) (permute_trm3 pi t2)"  | 
         | 
   447 | "permute_trm3 pi (Lm3 a t) = Lm3 (pi \<bullet> a) (permute_trm3 pi t)"  | 
         | 
   448 | "permute_trm3 pi (Lt3 as t) = Lt3 (permute_assigns pi as) (permute_trm3 pi t)"  | 
         | 
   449 | "permute_assigns pi (ANil) = ANil"  | 
         | 
   450 | "permute_assigns pi (ACons a t as) = ACons (pi \<bullet> a) (permute_trm3 pi t) (permute_assigns pi as)"  | 
         | 
   451   | 
         | 
   452 lemma pt_trm3_assigns_zero:  | 
         | 
   453   fixes t::trm3  | 
         | 
   454   and   b::assigns  | 
         | 
   455   shows "0 \<bullet> t = t"  | 
         | 
   456   and   "0 \<bullet> b = b"  | 
         | 
   457 apply(induct t and b rule: trm3_assigns.inducts)  | 
         | 
   458 apply(simp_all)  | 
         | 
   459 done  | 
         | 
   460   | 
         | 
   461 lemma pt_trm3_assigns_plus:  | 
         | 
   462   fixes t::trm3  | 
         | 
   463   and   b::assigns  | 
         | 
   464   shows "((p + q) \<bullet> t) = p \<bullet> (q \<bullet> t)"  | 
         | 
   465   and   "((p + q) \<bullet> b) = p \<bullet> (q \<bullet> b)"  | 
         | 
   466 apply(induct t and b rule: trm3_assigns.inducts)  | 
         | 
   467 apply(simp_all)  | 
         | 
   468 done  | 
         | 
   469   | 
         | 
   470 instance  | 
         | 
   471 apply default  | 
         | 
   472 apply(simp_all add: pt_trm3_assigns_zero pt_trm3_assigns_plus)  | 
         | 
   473 done  | 
         | 
   474   | 
         | 
   475   | 
         | 
   476 end  | 
         | 
   477   | 
   361   | 
   478 inductive  | 
   362 inductive  | 
   479   alpha3 :: "trm3 \<Rightarrow> trm3 \<Rightarrow> bool" ("_ \<approx>3 _" [100, 100] 100) | 
   363   alpha3 :: "trm3 \<Rightarrow> trm3 \<Rightarrow> bool" ("_ \<approx>3 _" [100, 100] 100) | 
   480 and  | 
   364 and  | 
   481   alpha3a :: "assigns \<Rightarrow> assigns \<Rightarrow> bool" ("_ \<approx>3a _" [100, 100] 100) | 
   365   alpha3a :: "assigns \<Rightarrow> assigns \<Rightarrow> bool" ("_ \<approx>3a _" [100, 100] 100) | 
   517 | "fv_trm4 (Ap4 t ts) = (fv_trm4 t) \<union> (fv_trm4_list ts)"  | 
   401 | "fv_trm4 (Ap4 t ts) = (fv_trm4 t) \<union> (fv_trm4_list ts)"  | 
   518 | "fv_trm4 (Lm4 x t) = (fv_trm4 t) - {atom x}" | 
   402 | "fv_trm4 (Lm4 x t) = (fv_trm4 t) - {atom x}" | 
   519 | "fv_trm4_list ([]) = {}" | 
   403 | "fv_trm4_list ([]) = {}" | 
   520 | "fv_trm4_list (t#ts) = (fv_trm4 t) \<union> (fv_trm4_list ts)"  | 
   404 | "fv_trm4_list (t#ts) = (fv_trm4 t) \<union> (fv_trm4_list ts)"  | 
   521   | 
   405   | 
   522   | 
   406 (* there cannot be a clause for lists, as *)  | 
   523 (* needs to be stated by the package *)  | 
         | 
   524 (* there cannot be a clause for lists, as *)   | 
         | 
   525 (* permutations are  already defined in Nominal (also functions, options, and so on) *)  | 
   407 (* permutations are  already defined in Nominal (also functions, options, and so on) *)  | 
   526 instantiation  | 
   408 setup {* snd o define_raw_perms ["trm4"] ["Terms.trm4"] *} | 
   527   trm4 :: pt  | 
         | 
   528 begin  | 
         | 
   529   | 
         | 
   530 (* does not work yet *)  | 
         | 
   531 primrec  | 
         | 
   532   permute_trm4  and permute_trm4_list  | 
         | 
   533 where  | 
         | 
   534   "permute_trm4 pi (Vr4 a) = Vr4 (pi \<bullet> a)"  | 
         | 
   535 | "permute_trm4 pi (Ap4 t ts) = Ap4 (permute_trm4 pi t) (permute_trm4_list pi ts)"  | 
         | 
   536 | "permute_trm4 pi (Lm4 a t) = Lm4 (pi \<bullet> a) (permute_trm4 pi t)"  | 
         | 
   537 | "permute_trm4_list pi ([]) = []"  | 
         | 
   538 | "permute_trm4_list pi (t#ts) = (permute_trm4 pi t) # (permute_trm4_list pi ts)"  | 
         | 
   539   | 
         | 
   540 lemma pt_trm4_list_zero:  | 
         | 
   541   fixes t::trm4  | 
         | 
   542   and   ts::"trm4 list"  | 
         | 
   543   shows "0 \<bullet> t = t"  | 
         | 
   544   and   "permute_trm4_list 0 ts = ts"  | 
         | 
   545 apply(induct t and ts rule: trm4.inducts)  | 
         | 
   546 apply(simp_all)  | 
         | 
   547 done  | 
         | 
   548   | 
         | 
   549 lemma pt_trm4_list_plus:  | 
         | 
   550   fixes t::trm4  | 
         | 
   551   and   ts::"trm4 list"  | 
         | 
   552   shows "((p + q) \<bullet> t) = p \<bullet> (q \<bullet> t)"  | 
         | 
   553   and   "(permute_trm4_list (p + q) ts) = permute_trm4_list p (permute_trm4_list q ts)"  | 
         | 
   554 apply(induct t and ts rule: trm4.inducts)  | 
         | 
   555 apply(simp_all)  | 
         | 
   556 done  | 
         | 
   557   | 
         | 
   558   | 
         | 
   559 instance  | 
         | 
   560 apply(default)  | 
         | 
   561 apply(simp_all add: pt_trm4_list_zero pt_trm4_list_plus)  | 
         | 
   562 done  | 
         | 
   563   | 
         | 
   564 end  | 
         | 
   565   | 
   409   | 
   566 (* "repairing" of the permute function *)  | 
   410 (* "repairing" of the permute function *)  | 
   567 lemma repaired:  | 
   411 lemma repaired:  | 
   568   fixes ts::"trm4 list"  | 
   412   fixes ts::"trm4 list"  | 
   569   shows "permute_trm4_list p ts = p \<bullet> ts"  | 
   413   shows "permute_trm4_list p ts = p \<bullet> ts"  | 
   614 | "rfv_trm5 (rAp5 t s) = (rfv_trm5 t) \<union> (rfv_trm5 s)"  | 
   458 | "rfv_trm5 (rAp5 t s) = (rfv_trm5 t) \<union> (rfv_trm5 s)"  | 
   615 | "rfv_trm5 (rLt5 lts t) = (rfv_trm5 t - rbv5 lts) \<union> (rfv_lts lts - rbv5 lts)"  | 
   459 | "rfv_trm5 (rLt5 lts t) = (rfv_trm5 t - rbv5 lts) \<union> (rfv_lts lts - rbv5 lts)"  | 
   616 | "rfv_lts (rLnil) = {}" | 
   460 | "rfv_lts (rLnil) = {}" | 
   617 | "rfv_lts (rLcons n t ltl) = (rfv_trm5 t) \<union> (rfv_lts ltl)"  | 
   461 | "rfv_lts (rLcons n t ltl) = (rfv_trm5 t) \<union> (rfv_lts ltl)"  | 
   618   | 
   462   | 
   619 instantiation  | 
   463 setup {* snd o define_raw_perms ["rtrm5", "rlts"] ["Terms.rtrm5", "Terms.rlts"] *} | 
   620   rtrm5 and rlts :: pt  | 
   464 print_theorems  | 
   621 begin  | 
         | 
   622   | 
         | 
   623 primrec  | 
         | 
   624   permute_rtrm5 and permute_rlts  | 
         | 
   625 where  | 
         | 
   626   "permute_rtrm5 pi (rVr5 a) = rVr5 (pi \<bullet> a)"  | 
         | 
   627 | "permute_rtrm5 pi (rAp5 t1 t2) = rAp5 (permute_rtrm5 pi t1) (permute_rtrm5 pi t2)"  | 
         | 
   628 | "permute_rtrm5 pi (rLt5 ls t) = rLt5 (permute_rlts pi ls) (permute_rtrm5 pi t)"  | 
         | 
   629 | "permute_rlts pi (rLnil) = rLnil"  | 
         | 
   630 | "permute_rlts pi (rLcons n t ls) = rLcons (pi \<bullet> n) (permute_rtrm5 pi t) (permute_rlts pi ls)"  | 
         | 
   631   | 
         | 
   632 lemma pt_rtrm5_zero:  | 
         | 
   633   fixes t::rtrm5  | 
         | 
   634   and   l::rlts  | 
         | 
   635   shows "0 \<bullet> t = t"  | 
         | 
   636   and   "0 \<bullet> l = l"  | 
         | 
   637 apply(induct t and l rule: rtrm5_rlts.inducts)  | 
         | 
   638 apply(simp_all)  | 
         | 
   639 done  | 
         | 
   640   | 
         | 
   641 lemma pt_rtrm5_plus:  | 
         | 
   642   fixes t::rtrm5  | 
         | 
   643   and   l::rlts  | 
         | 
   644   shows "((p + q) \<bullet> t) = p \<bullet> (q \<bullet> t)"  | 
         | 
   645   and   "((p + q) \<bullet> l) = p \<bullet> (q \<bullet> l)"  | 
         | 
   646 apply(induct t and l rule: rtrm5_rlts.inducts)  | 
         | 
   647 apply(simp_all)  | 
         | 
   648 done  | 
         | 
   649   | 
         | 
   650 instance  | 
         | 
   651 apply default  | 
         | 
   652 apply(simp_all add: pt_rtrm5_zero pt_rtrm5_plus)  | 
         | 
   653 done  | 
         | 
   654   | 
         | 
   655 end  | 
         | 
   656   | 
   465   | 
   657 inductive  | 
   466 inductive  | 
   658   alpha5 :: "rtrm5 \<Rightarrow> rtrm5 \<Rightarrow> bool" ("_ \<approx>5 _" [100, 100] 100) | 
   467   alpha5 :: "rtrm5 \<Rightarrow> rtrm5 \<Rightarrow> bool" ("_ \<approx>5 _" [100, 100] 100) | 
   659 and  | 
   468 and  | 
   660   alphalts :: "rlts \<Rightarrow> rlts \<Rightarrow> bool" ("_ \<approx>l _" [100, 100] 100) | 
   469   alphalts :: "rlts \<Rightarrow> rlts \<Rightarrow> bool" ("_ \<approx>l _" [100, 100] 100) | 
   944 where  | 
   753 where  | 
   945   "rfv_trm6 (rVr6 n) = {atom n}" | 
   754   "rfv_trm6 (rVr6 n) = {atom n}" | 
   946 | "rfv_trm6 (rLm6 n t) = (rfv_trm6 t) - {atom n}" | 
   755 | "rfv_trm6 (rLm6 n t) = (rfv_trm6 t) - {atom n}" | 
   947 | "rfv_trm6 (rLt6 l r) = (rfv_trm6 r - rbv6 l) \<union> rfv_trm6 l"  | 
   756 | "rfv_trm6 (rLt6 l r) = (rfv_trm6 r - rbv6 l) \<union> rfv_trm6 l"  | 
   948   | 
   757   | 
   949 instantiation  | 
   758 setup {* snd o define_raw_perms ["rtrm6"] ["Terms.rtrm6"] *} | 
   950   rtrm6 :: pt  | 
   759 print_theorems  | 
   951 begin  | 
         | 
   952   | 
         | 
   953 primrec  | 
         | 
   954   permute_rtrm6  | 
         | 
   955 where  | 
         | 
   956   "permute_rtrm6 pi (rVr6 a) = rVr6 (pi \<bullet> a)"  | 
         | 
   957 | "permute_rtrm6 pi (rLm6 n t) = rLm6 (pi \<bullet> n) (permute_rtrm6 pi t)"  | 
         | 
   958 | "permute_rtrm6 pi (rLt6 l r) = rLt6 (permute_rtrm6 pi l) (permute_rtrm6 pi r)"  | 
         | 
   959   | 
         | 
   960 lemma pt_rtrm6_zero:  | 
         | 
   961   fixes t::rtrm6  | 
         | 
   962   shows "0 \<bullet> t = t"  | 
         | 
   963 apply(induct t)  | 
         | 
   964 apply(simp_all)  | 
         | 
   965 done  | 
         | 
   966   | 
         | 
   967 lemma pt_rtrm6_plus:  | 
         | 
   968   fixes t::rtrm6  | 
         | 
   969   shows "((p + q) \<bullet> t) = p \<bullet> (q \<bullet> t)"  | 
         | 
   970 apply(induct t)  | 
         | 
   971 apply(simp_all)  | 
         | 
   972 done  | 
         | 
   973   | 
         | 
   974 instance  | 
         | 
   975 apply default  | 
         | 
   976 apply(simp_all add: pt_rtrm6_zero pt_rtrm6_plus)  | 
         | 
   977 done  | 
         | 
   978   | 
         | 
   979 end  | 
         | 
   980   | 
   760   | 
   981 inductive  | 
   761 inductive  | 
   982   alpha6 :: "rtrm6 \<Rightarrow> rtrm6 \<Rightarrow> bool" ("_ \<approx>6 _" [100, 100] 100) | 
   762   alpha6 :: "rtrm6 \<Rightarrow> rtrm6 \<Rightarrow> bool" ("_ \<approx>6 _" [100, 100] 100) | 
   983 where  | 
   763 where  | 
   984   a1: "a = b \<Longrightarrow> (rVr6 a) \<approx>6 (rVr6 b)"  | 
   764   a1: "a = b \<Longrightarrow> (rVr6 a) \<approx>6 (rVr6 b)"  | 
  1132 where  | 
   912 where  | 
  1133   "rfv_trm7 (rVr7 n) = {atom n}" | 
   913   "rfv_trm7 (rVr7 n) = {atom n}" | 
  1134 | "rfv_trm7 (rLm7 n t) = (rfv_trm7 t) - {atom n}" | 
   914 | "rfv_trm7 (rLm7 n t) = (rfv_trm7 t) - {atom n}" | 
  1135 | "rfv_trm7 (rLt7 l r) = (rfv_trm7 l) \<union> (rfv_trm7 r - rbv7 l)"  | 
   915 | "rfv_trm7 (rLt7 l r) = (rfv_trm7 l) \<union> (rfv_trm7 r - rbv7 l)"  | 
  1136   | 
   916   | 
  1137 instantiation  | 
   917 setup {* snd o define_raw_perms ["rtrm7"] ["Terms.rtrm7"] *} | 
  1138   rtrm7 :: pt  | 
   918 print_theorems  | 
  1139 begin  | 
         | 
  1140   | 
         | 
  1141 primrec  | 
         | 
  1142   permute_rtrm7  | 
         | 
  1143 where  | 
         | 
  1144   "permute_rtrm7 pi (rVr7 a) = rVr7 (pi \<bullet> a)"  | 
         | 
  1145 | "permute_rtrm7 pi (rLm7 a t) = rLm7 (pi \<bullet> a) (permute_rtrm7 pi t)"  | 
         | 
  1146 | "permute_rtrm7 pi (rLt7 t1 t2) = rLt7 (permute_rtrm7 pi t1) (permute_rtrm7 pi t2)"  | 
         | 
  1147   | 
         | 
  1148 lemma pt_rtrm7_zero:  | 
         | 
  1149   fixes t::rtrm7  | 
         | 
  1150   shows "0 \<bullet> t = t"  | 
         | 
  1151 apply(induct t)  | 
         | 
  1152 apply(simp_all)  | 
         | 
  1153 done  | 
         | 
  1154   | 
         | 
  1155 lemma pt_rtrm7_plus:  | 
         | 
  1156   fixes t::rtrm7  | 
         | 
  1157   shows "((p + q) \<bullet> t) = p \<bullet> (q \<bullet> t)"  | 
         | 
  1158 apply(induct t)  | 
         | 
  1159 apply(simp_all)  | 
         | 
  1160 done  | 
         | 
  1161   | 
         | 
  1162 instance  | 
         | 
  1163 apply default  | 
         | 
  1164 apply(simp_all add: pt_rtrm7_zero pt_rtrm7_plus)  | 
         | 
  1165 done  | 
         | 
  1166   | 
         | 
  1167 end  | 
         | 
  1168   | 
   919   | 
  1169 inductive  | 
   920 inductive  | 
  1170   alpha7 :: "rtrm7 \<Rightarrow> rtrm7 \<Rightarrow> bool" ("_ \<approx>7 _" [100, 100] 100) | 
   921   alpha7 :: "rtrm7 \<Rightarrow> rtrm7 \<Rightarrow> bool" ("_ \<approx>7 _" [100, 100] 100) | 
  1171 where  | 
   922 where  | 
  1172   a1: "a = b \<Longrightarrow> (rVr7 a) \<approx>7 (rVr7 b)"  | 
   923   a1: "a = b \<Longrightarrow> (rVr7 a) \<approx>7 (rVr7 b)"  | 
  1214 | "rfv_foo8 (Foo1 b t) = (rfv_foo8 t - rbv8 b) \<union> (rfv_bar8 b)"  | 
   965 | "rfv_foo8 (Foo1 b t) = (rfv_foo8 t - rbv8 b) \<union> (rfv_bar8 b)"  | 
  1215 | "rfv_bar8 (Bar0 x) = {atom x}" | 
   966 | "rfv_bar8 (Bar0 x) = {atom x}" | 
  1216 | "rfv_bar8 (Bar1 v x t) = {atom v} \<union> (rfv_bar8 t - {atom x})" | 
   967 | "rfv_bar8 (Bar1 v x t) = {atom v} \<union> (rfv_bar8 t - {atom x})" | 
  1217 print_theorems  | 
   968 print_theorems  | 
  1218   | 
   969   | 
  1219 instantiation  | 
   970 setup {* snd o define_raw_perms ["rfoo8", "rbar8"] ["Terms.rfoo8", "Terms.rbar8"] *} | 
  1220   rfoo8 and rbar8 :: pt  | 
   971 print_theorems  | 
  1221 begin  | 
         | 
  1222   | 
         | 
  1223 primrec  | 
         | 
  1224   permute_rfoo8 and permute_rbar8  | 
         | 
  1225 where  | 
         | 
  1226   "permute_rfoo8 pi (Foo0 a) = Foo0 (pi \<bullet> a)"  | 
         | 
  1227 | "permute_rfoo8 pi (Foo1 b t) = Foo1 (permute_rbar8 pi b) (permute_rfoo8 pi t)"  | 
         | 
  1228 | "permute_rbar8 pi (Bar0 a) = Bar0 (pi \<bullet> a)"  | 
         | 
  1229 | "permute_rbar8 pi (Bar1 v x t) = Bar1 (pi \<bullet> v) (pi \<bullet> x) (permute_rbar8 pi t)"  | 
         | 
  1230   | 
         | 
  1231 instance sorry  | 
         | 
  1232   | 
         | 
  1233 end  | 
         | 
  1234   | 
   972   | 
  1235 inductive  | 
   973 inductive  | 
  1236   alpha8f :: "rfoo8 \<Rightarrow> rfoo8 \<Rightarrow> bool" ("_ \<approx>f _" [100, 100] 100) | 
   974   alpha8f :: "rfoo8 \<Rightarrow> rfoo8 \<Rightarrow> bool" ("_ \<approx>f _" [100, 100] 100) | 
  1237 and  | 
   975 and  | 
  1238   alpha8b :: "rbar8 \<Rightarrow> rbar8 \<Rightarrow> bool" ("_ \<approx>b _" [100, 100] 100) | 
   976   alpha8b :: "rbar8 \<Rightarrow> rbar8 \<Rightarrow> bool" ("_ \<approx>b _" [100, 100] 100) | 
  1284 where  | 
  1022 where  | 
  1285   "rfv_lam9 (Var9 x) = {atom x}" | 
  1023   "rfv_lam9 (Var9 x) = {atom x}" | 
  1286 | "rfv_lam9 (Lam9 b t) = (rfv_lam9 t - {atom b})" | 
  1024 | "rfv_lam9 (Lam9 b t) = (rfv_lam9 t - {atom b})" | 
  1287 | "rfv_bla9 (Bla9 l r) = (rfv_lam9 r - rbv9 l) \<union> rfv_lam9 l"  | 
  1025 | "rfv_bla9 (Bla9 l r) = (rfv_lam9 r - rbv9 l) \<union> rfv_lam9 l"  | 
  1288   | 
  1026   | 
  1289 instantiation  | 
  1027 setup {* snd o define_raw_perms ["rlam9", "rbla9"] ["Terms.rlam9", "Terms.rbla9"] *} | 
  1290   rlam9 and rbla9 :: pt  | 
  1028 print_theorems  | 
  1291 begin  | 
         | 
  1292   | 
         | 
  1293 primrec  | 
         | 
  1294   permute_rlam9 and permute_rbla9  | 
         | 
  1295 where  | 
         | 
  1296   "permute_rlam9 pi (Var9 a) = Var9 (pi \<bullet> a)"  | 
         | 
  1297 | "permute_rlam9 pi (Lam9 b t) = Lam9 (pi \<bullet> b) (permute_rlam9 pi t)"  | 
         | 
  1298 | "permute_rbla9 pi (Bla9 l r) = Bla9 (permute_rlam9 pi l) (permute_rlam9 pi r)"  | 
         | 
  1299   | 
         | 
  1300 instance sorry  | 
         | 
  1301   | 
         | 
  1302 end  | 
         | 
  1303   | 
  1029   | 
  1304 inductive  | 
  1030 inductive  | 
  1305   alpha9l :: "rlam9 \<Rightarrow> rlam9 \<Rightarrow> bool" ("_ \<approx>9l _" [100, 100] 100) | 
  1031   alpha9l :: "rlam9 \<Rightarrow> rlam9 \<Rightarrow> bool" ("_ \<approx>9l _" [100, 100] 100) | 
  1306 and  | 
  1032 and  | 
  1307   alpha9b :: "rbla9 \<Rightarrow> rbla9 \<Rightarrow> bool" ("_ \<approx>9b _" [100, 100] 100) | 
  1033   alpha9b :: "rbla9 \<Rightarrow> rbla9 \<Rightarrow> bool" ("_ \<approx>9b _" [100, 100] 100) | 
  1378 text {* type schemes *}  | 
  1104 text {* type schemes *}  | 
  1379 datatype ty =   | 
  1105 datatype ty =   | 
  1380   Var "name"   | 
  1106   Var "name"   | 
  1381 | Fun "ty" "ty"  | 
  1107 | Fun "ty" "ty"  | 
  1382   | 
  1108   | 
  1383 instantiation  | 
  1109 setup {* snd o define_raw_perms ["ty"] ["Terms.ty"] *} | 
  1384   ty :: pt  | 
  1110 print_theorems  | 
  1385 begin  | 
         | 
  1386   | 
         | 
  1387 primrec  | 
         | 
  1388   permute_ty   | 
         | 
  1389 where  | 
         | 
  1390   "permute_ty pi (Var a) = Var (pi \<bullet> a)"  | 
         | 
  1391 | "permute_ty pi (Fun T1 T2) = Fun (permute_ty pi T1) (permute_ty pi T2)"  | 
         | 
  1392   | 
         | 
  1393 lemma pt_ty_zero:  | 
         | 
  1394   fixes T::ty  | 
         | 
  1395   shows "0 \<bullet> T = T"  | 
         | 
  1396 apply(induct T rule: ty.inducts)  | 
         | 
  1397 apply(simp_all)  | 
         | 
  1398 done  | 
         | 
  1399   | 
         | 
  1400 lemma pt_ty_plus:  | 
         | 
  1401   fixes T::ty  | 
         | 
  1402   shows "((p + q) \<bullet> T) = p \<bullet> (q \<bullet> T)"  | 
         | 
  1403 apply(induct T rule: ty.inducts)  | 
         | 
  1404 apply(simp_all)  | 
         | 
  1405 done  | 
         | 
  1406   | 
         | 
  1407 instance  | 
         | 
  1408 apply default  | 
         | 
  1409 apply(simp_all add: pt_ty_zero pt_ty_plus)  | 
         | 
  1410 done  | 
         | 
  1411   | 
         | 
  1412 end  | 
         | 
  1413   | 
  1111   | 
  1414 datatype tyS =   | 
  1112 datatype tyS =   | 
  1415   All "name set" "ty"   | 
  1113   All "name set" "ty"   | 
  1416   | 
  1114   | 
  1417 instantiation  | 
  1115 setup {* snd o define_raw_perms ["tyS"] ["Terms.tyS"] *} | 
  1418   tyS :: pt  | 
  1116 print_theorems  | 
  1419 begin  | 
         | 
  1420   | 
         | 
  1421 primrec  | 
         | 
  1422   permute_tyS   | 
         | 
  1423 where  | 
         | 
  1424   "permute_tyS pi (All xs T) = All (pi \<bullet> xs) (pi \<bullet> T)"  | 
         | 
  1425   | 
         | 
  1426 lemma pt_tyS_zero:  | 
         | 
  1427   fixes T::tyS  | 
         | 
  1428   shows "0 \<bullet> T = T"  | 
         | 
  1429 apply(induct T rule: tyS.inducts)  | 
         | 
  1430 apply(simp_all)  | 
         | 
  1431 done  | 
         | 
  1432   | 
         | 
  1433 lemma pt_tyS_plus:  | 
         | 
  1434   fixes T::tyS  | 
         | 
  1435   shows "((p + q) \<bullet> T) = p \<bullet> (q \<bullet> T)"  | 
         | 
  1436 apply(induct T rule: tyS.inducts)  | 
         | 
  1437 apply(simp_all)  | 
         | 
  1438 done  | 
         | 
  1439   | 
         | 
  1440 instance  | 
         | 
  1441 apply default  | 
         | 
  1442 apply(simp_all add: pt_tyS_zero pt_tyS_plus)  | 
         | 
  1443 done  | 
         | 
  1444   | 
         | 
  1445 end  | 
         | 
  1446   | 
         | 
  1447   | 
  1117   | 
  1448 abbreviation  | 
  1118 abbreviation  | 
  1449   "atoms xs \<equiv> {atom x| x. x \<in> xs}" | 
  1119   "atoms xs \<equiv> {atom x| x. x \<in> xs}" | 
  1450   | 
  1120   | 
  1451 primrec  | 
  1121 primrec  |