67 let |
67 let |
68 val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs; |
68 val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs; |
69 val constr_t = Const (cname, Ts ---> T); |
69 val constr_t = Const (cname, Ts ---> T); |
70 val tnames = make_tnames Ts; |
70 val tnames = make_tnames Ts; |
71 val frees = map Free (tnames ~~ Ts); |
71 val frees = map Free (tnames ~~ Ts); |
72 val frees' = map Free ((map ((op ^) o (rpair "'")) tnames) ~~ Ts); |
72 val frees' = map Free (map (suffix "'") tnames ~~ Ts); |
73 in cons (HOLogic.mk_Trueprop (HOLogic.mk_eq |
73 in |
74 (HOLogic.mk_eq (list_comb (constr_t, frees), list_comb (constr_t, frees')), |
74 cons (HOLogic.mk_Trueprop (HOLogic.mk_eq |
75 foldr1 (HOLogic.mk_binop @{const_name HOL.conj}) |
75 (HOLogic.mk_eq (list_comb (constr_t, frees), list_comb (constr_t, frees')), |
76 (map HOLogic.mk_eq (frees ~~ frees'))))) |
76 foldr1 (HOLogic.mk_binop @{const_name HOL.conj}) |
|
77 (map HOLogic.mk_eq (frees ~~ frees'))))) |
77 end; |
78 end; |
78 in |
79 in |
79 map2 (fn d => fn T => fold_rev (make_inj T) (#3 (snd d)) []) |
80 map2 (fn d => fn T => fold_rev (make_inj T) (#3 (snd d)) []) |
80 (hd descr) (take (length (hd descr)) (Datatype_Aux.get_rec_types descr' sorts)) |
81 (hd descr) (take (length (hd descr)) (Datatype_Aux.get_rec_types descr' sorts)) |
81 end; |
82 end; |
93 (cname, map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs); |
94 (cname, map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs); |
94 |
95 |
95 fun make_distincts' _ [] = [] |
96 fun make_distincts' _ [] = [] |
96 | make_distincts' T ((cname, cargs) :: constrs) = |
97 | make_distincts' T ((cname, cargs) :: constrs) = |
97 let |
98 let |
98 val frees = map Free ((make_tnames cargs) ~~ cargs); |
99 val frees = map Free (make_tnames cargs ~~ cargs); |
99 val t = list_comb (Const (cname, cargs ---> T), frees); |
100 val t = list_comb (Const (cname, cargs ---> T), frees); |
100 |
101 |
101 fun make_distincts'' (cname', cargs') = |
102 fun make_distincts'' (cname', cargs') = |
102 let |
103 let |
103 val frees' = map Free (map (suffix "'") (make_tnames cargs') ~~ cargs'); |
104 val frees' = map Free (map (suffix "'") (make_tnames cargs') ~~ cargs'); |
345 (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, Datatype_Aux.mk_conj t1s)), |
346 (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, Datatype_Aux.mk_conj t1s)), |
346 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ Datatype_Aux.mk_disj t2s))) |
347 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ Datatype_Aux.mk_disj t2s))) |
347 end |
348 end |
348 |
349 |
349 in |
350 in |
350 map make_split |
351 map make_split (hd descr ~~ newTs ~~ make_case_combs new_type_names descr sorts thy "f") |
351 ((hd descr) ~~ newTs ~~ (make_case_combs new_type_names descr sorts thy "f")) |
|
352 end; |
352 end; |
353 |
353 |
354 (************************* additional rules for TFL ***************************) |
354 (************************* additional rules for TFL ***************************) |
355 |
355 |
356 fun make_weak_case_congs new_type_names descr sorts thy = |
356 fun make_weak_case_congs new_type_names descr sorts thy = |
398 |
398 |
399 fun mk_clause ((f, g), (cname, _)) = |
399 fun mk_clause ((f, g), (cname, _)) = |
400 let |
400 let |
401 val Ts = binder_types (fastype_of f); |
401 val Ts = binder_types (fastype_of f); |
402 val tnames = Name.variant_list used (make_tnames Ts); |
402 val tnames = Name.variant_list used (make_tnames Ts); |
403 val frees = map Free (tnames ~~ Ts) |
403 val frees = map Free (tnames ~~ Ts); |
404 in |
404 in |
405 list_all_free (tnames ~~ Ts, Logic.mk_implies |
405 list_all_free (tnames ~~ Ts, Logic.mk_implies |
406 (HOLogic.mk_Trueprop |
406 (HOLogic.mk_Trueprop |
407 (HOLogic.mk_eq (M', list_comb (Const (cname, Ts ---> T), frees))), |
407 (HOLogic.mk_eq (M', list_comb (Const (cname, Ts ---> T), frees))), |
408 HOLogic.mk_Trueprop |
408 HOLogic.mk_Trueprop |
431 |
431 |
432 fun mk_eqn T (cname, cargs) = |
432 fun mk_eqn T (cname, cargs) = |
433 let |
433 let |
434 val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs; |
434 val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs; |
435 val tnames = Name.variant_list ["v"] (make_tnames Ts); |
435 val tnames = Name.variant_list ["v"] (make_tnames Ts); |
436 val frees = tnames ~~ Ts |
436 val frees = tnames ~~ Ts; |
437 in |
437 in |
438 fold_rev (fn (s, T') => fn t => HOLogic.mk_exists (s, T', t)) frees |
438 fold_rev (fn (s, T') => fn t => HOLogic.mk_exists (s, T', t)) frees |
439 (HOLogic.mk_eq (Free ("v", T), |
439 (HOLogic.mk_eq (Free ("v", T), |
440 list_comb (Const (cname, Ts ---> T), map Free frees))) |
440 list_comb (Const (cname, Ts ---> T), map Free frees))) |
441 end; |
441 end; |