src/HOL/HOLCF/ex/Pattern_Match.thy
changeset 58112 8081087096ad
parent 54895 515630483010
child 58880 0baae4311a9f
equal deleted inserted replaced
58111:82db9ad610b9 58112:8081087096ad
   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;