equal
deleted
inserted
replaced
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 |