import TestGame.Metadata Game "TestGame" World "TestWorld" Level 3 Title "Peano's axioms" Introduction " The team that salvaged the type `ℕ` of natural numbers actually got us three things: * a term `0 : ℕ`, interpreted as the number zero. * a function `succ : ℕ → ℕ`, with `succ n` interpreted as \"the number after $n$\". * The principle of mathematical induction. These are essentially the axioms isolated by Peano which uniquely characterise the natural numbers (we also need recursion, but we can ignore it for now). The first axiom says that $0$ is a natural number. The second says that there is a `succ` function which eats a number and spits out the number after it, so $\\operatorname{succ}(0)=1$, $\\operatorname{succ}(1)=2$ and so on. Peano's last axiom is the principle of mathematical induction. This is a deeper fact. It says that if we have infinitely many true/false statements $P(0)$, $P(1)$, $P(2)$ and so on, and if $P(0)$ is true, and if for every natural number $d$ we know that $P(d)$ implies $P(\\operatorname{succ}(d))$, then $P(n)$ must be true for every natural number $n$. It's like saying that if you have a long line of dominoes, and if you knock the first one down, and if you know that if a domino falls down then the one after it will fall down too, then you can deduce that all the dominos will fall down. One can also think of it as saying that every natural number can be built by starting at `0` and then applying `succ` a finite number of times. Peano's insights were firstly that these axioms completely characterise the natural numbers, and secondly that these axioms alone can be used to build a whole bunch of other structure on the natural numbers, for example addition, multiplication and so on. This game is all about seeing how far these axioms of Peano can take us. Let's practice our use of the `rewrite` tactic in the following example. Our hypothesis `h` is a proof that `succ(a) = b` and we want to prove that `succ(succ(a))=succ(b)`. In words, we're going to prove that if `b` is the number after `a` then `succ(b)` is the number after `succ(a)`. Note that the system drops brackets when they're not necessary, so `succ b` just means `succ(b)`. Now here's a tricky question. Knowing that our goal is `succ (succ a) = succ b`, and our assumption is `h : succ a = b`, then what will the goal change to when we type `rewrite [h]` and hit enter? Remember that `rewrite [h]` will look for the *left* hand side of `h` in the goal, and will replace it with the *right* hand side. Try and figure out how the goal will change, and then try it. " Statement (a b : ℕ) (h : succ a = b) : succ (succ a) = succ b := by rewrite [h] rfl Message (a : ℕ) (b : ℕ) (h : succ a = b) : succ b = succ b => " Look: Lean changed `succ a` into `b`, so the goal became `succ b = succ b`. That goal is of the form `X = X`, so you know what to do. " Conclusion "Congratulations for completing the third level! You may be wondering whether we could have just substituted in the definition of `b` and proved the goal that way. To do that, we would want to replace the right hand side of `h` with the left hand side. You do this in Lean by writing `rewrite [<- h]`. You get the left-arrow by typing `\\l` and then a space; note that this is a small letter L, not a number 1. You can just edit your proof and try it. You may also be wondering why we keep writing `succ(b)` instead of `b+1`. This is because we haven't defined addition yet! On the next level, the final level of the tutorial, we will introduce addition, and then we'll be ready to enter Addition World. " Tactics rfl rewrite