src/HOL/ex/CodeEval.thy
changeset 20835 27d049062b56
parent 20655 8c4d80e8025f
child 21117 e8657a20a52f
--- a/src/HOL/ex/CodeEval.thy	Mon Oct 02 23:00:50 2006 +0200
+++ b/src/HOL/ex/CodeEval.thy	Mon Oct 02 23:00:51 2006 +0200
@@ -39,15 +39,14 @@
 
 setup {*
 let
-  fun mk thy arities _ =
-    maps (fn ((tyco, asorts), _) => [(("", []), TypOf.mk_typ_of_def
-      (Type (tyco, map TFree (Name.names Name.context "'a" asorts)))
-      |> tap (writeln o Sign.string_of_term thy))]) arities;
+  fun mk arities _ thy =
+    (maps (fn ((tyco, asorts), _) => [(("", []), TypOf.mk_typ_of_def
+      (Type (tyco, map TFree (Name.names Name.context "'a" asorts))))]) arities, thy);
   fun tac _ = ClassPackage.intro_classes_tac [];
   fun hook specs =
     DatatypeCodegen.prove_codetypes_arities tac
       (map (fn (tyco, (is_dt, _)) => (tyco, is_dt)) specs)
-      [TypOf.class_typ_of] mk I
+      [TypOf.class_typ_of] mk ((K o K) I)
 in DatatypeCodegen.add_codetypes_hook_bootstrap hook end
 *}
 
@@ -90,19 +89,27 @@
 
 setup {*
 let
-  fun mk thy arities css =
+  fun thy_note ((name, atts), thms) =
+    PureThy.add_thmss [((name, thms), atts)] #-> (fn [thms] => pair (name, thms));
+  fun thy_def ((name, atts), t) =
+    PureThy.add_defs_i false [((name, t), atts)] #-> (fn [thm] => pair (name, thm));
+  fun mk arities css thy =
     let
       val vs = (Name.names Name.context "'a" o snd o fst o hd) arities;
-      val raw_defs = map (TermOf.mk_terms_of_defs vs) css;
-      fun mk' thy' = map (apfst (rpair [])) ((PrimrecPackage.mk_combdefs thy' o flat) raw_defs)
-    in ClassPackage.assume_arities_thy thy arities mk' end;
+      val defs = map (TermOf.mk_terms_of_defs vs) css;
+      val defs' = (map (pair ("", []) o ObjectLogic.ensure_propT thy) o flat) defs;
+    in
+      thy
+      |> PrimrecPackage.gen_primrec thy_note thy_def "" defs'
+      |> snd
+    end;
   fun tac _ = ClassPackage.intro_classes_tac [];
   fun hook specs =
     if (fst o hd) specs = (fst o dest_Type) Embed.typ_typ then I
     else
       DatatypeCodegen.prove_codetypes_arities tac
       (map (fn (tyco, (is_dt, _)) => (tyco, is_dt)) specs)
-      [TermOf.class_term_of] mk I
+      [TermOf.class_term_of] ((K o K o pair) []) mk
 in DatatypeCodegen.add_codetypes_hook_bootstrap hook end
 *}