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 |