proper project_sort
authorhaftmann
Mon, 04 Sep 2006 08:17:28 +0200
changeset 20465 95f6d354b0ed
parent 20464 2b3fc1459ffa
child 20466 7c20ddbd911b
proper project_sort
src/Pure/Tools/class_package.ML
src/Pure/sorts.ML
--- a/src/Pure/Tools/class_package.ML	Sat Sep 02 03:10:27 2006 +0200
+++ b/src/Pure/Tools/class_package.ML	Mon Sep 04 08:17:28 2006 +0200
@@ -29,7 +29,7 @@
   val certify_sort: theory -> sort -> sort
   val read_class: theory -> xstring -> class
   val read_sort: theory -> string -> sort
-  val operational_algebra: theory -> Sorts.algebra * (sort -> sort)
+  val operational_algebra: theory -> (sort -> sort) * Sorts.algebra
   val the_consts_sign: theory -> class -> string * (string * typ) list
   val the_inst_sign: theory -> class * string -> (string * sort) list * (string * typ) list
   val assume_arities_of_sort: theory -> ((string * sort list) * sort) list -> typ * sort -> bool
--- a/src/Pure/sorts.ML	Sat Sep 02 03:10:27 2006 +0200
+++ b/src/Pure/sorts.ML	Mon Sep 04 08:17:28 2006 +0200
@@ -43,7 +43,7 @@
   val add_arities: Pretty.pp -> string * (class * sort list) list -> algebra -> algebra
   val empty_algebra: algebra
   val merge_algebra: Pretty.pp -> algebra * algebra -> algebra
-  val project_algebra: Pretty.pp -> (class -> bool) -> algebra -> algebra * (sort -> sort)
+  val project_algebra: Pretty.pp -> (class -> bool) -> algebra -> (sort -> sort) * algebra
   type class_error
   val class_error: Pretty.pp -> class_error -> 'a
   exception CLASS_ERROR of class_error
@@ -57,7 +57,7 @@
   val witness_sorts: algebra -> string list -> sort list -> sort list -> (typ * sort) list
 end;
 
-structure Sorts (*: SORTS *) =
+structure Sorts : SORTS =
 struct
 
 
@@ -281,21 +281,13 @@
 
 fun project_algebra pp proj (algebra as Algebra {classes, arities}) =
   let
+    val proj_sort = norm_sort algebra o filter proj o Graph.all_succs classes;
+    fun proj_arity (c, (_, Ss)) =
+      if proj c then SOME (c, (c, map proj_sort Ss)) else NONE;
     val classes' = classes |> Graph.project proj;
-    val proj' = can (Graph.get_node classes');
-    fun proj_classes class =
-      if proj' class
-      then [class]
-      else (norm_sort algebra o maps proj_classes o super_classes algebra) class;
-    val class_subst = fold (fn class => Symtab.update (class, proj_classes class))
-      (Graph.keys classes) Symtab.empty;
-    fun proj_arity (c, (_, Ss)) =
-      if proj' c then SOME (c,
-        (c, map (norm_sort algebra o filter proj' o Graph.all_succs classes) Ss)) else NONE;
     val arities' = arities |> (Symtab.map o map_filter) proj_arity;
-    val algebra' = rebuild_arities pp (make_algebra (classes', arities'));
-    val proj_sort = norm_sort algebra' o maps (the o Symtab.lookup class_subst);
-  in (rebuild_arities pp (make_algebra (classes', arities')), proj_sort) end;
+  in (proj_sort, rebuild_arities pp (make_algebra (classes', arities'))) end;
+
 
 
 (** sorts of types **)