src/Tools/code/code_thingol.ML
changeset 28924 5c8781b7d6a4
parent 28724 4656aacba2bc
child 29272 fb3ccf499df5
--- a/src/Tools/code/code_thingol.ML	Mon Dec 01 12:17:01 2008 +0100
+++ b/src/Tools/code/code_thingol.ML	Mon Dec 01 12:17:02 2008 +0100
@@ -489,7 +489,7 @@
 
 fun ensure_class thy (algbr as (_, algebra)) funcgr class =
   let
-    val superclasses = (Sorts.certify_sort algebra o Sorts.super_classes algebra) class;
+    val superclasses = (Sorts.minimize_sort algebra o Sorts.super_classes algebra) class;
     val cs = #params (AxClass.get_info thy class);
     val stmt_class =
       fold_map (fn superclass => ensure_class thy algbr funcgr superclass
@@ -538,8 +538,16 @@
           Global ((class, tyco), yss)
       | class_relation (Local (classrels, v), subclass) superclass =
           Local ((subclass, superclass) :: classrels, v);
+    fun norm_typargs ys =
+      let
+        val raw_sort = map snd ys;
+        val sort = Sorts.minimize_sort algebra raw_sort;
+      in
+        map_filter (fn (y, class) =>
+          if member (op =) sort class then SOME y else NONE) ys
+      end;
     fun type_constructor tyco yss class =
-      Global ((class, tyco), (map o map) fst yss);
+      Global ((class, tyco), map norm_typargs yss);
     fun type_variable (TFree (v, sort)) =
       let
         val sort' = proj_sort sort;
@@ -567,7 +575,7 @@
   end
 and ensure_inst thy (algbr as (_, algebra)) funcgr (class, tyco) =
   let
-    val superclasses = (Sorts.certify_sort algebra o Sorts.super_classes algebra) class;
+    val superclasses = (Sorts.minimize_sort algebra o Sorts.super_classes algebra) class;
     val classparams = these (try (#params o AxClass.get_info thy) class);
     val vs = Name.names Name.context "'a" (Sorts.mg_domain algebra tyco [class]);
     val sorts' = Sorts.mg_domain (Sign.classes_of thy) tyco [class];
@@ -736,9 +744,9 @@
 
 val cached_program = Program.get;
 
-fun invoke_generation thy funcgr f name =
+fun invoke_generation thy (algebra, funcgr) f name =
   Program.change_yield thy (fn naming_program => (NONE, naming_program)
-    |> f thy (Code.operational_algebra thy) funcgr name
+    |> f thy algebra funcgr name
     |-> (fn name => fn (_, naming_program) => (name, naming_program)));
 
 
@@ -789,9 +797,10 @@
 fun eval thy evaluator t =
   let
     val (t', evaluator'') = evaluator t;
-    fun evaluator' funcgr =
+    fun evaluator' algebra funcgr =
       let
-        val (((naming, program), (vs_ty_t, deps)), _) = invoke_generation thy funcgr ensure_value t';
+        val (((naming, program), (vs_ty_t, deps)), _) =
+          invoke_generation thy (algebra, funcgr) ensure_value t';
       in evaluator'' naming program vs_ty_t deps end;
   in (t', evaluator') end