src/Pure/sorts.ML
changeset 20465 95f6d354b0ed
parent 20454 7e948db7e42d
child 20573 c945a208e7f8
equal deleted inserted replaced
20464:2b3fc1459ffa 20465:95f6d354b0ed
    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 *)