Merge branch 'main' of github.com:leanprover-community/lean4game
This commit is contained in:
@@ -20,7 +20,7 @@ Statement (A B : Prop) (hb : B) : A → (A ∧ B) := by
|
||||
|
||||
**Du**: Einen Moment. Das ist ja gerade so eine Implikation (`\\to`). Wir nehmen an, dass `{B}` gilt, und wollen zeigen, dass dann gilt `{A}` impliziert `{A} und {B}`. Ja, klar! Natürlich stimmt das.
|
||||
|
||||
Der Operationsleiter sieht Dich erwartungsvoll an.
|
||||
Der Operationsleiter sieht dich erwartungsvoll an.
|
||||
|
||||
**Du** *(leise zu Robo)*: Soll ich ihm `tauto` aufschreiben?
|
||||
|
||||
@@ -29,11 +29,11 @@ Statement (A B : Prop) (hb : B) : A → (A ∧ B) := by
|
||||
|
||||
**Du**: Aber wie denn? Ich glaube, ich würde als erstes gern so etwas sagen wie 'Nehmen wir also an, `{A}` gilt …'
|
||||
|
||||
**Robo**: Ja, gute Idee. Wähle dazu für Deine Annahme einfach einen Namen, zum Beispiel `h`, und schreib `intro h`."
|
||||
**Robo**: Ja, gute Idee. Wähle dazu für deine Annahme einfach einen Namen, zum Beispiel `h`, und schreib `intro h`."
|
||||
intro hA
|
||||
Hint "**Du**: OK. Jetzt habe ich also sowohl `{A}` als auch `{B}` in meinen Annahmen und muss `{A} ∧ {B}` zeigen.
|
||||
|
||||
**Robo**: Genau. Und wie das geht, weißt Du ja schon."
|
||||
**Robo**: Genau. Und wie das geht, weißt du ja schon."
|
||||
constructor
|
||||
assumption
|
||||
assumption
|
||||
|
||||
@@ -17,7 +17,7 @@ Statement (A B : Prop) (mp : A → B) (mpr : B → A) : A ↔ B := by
|
||||
|
||||
**Du**: Also ganz ähnlich wie das UND, `A ∧ B`?
|
||||
|
||||
**Robo**: Genau. Entsprechend kannst Du auch hier mit `constructor` anfangen."
|
||||
**Robo**: Genau. Entsprechend kannst du auch hier mit `constructor` anfangen."
|
||||
constructor
|
||||
Hint "**Du**: Ah, und die beiden Teile habe ich schon in den Annahmen."
|
||||
assumption
|
||||
@@ -32,7 +32,7 @@ heißen bei `(h : A ↔ B)` die beiden Teile `h.mp` und `h.mpr`.
|
||||
|
||||
**Du**: Also `h.mp` ist `A → B`? Wieso `mp`?
|
||||
|
||||
**Robo**: `mp` steht für Modus Ponens`. Der Modus ponens ist eine schon in der antiken Logik geläufige Schlussfigur, die in vielen logischen Systemen … Ach nee, das wolltest Du ja nicht hören. Das \"r\" in `mpr` steht für \"reverse\", weil's die Rückrichtung ist.
|
||||
**Robo**: `mp` steht für Modus Ponens`. Der Modus ponens ist eine schon in der antiken Logik geläufige Schlussfigur, die in vielen logischen Systemen … Ach nee, das wolltest du ja nicht hören. Das \"r\" in `mpr` steht für \"reverse\", weil's die Rückrichtung ist.
|
||||
"
|
||||
|
||||
NewTactic constructor
|
||||
|
||||
@@ -23,7 +23,7 @@ Statement (A B C : Prop) (h : A ↔ B) (g : B → C) : A → C := by
|
||||
|
||||
**Du**: Weiß ich doch!"
|
||||
apply g
|
||||
Hint "**Robo**: … und Du kannst die Implikation `{A} → {B}` genau gleich mit
|
||||
Hint "**Robo**: … und du kannst die Implikation `{A} → {B}` genau gleich mit
|
||||
`apply {h}.mp` anwenden.
|
||||
|
||||
**Du**: Aber normalerweise könnte ich hier auch `rw [← h]` sagen, oder?
|
||||
|
||||
@@ -23,11 +23,11 @@ Statement (A B : Prop) : (A ↔ B) → (A → B) := by
|
||||
intro h
|
||||
Hint "**Du**: Also, ich kenne `rw [h]` und `apply h.mp`, aber das wollten wir ja diesmal vermeiden.
|
||||
|
||||
**Robo**: Was Du machen könntest, ist, mit `rcases h with ⟨mp, mpr⟩` die Annahme in zwei
|
||||
**Robo**: Was du machen könntest, ist, mit `rcases h with ⟨mp, mpr⟩` die Annahme in zwei
|
||||
Teile aufteilen."
|
||||
Branch
|
||||
intro a
|
||||
Hint "**Robo**: Hier müsstest Du jetzt `rw [←h]` oder `apply h.mp` benutzen.
|
||||
Hint "**Robo**: Hier müsstest du jetzt `rw [←h]` oder `apply h.mp` benutzen.
|
||||
Geh lieber einen Schritt zurück, sodass das Goal `A → B` ist."
|
||||
rcases h with ⟨mp, mpr⟩
|
||||
Hint (hidden := true) "**Du**: Ah, und jetzt ist das Beweisziel in den Annahmen."
|
||||
|
||||
@@ -20,8 +20,8 @@ Statement (A : Prop) : ¬A ∨ A := by
|
||||
Hint "**Du**: Das scheint wieder ziemlich offensichtlich.
|
||||
|
||||
**Robo**: Nee, offensichtlich ist das nicht. Aber ich glaube, es gibt ein wohlbekanntens Lemma, das hier weiterhilft:
|
||||
`not_or_of_imp` besagt `(A → B) → ¬ A ∨ B`. Da die rechte Seite der Implikation mit Deinem Beweisziel übereinstimmt,
|
||||
kannst Du es mit `apply not_or_of_imp` anwenden.
|
||||
`not_or_of_imp` besagt `(A → B) → ¬ A ∨ B`. Da die rechte Seite der Implikation mit deinem Beweisziel übereinstimmt,
|
||||
kannst du es mit `apply not_or_of_imp` anwenden.
|
||||
|
||||
**Du**: `Wohlbekannt` auf Implis?
|
||||
|
||||
@@ -30,12 +30,12 @@ Statement (A : Prop) : ¬A ∨ A := by
|
||||
right
|
||||
Hint "**Du**: Und jetzt?
|
||||
|
||||
**Robo**: `right/left` funktioniert hier nicht, da Du nicht weißt, ob `A` wahr oder falsch ist."
|
||||
**Robo**: `right/left` funktioniert hier nicht, da du nicht weißt, ob `A` wahr oder falsch ist."
|
||||
Branch
|
||||
left
|
||||
Hint "**Du**: Und jetzt?
|
||||
|
||||
**Robo**: `right/left` funktioniert hier nicht, da Du nicht weißt, ob `A` wahr oder falsch ist."
|
||||
**Robo**: `right/left` funktioniert hier nicht, da du nicht weißt, ob `A` wahr oder falsch ist."
|
||||
apply not_or_of_imp
|
||||
Hint (hidden := true) "**Robo**: Ich würde wieder mit `intro` weitermachen."
|
||||
intro
|
||||
|
||||
@@ -22,7 +22,7 @@ Wenn `A` wahr ist, beweisen wir die rechte Seite, sonst die Linke.
|
||||
Statement (A : Prop) : ¬A ∨ A := by
|
||||
Hint (hidden := true) "**Du**: Wie noch einmal?
|
||||
|
||||
**Robo**: Also `by_cases h : A` erstellt zwei Goals. Im ersten hast Du `(h : A)` zur
|
||||
**Robo**: Also `by_cases h : A` erstellt zwei Goals. Im ersten hast du `(h : A)` zur
|
||||
Verfügung, im zweiten `(h : ¬ A)`."
|
||||
by_cases h : A
|
||||
right
|
||||
|
||||
@@ -15,7 +15,7 @@ Introduction
|
||||
"
|
||||
**Operationsleiter**: Ihr habt mir wirklich so geholfen! Hier ist das letzte Problem. Das habe ich von meinem Vorgänger geerbt. Er hat behauptet, wenn wir das lösen können, dann läuft hier wieder alles. Aber es sah mir immer viel zu schwierig aus, um es überhaupt zu versuchen. Wollt Ihr es einmal probieren?
|
||||
|
||||
**Du**: Klar, zeig her! Robo, kannst Du mir vielleicht auch noch einmal so eine nette Zusammenfassung anzeigen, was ich theoretisch in den letzten fünf Minuten gelernt habe?
|
||||
**Du**: Klar, zeig her! Robo, kannst du mir vielleicht auch noch einmal so eine nette Zusammenfassung anzeigen, was ich theoretisch in den letzten fünf Minuten gelernt habe?
|
||||
|
||||
**Robo**: Hier ist die Übersicht:
|
||||
|
||||
@@ -49,8 +49,8 @@ Statement imp_iff_not_or (A B : Prop) : (A → B) ↔ ¬ A ∨ B := by
|
||||
apply not_or_of_imp
|
||||
Hint "**Du**: Gibt es für die Gegenrichtung auch ein Lemma?
|
||||
|
||||
**Robo**: Leider nicht. Da musst Du manuell ran."
|
||||
Hint (hidden := true) "**Robo**: Na Implikationen gehst Du immer mit `intro` an."
|
||||
**Robo**: Leider nicht. Da musst du manuell ran."
|
||||
Hint (hidden := true) "**Robo**: Na Implikationen gehst du immer mit `intro` an."
|
||||
intro h
|
||||
intro ha
|
||||
Hint (hidden := true) "**Robo**: Ich würde mal die Annahme `h` mit `rcases` aufteilen."
|
||||
|
||||
Reference in New Issue
Block a user