src/Pure/type.ML
changeset 26641 cf67665296c2
parent 26517 ef036a63f6e9
child 26669 c27efd6de25d
equal deleted inserted replaced
26640:92e6d3ec91bd 26641:cf67665296c2
    16   type tsig
    16   type tsig
    17   val rep_tsig: tsig ->
    17   val rep_tsig: tsig ->
    18    {classes: NameSpace.T * Sorts.algebra,
    18    {classes: NameSpace.T * Sorts.algebra,
    19     default: sort,
    19     default: sort,
    20     types: (decl * serial) NameSpace.table,
    20     types: (decl * serial) NameSpace.table,
    21     log_types: string list,
    21     log_types: string list}
    22     witness: (typ * sort) option}
       
    23   val empty_tsig: tsig
    22   val empty_tsig: tsig
    24   val defaultS: tsig -> sort
    23   val defaultS: tsig -> sort
    25   val logical_types: tsig -> string list
    24   val logical_types: tsig -> string list
    26   val universal_witness: tsig -> (typ * sort) option
       
    27   val eq_sort: tsig -> sort * sort -> bool
    25   val eq_sort: tsig -> sort * sort -> bool
    28   val subsort: tsig -> sort * sort -> bool
    26   val subsort: tsig -> sort * sort -> bool
    29   val of_sort: tsig -> typ * sort -> bool
    27   val of_sort: tsig -> typ * sort -> bool
    30   val inter_sort: tsig -> sort * sort -> sort
    28   val inter_sort: tsig -> sort * sort -> sort
    31   val cert_class: tsig -> class -> class
    29   val cert_class: tsig -> class -> class
   105 datatype tsig =
   103 datatype tsig =
   106   TSig of {
   104   TSig of {
   107     classes: NameSpace.T * Sorts.algebra,   (*order-sorted algebra of type classes*)
   105     classes: NameSpace.T * Sorts.algebra,   (*order-sorted algebra of type classes*)
   108     default: sort,                          (*default sort on input*)
   106     default: sort,                          (*default sort on input*)
   109     types: (decl * serial) NameSpace.table, (*declared types*)
   107     types: (decl * serial) NameSpace.table, (*declared types*)
   110     log_types: string list,                 (*logical types sorted by number of arguments*)
   108     log_types: string list};                (*logical types sorted by number of arguments*)
   111     witness: (typ * sort) option};          (*witness for non-emptiness of strictest sort*)
       
   112 
   109 
   113 fun rep_tsig (TSig comps) = comps;
   110 fun rep_tsig (TSig comps) = comps;
   114 
   111 
   115 fun make_tsig (classes, default, types, log_types, witness) =
   112 fun make_tsig (classes, default, types, log_types) =
   116   TSig {classes = classes, default = default, types = types,
   113   TSig {classes = classes, default = default, types = types, log_types = log_types};
   117     log_types = log_types, witness = witness};
       
   118 
   114 
   119 fun build_tsig ((space, classes), default, types) =
   115 fun build_tsig ((space, classes), default, types) =
   120   let
   116   let
   121     val log_types =
   117     val log_types =
   122       Symtab.fold (fn (c, (LogicalType n, _)) => cons (c, n) | _ => I) (snd types) []
   118       Symtab.fold (fn (c, (LogicalType n, _)) => cons (c, n) | _ => I) (snd types) []
   123       |> Library.sort (Library.int_ord o pairself snd) |> map fst;
   119       |> Library.sort (Library.int_ord o pairself snd) |> map fst;
   124     val witness =
   120   in make_tsig ((space, classes), default, types, log_types) end;
   125       (case Sorts.witness_sorts classes log_types [] [Sorts.minimal_classes classes] of
   121 
   126         [w] => SOME w | _ => NONE);
   122 fun map_tsig f (TSig {classes, default, types, log_types = _}) =
   127   in make_tsig ((space, classes), default, types, log_types, witness) end;
       
   128 
       
   129 fun map_tsig f (TSig {classes, default, types, log_types = _, witness = _}) =
       
   130   build_tsig (f (classes, default, types));
   123   build_tsig (f (classes, default, types));
   131 
   124 
   132 val empty_tsig =
   125 val empty_tsig =
   133   build_tsig ((NameSpace.empty, Sorts.empty_algebra), [], NameSpace.empty_table);
   126   build_tsig ((NameSpace.empty, Sorts.empty_algebra), [], NameSpace.empty_table);
   134 
   127 
   135 
   128 
   136 (* classes and sorts *)
   129 (* classes and sorts *)
   137 
   130 
   138 fun defaultS (TSig {default, ...}) = default;
   131 fun defaultS (TSig {default, ...}) = default;
   139 fun logical_types (TSig {log_types, ...}) = log_types;
   132 fun logical_types (TSig {log_types, ...}) = log_types;
   140 fun universal_witness (TSig {witness, ...}) = witness;
       
   141 
   133 
   142 fun eq_sort (TSig {classes, ...}) = Sorts.sort_eq (#2 classes);
   134 fun eq_sort (TSig {classes, ...}) = Sorts.sort_eq (#2 classes);
   143 fun subsort (TSig {classes, ...}) = Sorts.sort_le (#2 classes);
   135 fun subsort (TSig {classes, ...}) = Sorts.sort_le (#2 classes);
   144 fun of_sort (TSig {classes, ...}) = Sorts.of_sort (#2 classes);
   136 fun of_sort (TSig {classes, ...}) = Sorts.of_sort (#2 classes);
   145 fun inter_sort (TSig {classes, ...}) = Sorts.inter_sort (#2 classes);
   137 fun inter_sort (TSig {classes, ...}) = Sorts.inter_sort (#2 classes);
   228     SOME (LogicalType n, _) => n
   220     SOME (LogicalType n, _) => n
   229   | _ => error (undecl_type a));
   221   | _ => error (undecl_type a));
   230 
   222 
   231 fun arity_sorts _ tsig a [] = replicate (arity_number tsig a) []
   223 fun arity_sorts _ tsig a [] = replicate (arity_number tsig a) []
   232   | arity_sorts pp (TSig {classes, ...}) a S = Sorts.mg_domain (#2 classes) a S
   224   | arity_sorts pp (TSig {classes, ...}) a S = Sorts.mg_domain (#2 classes) a S
   233       handle Sorts.CLASS_ERROR err => Sorts.class_error pp err;
   225       handle Sorts.CLASS_ERROR err => error (Sorts.class_error pp err);
   234 
   226 
   235 
   227 
   236 
   228 
   237 (** special treatment of type vars **)
   229 (** special treatment of type vars **)
   238 
   230 
   389 
   381 
   390 (* unification *)
   382 (* unification *)
   391 
   383 
   392 exception TUNIFY;
   384 exception TUNIFY;
   393 
   385 
   394 (*occurs_check*)
   386 (*occurs check*)
   395 fun occurs v tye =
   387 fun occurs v tye =
   396   let
   388   let
   397     fun occ (Type (_, Ts)) = exists occ Ts
   389     fun occ (Type (_, Ts)) = exists occ Ts
   398       | occ (TFree _) = false
   390       | occ (TFree _) = false
   399       | occ (TVar (w, S)) =
   391       | occ (TVar (w, S)) =
   623 (* merge type signatures *)
   615 (* merge type signatures *)
   624 
   616 
   625 fun merge_tsigs pp (tsig1, tsig2) =
   617 fun merge_tsigs pp (tsig1, tsig2) =
   626   let
   618   let
   627     val (TSig {classes = (space1, classes1), default = default1, types = types1,
   619     val (TSig {classes = (space1, classes1), default = default1, types = types1,
   628       log_types = _, witness = _}) = tsig1;
   620       log_types = _}) = tsig1;
   629     val (TSig {classes = (space2, classes2), default = default2, types = types2,
   621     val (TSig {classes = (space2, classes2), default = default2, types = types2,
   630       log_types = _, witness = _}) = tsig2;
   622       log_types = _}) = tsig2;
   631 
   623 
   632     val space' = NameSpace.merge (space1, space2);
   624     val space' = NameSpace.merge (space1, space2);
   633     val classes' = Sorts.merge_algebra pp (classes1, classes2);
   625     val classes' = Sorts.merge_algebra pp (classes1, classes2);
   634     val default' = Sorts.inter_sort classes' (default1, default2);
   626     val default' = Sorts.inter_sort classes' (default1, default2);
   635     val types' = merge_types (types1, types2);
   627     val types' = merge_types (types1, types2);