src/HOL/Tools/inductive_codegen.ML
changeset 22642 bfdb29f11eb4
parent 22556 b067fdca022d
child 22661 f3ba63a2663e
--- a/src/HOL/Tools/inductive_codegen.ML	Thu Apr 12 03:37:30 2007 +0200
+++ b/src/HOL/Tools/inductive_codegen.ML	Thu Apr 12 12:26:19 2007 +0200
@@ -30,8 +30,7 @@
 (**** theory data ****)
 
 fun merge_rules tabs =
-  Symtab.join (fn _ => fn (ths, ths') =>
-    gen_merge_lists (Thm.eq_thm_prop o pairself fst) ths ths') tabs;
+  Symtab.join (fn _ => AList.merge (Thm.eq_thm_prop) (K true)) tabs;
 
 structure CodegenData = TheoryDataFun
 (struct
@@ -67,8 +66,8 @@
       SOME (Const ("op =", _), [t, _]) => (case head_of t of
         Const (s, _) =>
           CodegenData.put {intros = intros, graph = graph,
-             eqns = eqns |> Symtab.update
-               (s, Symtab.lookup_list eqns s @ [(thm, thyname_of s)])} thy
+             eqns = eqns |> Symtab.map_default (s, [])
+               (AList.update Thm.eq_thm_prop (thm, thyname_of s))} thy
       | _ => (warn thm; thy))
     | SOME (Const (s, _), _) =>
         let
@@ -83,7 +82,8 @@
             | xs => snd (snd (snd (split_last xs)))))
         in CodegenData.put
           {intros = intros |>
-           Symtab.update (s, rules @ [(thm, (thyname_of s, nparms))]),
+           Symtab.update (s, (AList.update Thm.eq_thm_prop
+             (thm, (thyname_of s, nparms)) rules)),
            graph = foldr (uncurry (Graph.add_edge o pair s))
              (Library.foldl add_node (graph, s :: cs)) cs,
            eqns = eqns} thy
@@ -98,15 +98,14 @@
         NONE => NONE
       | SOME ({names, ...}, {intrs, raw_induct, ...}) =>
           SOME (names, thyname_of_const s thy, length (params_of raw_induct),
-            preprocess thy intrs))
+            preprocess thy (rev intrs)))
     | SOME _ =>
         let
           val SOME names = find_first
-            (fn xs => s mem xs) (Graph.strong_conn graph);
-          val intrs = List.concat (map
-            (fn s => the (Symtab.lookup intros s)) names);
-          val (_, (_, (thyname, nparms))) = split_last intrs
-        in SOME (names, thyname, nparms, preprocess thy (map fst intrs)) end
+            (fn xs => member (op =) xs s) (Graph.strong_conn graph);
+          val intrs as (_, (thyname, nparms)) :: _ =
+            maps (the o Symtab.lookup intros) names;
+        in SOME (names, thyname, nparms, preprocess thy (map fst (rev intrs))) end
   end;
 
 
@@ -255,7 +254,7 @@
       p ^ " violates mode " ^ string_of_mode m); false)) ms)
   end;
 
-fun fixp f x =
+fun fixp f (x : (string * (int list option list * int list) list) list) =
   let val y = f x
   in if x = y then x else fixp f y end;
 
@@ -488,7 +487,7 @@
 fun prep_intrs intrs = map (rename_term o #prop o rep_thm o standard) intrs;
 
 fun constrain cs [] = []
-  | constrain cs ((s, xs) :: ys) = (s, case AList.lookup (op =) cs s of
+  | constrain cs ((s, xs) :: ys) = (s, case AList.lookup (op =) cs (s : string) of
       NONE => xs
     | SOME xs' => xs inter xs') :: constrain cs ys;
 
@@ -652,8 +651,8 @@
       | _ => NONE)
     | SOME eqns =>
         let
-          val (_, (_, thyname)) = split_last eqns;
-          val (gr', id) = mk_fun thy defs s (preprocess thy (map fst eqns))
+          val (_, thyname) :: _ = eqns;
+          val (gr', id) = mk_fun thy defs s (preprocess thy (map fst (rev eqns)))
             dep module (if_library thyname module) gr;
           val (gr'', ps) = foldl_map
             (invoke_codegen thy defs dep module true) (gr', ts);