41 val add_class: Pretty.pp -> class * class list -> algebra -> algebra |
41 val add_class: Pretty.pp -> class * class list -> algebra -> algebra |
42 val add_classrel: Pretty.pp -> class * class -> algebra -> algebra |
42 val add_classrel: Pretty.pp -> class * class -> algebra -> algebra |
43 val add_arities: Pretty.pp -> string * (class * sort list) list -> algebra -> algebra |
43 val add_arities: Pretty.pp -> string * (class * sort list) list -> algebra -> algebra |
44 val empty_algebra: algebra |
44 val empty_algebra: algebra |
45 val merge_algebra: Pretty.pp -> algebra * algebra -> algebra |
45 val merge_algebra: Pretty.pp -> algebra * algebra -> algebra |
46 val project_algebra: Pretty.pp -> (class -> bool) -> algebra -> algebra * (sort -> sort) |
46 val project_algebra: Pretty.pp -> (class -> bool) -> algebra -> (sort -> sort) * algebra |
47 type class_error |
47 type class_error |
48 val class_error: Pretty.pp -> class_error -> 'a |
48 val class_error: Pretty.pp -> class_error -> 'a |
49 exception CLASS_ERROR of class_error |
49 exception CLASS_ERROR of class_error |
50 val mg_domain: algebra -> string -> sort -> sort list (*exception CLASS_ERROR*) |
50 val mg_domain: algebra -> string -> sort -> sort list (*exception CLASS_ERROR*) |
51 val of_sort: algebra -> typ * sort -> bool |
51 val of_sort: algebra -> typ * sort -> 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 |
279 |> add_arities_table pp algebra0 arities2; |
279 |> add_arities_table pp algebra0 arities2; |
280 in make_algebra (classes', arities') end; |
280 in make_algebra (classes', arities') end; |
281 |
281 |
282 fun project_algebra pp proj (algebra as Algebra {classes, arities}) = |
282 fun project_algebra pp proj (algebra as Algebra {classes, arities}) = |
283 let |
283 let |
|
284 val proj_sort = norm_sort algebra o filter proj o Graph.all_succs classes; |
|
285 fun proj_arity (c, (_, Ss)) = |
|
286 if proj c then SOME (c, (c, map proj_sort Ss)) else NONE; |
284 val classes' = classes |> Graph.project proj; |
287 val classes' = classes |> Graph.project proj; |
285 val proj' = can (Graph.get_node classes'); |
|
286 fun proj_classes class = |
|
287 if proj' class |
|
288 then [class] |
|
289 else (norm_sort algebra o maps proj_classes o super_classes algebra) class; |
|
290 val class_subst = fold (fn class => Symtab.update (class, proj_classes class)) |
|
291 (Graph.keys classes) Symtab.empty; |
|
292 fun proj_arity (c, (_, Ss)) = |
|
293 if proj' c then SOME (c, |
|
294 (c, map (norm_sort algebra o filter proj' o Graph.all_succs classes) Ss)) else NONE; |
|
295 val arities' = arities |> (Symtab.map o map_filter) proj_arity; |
288 val arities' = arities |> (Symtab.map o map_filter) proj_arity; |
296 val algebra' = rebuild_arities pp (make_algebra (classes', arities')); |
289 in (proj_sort, rebuild_arities pp (make_algebra (classes', arities'))) end; |
297 val proj_sort = norm_sort algebra' o maps (the o Symtab.lookup class_subst); |
290 |
298 in (rebuild_arities pp (make_algebra (classes', arities')), proj_sort) end; |
|
299 |
291 |
300 |
292 |
301 (** sorts of types **) |
293 (** sorts of types **) |
302 |
294 |
303 (* errors *) |
295 (* errors *) |