theory Nat imports Identity begin axiomatization Nat :: \o\ and zero :: \o\ ("0") and suc :: \o \ o\ and NatInd :: \(o \ o) \ o \ (o \ o \ o) \ o \ o\ where NatF: "Nat: U i" and Nat_zero: "0: Nat" and Nat_suc: "n: Nat \ suc n: Nat" and NatE: "\ n: Nat; c\<^sub>0: C 0; \k rec. \k: Nat; rec: C k\ \ f k rec: C (suc k); \n. n: Nat \ C n: U i \ \ NatInd (\n. C n) c\<^sub>0 (\k rec. f k rec) n: C n" and Nat_comp_zero: "\ c\<^sub>0: C 0; \k rec. \k: Nat; rec: C k\ \ f k rec: C (suc k); \n. n: Nat \ C n: U i \ \ NatInd (\n. C n) c\<^sub>0 (\k rec. f k rec) 0 \ c\<^sub>0" and Nat_comp_suc: "\ n: Nat; c\<^sub>0: C 0; \k rec. \k: Nat; rec: C k\ \ f k rec: C (suc k); \n. n: Nat \ C n: U i \ \ NatInd (\n. C n) c\<^sub>0 (\k rec. f k rec) (suc n) \ f n (NatInd (\n. C n) c\<^sub>0 (\k rec. f k rec) n)" lemmas [intros] = NatF Nat_zero Nat_suc and [elims "?n"] = NatE and [comps] = Nat_comp_zero Nat_comp_suc text \Non-dependent recursion\ abbreviation "NatRec C \ NatInd (\_. C)" text \Manual notation for now:\ abbreviation one ("1") where "1 \ suc 0" abbreviation two ("2") where "2 \ suc 1" abbreviation three ("3") where "3 \ suc 2" abbreviation four ("4") where "4 \ suc 3" abbreviation five ("5") where "5 \ suc 4" abbreviation six ("6") where "6 \ suc 5" abbreviation seven ("7") where "7 \ suc 6" abbreviation eight ("8") where "8 \ suc 7" abbreviation nine ("9") where "9 \ suc 8" section \Basic arithmetic\ subsection \Addition\ definition add (infixl "+" 120) where "m + n \ NatRec Nat m (K suc) n" lemma add_type [typechk]: assumes "m: Nat" "n: Nat" shows "m + n: Nat" unfolding add_def by typechk lemma add_zero [comps]: assumes "m: Nat" shows "m + 0 \ m" unfolding add_def by reduce lemma add_suc [comps]: assumes "m: Nat" "n: Nat" shows "m + suc n \ suc (m + n)" unfolding add_def by reduce Lemma (derive) zero_add: assumes "n: Nat" shows "0 + n = n" apply (elim n) \ by (reduce; intro) \ vars _ ih by reduce (eq ih; intro) done Lemma (derive) suc_add: assumes "m: Nat" "n: Nat" shows "suc m + n = suc (m + n)" apply (elim n) \ by reduce refl \ vars _ ih by reduce (eq ih; intro) done Lemma (derive) suc_eq: assumes "m: Nat" "n: Nat" shows "p: m = n \ suc m = suc n" by (eq p) intro Lemma (derive) add_assoc: assumes "l: Nat" "m: Nat" "n: Nat" shows "l + (m + n) = (l + m) + n" apply (elim n) \ by reduce intro \ vars _ ih by reduce (eq ih; intro) done Lemma (derive) add_comm: assumes "m: Nat" "n: Nat" shows "m + n = n + m" apply (elim n) \ by (reduce; rule zero_add[symmetric]) \ prems vars n ih proof reduce have "suc (m + n) = suc (n + m)" by (eq ih) intro also have ".. = suc n + m" by (rule suc_add[symmetric]) finally show "suc (m + n) = suc n + m" by this qed done subsection \Multiplication\ definition mul (infixl "*" 121) where "m * n \ NatRec Nat 0 (K $ add m) n" lemma mul_type [typechk]: assumes "m: Nat" "n: Nat" shows "m * n: Nat" unfolding mul_def by typechk lemma mul_zero [comps]: assumes "n: Nat" shows "n * 0 \ 0" unfolding mul_def by reduce lemma mul_one [comps]: assumes "n: Nat" shows "n * 1 \ n" unfolding mul_def by reduce lemma mul_suc [comps]: assumes "m: Nat" "n: Nat" shows "m * suc n \ m + m * n" unfolding mul_def by reduce end