368 val mutual_calls' = tag_list 0 calls |
368 val mutual_calls' = tag_list 0 calls |
369 |> map_filter (try (apsnd (fn Mutual_Rec (_, p) => p))); |
369 |> map_filter (try (apsnd (fn Mutual_Rec (_, p) => p))); |
370 val nested_calls' = tag_list 0 calls |
370 val nested_calls' = tag_list 0 calls |
371 |> map_filter (try (apsnd (fn Nested_Rec p => p))); |
371 |> map_filter (try (apsnd (fn Nested_Rec p => p))); |
372 |
372 |
|
373 fun ensure_unique frees t = |
|
374 if member (op =) frees t then Free (the_single (Term.variant_frees t [dest_Free t])) else t; |
|
375 |
373 val args = replicate n_args ("", dummyT) |
376 val args = replicate n_args ("", dummyT) |
374 |> Term.rename_wrt_term t |
377 |> Term.rename_wrt_term t |
375 |> map Free |
378 |> map Free |
376 |> fold (fn (ctr_arg_idx, (arg_idx, _)) => |
379 |> fold (fn (ctr_arg_idx, (arg_idx, _)) => |
377 nth_map arg_idx (K (nth ctr_args ctr_arg_idx))) |
380 nth_map arg_idx (K (nth ctr_args ctr_arg_idx))) |
378 no_calls' |
381 no_calls' |
379 |> fold (fn (ctr_arg_idx, (arg_idx, T)) => |
382 |> fold (fn (ctr_arg_idx, (arg_idx, T)) => fn xs => |
380 nth_map arg_idx (K (retype_free T (nth ctr_args ctr_arg_idx)))) |
383 nth_map arg_idx (K (ensure_unique xs (retype_free T (nth ctr_args ctr_arg_idx)))) xs) |
381 mutual_calls' |
384 mutual_calls' |
382 |> fold (fn (ctr_arg_idx, (arg_idx, T)) => |
385 |> fold (fn (ctr_arg_idx, (arg_idx, T)) => |
383 nth_map arg_idx (K (retype_free T (nth ctr_args ctr_arg_idx)))) |
386 nth_map arg_idx (K (retype_free T (nth ctr_args ctr_arg_idx)))) |
384 nested_calls'; |
387 nested_calls'; |
385 |
388 |