src/HOL/Tools/inductive_codegen.ML
changeset 30190 479806475f3c
parent 29287 5b0bfd63b5da
child 31723 f5cafe803b55
equal deleted inserted replaced
30189:3633f560f4c3 30190:479806475f3c
    69             | xs => snd (snd (snd (split_last xs)))))
    69             | xs => snd (snd (snd (split_last xs)))))
    70         in CodegenData.put
    70         in CodegenData.put
    71           {intros = intros |>
    71           {intros = intros |>
    72            Symtab.update (s, (AList.update Thm.eq_thm_prop
    72            Symtab.update (s, (AList.update Thm.eq_thm_prop
    73              (thm, (thyname_of s, nparms)) rules)),
    73              (thm, (thyname_of s, nparms)) rules)),
    74            graph = foldr (uncurry (Graph.add_edge o pair s))
    74            graph = List.foldr (uncurry (Graph.add_edge o pair s))
    75              (Library.foldl add_node (graph, s :: cs)) cs,
    75              (Library.foldl add_node (graph, s :: cs)) cs,
    76            eqns = eqns} thy
    76            eqns = eqns} thy
    77         end
    77         end
    78     | _ => (warn thm; thy))
    78     | _ => (warn thm; thy))
    79   end) I);
    79   end) I);
   150      else [[]];
   150      else [[]];
   151 
   151 
   152 fun cprod ([], ys) = []
   152 fun cprod ([], ys) = []
   153   | cprod (x :: xs, ys) = map (pair x) ys @ cprod (xs, ys);
   153   | cprod (x :: xs, ys) = map (pair x) ys @ cprod (xs, ys);
   154 
   154 
   155 fun cprods xss = foldr (map op :: o cprod) [[]] xss;
   155 fun cprods xss = List.foldr (map op :: o cprod) [[]] xss;
   156 
   156 
   157 datatype mode = Mode of (int list option list * int list) * int list * mode option list;
   157 datatype mode = Mode of (int list option list * int list) * int list * mode option list;
   158 
   158 
   159 fun modes_of modes t =
   159 fun modes_of modes t =
   160   let
   160   let
   355       apfst (Pretty.block o cons (str (s ^ " = ")) o single)
   355       apfst (Pretty.block o cons (str (s ^ " = ")) o single)
   356         (invoke_codegen thy defs dep module false t gr);
   356         (invoke_codegen thy defs dep module false t gr);
   357 
   357 
   358     val (in_ts, out_ts) = get_args is 1 ts;
   358     val (in_ts, out_ts) = get_args is 1 ts;
   359     val ((all_vs', eqs), in_ts') =
   359     val ((all_vs', eqs), in_ts') =
   360       foldl_map check_constrt ((all_vs, []), in_ts);
   360       Library.foldl_map check_constrt ((all_vs, []), in_ts);
   361 
   361 
   362     fun compile_prems out_ts' vs names [] gr =
   362     fun compile_prems out_ts' vs names [] gr =
   363           let
   363           let
   364             val (out_ps, gr2) = fold_map
   364             val (out_ps, gr2) = fold_map
   365               (invoke_codegen thy defs dep module false) out_ts gr;
   365               (invoke_codegen thy defs dep module false) out_ts gr;
   366             val (eq_ps, gr3) = fold_map compile_eq eqs gr2;
   366             val (eq_ps, gr3) = fold_map compile_eq eqs gr2;
   367             val ((names', eqs'), out_ts'') =
   367             val ((names', eqs'), out_ts'') =
   368               foldl_map check_constrt ((names, []), out_ts');
   368               Library.foldl_map check_constrt ((names, []), out_ts');
   369             val (nvs, out_ts''') = foldl_map distinct_v
   369             val (nvs, out_ts''') = Library.foldl_map distinct_v
   370               ((names', map (fn x => (x, [x])) vs), out_ts'');
   370               ((names', map (fn x => (x, [x])) vs), out_ts'');
   371             val (out_ps', gr4) = fold_map
   371             val (out_ps', gr4) = fold_map
   372               (invoke_codegen thy defs dep module false) (out_ts''') gr3;
   372               (invoke_codegen thy defs dep module false) (out_ts''') gr3;
   373             val (eq_ps', gr5) = fold_map compile_eq eqs' gr4;
   373             val (eq_ps', gr5) = fold_map compile_eq eqs' gr4;
   374           in
   374           in
   381             val vs' = distinct (op =) (List.concat (vs :: map term_vs out_ts));
   381             val vs' = distinct (op =) (List.concat (vs :: map term_vs out_ts));
   382             val SOME (p, mode as SOME (Mode (_, js, _))) =
   382             val SOME (p, mode as SOME (Mode (_, js, _))) =
   383               select_mode_prem thy modes' vs' ps;
   383               select_mode_prem thy modes' vs' ps;
   384             val ps' = filter_out (equal p) ps;
   384             val ps' = filter_out (equal p) ps;
   385             val ((names', eqs), out_ts') =
   385             val ((names', eqs), out_ts') =
   386               foldl_map check_constrt ((names, []), out_ts);
   386               Library.foldl_map check_constrt ((names, []), out_ts);
   387             val (nvs, out_ts'') = foldl_map distinct_v
   387             val (nvs, out_ts'') = Library.foldl_map distinct_v
   388               ((names', map (fn x => (x, [x])) vs), out_ts');
   388               ((names', map (fn x => (x, [x])) vs), out_ts');
   389             val (out_ps, gr0) = fold_map
   389             val (out_ps, gr0) = fold_map
   390               (invoke_codegen thy defs dep module false) out_ts'' gr;
   390               (invoke_codegen thy defs dep module false) out_ts'' gr;
   391             val (eq_ps, gr1) = fold_map compile_eq eqs gr0;
   391             val (eq_ps, gr1) = fold_map compile_eq eqs gr0;
   392           in
   392           in