|
|
import NNG.Levels.Function.Level_1
|
|
|
import NNG.Levels.Function.Level_2
|
|
|
import NNG.Levels.Function.Level_3
|
|
|
import NNG.Levels.Function.Level_4
|
|
|
import NNG.Levels.Function.Level_5
|
|
|
import NNG.Levels.Function.Level_6
|
|
|
import NNG.Levels.Function.Level_7
|
|
|
import NNG.Levels.Function.Level_8
|
|
|
import NNG.Levels.Function.Level_9
|
|
|
|
|
|
|
|
|
Game "NNG"
|
|
|
World "Function"
|
|
|
Title "Function World"
|
|
|
|
|
|
Introduction
|
|
|
"
|
|
|
If you have beaten Addition World, then you have got
|
|
|
quite good at manipulating equalities in Lean using the `rw` tactic.
|
|
|
But there are plenty of levels later on which will require you
|
|
|
to manipulate functions, and `rw` is not the tool for you here.
|
|
|
|
|
|
To manipulate functions effectively, we need to learn about a new collection
|
|
|
of tactics, namely `exact`, `intro`, `have` and `apply`. These tactics
|
|
|
are specially designed for dealing with functions. Of course we are
|
|
|
ultimately interested in using these tactics to prove theorems
|
|
|
about the natural numbers – but in this
|
|
|
world there is little point in working with specific sets like `mynat`,
|
|
|
everything works for general sets.
|
|
|
|
|
|
So our notation for this level is: $P$, $Q$, $R$ and so on denote general sets,
|
|
|
and $h$, $j$, $k$ and so on denote general
|
|
|
functions between them. What we will learn in this world is how to use functions
|
|
|
in Lean to push elements from set to set. A word of warning –
|
|
|
even though there's no harm at all in thinking of $P$ being a set and $p$
|
|
|
being an element, you will not see Lean using the notation $p\\in P$, because
|
|
|
internally Lean stores $P$ as a \"Type\" and $p$ as a \"term\", and it uses `p : P`
|
|
|
to mean \"$p$ is a term of type $P$\", Lean's way of expressing the idea that $p$
|
|
|
is an element of the set $P$. You have seen this already – Lean has
|
|
|
been writing `n : ℕ` to mean that $n$ is a natural number.
|
|
|
" |