import NNG.Metadata
import NNG.MyNat.Addition

Game "NNG"
World "Addition"
Level 2
Title "add_assoc (associativity of addition)"

open MyNat

namespace AdditionWorld

theorem zero_add (n : ℕ) : 0 + n = n := by
  induction n with n hn
  · rw [add_zero]
    rfl
  · rw [add_succ]
    rw [hn]
    rfl

Introduction
"
It's well-known that $(1 + 2) + 3 = 1 + (2 + 3)$; if we have three numbers
to add up, it doesn't matter which of the additions we do first. This fact
is called *associativity of addition* by mathematicians, and it is *not*
obvious. For example, subtraction really is not associative: $(6 - 2) - 1$
is really not equal to $6 - (2 - 1)$. We are going to have to prove
that addition, as defined the way we've defined it, is associative.

See if you can prove associativity of addition.
"

Statement add_assoc
"On the set of natural numbers, addition is associative.
In other words, for all natural numbers $a, b$ and $c$, we have
$ (a + b) + c = a + (b + c). $"
    (a b c : ℕ) : (a + b) + c = a + (b + c)  := by
  Hint "Because addition was defined by recursion on the right-most variable,
  use induction on the right-most variable (try other variables at your peril!).

  Note that when Lean writes `a + b + c`, it means `(a + b) + c`. If it wants to talk
  about `a + (b + c)` it will put the brackets in explictly."
  Branch
    induction a
    Hint "Good luck with that…"
    rw [zero_add, zero_add]
    rfl
  Branch
    induction b
    Hint "Good luck with that…"
  induction c with c hc
  Hint (hidden := true) "look at the lemma `add_zero`."
  rw [add_zero]
  Hint "`rw [add_zero]` only rewrites one term of the form `… + 0`, so you might to
  use it multiple times."
  rw [add_zero]
  rfl
  Hint (hidden := true) "`add_succ` might help here."
  rw [add_succ]
  rw [add_succ]
  rw [add_succ]
  Hint (hidden := true) "Now you can use the induction hypothesis."
  rw [hc]
  rfl


Conclusion
"

"

NewLemma MyNat.zero_add