40 * term list list list list) list option |
40 * term list list list list) list option |
41 * (string * term list * term list list |
41 * (string * term list * term list list |
42 * ((term list list * term list list list) * (typ list * typ list list)) list) option) |
42 * ((term list list * term list list list) * (typ list * typ list list)) list) option) |
43 * Proof.context |
43 * Proof.context |
44 |
44 |
45 val mk_iter_fun_arg_typessss: typ list -> int list -> int list list -> term -> |
45 val mk_iter_fun_arg_types: typ list -> int list -> int list list -> term -> |
46 typ list list list list |
46 typ list list list list |
|
47 val mk_coiter_fun_arg_types: typ list -> int list -> int list list -> term -> |
|
48 typ list list list list * typ list list list * typ list list list list * typ list |
47 val define_iters: string list -> |
49 val define_iters: string list -> |
48 (typ list list * typ list list list list * term list list * term list list list list) list -> |
50 (typ list list * typ list list list list * term list list * term list list list list) list -> |
49 (string -> binding) -> typ list -> typ list -> term list -> Proof.context -> |
51 (string -> binding) -> typ list -> typ list -> term list -> Proof.context -> |
50 (term list * thm list) * Proof.context |
52 (term list * thm list) * Proof.context |
51 val define_coiters: string list -> string * term list * term list list |
53 val define_coiters: string list -> string * term list * term list list |
325 fun nesty_bnfs ctxt ctr_Tsss Us = |
327 fun nesty_bnfs ctxt ctr_Tsss Us = |
326 map_filter (bnf_of ctxt) (fold (fold (fold (add_nesty_bnf_names Us))) ctr_Tsss []); |
328 map_filter (bnf_of ctxt) (fold (fold (fold (add_nesty_bnf_names Us))) ctr_Tsss []); |
327 |
329 |
328 fun indexify proj xs f p = f (find_index (curry (op =) (proj p)) xs) p; |
330 fun indexify proj xs f p = f (find_index (curry (op =) (proj p)) xs) p; |
329 |
331 |
330 fun mk_fun_arg_typess n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type; |
332 fun mk_iter_fun_arg_types0 n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type; |
331 |
333 |
332 fun mk_iter_fun_arg_typessss Cs ns mss = |
334 fun mk_iter_fun_arg_types Cs ns mss = |
333 mk_fp_iter_fun_types |
335 mk_fp_iter_fun_types |
334 #> map3 mk_fun_arg_typess ns mss |
336 #> map3 mk_iter_fun_arg_types0 ns mss |
335 #> map (map (map (unzip_recT Cs))); |
337 #> map (map (map (unzip_recT Cs))); |
336 |
338 |
337 fun mk_iters_args_types Cs ns mss ctor_iter_fun_Tss lthy = |
339 fun mk_iters_args_types Cs ns mss ctor_iter_fun_Tss lthy = |
338 let |
340 let |
339 val Css = map2 replicate ns Cs; |
341 val Css = map2 replicate ns Cs; |
340 val y_Tsss = map3 mk_fun_arg_typess ns mss (map un_fold_of ctor_iter_fun_Tss); |
342 val y_Tsss = map3 mk_iter_fun_arg_types0 ns mss (map un_fold_of ctor_iter_fun_Tss); |
341 val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss; |
343 val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss; |
342 |
344 |
343 val ((gss, ysss), lthy) = |
345 val ((gss, ysss), lthy) = |
344 lthy |
346 lthy |
345 |> mk_Freess "f" g_Tss |
347 |> mk_Freess "f" g_Tss |
363 val zssss = map2 (map2 (map2 cons)) zssss_hd zssss_tl; |
365 val zssss = map2 (map2 (map2 cons)) zssss_hd zssss_tl; |
364 in |
366 in |
365 ([(g_Tss, y_Tssss, gss, yssss), (h_Tss, z_Tssss, hss, zssss)], lthy) |
367 ([(g_Tss, y_Tssss, gss, yssss), (h_Tss, z_Tssss, hss, zssss)], lthy) |
366 end; |
368 end; |
367 |
369 |
368 fun mk_coiter_fun_arg_typessss_typesss_typessss Cs ns mss fun_Ts = |
370 fun mk_coiter_fun_arg_types0 Cs ns mss fun_Ts = |
369 let |
371 let |
370 (*avoid "'a itself" arguments in coiterators and corecursors*) |
372 (*avoid "'a itself" arguments in coiterators and corecursors*) |
371 fun repair_arity [0] = [1] |
373 fun repair_arity [0] = [1] |
372 | repair_arity ms = ms; |
374 | repair_arity ms = ms; |
373 |
375 |
378 val q_Tssss = map (map (map (fn [_] => [] | [_, T] => [mk_pred1T (domain_type T)]))) f_Tssss; |
380 val q_Tssss = map (map (map (fn [_] => [] | [_, T] => [mk_pred1T (domain_type T)]))) f_Tssss; |
379 in |
381 in |
380 (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts) |
382 (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts) |
381 end; |
383 end; |
382 |
384 |
|
385 fun mk_coiter_fun_arg_types Cs ns mss = |
|
386 mk_fp_iter_fun_types |
|
387 #> mk_coiter_fun_arg_types0 Cs ns mss; |
|
388 |
383 fun mk_coiters_args_types Cs ns mss dtor_coiter_fun_Tss lthy = |
389 fun mk_coiters_args_types Cs ns mss dtor_coiter_fun_Tss lthy = |
384 let |
390 let |
385 val p_Tss = map2 (fn n => replicate (Int.max (0, n - 1)) o mk_pred1T) ns Cs; |
391 val p_Tss = map2 (fn n => replicate (Int.max (0, n - 1)) o mk_pred1T) ns Cs; |
386 |
392 |
387 fun mk_types get_Ts = |
393 fun mk_types get_Ts = |
388 let |
394 let |
389 val fun_Ts = map get_Ts dtor_coiter_fun_Tss; |
395 val fun_Ts = map get_Ts dtor_coiter_fun_Tss; |
390 val (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts) = |
396 val (q_Tssss, f_Tsss, f_Tssss, f_sum_prod_Ts) = mk_coiter_fun_arg_types0 Cs ns mss fun_Ts; |
391 mk_coiter_fun_arg_typessss_typesss_typessss Cs ns mss fun_Ts; |
|
392 val pf_Tss = map3 flat_corec_preds_predsss_gettersss p_Tss q_Tssss f_Tssss; |
397 val pf_Tss = map3 flat_corec_preds_predsss_gettersss p_Tss q_Tssss f_Tssss; |
393 in |
398 in |
394 (q_Tssss, f_Tsss, f_Tssss, (f_sum_prod_Ts, pf_Tss)) |
399 (q_Tssss, f_Tsss, f_Tssss, (f_sum_prod_Ts, pf_Tss)) |
395 end; |
400 end; |
396 |
401 |