34 val class_le: algebra -> class * class -> bool |
34 val class_le: algebra -> class * class -> bool |
35 val sort_eq: algebra -> sort * sort -> bool |
35 val sort_eq: algebra -> sort * sort -> bool |
36 val sort_le: algebra -> sort * sort -> bool |
36 val sort_le: algebra -> sort * sort -> bool |
37 val sorts_le: algebra -> sort list * sort list -> bool |
37 val sorts_le: algebra -> sort list * sort list -> bool |
38 val inter_sort: algebra -> sort * sort -> sort |
38 val inter_sort: algebra -> sort * sort -> sort |
|
39 val minimize_sort: algebra -> sort -> sort |
|
40 val complete_sort: algebra -> sort -> sort |
39 val certify_class: algebra -> class -> class (*exception TYPE*) |
41 val certify_class: algebra -> class -> class (*exception TYPE*) |
40 val certify_sort: algebra -> sort -> sort (*exception TYPE*) |
42 val certify_sort: algebra -> sort -> sort (*exception TYPE*) |
41 val add_class: Pretty.pp -> class * class list -> algebra -> algebra |
43 val add_class: Pretty.pp -> class * class list -> algebra -> algebra |
42 val add_classrel: Pretty.pp -> class * class -> algebra -> algebra |
44 val add_classrel: Pretty.pp -> class * class -> algebra -> algebra |
43 val add_arities: Pretty.pp -> string * (class * sort list) list -> algebra -> algebra |
45 val add_arities: Pretty.pp -> string * (class * sort list) list -> algebra -> algebra |
158 |
160 |
159 fun inter_sort algebra (S1, S2) = |
161 fun inter_sort algebra (S1, S2) = |
160 sort_strings (fold (inter_class algebra) S1 S2); |
162 sort_strings (fold (inter_class algebra) S1 S2); |
161 |
163 |
162 |
164 |
163 (* normal form *) |
165 (* normal forms *) |
164 |
166 |
165 fun norm_sort _ [] = [] |
167 fun minimize_sort _ [] = [] |
166 | norm_sort _ (S as [_]) = S |
168 | minimize_sort _ (S as [_]) = S |
167 | norm_sort algebra S = |
169 | minimize_sort algebra S = |
168 filter (fn c => not (exists (fn c' => class_less algebra (c', c)) S)) S |
170 filter (fn c => not (exists (fn c' => class_less algebra (c', c)) S)) S |
169 |> sort_distinct string_ord; |
171 |> sort_distinct string_ord; |
|
172 |
|
173 fun complete_sort algebra = |
|
174 Graph.all_succs (classes_of algebra) o minimize_sort algebra; |
170 |
175 |
171 |
176 |
172 (* certify *) |
177 (* certify *) |
173 |
178 |
174 fun certify_class algebra c = |
179 fun certify_class algebra c = |
175 if can (Graph.get_node (classes_of algebra)) c then c |
180 if can (Graph.get_node (classes_of algebra)) c then c |
176 else raise TYPE ("Undeclared class: " ^ quote c, [], []); |
181 else raise TYPE ("Undeclared class: " ^ quote c, [], []); |
177 |
182 |
178 fun certify_sort classes = norm_sort classes o map (certify_class classes); |
183 fun certify_sort classes = minimize_sort classes o map (certify_class classes); |
179 |
184 |
180 |
185 |
181 |
186 |
182 (** build algebras **) |
187 (** build algebras **) |
183 |
188 |
284 |
289 |
285 (* subalgebra *) |
290 (* subalgebra *) |
286 |
291 |
287 fun subalgebra pp P sargs (algebra as Algebra {classes, arities}) = |
292 fun subalgebra pp P sargs (algebra as Algebra {classes, arities}) = |
288 let |
293 let |
289 val restrict_sort = norm_sort algebra o filter P o Graph.all_succs classes; |
294 val restrict_sort = minimize_sort algebra o filter P o Graph.all_succs classes; |
290 fun restrict_arity tyco (c, (_, Ss)) = |
295 fun restrict_arity tyco (c, (_, Ss)) = |
291 if P c then |
296 if P c then |
292 SOME (c, (c, Ss |> map2 (curry (inter_sort algebra)) (sargs (c, tyco)) |
297 SOME (c, (c, Ss |> map2 (curry (inter_sort algebra)) (sargs (c, tyco)) |
293 |> map restrict_sort)) |
298 |> map restrict_sort)) |
294 else NONE; |
299 else NONE; |