src/HOL/BNF/Tools/bnf_wrap.ML
changeset 49536 898aea2e7a94
parent 49510 ba50d204095e
child 49585 5c4a12550491
equal deleted inserted replaced
49535:e016736fbe0a 49536:898aea2e7a94
    82   end;
    82   end;
    83 
    83 
    84 fun mk_disc_or_sel Ts t =
    84 fun mk_disc_or_sel Ts t =
    85   Term.subst_atomic_types (snd (Term.dest_Type (domain_type (fastype_of t))) ~~ Ts) t;
    85   Term.subst_atomic_types (snd (Term.dest_Type (domain_type (fastype_of t))) ~~ Ts) t;
    86 
    86 
       
    87 fun mk_case Ts T t =
       
    88   let val (Type (_, Ts0), body) = strip_type (fastype_of t) |>> List.last in
       
    89     Term.subst_atomic_types ((body, T) :: (Ts0 ~~ Ts)) t
       
    90   end;
       
    91 
    87 fun base_name_of_ctr c =
    92 fun base_name_of_ctr c =
    88   Long_Name.base_name (case head_of c of
    93   Long_Name.base_name (case head_of c of
    89       Const (s, _) => s
    94       Const (s, _) => s
    90     | Free (s, _) => s
    95     | Free (s, _) => s
    91     | _ => error "Cannot extract name of constructor");
    96     | _ => error "Cannot extract name of constructor");
    92 
       
    93 fun rapp u t = betapply (t, u);
       
    94 
    97 
    95 fun eta_expand_arg xs f_xs = fold_rev Term.lambda xs f_xs;
    98 fun eta_expand_arg xs f_xs = fold_rev Term.lambda xs f_xs;
    96 
    99 
    97 fun prepare_wrap_datatype prep_term (((no_dests, raw_ctrs), raw_case),
   100 fun prepare_wrap_datatype prep_term (((no_dests, raw_ctrs), raw_case),
    98     (raw_disc_bindings, (raw_sel_bindingss, raw_sel_defaultss))) no_defs_lthy =
   101     (raw_disc_bindings, (raw_sel_bindingss, raw_sel_defaultss))) no_defs_lthy =
   161           (if Binding.eq_name (sel, Binding.empty) orelse Binding.eq_name (sel, std_binding) then
   164           (if Binding.eq_name (sel, Binding.empty) orelse Binding.eq_name (sel, std_binding) then
   162             std_sel_binding m l ctr
   165             std_sel_binding m l ctr
   163           else
   166           else
   164             sel)) (1 upto m) o pad_list Binding.empty m) ctrs0 ms;
   167             sel)) (1 upto m) o pad_list Binding.empty m) ctrs0 ms;
   165 
   168 
   166     fun mk_case Ts T =
   169     val casex = mk_case As B case0;
   167       let
       
   168         val (bindings, body) = strip_type (fastype_of case0)
       
   169         val Type (_, Ts0) = List.last bindings
       
   170       in Term.subst_atomic_types ((body, T) :: (Ts0 ~~ Ts)) case0 end;
       
   171 
       
   172     val casex = mk_case As B;
       
   173     val case_Ts = map (fn Ts => Ts ---> B) ctr_Tss;
   170     val case_Ts = map (fn Ts => Ts ---> B) ctr_Tss;
   174 
   171 
   175     val (((((((xss, xss'), yss), fs), gs), [u', v']), (p, p')), names_lthy) = no_defs_lthy |>
   172     val (((((((xss, xss'), yss), fs), gs), [u', v']), (p, p')), names_lthy) = no_defs_lthy |>
   176       mk_Freess' "x" ctr_Tss
   173       mk_Freess' "x" ctr_Tss
   177       ||>> mk_Freess "y" ctr_Tss
   174       ||>> mk_Freess "y" ctr_Tss
   258                 | T :: T' :: _ => error ("Inconsistent range type for selector " ^
   255                 | T :: T' :: _ => error ("Inconsistent range type for selector " ^
   259                     quote (Binding.name_of b) ^ ": " ^ quote (Syntax.string_of_typ no_defs_lthy T) ^
   256                     quote (Binding.name_of b) ^ ": " ^ quote (Syntax.string_of_typ no_defs_lthy T) ^
   260                     " vs. " ^ quote (Syntax.string_of_typ no_defs_lthy T')));
   257                     " vs. " ^ quote (Syntax.string_of_typ no_defs_lthy T')));
   261             in
   258             in
   262               mk_Trueprop_eq (Free (Binding.name_of b, dataT --> T) $ u,
   259               mk_Trueprop_eq (Free (Binding.name_of b, dataT --> T) $ u,
   263                 Term.list_comb (mk_case As T, mk_sel_case_args b proto_sels T) $ u)
   260                 Term.list_comb (mk_case As T case0, mk_sel_case_args b proto_sels T) $ u)
   264             end;
   261             end;
   265 
   262 
   266           val sel_bindings = flat sel_bindingss;
   263           val sel_bindings = flat sel_bindingss;
   267           val uniq_sel_bindings = distinct Binding.eq_name sel_bindings;
   264           val uniq_sel_bindings = distinct Binding.eq_name sel_bindings;
   268           val all_sels_distinct = (length uniq_sel_bindings = length sel_bindings);
   265           val all_sels_distinct = (length uniq_sel_bindings = length sel_bindings);