rename testgame to adam

This commit is contained in:
Alexander Bentkamp
2023-03-23 17:10:13 +01:00
parent a262cff63b
commit 5c73d3bddb
166 changed files with 0 additions and 0 deletions
+66
View File
@@ -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!"
+54
View File
@@ -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