src/Pure/sorts.ML
changeset 20573 c945a208e7f8
parent 20465 95f6d354b0ed
child 21926 1091904ddb19
equal deleted inserted replaced
20572:2b88de40da57 20573:c945a208e7f8
    24   val insert_typs: typ list -> sort list -> sort list
    24   val insert_typs: typ list -> sort list -> sort list
    25   val insert_term: term -> sort list -> sort list
    25   val insert_term: term -> sort list -> sort list
    26   val insert_terms: term list -> sort list -> sort list
    26   val insert_terms: term list -> sort list -> sort list
    27   type algebra
    27   type algebra
    28   val rep_algebra: algebra ->
    28   val rep_algebra: algebra ->
    29    {classes: stamp Graph.T,
    29    {classes: serial Graph.T,
    30     arities: (class * (class * sort list)) list Symtab.table}
    30     arities: (class * (class * sort list)) list Symtab.table}
    31   val classes: algebra -> class list
    31   val classes: algebra -> class list
    32   val super_classes: algebra -> class -> class list
    32   val super_classes: algebra -> class -> class list
    33   val class_less: algebra -> class * class -> bool
    33   val class_less: algebra -> class * class -> bool
    34   val class_le: algebra -> class * class -> bool
    34   val class_le: algebra -> class * class -> bool
    55      variable: typ -> ('a * class) list} ->
    55      variable: typ -> ('a * class) list} ->
    56     typ * sort -> 'a list   (*exception CLASS_ERROR*)
    56     typ * sort -> 'a list   (*exception CLASS_ERROR*)
    57   val witness_sorts: algebra -> string list -> sort list -> sort list -> (typ * sort) list
    57   val witness_sorts: algebra -> string list -> sort list -> sort list -> (typ * sort) list
    58 end;
    58 end;
    59 
    59 
    60 structure Sorts : SORTS =
    60 structure Sorts: SORTS =
    61 struct
    61 struct
    62 
    62 
    63 
    63 
    64 (** ordered lists of sorts **)
    64 (** ordered lists of sorts **)
    65 
    65 
   101     that for any two declarations t::(Ss1)c1 and t::(Ss2)c2 such that
   101     that for any two declarations t::(Ss1)c1 and t::(Ss2)c2 such that
   102     c1 <= c2 holds Ss1 <= Ss2.
   102     c1 <= c2 holds Ss1 <= Ss2.
   103 *)
   103 *)
   104 
   104 
   105 datatype algebra = Algebra of
   105 datatype algebra = Algebra of
   106  {classes: stamp Graph.T,
   106  {classes: serial Graph.T,
   107   arities: (class * (class * sort list)) list Symtab.table};
   107   arities: (class * (class * sort list)) list Symtab.table};
   108 
   108 
   109 fun rep_algebra (Algebra args) = args;
   109 fun rep_algebra (Algebra args) = args;
   110 
   110 
   111 val classes_of = #classes o rep_algebra;
   111 val classes_of = #classes o rep_algebra;
   187   error (cat_lines (map (fn cs =>
   187   error (cat_lines (map (fn cs =>
   188     "Cycle in class relation: " ^ Pretty.string_of_classrel pp cs) css));
   188     "Cycle in class relation: " ^ Pretty.string_of_classrel pp cs) css));
   189 
   189 
   190 fun add_class pp (c, cs) = map_classes (fn classes =>
   190 fun add_class pp (c, cs) = map_classes (fn classes =>
   191   let
   191   let
   192     val classes' = classes |> Graph.new_node (c, stamp ())
   192     val classes' = classes |> Graph.new_node (c, serial ())
   193       handle Graph.DUP dup => err_dup_classes [dup];
   193       handle Graph.DUP dup => err_dup_classes [dup];
   194     val classes'' = classes' |> fold Graph.add_edge_trans_acyclic (map (pair c) cs)
   194     val classes'' = classes' |> fold Graph.add_edge_trans_acyclic (map (pair c) cs)
   195       handle Graph.CYCLES css => err_cyclic_classes pp css;
   195       handle Graph.CYCLES css => err_cyclic_classes pp css;
   196   in classes'' end);
   196   in classes'' end);
   197 
   197