|    103   val qtys = [@{typ tkind}, @{typ ckind}, @{typ ty}, @{typ ty_lst}, @{typ co}, |    103   val qtys = [@{typ tkind}, @{typ ckind}, @{typ ty}, @{typ ty_lst}, @{typ co}, | 
|    104               @{typ co_lst}, @{typ trm}, @{typ assoc_lst}, @{typ pat}, @{typ vars}, |    104               @{typ co_lst}, @{typ trm}, @{typ assoc_lst}, @{typ pat}, @{typ vars}, | 
|    105               @{typ tvars}, @{typ cvars}] |    105               @{typ tvars}, @{typ cvars}] | 
|    106 *} |    106 *} | 
|    107  |    107  | 
|    108 ML {* |    108  | 
|    109 fun lifted ctxt qtys rthm = |    109 ML {* | 
|    110 let |    110   val _ = timeit (fn () => map (lift_thm @{context} qtys []) @{thms distinct}) | 
|    111   (* When the theorem is atomized, eta redexes are contracted, |         | 
|    112      so we do it both in the original theorem *) |         | 
|    113   val rthm' = Drule.eta_contraction_rule rthm |         | 
|    114   val ((_, [rthm'']), ctxt') = Variable.import false [rthm'] ctxt |         | 
|    115   val goal = Quotient_Term.derive_qtrm ctxt' qtys (prop_of rthm'') |         | 
|    116 in |         | 
|    117   Goal.prove ctxt' [] [] goal (K (Quotient_Tacs.lift_tac ctxt' [rthm'] 1)) |         | 
|    118   |> singleton (ProofContext.export ctxt' ctxt) |         | 
|    119 end |         | 
|    120 *} |         | 
|    121  |         | 
|    122 ML {* |         | 
|    123 fun lifted2 ctxt qtys rthms = |         | 
|    124 let |         | 
|    125   (* When the theorem is atomized, eta redexes are contracted, |         | 
|    126      so we do it both in the original theorem *) |         | 
|    127   val rthms' = map Drule.eta_contraction_rule rthms |         | 
|    128   val ((_, rthms''), ctxt') = Variable.import false rthms' ctxt |         | 
|    129   val goals = map (Quotient_Term.derive_qtrm ctxt' qtys o prop_of) rthms'' |         | 
|    130 in |         | 
|    131   Goal.prove_multi ctxt' [] [] goals (K (Quotient_Tacs.lift_tac ctxt' rthms' 1)) |         | 
|    132   |> ProofContext.export ctxt' ctxt |         | 
|    133 end |         | 
|    134 *} |         | 
|    135  |         | 
|    136 ML {* |         | 
|    137   val _ = timeit (fn () => map (lifted @{context} qtys) @{thms distinct}) |         | 
|    138 *} |         | 
|    139  |         | 
|    140 ML {* |         | 
|    141   val _ = timeit (fn () => lifted2 @{context} qtys @{thms distinct}) |         | 
|    142 *} |    111 *} | 
|    143  |    112  | 
|    144  |    113  | 
|    145 ML {*  |    114 ML {*  | 
|    146   val thms_i = map (lift_thm @{context} qtys) @{thms tkind_raw_ckind_raw_ty_raw_ty_lst_raw_co_raw_co_lst_raw_trm_raw_assoc_lst_raw_pat_raw_vars_raw_tvars_raw_cvars_raw.inducts} |    115   val _ = timeit (fn () => map (lift_thm @{context} qtys []) @{thms tkind_raw_ckind_raw_ty_raw_ty_lst_raw_co_raw_co_lst_raw_trm_raw_assoc_lst_raw_pat_raw_vars_raw_tvars_raw_cvars_raw.induct}) | 
|    147 *} |    116 *} | 
|    148  |    117  | 
|    149 ML {* |    118 ML {* | 
|    150   val thms_f = map (lift_thm @{context} qtys) @{thms fv_defs} |    119   val thms_f = map (lift_thm @{context} qtys []) @{thms fv_defs} | 
|    151 *} |    120 *} | 
|    152  |    121  | 
|    153 ML {*  |    122 ML {*  | 
|    154   val thms_i = map (lift_thm @{context} qtys) @{thms tkind_raw_ckind_raw_ty_raw_ty_lst_raw_co_raw_co_lst_raw_trm_raw_assoc_lst_raw_pat_raw_vars_raw_tvars_raw_cvars_raw.size(50 - 98)} |    123   val thms_i = map (lift_thm @{context} qtys []) @{thms tkind_raw_ckind_raw_ty_raw_ty_lst_raw_co_raw_co_lst_raw_trm_raw_assoc_lst_raw_pat_raw_vars_raw_tvars_raw_cvars_raw.size(50 - 98)} | 
|    155 *} |    124 *} | 
|    156  |    125  | 
|    157 ML {* |    126 ML {* | 
|    158   val thms_p = map (lift_thm @{context} qtys) @{thms perm_simps} |    127   val thms_p = map (lift_thm @{context} qtys []) @{thms perm_simps} | 
|    159 *} |    128 *} | 
|    160  |    129  | 
|    161 ML {* |    130 ML {* | 
|    162   val thms_f = map (lift_thm @{context} qtys) @{thms perm_laws} |    131   val thms_f = map (lift_thm @{context} qtys []) @{thms perm_laws} | 
|    163 *} |    132 *} | 
|    164  |    133  | 
|    165 ML {* |    134 ML {* | 
|    166  val thms_e = map (lift_thm @{context} qtys)  |    135   val simps = @{thms alphas permute_prod.simps prod_fv.simps prod_alpha_def prod_rel.simps | 
|    167    @{thms eq_iff[unfolded alphas permute_prod.simps prod_fv.simps prod_alpha_def prod_rel.simps |    136     prod.cases} | 
|    168     prod.cases]} |    137 *} | 
|    169 *} |    138  | 
|    170  |    139 ML {* | 
|    171 ML {* |    140  val thms_e = map (lift_thm @{context} qtys simps) @{thms eq_iff} | 
|    172   val thms_f = map (lift_thm @{context} qtys) @{thms bn_defs} |    141 *} | 
|    173 *} |    142  | 
|    174  |    143 ML {* | 
|    175 ML {* |    144   val thms_f = map (lift_thm @{context} qtys []) @{thms bn_defs} | 
|    176   val thms_f = map (lift_thm @{context} qtys) @{thms bn_eqvt} |    145 *} | 
|    177 *} |    146  | 
|    178  |    147 ML {* | 
|    179 ML {* |    148   val thms_f = map (lift_thm @{context} qtys []) @{thms bn_eqvt} | 
|    180   val thms_f = map (lift_thm @{context} qtys) @{thms fv_eqvt} |    149 *} | 
|    181 *} |    150  | 
|    182  |    151 ML {* | 
|    183 ML {* |    152   val thms_f = map (lift_thm @{context} qtys []) @{thms fv_eqvt} | 
|    184   val thms_f = map (lift_thm @{context} qtys) @{thms size_eqvt} |    153 *} | 
|         |    154  | 
|         |    155 ML {* | 
|         |    156   val thms_f = map (lift_thm @{context} qtys []) @{thms size_eqvt} | 
|    185 *} |    157 *} | 
|    186  |    158  | 
|    187  |    159  | 
|    188  |    160  | 
|    189  |    161  |