import Game.Metadata
import Game.MyNat.LE
import Game.Tactic.Use
import Game.Levels.AdvAddition

World "LessOrEqual"
Level 1
Title "The `use` tactic"

namespace MyNat

/--
## Summary

The `use` tactic makes progress with goals which claim something *exists*.
If the goal claims that some `x` exists with some property, and you know
that `x = 37` will work, then `use 37` will make progress.

Because `a ≤ b` is notation for \"there exists `c` such that `b = a + c`\",
you can make progress on goals of the form `a ≤ b` by `use`ing the
number which is morally `b - a` (i.e. `use b - a`)

Any of the following examples is possible assuming the type of the argument passed to the `use` function is accurate:

- `use 37`
- `use a`
- `use a * a + 1`
-/
TacticDoc use

NewTactic use

/--
`a ≤ b` is *notation* for `∃ c, b = a + c`.

Because this game doesn't have negative numbers, this definition
is mathematically valid.

This means that if you have a goal of the form `a ≤ b` you can
make progress with the `use` tactic, and if you have a hypothesis
`h : a ≤ b`, you can make progress with `cases h with c hc`.
-/
DefinitionDoc LE as "≤"

NewDefinition LE

Introduction
"
`a ≤ b` is *notation* for `∃ c, b = a + c`. This \"backwards E\"
means \"there exists\". So `a ≤ b` means that there exists
a number `c` such that `b = a + c`. This definition works
because there are no negative numbers in this game.

To *prove* an \"exists\" statement, use the `use` tactic.
Let's see an example.
"

/--
`le_refl x` is a proof of `x ≤ x`.

The reason for the name is that this lemma is "reflexivity of $\le$"
-/
TheoremDoc MyNat.le_refl as "le_refl" in "≤"

/-- If $x$ is a number, then $x \le x$. -/
Statement le_refl (x : ℕ) : x ≤ x := by
  Hint "The reason `{x} ≤ {x}` is because `{x} = {x} + 0`.
  So you should start this proof with `use 0`."
  use 0
  Hint "You can probably take it from here."
  rw [add_zero]
  rfl


TheoremTab "≤"
