(* Title: FOL/ex/Natural_Numbers.thy
Author: Markus Wenzel, TU Munich
*)
section ‹ Natural numbers›
theory Natural_Numbers
imports FOL
begin
text ‹
Theory of the natural numbers: Peano's axioms, primitive recursion.
(Modernized version of Larry Paulson's theory "Nat".) \medskip
›
typedecl nat
instance nat :: ‹ term › ..
axiomatization
Zero :: ‹ nat› (‹ 0› ) and
Suc :: ‹ nat => nat› and
rec :: ‹ [nat, 'a, [nat, ' a] => 'a] => ' a›
where
induct [case_names 0 Suc, induct type: nat]:
‹ P(0) ==> (!!x. P(x) ==> P(Suc(x))) ==> P(n)› and
Suc_inject: ‹ Suc(m) = Suc(n) ==> m = n› and
Suc_neq_0: ‹ Suc(m) = 0 ==> R› and
rec_0: ‹ rec(0, a, f) = a› and
rec_Suc: ‹ rec(Suc(m), a, f) = f(m, rec(m, a, f))›
lemma Suc_n_not_n: ‹ Suc(k) ≠ k›
proof (induct ‹ k› )
show ‹ Suc(0) ≠ 0›
proof
assume ‹ Suc(0) = 0›
then show ‹ False› by (rule Suc_neq_0)
qed
next
fix n assume hyp: ‹ Suc(n) ≠ n›
show ‹ Suc(Suc(n)) ≠ Suc(n)›
proof
assume ‹ Suc(Suc(n)) = Suc(n)›
then have ‹ Suc(n) = n› by (rule Suc_inject)
with hyp show ‹ False› by contradiction
qed
qed
definition add :: ‹ nat => nat => nat› (infixl ‹ +› 60)
where ‹ m + n = rec(m, n, λx y. Suc(y))›
lemma add_0 [simp]: ‹ 0 + n = n›
unfolding add_def by (rule rec_0)
lemma add_Suc [simp]: ‹ Suc(m) + n = Suc(m + n)›
unfolding add_def by (rule rec_Suc)
lemma add_assoc: ‹ (k + m) + n = k + (m + n)›
by (induct ‹ k› ) simp_all
lemma add_0_right: ‹ m + 0 = m›
by (induct ‹ m› ) simp_all
lemma add_Suc_right: ‹ m + Suc(n) = Suc(m + n)›
by (induct ‹ m› ) simp_all
lemma
assumes ‹ !!n. f(Suc(n)) = Suc(f(n))›
shows ‹ f(i + j) = i + f(j)›
using assms by (induct ‹ i› ) simp_all
end
Messung V0.5 C=98 H=99 G=98
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland