1
Fork 0
solar-conflux/lean/learning/LeanSandbox/Nat.lean

56 lines
1.8 KiB
Plaintext

namespace Nat
theorem add_equations: ∀{a b c d: Nat}, a = b → c = d → a + c = b + d := by
intro a b c d ab cd
rw [ab, cd]
theorem add_to_equation_right: ∀{a b c: Nat}, a = b → a + c = b + c := by
intro a b c ab
exact add_equations ab rfl
theorem succ_equation : ∀{a b: Nat}, Nat.succ a = Nat.succ b → a = b := by
intro a b
apply Eq.mp -- (a + 1 = b + 1) = a + b
apply Nat.succ.injEq -- this was already here?
inductive A : Nat -> Type
| ooo: (n: Nat) → A n
theorem subtract_to_equation_right: ∀{a b c: Nat}, a + c = b + c → a = b := by
intro a b c acbc
induction c with
| zero =>
repeat rw [Nat.add_zero] at acbc
exact acbc
| succ pc inner =>
/-
a + S pc = b + S pc -- comm
S pc + a = S pc + b -- addition definition
S (pc + a) = S (pc + b) -- injective constructor
pc + a = pc + b
-/
rw [Nat.add_comm a (Nat.succ pc), Nat.add_comm b (Nat.succ pc)] at acbc
simp [Nat.succ_add, Nat.add_comm] at acbc
exact (inner acbc)
theorem subtract_to_equation_left: ∀{a b c: Nat}, c + a = c + b → a = b := by
intro a b c cacb
rw [Nat.add_comm c a, Nat.add_comm c b] at cacb
exact (subtract_to_equation_right cacb)
theorem add_equation_both_sides_right: ∀{a b c: Nat}, (a = b) ↔ (a + c = b + c) := by
intro a b c
apply Iff.intro
. exact add_to_equation_right
. exact subtract_to_equation_right
theorem multiply_equation_left: ∀{a b c: Nat}, (a = b) → (c * a = c * b) := by
intro a b c ab
rw [ab]
theorem double.addition_is_multiplication (x: Nat): 2 * x = x + x := by
induction x with
| zero => simp
| succ px ic =>
simp [<-Nat.add_one, Nat.left_distrib, ic, Nat.add_left_comm, Nat.add_assoc]
end Nat