src/HOL/Tools/numeral_simprocs.ML
changeset 61150 d85d8f5e921b
parent 61144 5e94dfead1c2
child 61694 6571c78c9667
equal deleted inserted replaced
61149:3e28b08d62c0 61150:d85d8f5e921b
   582 fun dvd_cancel_factor ctxt ct = DvdCancelFactor.proc ctxt (Thm.term_of ct)
   582 fun dvd_cancel_factor ctxt ct = DvdCancelFactor.proc ctxt (Thm.term_of ct)
   583 fun divide_cancel_factor ctxt ct = DivideCancelFactor.proc ctxt (Thm.term_of ct)
   583 fun divide_cancel_factor ctxt ct = DivideCancelFactor.proc ctxt (Thm.term_of ct)
   584 
   584 
   585 local
   585 local
   586 
   586 
   587 val zr = @{cpat "0"}
   587 val cterm_of = Thm.cterm_of @{context};
   588 val zT = Thm.ctyp_of_cterm zr
   588 fun tvar S = (("'a", 0), S);
   589 val geq = @{cpat HOL.eq}
   589 
   590 val eqT = Thm.dest_ctyp (Thm.ctyp_of_cterm geq) |> hd
   590 val zero_tvar = tvar @{sort zero};
       
   591 val zero = cterm_of (Const (@{const_name zero_class.zero}, TVar zero_tvar));
       
   592 
       
   593 val type_tvar = tvar @{sort type};
       
   594 val geq = cterm_of (Const (@{const_name HOL.eq}, TVar type_tvar --> TVar type_tvar --> @{typ bool}));
       
   595 
   591 val add_frac_eq = mk_meta_eq @{thm "add_frac_eq"}
   596 val add_frac_eq = mk_meta_eq @{thm "add_frac_eq"}
   592 val add_frac_num = mk_meta_eq @{thm "add_frac_num"}
   597 val add_frac_num = mk_meta_eq @{thm "add_frac_num"}
   593 val add_num_frac = mk_meta_eq @{thm "add_num_frac"}
   598 val add_num_frac = mk_meta_eq @{thm "add_num_frac"}
   594 
   599 
   595 fun prove_nz ctxt T t =
   600 fun prove_nz ctxt T t =
   596   let
   601   let
   597     val z = Thm.instantiate_cterm ([(dest_TVar (Thm.typ_of zT), T)],[]) zr
   602     val z = Thm.instantiate_cterm ([(zero_tvar, T)], []) zero
   598     val eq = Thm.instantiate_cterm ([(dest_TVar (Thm.typ_of eqT), T)],[]) geq
   603     val eq = Thm.instantiate_cterm ([(type_tvar, T)], []) geq
   599     val th = Simplifier.rewrite (ctxt addsimps @{thms simp_thms})
   604     val th =
   600          (Thm.apply @{cterm "Trueprop"} (Thm.apply @{cterm "Not"}
   605       Simplifier.rewrite (ctxt addsimps @{thms simp_thms})
   601                 (Thm.apply (Thm.apply eq t) z)))
   606         (Thm.apply @{cterm "Trueprop"} (Thm.apply @{cterm "Not"}
   602   in Thm.equal_elim (Thm.symmetric th) TrueI
   607           (Thm.apply (Thm.apply eq t) z)))
   603   end
   608   in Thm.equal_elim (Thm.symmetric th) TrueI end
   604 
   609 
   605 fun proc ctxt ct =
   610 fun proc ctxt ct =
   606   let
   611   let
   607     val ((x,y),(w,z)) =
   612     val ((x,y),(w,z)) =
   608          (Thm.dest_binop #> (fn (a,b) => (Thm.dest_binop a, Thm.dest_binop b))) ct
   613          (Thm.dest_binop #> (fn (a,b) => (Thm.dest_binop a, Thm.dest_binop b))) ct