# HG changeset patch # User haftmann # Date 1276783186 -7200 # Node ID 3bd4b3809bee96b6eeb3feaaea181d1f9a59672a # Parent ad3e04f289b67380f7c8fa3c2fb899ddd15efc98 explicit type variable arguments for constructors diff -r ad3e04f289b6 -r 3bd4b3809bee src/Pure/Isar/code.ML --- a/src/Pure/Isar/code.ML Thu Jun 17 11:33:04 2010 +0200 +++ b/src/Pure/Isar/code.ML Thu Jun 17 15:59:46 2010 +0200 @@ -66,7 +66,7 @@ val del_eqns: string -> theory -> theory val add_case: thm -> theory -> theory val add_undefined: string -> theory -> theory - val get_type: theory -> string -> ((string * sort) list * (string * typ list) list) + val get_type: theory -> string -> ((string * sort) list * ((string * string list) * typ list) list) val get_type_of_constr_or_abstr: theory -> string -> (string * bool) option val is_constr: theory -> string -> bool val is_abstr: theory -> string -> bool @@ -429,7 +429,13 @@ of SOME (vs, Abstractor spec) => (vs, spec) | _ => error ("Not an abstract type: " ^ tyco); -fun get_type thy = fst o get_type_spec thy; +fun get_type thy tyco = + let + val ((vs, cos), _) = get_type_spec thy tyco; + fun args_of c tys = map (fst o dest_TFree) + (Sign.const_typargs thy (c, tys ---> Type (tyco, map TFree vs))); + fun add_typargs (c, tys) = ((c, args_of c tys), tys); + in (vs, map add_typargs cos) end; fun get_type_of_constr_or_abstr thy c = case (snd o strip_type o const_typ thy) c @@ -1115,7 +1121,7 @@ val ([x, y], ctxt) = Name.variants ["A", "A'"] Name.context; val (zs, _) = Name.variants (replicate (num_args - 1) "") ctxt; val (ws, vs) = chop pos zs; - val T = Logic.unvarifyT_global (const_typ thy case_const); + val T = Logic.unvarifyT_global (Sign.the_const_type thy case_const); val Ts = (fst o strip_type) T; val T_cong = nth Ts pos; fun mk_prem z = Free (z, T_cong); @@ -1177,7 +1183,7 @@ Interpretation(type T = string * serial val eq = eq_snd (op =) : T * T -> bool); fun datatype_interpretation f = Datatype_Interpretation.interpretation - (fn (tyco, _) => fn thy => f (tyco, get_type thy tyco) thy); + (fn (tyco, _) => fn thy => f (tyco, fst (get_type_spec thy tyco)) thy); fun add_datatype proto_constrs thy = let diff -r ad3e04f289b6 -r 3bd4b3809bee src/Tools/Code/code_eval.ML --- a/src/Tools/Code/code_eval.ML Thu Jun 17 11:33:04 2010 +0200 +++ b/src/Tools/Code/code_eval.ML Thu Jun 17 15:59:46 2010 +0200 @@ -122,7 +122,7 @@ fun check_datatype thy tyco consts = let - val constrs = (map fst o snd o Code.get_type thy) tyco; + val constrs = (map (fst o fst) o snd o Code.get_type thy) tyco; val missing_constrs = subtract (op =) consts constrs; val _ = if null missing_constrs then [] else error ("Missing constructor(s) " ^ commas (map quote missing_constrs) diff -r ad3e04f289b6 -r 3bd4b3809bee src/Tools/Code/code_thingol.ML --- a/src/Tools/Code/code_thingol.ML Thu Jun 17 11:33:04 2010 +0200 +++ b/src/Tools/Code/code_thingol.ML Thu Jun 17 15:59:46 2010 +0200 @@ -67,14 +67,16 @@ datatype stmt = NoStmt | Fun of string * ((typscheme * ((iterm list * iterm) * (thm option * bool)) list) * thm option) - | Datatype of string * ((vname * sort) list * (string * itype list) list) + | Datatype of string * ((vname * sort) list * + ((string * vname list (*type argument wrt. canonical order*)) * itype list) list) | Datatypecons of string * string | Class of class * (vname * ((class * string) list * (string * itype) list)) | Classrel of class * class | Classparam of string * class - | Classinst of (class * (string * (vname * sort) list) (*class and arity*) ) + | Classinst of (class * (string * (vname * sort) list) (*class and arity*)) * ((class * (string * (string * dict list list))) list (*super instances*) - * ((string * const) * (thm * bool)) list (*class parameter instances*)) + * (((string * const) * (thm * bool)) list (*class parameter instances*) + * ((string * const) * (thm * bool)) list (*super class parameter instances*))) type program = stmt Graph.T val empty_funs: program -> string list val map_terms_bottom_up: (iterm -> iterm) -> iterm -> iterm @@ -403,14 +405,16 @@ datatype stmt = NoStmt | Fun of string * ((typscheme * ((iterm list * iterm) * (thm option * bool)) list) * thm option) - | Datatype of string * ((vname * sort) list * (string * itype list) list) + | Datatype of string * ((vname * sort) list * ((string * vname list) * itype list) list) | Datatypecons of string * string | Class of class * (vname * ((class * string) list * (string * itype) list)) | Classrel of class * class | Classparam of string * class | Classinst of (class * (string * (vname * sort) list)) * ((class * (string * (string * dict list list))) list - * ((string * const) * (thm * bool)) list) (*see also signature*); + * (((string * const) * (thm * bool)) list + * ((string * const) * (thm * bool)) list)) + (*see also signature*); type program = stmt Graph.T; @@ -428,6 +432,9 @@ (ICase (((map_terms_bottom_up f t, ty), (map o pairself) (map_terms_bottom_up f) ps), map_terms_bottom_up f t0)); +fun map_classparam_instances_as_term f = + (map o apfst o apsnd) (fn const => case f (IConst const) of IConst const' => const') + fun map_terms_stmt f NoStmt = NoStmt | map_terms_stmt f (Fun (c, ((tysm, eqs), case_cong))) = Fun (c, ((tysm, (map o apfst) (fn (ts, t) => (map f ts, f t)) eqs), case_cong)) @@ -436,9 +443,8 @@ | map_terms_stmt f (stmt as Class _) = stmt | map_terms_stmt f (stmt as Classrel _) = stmt | map_terms_stmt f (stmt as Classparam _) = stmt - | map_terms_stmt f (Classinst (arity, (super_instances, classparams))) = - Classinst (arity, (super_instances, (map o apfst o apsnd) (fn const => - case f (IConst const) of IConst const' => const') classparams)); + | map_terms_stmt f (Classinst (arity, (super_instances, classparam_instances))) = + Classinst (arity, (super_instances, (pairself o map_classparam_instances_as_term) f classparam_instances)); fun is_cons program name = case Graph.get_node program name of Datatypecons _ => true @@ -557,8 +563,9 @@ val (vs, cos) = Code.get_type thy tyco; val stmt_datatype = fold_map (translate_tyvar_sort thy algbr eqngr permissive) vs - ##>> fold_map (fn (c, tys) => + ##>> fold_map (fn ((c, vs), tys) => ensure_const thy algbr eqngr permissive c + ##>> pair (map (unprefix "'") vs) ##>> fold_map (translate_typ thy algbr eqngr permissive) tys) cos #>> (fn info => Datatype (tyco, info)); in ensure_stmt lookup_tyco (declare_tyco thy) stmt_datatype tyco end @@ -607,7 +614,10 @@ and ensure_inst thy (algbr as (_, algebra)) eqngr permissive (class, tyco) = let val super_classes = (Sorts.minimize_sort algebra o Sorts.super_classes algebra) class; - val classparams = these (try (#params o AxClass.get_info thy) class); + val these_classparams = these o try (#params o AxClass.get_info thy); + val classparams = these_classparams class; + val further_classparams = maps these_classparams + ((Sorts.complete_sort algebra o Sorts.super_classes algebra) class); val vs = Name.names Name.context "'a" (Sorts.mg_domain algebra tyco [class]); val sorts' = Sorts.mg_domain (Sign.classes_of thy) tyco [class]; val vs' = map2 (fn (v, sort1) => fn sort2 => (v, @@ -637,8 +647,11 @@ ##>> fold_map (translate_tyvar_sort thy algbr eqngr permissive) vs ##>> fold_map translate_super_instance super_classes ##>> fold_map translate_classparam_instance classparams - #>> (fn ((((class, tyco), arity_args), super_instances), classparam_instances) => - Classinst ((class, (tyco, arity_args)), (super_instances, classparam_instances))); + ##>> fold_map translate_classparam_instance further_classparams + #>> (fn (((((class, tyco), arity_args), super_instances), + classparam_instances), further_classparam_instances) => + Classinst ((class, (tyco, arity_args)), (super_instances, + (classparam_instances, further_classparam_instances)))); in ensure_stmt lookup_instance (declare_instance thy) stmt_inst (class, tyco) end and translate_typ thy algbr eqngr permissive (TFree (v, _)) = pair (ITyVar (unprefix "'" v)) @@ -682,15 +695,15 @@ then translation_error thy permissive some_thm "Abstraction violation" ("constant " ^ Code.string_of_const thy c) else () - val tys = Sign.const_typargs thy (c, ty); + val arg_typs = Sign.const_typargs thy (c, ty); val sorts = Code_Preproc.sortargs eqngr c; - val tys_args = (fst o Term.strip_type) ty; + val function_typs = (fst o Term.strip_type) ty; in ensure_const thy algbr eqngr permissive c - ##>> fold_map (translate_typ thy algbr eqngr permissive) tys - ##>> fold_map (translate_dicts thy algbr eqngr permissive some_thm) (tys ~~ sorts) - ##>> fold_map (translate_typ thy algbr eqngr permissive) tys_args - #>> (fn (((c, tys), iss), tys_args) => IConst (c, ((tys, iss), tys_args))) + ##>> fold_map (translate_typ thy algbr eqngr permissive) arg_typs + ##>> fold_map (translate_dicts thy algbr eqngr permissive some_thm) (arg_typs ~~ sorts) + ##>> fold_map (translate_typ thy algbr eqngr permissive) function_typs + #>> (fn (((c, arg_typs), dss), function_typs) => IConst (c, ((arg_typs, dss), function_typs))) end and translate_app_const thy algbr eqngr permissive some_thm ((c_ty, ts), some_abs) = translate_const thy algbr eqngr permissive some_thm (c_ty, some_abs)