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)" section \Basic arithmetic\ definition add (infixl "+" 120) where "m + n \ NatRec Nat n (K suc) m" lemma add_type [typechk]: assumes "m: Nat" "n: Nat" shows "m + n: Nat" unfolding add_def by typechk lemma zero_add [comps]: assumes "n: Nat" shows "0 + n \ n" unfolding add_def by reduce lemma suc_add [comps]: assumes "m: Nat" "n: Nat" shows "suc m + n \ suc (m + n)" unfolding add_def by reduce Lemma (derive) add_zero: assumes "n: Nat" shows "n + 0 = n" apply (elim n) \ by (reduce; intro) \ vars _ ih by reduce (eq ih; intro) done Lemma (derive) add_suc: assumes "m: Nat" "n: Nat" shows "m + suc n = suc (m + n)" apply (elim m) \ by reduce intro \ vars _ ih by reduce (eq ih; intro) done Lemma (derive) suc_monotone: 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 l) \ 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 m) \ by (reduce; rule add_zero[symmetric]) \ prems vars m ih proof reduce have "suc (m + n) = suc (n + m)" by (eq ih) intro also have ".. = n + suc m" by (rule add_suc[symmetric]) finally show "suc (m + n) = n + suc m" by this qed done definition mul (infixl "*" 120) where [comps]: "m * n \ NatRec Nat 0 (K $ add n) m" end