changeset 49536 | 898aea2e7a94 |
parent 49510 | ba50d204095e |
child 49585 | 5c4a12550491 |
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); |