421 (taken : string list) |
421 (taken : string list) |
422 (args : (bool * typ) list) |
422 (args : (bool * typ) list) |
423 : (term list * term list) = |
423 : (term list * term list) = |
424 let |
424 let |
425 val Ts = map snd args; |
425 val Ts = map snd args; |
426 val ns = Name.variant_list taken (Datatype_Prop.make_tnames Ts); |
426 val ns = Name.variant_list taken (Old_Datatype_Prop.make_tnames Ts); |
427 val vs = map Free (ns ~~ Ts); |
427 val vs = map Free (ns ~~ Ts); |
428 val nonlazy = map snd (filter_out (fst o fst) (args ~~ vs)); |
428 val nonlazy = map snd (filter_out (fst o fst) (args ~~ vs)); |
429 in |
429 in |
430 (vs, nonlazy) |
430 (vs, nonlazy) |
431 end; |
431 end; |
471 let |
471 let |
472 val pat_bind = Binding.suffix_name "_pat" bind; |
472 val pat_bind = Binding.suffix_name "_pat" bind; |
473 val Ts = map snd args; |
473 val Ts = map snd args; |
474 val Vs = |
474 val Vs = |
475 (map (K "'t") args) |
475 (map (K "'t") args) |
476 |> Datatype_Prop.indexify_names |
476 |> Old_Datatype_Prop.indexify_names |
477 |> Name.variant_list tns |
477 |> Name.variant_list tns |
478 |> map (fn t => TFree (t, @{sort pcpo})); |
478 |> map (fn t => TFree (t, @{sort pcpo})); |
479 val patNs = Datatype_Prop.indexify_names (map (K "pat") args); |
479 val patNs = Old_Datatype_Prop.indexify_names (map (K "pat") args); |
480 val patTs = map2 (fn T => fn V => T ->> mk_matchT V) Ts Vs; |
480 val patTs = map2 (fn T => fn V => T ->> mk_matchT V) Ts Vs; |
481 val pats = map Free (patNs ~~ patTs); |
481 val pats = map Free (patNs ~~ patTs); |
482 val fail = mk_fail (mk_tupleT Vs); |
482 val fail = mk_fail (mk_tupleT Vs); |
483 val (vs, nonlazy) = get_vars_avoiding patNs args; |
483 val (vs, nonlazy) = get_vars_avoiding patNs args; |
484 val rhs = big_lambdas vs (mk_tuple_pat pats ` mk_tuple vs); |
484 val rhs = big_lambdas vs (mk_tuple_pat pats ` mk_tuple vs); |
537 fun pat_lhs (pat, args) = |
537 fun pat_lhs (pat, args) = |
538 let |
538 let |
539 val Ts = map snd args; |
539 val Ts = map snd args; |
540 val Vs = |
540 val Vs = |
541 (map (K "'t") args) |
541 (map (K "'t") args) |
542 |> Datatype_Prop.indexify_names |
542 |> Old_Datatype_Prop.indexify_names |
543 |> Name.variant_list (rn::tns) |
543 |> Name.variant_list (rn::tns) |
544 |> map (fn t => TFree (t, @{sort pcpo})); |
544 |> map (fn t => TFree (t, @{sort pcpo})); |
545 val patNs = Datatype_Prop.indexify_names (map (K "pat") args); |
545 val patNs = Old_Datatype_Prop.indexify_names (map (K "pat") args); |
546 val patTs = map2 (fn T => fn V => T ->> mk_matchT V) Ts Vs; |
546 val patTs = map2 (fn T => fn V => T ->> mk_matchT V) Ts Vs; |
547 val pats = map Free (patNs ~~ patTs); |
547 val pats = map Free (patNs ~~ patTs); |
548 val k = Free ("rhs", mk_tupleT Vs ->> R); |
548 val k = Free ("rhs", mk_tupleT Vs ->> R); |
549 val branch1 = branch_const (lhsT, mk_tupleT Vs, R); |
549 val branch1 = branch_const (lhsT, mk_tupleT Vs, R); |
550 val fun1 = (branch1 $ list_comb (pat, pats)) ` k; |
550 val fun1 = (branch1 $ list_comb (pat, pats)) ` k; |