|
|
|
|
import Adam.Metadata
|
|
|
|
|
import Std.Tactic.RCases
|
|
|
|
|
import Mathlib.Tactic.LeftRight
|
|
|
|
|
|
|
|
|
|
set_option tactic.hygienic false
|
|
|
|
|
|
|
|
|
|
--set_option autoImplicit false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Game "Adam"
|
|
|
|
|
World "Proposition"
|
|
|
|
|
Level 13
|
|
|
|
|
|
|
|
|
|
Title "Oder"
|
|
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
|
"
|
|
|
|
|
Der nächste bitte …
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
Statement ""
|
|
|
|
|
(A B : Prop) (h : (A ∧ B) ∨ A) : A := by
|
|
|
|
|
Hint "**Robo** Schau mal, wenn du mit dem Finger eine Annahme berührst, zeigt es dir,
|
|
|
|
|
wie die Klammern gesetzt sind. Irre…
|
|
|
|
|
|
|
|
|
|
**Du** Ah ich sehe, also `({A} ∧ {B}) ∨ {A}`!
|
|
|
|
|
|
|
|
|
|
**Du** Ich glaube den ganzen Zircus hier langsam nicht mehr:
|
|
|
|
|
Zuerst ein \"Und\" im Ziel, dann \"Und\" in der Annahme, dann \"Oder\" im Ziel und jetzt
|
|
|
|
|
\"Oder\" in der Annahme, die haben sich doch abgesprochen!
|
|
|
|
|
|
|
|
|
|
**Robo** Lass ihnen doch ihren Spaß.
|
|
|
|
|
Wir sind ja gleich hier fertig, und können zu einem interessanteren Planeten weiterfliegen.
|
|
|
|
|
|
|
|
|
|
**Du** Also, wieder `rcases …`?
|
|
|
|
|
|
|
|
|
|
**Robo** Ja, aber diesmal nicht `rcases {h} with ⟨h₁, h₂⟩`, sondern `rcases {h} with h | h`."
|
|
|
|
|
rcases h with h | h
|
|
|
|
|
Hint "**Robo**
|
|
|
|
|
Jetzt musst Du Dein Ziel zweimal beweisen:
|
|
|
|
|
Einmal unter Annahme der linken Seite `{A} ∨ {B}`,
|
|
|
|
|
und einmal unter Annahme der rechten Seite `{A}`.
|
|
|
|
|
Hier haben nehmen wir an, die linke Seite
|
|
|
|
|
sei wahr."
|
|
|
|
|
Hint (hidden := true) " **Robo** Wie man mit einem Und in den Annahmen umgeht,
|
|
|
|
|
weißt Du doch schon:
|
|
|
|
|
`rcases h with ⟨h₁, h₂⟩`. Zur Erinnerung: Für die Klammern schreibst Du `\\<>`."
|
|
|
|
|
rcases h with ⟨h₁, h₂⟩
|
|
|
|
|
Hint "**Robo** Jetzt musst Du Dein Ziel zweimal beweisen:
|
|
|
|
|
Einmal unter Annahme der linken Seite `{A}`,
|
|
|
|
|
und einmal unter Annahme der rechten Seite `{A} ∨ {B}`. Hier haben nehmen wir an, die linke Seite
|
|
|
|
|
sei wahr."
|
|
|
|
|
assumption
|
|
|
|
|
assumption
|
|
|
|
|
|
|
|
|
|
Conclusion
|
|
|
|
|
"**Du** Ok, das scheint ihn zufriedenzustellen. Nur noch eine Seele…
|
|
|
|
|
Kannst Du mir vorher noch einmal kurz alles Leansch zusammenfassen,
|
|
|
|
|
das Du mir bis hierher beigebracht hast?
|
|
|
|
|
|
|
|
|
|
Robo strahlt überglücklich. Noch *nie* warst Du so auf ihn angewiesen.
|
|
|
|
|
|
|
|
|
|
**Robo** Na klar, schau her!
|
|
|
|
|
|
|
|
|
|
## Notationen / Begriffe
|
|
|
|
|
|
|
|
|
|
| | Beschreibung |
|
|
|
|
|
|:--------------|:-------------------------------------------------------------------------|
|
|
|
|
|
| *Goal* | Was aktuell zu beweisen ist. |
|
|
|
|
|
| *Annahme* | Objekte & Resultate, die man zur Verfügung hat. |
|
|
|
|
|
| *Taktik* | Befehl im Beweis. Entspricht einem Beweisschritt. |
|
|
|
|
|
| `ℕ` | Typ aller natürlichen Zahlen. |
|
|
|
|
|
| `0, 1, 2, …` | Explizite natürliche Zahlen. |
|
|
|
|
|
| `=` | Gleichheit. |
|
|
|
|
|
| `≠` | Ungleichheit. Abkürzung für `¬(·=·)`. |
|
|
|
|
|
| `Prop` | Typ aller logischen Aussagen. |
|
|
|
|
|
| `True` | Die logische Aussage `(True : Prop)` ist bedingungslos wahr. |
|
|
|
|
|
| `False` | Die logische Aussage `(False : Prop)` ist bedingungslos falsch. |
|
|
|
|
|
| `¬` | Logische Negierung. |
|
|
|
|
|
| `∧` | Logisch UND. |
|
|
|
|
|
| `∨` | Logisch ODER. |
|
|
|
|
|
| `(n : ℕ)` | Eine natürliche Zahl. |
|
|
|
|
|
| `(A : Prop)` | Eine logische Aussage. |
|
|
|
|
|
| `(ha : A)` | Ein Beweis, dass die logische Aussage `(A : Prop)` wahr ist. |
|
|
|
|
|
| `(h : A ∧ B)` | Eine Annahme, die den Namen `h` bekommen hat. |
|
|
|
|
|
| `⟨·,·⟩` | Schreibweise für Struktur mit mehreren Feldern (kommt später im Detail). |
|
|
|
|
|
| `h.1, h.2, …` | Die einzelnen Felder der Stuktur. Auch `h.[Name des Feldes]` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Taktiken
|
|
|
|
|
|
|
|
|
|
Die Worte, die Du aktiv gebrauchen musst, heißen zusammengefasst `Taktiken`. Hier sind alle Taktiken, die wir auf diesem Planeten gebraucht haben:
|
|
|
|
|
|
|
|
|
|
| | Taktik | Beispiel |
|
|
|
|
|
|:---|:--------------------------|:--------------------------------------------------|
|
|
|
|
|
| 1 | `rfl` | Beweist `A = A`. |
|
|
|
|
|
| 2 | `assumption` | Sucht das Goal in den Annahmen. |
|
|
|
|
|
| 3 | `contradiction` | Sucht einen Widerspruch. |
|
|
|
|
|
| 4 | `trivial` | Kombiniert die obigen drei Taktiken (und mehr). |
|
|
|
|
|
| 5 | `constructor` | Teilt ein UND im Goal auf. |
|
|
|
|
|
| 6 | `left`/`right` | Beweist eine Seite eines ODER im Goal. |
|
|
|
|
|
| 7ᵃ | `rcases h with ⟨h₁, h₂⟩` | Teilt ein UND in den Annahmen auf. |
|
|
|
|
|
| 7ᵇ | `rcases h with h \\| h` | Teilt ein ODER in den Annahmen in zwei Fälle auf. |
|
|
|
|
|
|
|
|
|
|
**Du** Woher weißt Du das eigentlich alles?
|
|
|
|
|
|
|
|
|
|
**Robo** Keine Ahnung. War, glaube ich, vorinstalliert.
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NewTactic assumption rcases
|
|
|
|
|
DisabledTactic tauto
|