equal
deleted
inserted
replaced
327 in (defs @ [get_def thy' (Sign.base_name name)], thy') |
327 in (defs @ [get_def thy' (Sign.base_name name)], thy') |
328 end) (([], thy), (hd descr) ~~ newTs ~~ case_names ~~ |
328 end) (([], thy), (hd descr) ~~ newTs ~~ case_names ~~ |
329 (take (length newTs, reccomb_names))); |
329 (take (length newTs, reccomb_names))); |
330 |
330 |
331 val case_thms = map (map (fn t => prove_goalw_cterm (case_defs @ |
331 val case_thms = map (map (fn t => prove_goalw_cterm (case_defs @ |
332 (map mk_meta_eq primrec_thms)) (cterm_of (sign_of thy2) t) |
332 (map meta_eq primrec_thms)) (cterm_of (sign_of thy2) t) |
333 (fn _ => [rtac refl 1]))) |
333 (fn _ => [rtac refl 1]))) |
334 (DatatypeProp.make_cases new_type_names descr sorts thy2); |
334 (DatatypeProp.make_cases new_type_names descr sorts thy2); |
335 |
335 |
336 val thy3 = Theory.add_trrules_i |
336 val thy3 = Theory.add_trrules_i |
337 (DatatypeProp.make_case_trrules new_type_names descr) thy2 |
337 (DatatypeProp.make_case_trrules new_type_names descr) thy2 |
397 val t::ts' = rev ts; |
397 val t::ts' = rev ts; |
398 val (_ $ (_ $ (_ $ (f $ _) $ _))) = hd (Logic.strip_imp_prems t); |
398 val (_ $ (_ $ (_ $ (f $ _) $ _))) = hd (Logic.strip_imp_prems t); |
399 val cert = cterm_of (sign_of thy2); |
399 val cert = cterm_of (sign_of thy2); |
400 val distinct_lemma' = cterm_instantiate |
400 val distinct_lemma' = cterm_instantiate |
401 [(cert distinct_f, cert f)] distinct_lemma; |
401 [(cert distinct_f, cert f)] distinct_lemma; |
402 val rewrites = ord_defs @ (map mk_meta_eq case_thms) |
402 val rewrites = ord_defs @ (map meta_eq case_thms) |
403 in |
403 in |
404 (map (fn t => prove_goalw_cterm rewrites (cert t) |
404 (map (fn t => prove_goalw_cterm rewrites (cert t) |
405 (fn _ => [rtac refl 1])) (rev ts')) @ [standard distinct_lemma'] |
405 (fn _ => [rtac refl 1])) (rev ts')) @ [standard distinct_lemma'] |
406 end) ((hd descr) ~~ (DatatypeProp.make_distincts new_type_names |
406 end) ((hd descr) ~~ (DatatypeProp.make_distincts new_type_names |
407 descr sorts thy2) ~~ dist_rewrites ~~ case_thms) |
407 descr sorts thy2) ~~ dist_rewrites ~~ case_thms) |
488 (def_name, Logic.mk_equals (Const (s, T --> HOLogic.natT), |
488 (def_name, Logic.mk_equals (Const (s, T --> HOLogic.natT), |
489 list_comb (Const (rec_name, fTs @ [T] ---> HOLogic.natT), fs)))) |
489 list_comb (Const (rec_name, fTs @ [T] ---> HOLogic.natT), fs)))) |
490 (size_names ~~ recTs ~~ def_names ~~ reccomb_names)); |
490 (size_names ~~ recTs ~~ def_names ~~ reccomb_names)); |
491 |
491 |
492 val size_def_thms = map (get_axiom thy') def_names; |
492 val size_def_thms = map (get_axiom thy') def_names; |
493 val rewrites = size_def_thms @ map mk_meta_eq primrec_thms; |
493 val rewrites = size_def_thms @ map meta_eq primrec_thms; |
494 |
494 |
495 val size_thms = map (fn t => prove_goalw_cterm rewrites |
495 val size_thms = map (fn t => prove_goalw_cterm rewrites |
496 (cterm_of (sign_of thy') t) (fn _ => [rtac refl 1])) |
496 (cterm_of (sign_of thy') t) (fn _ => [rtac refl 1])) |
497 (DatatypeProp.make_size new_type_names descr sorts thy') |
497 (DatatypeProp.make_size new_type_names descr sorts thy') |
498 |
498 |