(* Author: Markus Wenzel, Stefan Berghofer, and Tobias Nipkow Author: Brian Huffman
Basic arithmetic for natural numbers.
*)
signature NAT_ARITH = sig val cancel_diff_conv: Proof.context -> conv val cancel_eq_conv: Proof.context -> conv val cancel_le_conv: Proof.context -> conv val cancel_less_conv: Proof.context -> conv end;
structure Nat_Arith: NAT_ARITH = struct
val norm_rules = map mk_meta_eq @{thms add_0_left add_0_right}
fun add_atoms path \<^Const_>\<open>plus _ for x y\<close> =
add_atoms (@{thm nat_arith.add1}::path) x #>
add_atoms (@{thm nat_arith.add2}::path) y
| add_atoms path \<^Const_>\<open>Suc for x\<close> =
add_atoms (@{thm nat_arith.suc1}::path) x
| add_atoms _ \<^Const_>\<open>Groups.zero _\<close> = I
| add_atoms path x = cons (x, path)
fun atoms t = add_atoms [] t []
exception Cancel
fun find_common ord xs ys = let funfind (xs as (x, px)::xs') (ys as (y, py)::ys') =
(caseord (x, y) of
EQUAL => (px, py)
| LESS => find xs' ys
| GREATER => find xs ys')
| find _ _ = raise Cancel funord' ((x, _), (y, _)) = ord (x, y) in find (sort ord' xs) (sort ord' ys) end
fun cancel_conv rule ctxt ct = let val ((_, lhs), rhs) = (apfst dest_comb o dest_comb) (Thm.term_of ct) val (lpath, rpath) = find_common Term_Ord.term_ord (atoms lhs) (atoms rhs) val lconv = move_to_front ctxt lpath val rconv = move_to_front ctxt rpath val conv1 = Conv.combination_conv (Conv.arg_conv lconv) rconv val conv = conv1 then_conv Conv.rewr_conv rule in conv ct end handle Cancel => raise CTERM ("no_conversion", [])
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.14Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.