From 0d805055ff5ca5663b48f6adcf7a5df7851d9500 Mon Sep 17 00:00:00 2001 From: Josh Chen Date: Mon, 25 May 2020 16:01:38 +0200 Subject: some arithmetic --- hott/Nat.thy | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) (limited to 'hott/Nat.thy') diff --git a/hott/Nat.thy b/hott/Nat.thy index bd58fbc..4825404 100644 --- a/hott/Nat.thy +++ b/hott/Nat.thy @@ -18,8 +18,8 @@ where NatE: "\ n: Nat; c\<^sub>0: C 0; - \n. n: Nat \ C n: U i; - \k c. \k: Nat; c: C k\ \ f k c: C (suc k) + \k c. \k: Nat; c: C k\ \ f k c: C (suc k); + \n. n: Nat \ C n: U i \ \ NatInd (\n. C n) c\<^sub>0 (\k c. f k c) n: C n" and Nat_comp_zero: "\ @@ -56,44 +56,57 @@ lemma add_type [typechk]: shows "m + n: Nat" unfolding add_def by typechk -lemma add_rec [comps]: - assumes "m: Nat" "n: Nat" - shows "suc m + n \ suc (m + n)" - unfolding add_def by reduce - 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 (elim IH; 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 (elim IH; 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[sym]) - \ vars m p - apply (elim n) - (*Should also change the `n`s in the premises!*) - (*FIXME: Elimination tactic needs to do the same kind of thing as the - equality tactic with pushing context premises into the statement, applying - the appropriate elimination rule and then pulling back out.*) -oops + \ by (reduce; rule add_zero[symmetric]) + \ prems prms 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 reduce + qed + done definition mul (infixl "*" 120) where [comps]: "m * n \ NatRec Nat 0 (K $ add n) m" -- cgit v1.2.3