src/Pure/sorts.ML
changeset 24732 08c2dd5378c7
parent 23655 d2d1138e0ddc
child 26326 a68045977f60
equal deleted inserted replaced
24731:c25aa6ae64ec 24732:08c2dd5378c7
    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;