1289 i st)) (st,((length params) - 1) downto 0)) |
1289 i st)) (st,((length params) - 1) downto 0)) |
1290 end; |
1290 end; |
1291 |
1291 |
1292 fun extension_typedef name repT alphas thy = |
1292 fun extension_typedef name repT alphas thy = |
1293 let |
1293 let |
1294 val UNIV = HOLogic.mk_UNIV repT; |
1294 fun get_thms thy name = |
1295 |
1295 let |
1296 val ({set_def=SOME def, Abs_induct = abs_induct, |
1296 val SOME { Abs_induct = abs_induct, |
1297 Abs_inject=abs_inject, Abs_inverse = abs_inverse,...}, thy') = |
1297 Abs_inject=abs_inject, Abs_inverse = abs_inverse, ...} = TypedefPackage.get_info thy name; |
1298 thy |
1298 val rewrite_rule = Tactic.rewrite_rule [rec_UNIV_I, rec_True_simp]; |
1299 |> setmp TypedefPackage.quiet_mode true |
1299 in map rewrite_rule [abs_inject, abs_inverse, abs_induct] end; |
1300 (TypedefPackage.add_typedef_i true NONE |
1300 in |
1301 (suffix ext_typeN (Sign.base_name name), alphas, Syntax.NoSyn) UNIV NONE |
1301 thy |
1302 (Tactic.rtac UNIV_witness 1)) |
1302 |> TypecopyPackage.add_typecopy (suffix ext_typeN (Sign.base_name name), alphas) repT NONE |
1303 val rewrite_rule = Tactic.rewrite_rule [def, rec_UNIV_I, rec_True_simp]; |
1303 |-> (fn (name, _) => `(fn thy => get_thms thy name)) |
1304 in (map rewrite_rule [abs_inject, abs_inverse, abs_induct], thy') |
|
1305 end; |
1304 end; |
1306 |
1305 |
1307 fun mixit convs refls = |
1306 fun mixit convs refls = |
1308 let fun f ((res,lhs,rhs),refl) = ((refl,List.revAppend (lhs,refl::tl rhs))::res,hd rhs::lhs,tl rhs); |
1307 let fun f ((res,lhs,rhs),refl) = ((refl,List.revAppend (lhs,refl::tl rhs))::res,hd rhs::lhs,tl rhs); |
1309 in #1 (Library.foldl f (([],[],convs),refls)) end; |
1308 in #1 (Library.foldl f (([],[],convs),refls)) end; |