rename testgame to adam
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
|
||||
set_option tactic.hygienic false
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 1
|
||||
|
||||
Title "Simp"
|
||||
|
||||
Introduction
|
||||
"
|
||||
**Unbekannte**: Willkommen auf *Indu*, unserem Planeten! Bevor ich euch herumzeigen will,
|
||||
sagt mir, ob ihr unsere Lebensweise zu verstehen und schätzen wisst:
|
||||
In diesem Kapitel lernen wir endliche Summen und mehr Übungen zur Induktion.
|
||||
|
||||
"
|
||||
|
||||
-- Eine endliche Summe läuft erstmal immer über einen endlichen Index
|
||||
-- `Fin n`, welcher $n$ Elemente
|
||||
-- $\\{0, 1, \\ldots, n-1\\}$ beinhaltet.
|
||||
|
||||
-- Der Syntax für $\\sum_{i=0}^n a_i$ ist `∑ i : Fin n, _` (\\sum)
|
||||
|
||||
-- Als erstes kann die Taktik `simp` (für \"simplification\") ganz viel Triviales vereinfachen.
|
||||
-- `simp` ist eine der stärksten Taktiken in Lean und verwendet
|
||||
-- ganz viele markierte Lemmas um das Goal zu vereinfachen.
|
||||
|
||||
-- Zum Beispiel kennt es ein Lemma das ungefähr so aussieht:
|
||||
|
||||
-- ```
|
||||
-- @[simp]
|
||||
-- lemma sum_const_add (n : ℕ) : (∑ i in Fin n, 0) = 0 := by
|
||||
-- sorry
|
||||
-- ```
|
||||
|
||||
-- Die Taktik `simp` benützt alle Lemmas, die mit `@[simp]` markiert sind.
|
||||
|
||||
-- (Tipp: `simp?` zeigt an, welche Lemmas `simp` benutzen würde.)
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement (n : ℕ) : (∑ i : Fin n, (0 + 0)) = 0 := by
|
||||
Hint "BUG"
|
||||
|
||||
-- TODO (Bug): Invalid escape sequence:
|
||||
-- "**Du**: Oh das ist ganz schön viel neues… Mal sehen, das sagt wohl
|
||||
-- $( \\sum_i 0 + 0 ) = 0$. Dann ist das vielleicht doch nicht so komplex.
|
||||
|
||||
-- **Robo**: Genau! Man schreibt `\\sum`. Beachte den Index:
|
||||
-- $( \\sum_\{i=0}^\{n-1} 0 + 0 ) = 0$, also `Fin n` ist ein Typ mit den Elementen
|
||||
-- $\\{0, \\ldots, n-1\\}$.
|
||||
|
||||
-- **Du**: Oke, also `Fin n` hat `n` Elemente. Und was mach ich jetzt?
|
||||
|
||||
-- **Robo**: `simp` ist eine ganz starke Taktik, die viele Terme vereinfacht, wir
|
||||
-- fangen besser an, diese zu benützen.
|
||||
|
||||
-- Irgendwie hast du das Gefühl ein Déjà-vue zu haben…"
|
||||
simp
|
||||
|
||||
OnlyTactic simp
|
||||
|
||||
Conclusion "**Unbekannte**: Sehr gut, folgt mir!"
|
||||
@@ -0,0 +1,54 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import Mathlib
|
||||
|
||||
set_option tactic.hygienic false
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 2
|
||||
|
||||
Title "endliche Summe"
|
||||
|
||||
Introduction
|
||||
"
|
||||
Während euch die Person zu einem besonders herausragenden Steinturm führt, löchert
|
||||
sie euch noch weiter mit Fragen.
|
||||
"
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement
|
||||
"$\\sum_{i=0}^{n-1} (i + 1) = n + \\sum_{i=0}^{n-1} i$."
|
||||
(n : ℕ) : ∑ i : Fin n, ((i : ℕ) + 1) = n + (∑ i : Fin n, (i : ℕ)) := by
|
||||
-- Hint "**Du**: Hmm, wieder `simp`?
|
||||
|
||||
-- **Robo**: Nicht ganz. `simp` benützt nur Lemmas, die klar eine Vereinfachung darstellen,
|
||||
-- und in deiner Bibliothek mit `@[simp]` markiert wird. Hier brauchen wir eine andere
|
||||
-- Umformung:
|
||||
|
||||
-- $$
|
||||
-- \\sum_\{i = 0}^n a_i + b_i = \\sum_\{i = 0}^n a_i + \\sum_\{j = 0}^n b_j
|
||||
-- $$
|
||||
|
||||
-- **Robo*: Da unklar ist, welche Seite \"einfacher\" ist, wird so ein Lemma nicht mit
|
||||
-- `@[simp]` markiert. Das heisst du musst `Finset.sum_add_distrib` mit `rw`
|
||||
-- explizit anwenden.
|
||||
-- "
|
||||
rw [Finset.sum_add_distrib]
|
||||
Hint "**Robo**: Die zweite Summe `∑ x : Fin n, 1` kann jetzt aber mit
|
||||
`simp` zu `n` vereinfacht werden."
|
||||
simp
|
||||
Hint "**Robo**: Bis auf Umordnung sind jetzt beide Seiten gleich!
|
||||
|
||||
**Du**: Dann greift jetzt wohl `ring`!
|
||||
|
||||
**Robo**: Genau! Und alternativ könntest du mit `rw [add_comm]` die Arbeit von `ring`
|
||||
auch manuell machen."
|
||||
ring
|
||||
|
||||
NewLemma Finset.sum_add_distrib add_comm
|
||||
|
||||
Conclusion "Eure Begleitung scheint mit der Antwort zu frieden zu sein und zeigt
|
||||
freudig an dem Turm empor, den ihr soeben erreicht habt."
|
||||
@@ -0,0 +1,89 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import Mathlib.Algebra.BigOperators.Fin
|
||||
import Mathlib.Tactic.Ring
|
||||
|
||||
import TestGame.ToBePorted
|
||||
|
||||
set_option tactic.hygienic false
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 3
|
||||
|
||||
Title "Arithmetische Summe"
|
||||
|
||||
Introduction
|
||||
"
|
||||
**Du**: Wie werden solche Meisterwerke eigentlich gebaut?
|
||||
|
||||
Da zeigt eure Begleitung auf eine kleine Steinplatte neben dem Eingang,
|
||||
auf der eien Beschreibung gekritzelt ist.
|
||||
|
||||
**Robo**: Das ist wohl der bekannte arithmetische Turm von Indu, über den hab ich schon
|
||||
einmal Daten verarbeitet. Und die antwort auf deine Frage: Vermutlich ein Stein nach
|
||||
dem anderen.
|
||||
"
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement arithmetic_sum
|
||||
"$2 \\cdot \\sum_{i = 0}^n i = n \\cdot (n + 1)$."
|
||||
(n : ℕ) : 2 * (∑ i : Fin (n + 1), ↑i) = n * (n + 1) := by
|
||||
Hint "**Du**: Klar, die werden ja nicht oben anfangen mit bauen. Sag mal,
|
||||
wie zeige ich denn die arithmetische Summe, die hier gekritzelt steht?
|
||||
Ich würde gerne Induktion über $n$ anwenden.
|
||||
|
||||
**Robo**: Ja dann ist's einfach `induction n`, ist doch logisch!"
|
||||
induction n
|
||||
Hint "**Du**: Zuerst den Induktionsanfang…
|
||||
|
||||
**Robo**: Diesen kannst du oft mit `simp` abkürzen!"
|
||||
simp
|
||||
Hint "**Robo**: Jetzt im Induktionsschritt: Bei Induktion über endlichen Summen willst du
|
||||
immer mit `rw [Fin.sum_univ_castSucc]` anfangen" -- :
|
||||
|
||||
-- $$\\sum_\{i=0}^n a_i = \\sum_{i=0}^\{n-1} a_i + a_n$$"
|
||||
rw [Fin.sum_univ_castSucc]
|
||||
-- TODO: Bug. Dieser Hint wird nicht angezeigt.
|
||||
Hint "**Du**: Oh das sieht jetz aber kompliziert aus…
|
||||
|
||||
**Robo**: Da musst du etwas drüber hinweg lesen. Am besten machst du kurz `simp`,
|
||||
dann sieht's schon wieder besser aus."
|
||||
simp
|
||||
Hint "**Du**: Was bedeutet eigentlich der kleine Pfeil `↑`?
|
||||
|
||||
**Robo**: Das ist eine *Coersion*. Sowas wie wenn man eine natürliche Zahl als Integer anschaut,
|
||||
also die natürliche Abbildung `ℕ ↪ ℤ`. Oder hier, wenn ein Element `x : Fin n` stattdessen als
|
||||
Element in `(↑x : ℕ)` angeschaut wird.
|
||||
|
||||
**Robo**: Übrigens, um die Induktionshypothese anzuwenden brauchst du zuerst das Lemma
|
||||
`mul_add`."
|
||||
rw [mul_add]
|
||||
Hint "**Du**: Und wie wende ich jetzt die Induktionshypothese an?
|
||||
|
||||
**Robo mit `rw` wie jede andere Annahme auch."
|
||||
rw [n_ih]
|
||||
Hint "**Robo**: Jetzt musst du noch kurz `rw [Nat.succ_eq_add_one]` anwenden.
|
||||
|
||||
**Du**: Aber wieso?
|
||||
|
||||
**Robo**: Naja, `ring` ist jetzt auch noch nicht so stark, und erkennt nicht dass `n.succ`
|
||||
und `n + 1` das gleiche sind.
|
||||
|
||||
**Du**: Aber das könnte man doch ändern, oder?
|
||||
|
||||
**Robo**: Vielleicht wenn wir einmal einem Techniker begegnen, der mir ein Update
|
||||
einspielen kann…"
|
||||
Branch
|
||||
ring_nf
|
||||
Hint "**Robo**: Wie gesagt, brauch doch `rw [Nat.succ_eq_add_one]` als Fix für meine
|
||||
kleinen Maken."
|
||||
rw [Nat.succ_eq_add_one]
|
||||
ring
|
||||
|
||||
NewTactic induction
|
||||
NewLemma Fin.sum_univ_castSucc Nat.succ_eq_add_one mul_add add_mul Nat.zero_eq
|
||||
|
||||
Conclusion "Du schaust dich um und bewunderst das Tal in dem hunderte, wenn nicht tausende,
|
||||
Steintürme in allen Formen und Höhen stehen."
|
||||
@@ -0,0 +1,33 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import Mathlib.Algebra.BigOperators.Fin
|
||||
import Mathlib.Tactic.Ring
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 4
|
||||
|
||||
Title "Summe aller ungeraden Zahlen"
|
||||
|
||||
Introduction
|
||||
"
|
||||
**Du**: Haben eigentlich alle Türme hier so kryptische Beschreibungen am Eingang?
|
||||
|
||||
Du gehst zu einem etwas kleineren Nachbarsturm.
|
||||
"
|
||||
set_option tactic.hygienic false
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement odd_arithmetic_sum
|
||||
"$\\sum_{i = 0}^n (2n + 1) = n ^ 2$."
|
||||
(n : ℕ) : (∑ i : Fin n, (2 * (i : ℕ) + 1)) = n ^ 2 := by
|
||||
Hint "**Robo**: Das funktioniert genau gleich wie zuvor, viel Glück."
|
||||
induction n
|
||||
simp
|
||||
rw [Fin.sum_univ_castSucc]
|
||||
simp
|
||||
rw [n_ih]
|
||||
rw [Nat.succ_eq_add_one]
|
||||
ring
|
||||
@@ -0,0 +1,49 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import Mathlib.Algebra.BigOperators.Fin
|
||||
import Mathlib.Tactic.Ring
|
||||
|
||||
import TestGame.Options.ArithSum
|
||||
|
||||
set_option tactic.hygienic false
|
||||
|
||||
open BigOperators
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 5
|
||||
|
||||
Title "Summe vertauschen"
|
||||
|
||||
Introduction
|
||||
"
|
||||
Nun aber zeigt euch eure Begleiterin zwei weitere Türme mit einer kleinen Brücke, die
|
||||
zwischen den beiden verläuft. Die Tafel am Eingang wurde von einem herunterfallenden Stein
|
||||
zerstört. Auf der oberen Hälfte steht nur folgendes:
|
||||
|
||||
$$\\sum_{i=0}^n\\sum_{j=0}^m a_{ij} = \\sum_{j=0}^m\\sum_{i=0}^n a_{ij}$$
|
||||
|
||||
**Du**: Ich glaube, ich kann das in eurem Dialekt formulieren und euch damit helfen!
|
||||
"
|
||||
|
||||
|
||||
Statement
|
||||
(n m : ℕ) : ∑ i : Fin n, ∑ j : Fin m, ( 2^i * (1 + j) : ℕ) =
|
||||
∑ j : Fin m, ∑ i : Fin n, ( 2^i * (1 + j) : ℕ) := by
|
||||
Hint "**Robo**: Das sieht gut aus, aber du solltest das kurz beweisen, um sicher zu sein.
|
||||
|
||||
**Du**: Hast du nicht ein Lemma dafür?
|
||||
|
||||
**Robo**: Doch, probier mal `Finset.sum_comm`."
|
||||
rw [Finset.sum_comm]
|
||||
|
||||
NewLemma Finset.sum_comm
|
||||
|
||||
Conclusion "
|
||||
Euer Begleiter ist ganz begeistert als er dir das Stück Papier aus den Händen nimmt,
|
||||
auf dem du die Aussage gekritzelt hast. Gleich zückt sie einen Meißel und beginnt eine
|
||||
neue Platte zu erstellen.
|
||||
|
||||
Ihr winkt ihr noch zum Abschied und geht weiter.
|
||||
"
|
||||
@@ -0,0 +1,92 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import Mathlib.Algebra.BigOperators.Fin
|
||||
import Mathlib.Tactic.Ring
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import TestGame.Options.ArithSum
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 6
|
||||
|
||||
set_option tactic.hygienic false
|
||||
|
||||
Title "Zusammenfassung"
|
||||
|
||||
Introduction
|
||||
"
|
||||
**Du**: Robo gib mir nochmals eine Übersicht, bitte.
|
||||
|
||||
**Robo**: Aber klar:
|
||||
|
||||
| | Beschreibung |
|
||||
|:---------------------|:------------------------------------------|
|
||||
| `Fin n` | Ist ein Typ mit Zahlen $0, \\ldots, n-1$. |
|
||||
| `∑ (i : Fin n), a i` | $\\sum_{i=0}^{n-1} a_i$ |
|
||||
| `↑i` | Eine Coersion, z.B. `Fin n → ℕ`. |
|
||||
|
||||
und
|
||||
|
||||
| | Taktik | Beispiel |
|
||||
|:---|:--------------------------|:-------------------------------------|
|
||||
| 21 | `simp` | Simplifikation. |
|
||||
| 22 | `induction n` | Induktion über $n$ |
|
||||
|
||||
Da löst sich aus der Steinlandschaft plötzlich ein grosser Steingolem. Er schaut euch
|
||||
bedrohlich an und fragt in tiefer Stimme:
|
||||
"
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement (m : ℕ) : (∑ i : Fin (m + 1), (i : ℕ)^3) = (∑ i : Fin (m + 1), (i : ℕ))^2 := by
|
||||
Hint "**Du**: Gulp. Naja das wird schon klappen. Also man fängt wieder mit Induktion an…"
|
||||
induction m
|
||||
Hint "**Du**: Also den Induktionsanfang kann man einfach zeigen…"
|
||||
simp
|
||||
Hint "**Robo**: Und jetzt wieder `rw [Fin.sum_univ_castSucc]` und `simp` um vorwärts zu
|
||||
kommen!"
|
||||
rw [Fin.sum_univ_castSucc]
|
||||
simp
|
||||
Hint "**Robo**: Siehst du die Induktionshypothese hier drin?"
|
||||
rw [n_ih]
|
||||
Hint "**Du**: Ok, damit habe ich die linke Seite der Gleichung ziemlich gut bearbeitet.
|
||||
Aber, ehm, mit der Rechten komme ich nicht weiter…
|
||||
|
||||
Der Golem schaut dich finster an.
|
||||
|
||||
**Robo**: Du willst `Fin.sum_univ_castSucc` auf der rechten Seite anwenden, aber es
|
||||
gibt mehrere Orte, wo das Lemma passen würde.
|
||||
Deshalb musst du mit `rw [Fin.sum_univ_castSucc (n := {n} + 1)]` angeben, wo genau.
|
||||
|
||||
**Du**: Was bedeutet das?
|
||||
|
||||
**Robo** Das Lemma hat eine Annahme `n` und du sagst ihm explizit, was es für dieses `n`
|
||||
einsetzen muss, nämlich `{n} + 1`"
|
||||
Branch
|
||||
rw [Fin.sum_univ_castSucc]
|
||||
Hint "**Robo**: Das hat jetzt einfach `Fin.sum_univ_castSucc` am ersten Ort angewendet,
|
||||
wo das möglich war. Das ist nicht so ideal, die like Seite war schon okay.
|
||||
|
||||
**Robo**: Geh doch zurück und bring `rw` dazu am anderen Ort umzuschreiben."
|
||||
rw [Fin.sum_univ_castSucc (n := n + 1)]
|
||||
simp
|
||||
Hint "**Robo**: `add_pow_two` ist auch noch nützlich!"
|
||||
rw [add_pow_two]
|
||||
Hint "**Du**: Ich glaube, ich sehe hier ne arithmetische Summe drin!!
|
||||
|
||||
**Robo**: Ich habe dir das dies von vorhin temporär als `arithmetic_sum` gespeichert,
|
||||
damit du diese brauchen kannst."
|
||||
rw [arithmetic_sum]
|
||||
Hint "**Du**: Jetzt sollten es eigentlich nur noch arithmetische Operationen sein."
|
||||
ring
|
||||
|
||||
NewLemma arithmetic_sum add_pow_two
|
||||
|
||||
Conclusion "Der Golem denkt ganz lange nach, und ihr bekommt das Gefühl, dass er gar nie
|
||||
aggressive war, sondern nur eine sehr tiefe Stimme hat.
|
||||
|
||||
Mit einem kleinen Erdbeben setzt er sich hin und winkt euch dankend zu.
|
||||
|
||||
Damit zieht ihr weiter durch die karge Landschaft auf diesem Planet."
|
||||
@@ -0,0 +1,38 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import Mathlib.Algebra.BigOperators.Fin
|
||||
|
||||
set_option tactic.hygienic false
|
||||
|
||||
open Nat
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 2
|
||||
|
||||
Title "endliche Summe"
|
||||
|
||||
-- TODO: Tactics `mono` and `omega` are not ported yet.
|
||||
|
||||
Introduction
|
||||
"
|
||||
2^n > n^2 für n ≥ 5
|
||||
"
|
||||
|
||||
Statement
|
||||
"2^n > n^2 für n ≥ 5"
|
||||
(n : ℕ) : (n + 5)^2 < 2 ^ (n + 5) := by
|
||||
induction' n with n ih
|
||||
simp
|
||||
rw [succ_eq_add_one]
|
||||
simp_rw [add_pow_two] at *
|
||||
ring_nf at ih ⊢
|
||||
sorry
|
||||
|
||||
|
||||
|
||||
example (n : ℕ) (h : 5 ≤ n) : n^2 < 2 ^ n
|
||||
| 0 | 1 | 2 | 3 | 4 => by
|
||||
sorry
|
||||
| n + 5 => by sorry
|
||||
@@ -0,0 +1,34 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import Mathlib.Algebra.BigOperators.Fin
|
||||
|
||||
set_option tactic.hygienic false
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 2
|
||||
|
||||
Title "endliche Summe"
|
||||
|
||||
Introduction
|
||||
"
|
||||
n^3 + 2n ist durch 3 teilbar für alle ganzen Zahlen n
|
||||
"
|
||||
|
||||
Statement
|
||||
"n^3 + 2n ist durch 3 teilbar für alle ganzen Zahlen n"
|
||||
(n : ℤ) : 3 ∣ n^3 + 2*n := by
|
||||
induction n
|
||||
induction a
|
||||
norm_cast
|
||||
change 3 ∣ (Nat.succ n : ℤ) ^ 3 + 2 * (Nat.succ n : ℤ)
|
||||
rw [Int.ofNat_succ]
|
||||
sorry
|
||||
sorry
|
||||
|
||||
-- example (n : ℕ) : (n - 1) * (n + 1) = (n ^ 2 - 1) := by
|
||||
-- induction' n with n hn
|
||||
-- ring
|
||||
-- rw [Nat.succ_eq_one_add]
|
||||
-- rw []
|
||||
@@ -0,0 +1,49 @@
|
||||
import TestGame.Metadata
|
||||
|
||||
import TestGame.ToBePorted
|
||||
import Mathlib.Algebra.BigOperators.Fin
|
||||
import Mathlib.Tactic.Ring
|
||||
|
||||
import TestGame.ToBePorted
|
||||
|
||||
Game "TestGame"
|
||||
World "Sum"
|
||||
Level 5
|
||||
|
||||
Title "Bernoulli Ungleichung"
|
||||
|
||||
Introduction
|
||||
"
|
||||
TODO: Induktion (& induktion vs rcases)
|
||||
|
||||
"
|
||||
|
||||
open BigOperators
|
||||
|
||||
example (x : ℕ) (n : ℕ) : 1 + n * x ≤ (x + 1) ^ n := by
|
||||
induction' n with n hn
|
||||
simp
|
||||
rw [Nat.succ_mul]
|
||||
rw [Nat.pow_succ]
|
||||
sorry
|
||||
|
||||
example (n : ℕ) : (∑ i : Fin (n + 1), ↑(2 * i - 1)) = n ^ 2 := by
|
||||
induction' n with n hn
|
||||
simp
|
||||
|
||||
#check Finset.sum_comm
|
||||
|
||||
Statement
|
||||
"Zeige $\\sum_{i = 0}^n i = \\frac{n ⬝ (n + 1)}{2}$."
|
||||
(n : ℕ) : (∑ i : Fin (n + 1), ↑i) = n * (n + 1) / 2 := by
|
||||
sorry
|
||||
-- apply hh1
|
||||
-- induction' n with n hn
|
||||
-- simp
|
||||
-- sorry
|
||||
-- rw [Fin.sum_univ_castSucc]
|
||||
-- simp [nat_succ]
|
||||
-- rw [mul_add, hn]
|
||||
-- ring
|
||||
|
||||
NewTactic ring
|
||||
Reference in New Issue
Block a user