250 |
250 |
251 |
251 |
252 fun sequential_preproc (config as FundefConfig {sequential, ...}) ctxt fixes spec = |
252 fun sequential_preproc (config as FundefConfig {sequential, ...}) ctxt fixes spec = |
253 if sequential then |
253 if sequential then |
254 let |
254 let |
255 val (nas, eqss) = split_list spec |
255 val (bnds, eqss) = split_list spec |
256 |
256 |
257 val eqs = map the_single eqss |
257 val eqs = map the_single eqss |
258 |
258 |
259 val feqs = eqs |
259 val feqs = eqs |
260 |> tap (check_defs ctxt fixes) (* Standard checks *) |
260 |> tap (check_defs ctxt fixes) (* Standard checks *) |
264 |
264 |
265 val spliteqs = warn_if_redundant ctxt feqs |
265 val spliteqs = warn_if_redundant ctxt feqs |
266 (FundefSplit.split_all_equations ctxt compleqs) |
266 (FundefSplit.split_all_equations ctxt compleqs) |
267 |
267 |
268 fun restore_spec thms = |
268 fun restore_spec thms = |
269 nas ~~ Library.take (length nas, Library.unflat spliteqs thms) |
269 bnds ~~ Library.take (length bnds, Library.unflat spliteqs thms) |
270 |
270 |
271 val spliteqs' = flat (Library.take (length nas, spliteqs)) |
271 val spliteqs' = flat (Library.take (length bnds, spliteqs)) |
272 val fnames = map (fst o fst) fixes |
272 val fnames = map (fst o fst) fixes |
273 val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) spliteqs' |
273 val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) spliteqs' |
274 |
274 |
275 fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1) (indices ~~ xs) |
275 fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1) (indices ~~ xs) |
276 |> map (map snd) |
276 |> map (map snd) |
277 |
277 |
278 |
278 |
279 val nas' = nas @ replicate (length spliteqs - length nas) ("",[]) |
279 val bnds' = bnds @ replicate (length spliteqs - length bnds) Attrib.empty_binding |
280 |
280 |
281 (* using theorem names for case name currently disabled *) |
281 (* using theorem names for case name currently disabled *) |
282 val case_names = map_index (fn (i, ((n, _), es)) => mk_case_names i "" (length es)) |
282 val case_names = map_index (fn (i, (_, es)) => mk_case_names i "" (length es)) |
283 (nas' ~~ spliteqs) |
283 (bnds' ~~ spliteqs) |
284 |> flat |
284 |> flat |
285 in |
285 in |
286 (flat spliteqs, restore_spec, sort, case_names) |
286 (flat spliteqs, restore_spec, sort, case_names) |
287 end |
287 end |
288 else |
288 else |