src/HOL/BNF/Tools/bnf_lfp_rec_sugar.ML
changeset 54851 48a24d371ebb
parent 54272 9d623cada37f
child 54926 28b621fce2f9
equal deleted inserted replaced
54846:bf86b2002c96 54851:48a24d371ebb
   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