src/HOL/Tools/datatype_abs_proofs.ML
changeset 5303 22029546d109
parent 5177 0d3a168e4d44
child 5553 ae42b36a50c2
equal deleted inserted replaced
5302:b8598e4fb73e 5303:22029546d109
   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