|
|
import TestGame.Metadata
|
|
|
|
|
|
Game "TestGame"
|
|
|
World "TestWorld"
|
|
|
Level 4
|
|
|
|
|
|
Title "Addition"
|
|
|
|
|
|
Introduction
|
|
|
"
|
|
|
Peano defined addition `a + b` by induction on `b`, or,
|
|
|
more precisely, by *recursion* on `b`. He first explained how to add 0 to a number:
|
|
|
this is the base case.
|
|
|
|
|
|
* `add_zero (a : ℕ) : a + 0 = a`
|
|
|
|
|
|
We will call this theorem `add_zero`. It has just appeared in your inventory!
|
|
|
Mathematicians sometimes call it \"Lemma 2.1\" or \"Hypothesis P6\" or something. But
|
|
|
computer scientists call it `add_zero` because it tells you
|
|
|
what the answer to \"$x$ add zero\" is. It's a *much* better name than \"Lemma 2.1\".
|
|
|
Even better, we can use the rewrite tactic with `add_zero`.
|
|
|
If you ever see `x + 0` in your goal, `rewrite [add_zero]` will simplify it to `x`.
|
|
|
This is because `add_zero` is a proof that `x + 0 = x` (more precisely,
|
|
|
`add_zero x` is a proof that `x + 0 = x` but Lean can figure out the `x` from the context).
|
|
|
|
|
|
Now here's the inductive step. If you know how to add `d` to `a`, then
|
|
|
Peano tells you how to add `succ(d)` to `a`. It looks like this:
|
|
|
|
|
|
* `add_succ (a d : ℕ) : a + succ(d) = succ (a + d)`
|
|
|
|
|
|
What's going on here is that we assume `a + d` is already
|
|
|
defined, and we define `a + succ(d)` to be the number after it.
|
|
|
This is also in your inventory now -- `add_succ` tells you
|
|
|
how to add a successor to something. If you ever see `... + succ ...`
|
|
|
in your goal, you should be able to use `rewrite [add_succ]` to make
|
|
|
progress. Here is a simple example where we shall see both. Let's prove
|
|
|
that $x$ add the number after $0$ is the number after $x$.
|
|
|
|
|
|
Observe that the goal mentions `... + succ ...`. So type
|
|
|
|
|
|
`rewrite [add_succ]`
|
|
|
|
|
|
and hit enter; see the goal change.
|
|
|
"
|
|
|
|
|
|
Statement (a : ℕ ) : a + succ 0 = succ a := by
|
|
|
rewrite [add_succ]
|
|
|
rewrite [add_zero]
|
|
|
rfl
|
|
|
|
|
|
Message (a : ℕ) : succ (a + 0) = succ a => "
|
|
|
Do you see that the goal now mentions ` ... + 0 ...`? So type
|
|
|
|
|
|
`rewrite [add_zero]`
|
|
|
|
|
|
and try to finish the level alone from there.
|
|
|
"
|
|
|
|
|
|
Conclusion "Congratulations for completing your fourth level! This is the end of the tutorial part
|
|
|
of the game. Serious things start in the next level."
|
|
|
|
|
|
Tactics rfl rewrite
|
|
|
|
|
|
Lemmas add_succ add_zero |