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 |