pull/43/head
Jon Eugster 3 years ago
parent 695903f5d8
commit 8a9b1a25e8

@ -0,0 +1,9 @@
import TestGame.Levels.Inequality.L01_Induction
import TestGame.Levels.Inequality.L02_LE
import TestGame.Levels.Inequality.L03_Pos
import TestGame.Levels.Inequality.L04_Linarith
import TestGame.Levels.Inequality.L05_Linarith
Game "TestGame"
World "Inequality"
Title "Ungleichung"

@ -0,0 +1,42 @@
import TestGame.Metadata
Game "TestGame"
World "Inequality"
Level 1
Title "Induktion"
set_option tactic.hygienic false
Introduction
"
Hier lernst du Induktion und Ungleichungen kennen. Beides essenziele Grundlagen, die du
für spätere Aufgaben brauchst.
Die Leantaktik `induction n` führt einen Induktionsbeweis über `(n : )`. Hier zuerst
ein abstraktes Beispiel.
"
Statement
"Sei $P(n)$ eine logische Aussage über die natürliche Zahl.
Agenommen $P(0)$ ist wahr und $P(m) \\Rightarrow P(m+1)$ für alle $m$,
dann gilt $P(n)$ für alle $n \\in \\mathbb{N}.$"
(n : ) (P : → Prop) (h_base : P 0) (h_step : ∀ m, P m → P m.succ) : P n := by
induction n
assumption
apply h_step
assumption
-- TODO: Why are these not shown.
HiddenHint (n : ) (P : → Prop) : P n =>
"Benutze `induction n`."
Hint (P : → Prop) : P 0 =>
"Das ist die Induktionsverankerung, hier musst du $P(0)$ zeigen."
Hint (P : → Prop) (m : ) (hi : P m) : P (Nat.succ m) =>
"An der Stelle kommt der Beweis $P(m) \\Rightarrow P(m+1)$.
In diesem Beispiel kannst du `apply` benützen."
NewTactics induction

@ -0,0 +1,24 @@
import TestGame.Metadata
Game "TestGame"
World "Inequality"
Level 2
Title "Kleinergleich"
Introduction
"
Ungleichheiten werden in Lean generell immer als Kleinergleich `≤` (`\\le`) oder `<`
geschrieben.
Die Symbole `≥` und `>` gibt es zwar auch, sind aber nur Notation für die gleiche
Aussage mit `≤` und `<`.
Zudem sind `<` und `≤` auf `` so definiert, dass `0 < n` und `1 ≤ n` per Definition
äquivalent sind. Die folgende Aussage ist also mit `rfl` beweisbar.
"
Statement
"$0 < n$ und $1 ≤ n$ sind äquivalente Aussagen."
(n m : ) : m < n ↔ m.succ ≤ n := by
rfl

@ -0,0 +1,54 @@
import TestGame.Metadata
Game "TestGame"
World "Inequality"
Level 3
Title "Kleinergleich"
Introduction
"
Es gibt zwei intrinsische Möglichkeiten, zu sagen dass `(n : )` nicht Null ist:
`n ≠ 0` oder `0 < n`.
Das folgende Lemma kannst du immer brauchen um zwischen den beiden zu wechseln.
Note: `0 < n` wird in Lemmanamen oft mit `_pos` beschrieben anstatt `zero_lt`, siehe z.B.
`Nat.succ_pos`.
"
Statement zero_lt_iff
"$0 < n$ und $n \\ne 0$ sind äquivalente Aussagen."
(n : ) : 0 < n ↔ n ≠ 0 := by
constructor
intro h
by_contra g
rw [g] at h
contradiction
intro h
induction n
contradiction
apply Nat.succ_pos
NewLemmas Nat.succ_pos
Hint (n : ) (h : 0 < n) : n ≠ 0 =>
"An dieser Stelle fürst du am besten einen Beweis durch Widerspruch."
HiddenHint (n : ) (h : 0 < n) : n ≠ 0 =>
"Das macht man mit `by_contra`."
Hint (n : ) (h : 0 < n) (g : n = 0) : False =>
"Brauche `rw [_] at _` um eine Annahme `0 < 0` zu erzeugen."
HiddenHint (h : 0 < 0) : False =>
"Mit `contradiction` schliesst du den Widerspruchsbeweis."
Hint (n : ) (h : n ≠ 0) : 0 < n =>
"Diese Richtung beweist du am besten per Induktion."
HiddenHint (n : ) (h : n ≠ 0) : 0 < n =>
"Starte mit `induction n`."
Hint (m : ) : 0 < Nat.succ m =>
"Hier kannst du das Lemma `Nat.succ_pos` anwenden."

@ -0,0 +1,23 @@
import TestGame.Metadata
import Mathlib.Tactic.Linarith
Game "TestGame"
World "Inequality"
Level 4
Title "Linarith"
Introduction
"
Die Taktik `linarith` kann alle Systeme von linearen (Un-)gleichungen über ``, ``, etc. lösen.
Über `` ist sie etwas schwächer, aber einfache Aussagen kann sie trotzdem beweisen.
"
Statement
"Wenn $n \\ge 2$, zeige, dass $n$ nich Null sein kann."
(n : ) (h : 2 ≤ n) : n ≠ 0 := by
linarith
NewTactics linarith
NewLemmas zero_lt_iff

@ -0,0 +1,28 @@
import TestGame.Metadata
import Mathlib.Tactic.Linarith
Game "TestGame"
World "Inequality"
Level 5
Title "Linarith"
Introduction
"
Sobald man mit einem Ring arbeitet, der eine lineare Order hat (also z.B. `` oder ``),
ist `linarith` stärker und kann Systeme von Gleichungen und Ungleichungen angehen.
`linarith` kann aber nur mit linearen Ungleichungen umgehen, mit Termen der Form `x ^ 2`
kann es nicht umgehen.
"
Statement
"
Angenommen man hat für zwei Ganzzahlen $x, y$ folgende Ungleichungen.
$$
\\begin{aligned} 5 * y &\\le 35 - 2 * x \\\\ 2 * y &\\le x + 3 \\end{aligned}
$$
Zeige, dass $y \\le 5$.
"
(x y : ) (h₂ : 5 * y ≤ 35 - 2 * x) (h₃ : 2 * y ≤ x + 3) : y ≤ 5 := by
linarith

@ -0,0 +1,52 @@
import TestGame.Metadata
import Mathlib.Tactic.Ring
Game "TestGame"
World "Prime"
Level 1
Title "Teilbarkeit"
Introduction
"
Die Aussage \"$m$ teilt $n$.\" wird in Lean als `m | n` (`\\|`) geschrieben.
**Wichtig:** `` (Teilbarkeit) ist ein spezielles Unicode Symbol, das nicht dem
senkrechten Strich auf der Tastatur (`|`) entspricht. Man erhält es mit `\\|`.
`m n` bedeutet `∃ c, n = m * c`, das heisst, man kann damit genau gleich umgehen
wie mit einem `∃`-Quantifier.
"
Statement dvd_add
"Wenn $m$ ein Teiler von $n$ und $k$ ist, dann teilt es die Summe."
(n m k : ) (h : m n) (g : m k) : m n + k := by
rcases h with ⟨x, h⟩
rcases g with ⟨y, g⟩
use x + y
rw [h, g]
ring
HiddenHint (n : ) (m : ) (k : ) (h : m n) (g : m k) : m n + k =>
"
Wenn man explizit mit der Definition von Teilbarkeit arbeiten will,
sollte man als erstes alle Annahmen der Form `x y` mit `rcases` aufteilen.
"
HiddenHint (n : ) (m : ) (k : ) (x : ) (h : n = m * x) (g : m k) : m n + k =>
"
Wenn man explizit mit der Definition von Teilbarkeit arbeiten will,
sollte man als erstes alle Annahmen der Form `x y` mit `rcases` aufteilen.
"
HiddenHint (n : ) (m : ) (k : ) (y : ) (h : m n) (g : k = m * y) : m n + k =>
"
Wenn man explizit mit der Definition von Teilbarkeit arbeiten will,
sollte man als erstes alle Annahmen der Form `x y` mit `rcases` aufteilen.
"
HiddenHint (n : ) (m : ) (k : ) (x : ) (y : ) (h : n = m * x) (g : k = m * y) : m n + k =>
"
Jetzt kannst du mit `use` eine Zahl angeben, so dass $m * X = n + k$.
"
Loading…
Cancel
Save