(* Title: FOL/ex/nat2.thy
ID: $Id: Nat2.thy,v 1.5 2005/09/03 15:15:52 wenzelm Exp $
Author: Tobias Nipkow
Copyright 1994 University of Cambridge
*)
header {* Theory for examples of simplification and induction on the natural numbers *}
theory Nat2
imports FOL
begin
typedecl nat
arities nat :: "term"
consts
succ :: "nat => nat"
pred :: "nat => nat"
0 :: nat ("0")
add :: "[nat,nat] => nat" (infixr "+" 90)
lt :: "[nat,nat] => o" (infixr "<" 70)
leq :: "[nat,nat] => o" (infixr "<=" 70)
axioms
pred_0: "pred(0) = 0"
pred_succ: "pred(succ(m)) = m"
plus_0: "0+n = n"
plus_succ: "succ(m)+n = succ(m+n)"
nat_distinct1: "~ 0=succ(n)"
nat_distinct2: "~ succ(m)=0"
succ_inject: "succ(m)=succ(n) <-> m=n"
leq_0: "0 <= n"
leq_succ_succ: "succ(m)<=succ(n) <-> m<=n"
leq_succ_0: "~ succ(m) <= 0"
lt_0_succ: "0 < succ(n)"
lt_succ_succ: "succ(m)<succ(n) <-> m<n"
lt_0: "~ m < 0"
nat_ind: "[| P(0); ALL n. P(n)-->P(succ(n)) |] ==> All(P)"
ML {* use_legacy_bindings (the_context ()) *}
end
theorem nat_exh:
[| P(0); !!x. P(succ(x)) |] ==> All(P)
theorem plus_0_right:
m + 0 = m
theorem plus_succ_right:
m + succ(n) = succ(m + n)
theorem le_imp_le_succ:
m <= n ==> m <= succ(n)
theorem le_plus:
m <= n --> m <= n + k
theorem succ_le:
succ(m) <= n --> m <= n
theorem not_less:
¬ m < n <-> n <= m
theorem le_imp_not_less:
n <= m --> ¬ m < n
theorem not_le:
m < n --> ¬ n <= m
theorem plus_le:
m + k <= n --> m <= n
theorem not0:
[| m ≠ 0; m <= n |] ==> n ≠ 0
theorem plus_le_plus:
a <= a' ∧ b <= b' --> a + b <= a' + b'
theorem le_trans:
i <= j --> j <= k --> i <= k
theorem less_le_trans:
i < j --> j <= k --> i < k
theorem succ_le2:
succ(i) <= j <-> i < j
theorem less_succ:
i < succ(j) <-> i = j ∨ i < j