Merge pull request #53 from TentativeConvert/main

Story für Implication & Predicate überarbeiten
pull/54/head
Jon Eugster 3 years ago committed by GitHub
commit 1adf5783bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -23,7 +23,6 @@ Game "Adam"
Title "Lean 4 game" Title "Lean 4 game"
Introduction Introduction
" "
# Game Over oder QED? # Game Over oder QED?
Willkommen zu unserem Prototyp eines Lean4-Lernspiels. Hier lernst du Computer-gestütztes Willkommen zu unserem Prototyp eines Lean4-Lernspiels. Hier lernst du Computer-gestütztes
@ -43,6 +42,13 @@ Level spielen, auch wenn frühere Levels nicht grün sind.
(oft werden *Site data & Cookies* zusammen gelöscht). (oft werden *Site data & Cookies* zusammen gelöscht).
### Funding
This game has been developed within the project
[ADAM: Anticipating the Digital Age of Mathematics](https://hhu-adam.github.io/).
The project is based at Heinrich Heine University Düsseldorf and funded by Stiftung
Innovation in der Hochschullehre.
### Kontakt ### Kontakt
Wenn du Bugs findest, schreib doch ein Email oder erstelle einen Wenn du Bugs findest, schreib doch ein Email oder erstelle einen

@ -7,10 +7,23 @@ import Adam.Levels.Contradiction.L06_Summary
Game "Adam" Game "Adam"
World "Contradiction" World "Contradiction"
Title "Widerspruch" Title "Spinoza"
Introduction " Introduction "
Ihr begebt euch auf die Suche nach *Oddeus*. Nach etwas rumfragen, kommt ihr tatsächlich an **Robo**: Ich glaube, das ist Spinoza, einer der ganz wenigen Asteroiden vom Type QED. Schnell. Wir müssen uns ein bisschen beeilen, sonst verpassen wir ihn.
eine Dornenfestung und nachdem ihr erklärt habt, wer ihr seit, werdet ihr auf eine Audienz
gebeten. Eine halbe Stunde später seid ihr gelandet. Sehr einladend wirkt Spinoza nicht. Seine gesamte Oberfläche ist von feinem, rötlichen Sand bedeckt.
Ein einziger, einsamer Formalosoph, der sich als Benedictus vorstellt, erwartet euch.
**Benedictus**: Schön, dass Ihr gekommen seid! Ich habe schon auf Euch gewartet!
**Du**: Hast Du auch ein paar dringende Fragen … ?
**Benedictus**: Ach nein, aus dem Alter bin ich heraus. Aber ich kann mir denken, wie es Euch auf Implis und Quantus ergangen ist. Und glaubt, mir auf den anderen Planeten wird es nicht viel besser. Aber ich kann Euch vielleicht ein bisschen vorbereiten.
**Du**: Können wir nicht einfach hier bleiben und uns ein wenig ausruhen?
Benedictus schüttelt den Kopf.
**Benedictus**: Nein. Spinoza verträgt keine drei Bewohner. Und Ihr müsst bald wieder weiter, sonst wird der Weg zu weit. Wir kommen nur alle 400 Jahre bei den Planeten vorbei.
" "

@ -11,12 +11,11 @@ Game "Adam"
World "Contradiction" World "Contradiction"
Level 1 Level 1
Title "Have" Title "Was wir haben, haben wir."
Introduction Introduction
" "
**Oddeus**: Willkommen Reisende! Ich muss eingestehen ich bin in Gedanken noch **Benedictus**: Hier, schaut mal. Das habe ich für Euch vorbereitet.
an etwas, könnt ihr mir bei diesem widersprüchlichen Problem helfen?
" "
-- Manchmal, wollen wir nicht am aktuellen Goal arbeiten, sondern zuerst ein -- Manchmal, wollen wir nicht am aktuellen Goal arbeiten, sondern zuerst ein
@ -36,17 +35,18 @@ an etwas, könnt ihr mir bei diesem widersprüchlichen Problem helfen?
-- bevor du dann mit dem Beweis forfährst. -- bevor du dann mit dem Beweis forfährst.
Statement (A B : Prop) (h : A → ¬ B) (k : A ∧ B) : False := by Statement (A B : Prop) (h : A → ¬ B) (k : A ∧ B) : False := by
Hint "**Du**: Also als erstes Teile ich wohl mal das Und (`∧`) auf." Hint "**Du**: Also als erstes teile ich wohl mal das Und (`∧`) auf."
rcases k with ⟨h₁, h₂⟩ rcases k with ⟨h₁, h₂⟩
Hint "**Du**: Aber jetzt Hint "**Du**: Und jetzt
**Robo**: Du könntest dir ein passendes Zwischenresultat zurechtlegen, das dir hilft: **Benedictus**: … solltest Du Dir ein passendes Zwischenresultat zurechtlegen.
Mach mal `have g : ¬ B`!"
**Robo**: Ja! Probier mal `have g : ¬ B`!"
have g : ¬ B have g : ¬ B
· Hint "**Du**: Was und jetzt hab ich einfach angenommen das sei richtig? · Hint "**Du**: Was? Jetzt hab ich einfach angenommen, dass sei richtig?
**Robo**: Ne, jetzt musst du das zuerst beweisen bevor du es dann benützen kannst." **Robo**: Nee, jetzt musst Du das erst noch beweisen, bevor Du es dann benutzen kannst."
Hint (hidden := true) "**Robo**: `apply` scheint passend zu sein." Hint (hidden := true) "**Robo**: `apply` sollte helfen"
apply h apply h
assumption assumption
· Hint (hidden := true) "**Du**: Und wie war das nochmals wenn zwei Annahmen sich widersprechen? · Hint (hidden := true) "**Du**: Und wie war das nochmals wenn zwei Annahmen sich widersprechen?
@ -57,4 +57,4 @@ Statement (A B : Prop) (h : A → ¬ B) (k : A ∧ B) : False := by
NewTactic «have» NewTactic «have»
DisabledTactic «suffices» DisabledTactic «suffices»
Conclusion "*Oddeus*: Das stimmt wohl." Conclusion "**Benedictus**: Das sieht gut aus!"

@ -11,13 +11,11 @@ Game "Adam"
World "Contradiction" World "Contradiction"
Level 2 Level 2
Title "Suffices" Title "Es reicht!"
Introduction Introduction
" "
*Oddeus*' Partner meldet sich. **Benedictus**: Ihr hättet natürlich auch erst das Hauptresultat und dann das Zwischenresultat beweisen können. Das könnt Ihr ja mal an dieser Aufgabe probieren, die ist ganz ähnlich.
**Partner**: Ich habe letzthin was änliches gesehen, aber irgendwie verdreht.
" "
-- Die Taktik `suffices` funktioniert genau gleich wie `have`, -- Die Taktik `suffices` funktioniert genau gleich wie `have`,
@ -35,29 +33,27 @@ Introduction
-- dass der erste Beweisblock der kürzere ist. Zum Beispiel wäre bei der vorigen Aufgabe -- dass der erste Beweisblock der kürzere ist. Zum Beispiel wäre bei der vorigen Aufgabe
-- `suffices` schöner gewesen: -- `suffices` schöner gewesen:
-- "Angenommen, man hat eine Implikation $A \\Rightarrow \\neg B$ und weiss, dass
-- $A \\land B$ wahr ist. Zeige, dass dies zu einem Widerspruch führt."
Statement Statement
"Angenommen, man hat eine Implikation $A \\Rightarrow \\neg B$ und weiss, dass
$A \\land B$ wahr ist. Zeige, dass dies zu einem Widerspruch führt."
(A B : Prop) (h : A → ¬ B) (k₁ : A) (k₂ : B) : False := by (A B : Prop) (h : A → ¬ B) (k₁ : A) (k₂ : B) : False := by
Hint "**Robo**: Ich weiss was er meint! Anstatt `have` kannst du auch `suffices` Hint "**Robo**: Ich weiss was er meint! Anstatt `have` kannst Du auch `suffices`
brauchen. Das funktioniert genau gleich, aussert dass dann die beiden Goals vertauscht sind. verwenden. Das funktioniert genau gleich, außer, dass dann die beiden Beweisziele vertauscht sind.
**Du**: Also nach `suffices g : ¬B` muss ich dann zuerst zeigen, wie man mit `g` den Beweis **Du**: Also nach `suffices g : ¬B` muss ich dann zuerst zeigen, wie man mit `g` den Beweis
abschliesst bevor ich `g` beweise? abschliesst, bevor ich `g` beweise?
**Robo**: Genau! Verwendende `have` und `suffices` einfach nach gutdünken." **Robo**: Genau!"
suffices g : ¬ B suffices g : ¬ B
Hint "**Robo**: Also hier beendest du den Beweis angenommen {g} sei wahr." Hint "**Robo**: Also hier beendest Du den Beweis unter der Annahme `{g}` sei wahr."
contradiction contradiction
Hint "**Robo**: Und hier beweist du das Zwischenresultat." Hint "**Robo**: Und hier beweist Du das Zwischenresultat."
apply h apply h
assumption assumption
NewTactic «suffices» NewTactic «suffices»
DisabledTactic «have» DisabledTactic «have»
Conclusion "*Oddeus* nimmt den Brief, schaut ihn an und, rollt ihn zusammen. Conclusion "**Benedictus**: Genau so meinte ich das. Ob Ihr nun in Zukunft `have` und `suffices` verwendet, ist reine Geschmacksfrage. Hauptsache, Ihr wisst, wie Ihr entfernte Ziele in kleinen Schritte erreicht.
**Oddeus**: Ich verstehe meine Schwester nie. Kommt, vielleicht könnt ihr mir helfen.
Und er führt euch durch seinen Rosengarten."

@ -12,17 +12,10 @@ Game "Adam"
World "Contradiction" World "Contradiction"
Level 3 Level 3
Title "Per Widerspruch" Title "Widerspruch"
Introduction Introduction
"**Oddeus**: Ich verstehe *Evenine* einfach nicht. Ich will euch auch gleich zeigen, "**Benedictus**: Hier ist noch eine Variante.
was sie mir letzthin geschrieben hat, aber zuerst schaut einmal unseren
wunderschönen Absurda-Tempel an!
Damit kommt ihr vor einen sehr hohen Turm, der ausschliesslich aus Dornenranken gewachsen
scheint.
**Oddeus**: Versteht ihr, was hier über dem Eingang steht?
" "
-- Eine sehr nützliche Beweismethode ist per Widerspruch. -- Eine sehr nützliche Beweismethode ist per Widerspruch.
@ -37,29 +30,24 @@ scheint.
-- steht: -- steht:
Statement (A B : Prop) (g : A → B) (b : ¬ B) : ¬ A := by Statement (A B : Prop) (g : A → B) (b : ¬ B) : ¬ A := by
Hint "**Robo**: Ein `¬` im Goal heisst häufig, dass du einen Widerspruchsbeweis führen Hint "**Robo**: Ein `¬` im Goal heißt häufig, dass Du einen Widerspruchsbeweis führen
möchtest. möchtest.
**Du**: Und wie mach ich das? Mit `contradiction`? **Du**: Und wie mache ich das? Mit `contradiction`?
**Robo**: Mit `by_contra h` fängst du einen an. Mit `contradiction` schliesst du ihn dann **Robo**: Mit `by_contra h` fängst Du einen Widerspruchsbeweis an. Und mit `contradiction` schließt Du ihn ab."
später ab."
by_contra h by_contra h
Hint "**Robo**: Jetzt hast du also eine Annahme `{h} : ¬ {A}`, und damit musst du einen Hint "**Robo**: Jetzt hast du also eine Annahme `{h} : {A}`, und damit musst Du einen Widerspruch herleiten.
Widerspruch herbeileiten.
Ein Methode ist, dass du jetzt mit `suffices` sagts, zu was du denn gerne den Widerspruch Du könntest zum Beispiel jetzt mit `suffices` sagten, welchen Widerspruch Du gern herleiten möchtest, etwa `suffices k : B`
haben möchtest, zum Beispiel `suffices k : B`
" "
suffices k : B suffices k : B
Hint "**Du**: Ah und jetzt kann ich einfach sagen dass sich die Anahmen `{B}` und `¬{B}` Hint "**Du**: Ah, und jetzt kann ich einfach sagen dass sich die Annahmen `{B}` und `¬{B}` sich widersprechen."
widersprechen."
contradiction contradiction
Hint "**Robo**: Und jetzt kannst du noch das Ergebnis zeigen, das zu einem Widerspruch Hint "**Robo**: Und jetzt musst Du nur noch das Zwischenresultat herleiten, dass zu diesem Widerspruch geführt hat."
geführt hat."
apply g apply g
assumption assumption
NewTactic by_contra NewTactic by_contra
Conclusion "**Oddeus**: Sehr gut, kommt mit hinein!" Conclusion "**Benedictus**: Ich sehe schon, Ihr lernt schnell!"

@ -12,32 +12,29 @@ Game "Adam"
World "Contradiction" World "Contradiction"
Level 4 Level 4
Title "Per Widerspruch" Title "Kontraposition"
Introduction Introduction
" "
*Oddeus* Geht zu einem Regal mit vielen Dokumenten und beginnt zu suchen. **Benedictus**: Ich habe noch eine schöne Frage zu ungeraden Quadraten für Euch. Aber vorher beweist Ihr besser noch diese Äquivalenz hier. Ich gaube, die hat sogar bei Euch einen Namen: *Kontrapositionsäquivalenz*, oder so etwas. Auf Leansch nennen wir die Äuqivalenz einfach `not_imp_not`. Ist doch viel einleuchtender, oder?
**Oddeus**: Ich hab's gleich. Hier ist eine Notiz meiner Gelehrter, die mir
mit solchen kryptischen Nachrichten helfen wollten.
Auf dem Pergament steht das ein Lemma mit dem Namen `not_imp_not`:
" "
Statement not_imp_not (A B : Prop) : A → B ↔ (¬ B → ¬ A) := by Statement not_imp_not (A B : Prop) : A → B ↔ (¬ B → ¬ A) := by
Hint "**Du**: Ich glaube, dafür kenn ich das meiste schon." Hint "**Du**: Ja, das habe ich tatsächlich schon einmal gesehen.
**Robo**: Ja, klar hast Du das schon einmal gesehen. Das benutzen Mathematiker doch ständig. Wenn ihnen zu $A ⇒ B$ nichts einfällt, zeigen sie stattdessen $¬B ⇒ ¬A$. Ich würde das ja statt *Kontraposition* oder `not_imp_not` eher *von_hinten_durch_die_Brust_ins_Auge* nennen. Aber gut, ich will mich nicht einmisschen.
"
Hint (hidden := true) "**Robo**: Fang doch mal mit `constructor` an." Hint (hidden := true) "**Robo**: Fang doch mal mit `constructor` an."
constructor constructor
intro h b intro h b
by_contra a by_contra a
Hint "**Robo**: Zur Erinnerung, hier würde ich mit `suffices g : B` einen Widerspruch Hint "**Robo**: Ich würde wieder mit `suffices g : B` einen Widerspruch herbeiführen."
herbeiführen."
suffices b : B suffices b : B
contradiction contradiction
apply h apply h
assumption assumption
intro h a intro h a
Hint "**Robo**: Hier würde ich ebenfalls einen Widerspruch anfangen." Hint "**Robo**: Hier würde ich ebenfalls einen Widerspruchsbeweis anfangen."
by_contra b by_contra b
Hint (hidden := true) "**Robo**: `suffices g : ¬ A` sieht nach einer guten Option aus." Hint (hidden := true) "**Robo**: `suffices g : ¬ A` sieht nach einer guten Option aus."
suffices g : ¬ A suffices g : ¬ A
@ -48,4 +45,4 @@ Statement not_imp_not (A B : Prop) : A → B ↔ (¬ B → ¬ A) := by
DisabledTactic rw DisabledTactic rw
DisabledLemma not_not DisabledLemma not_not
Conclusion "**Du**: Und wie hilft uns das jetzt, was steht denn in dem Brief?" Conclusion ""

@ -14,14 +14,7 @@ Title "Kontraposition"
Introduction Introduction
" "
*Oddeus* reicht euch das Papier. **Benedictus**: Gut, hier ist die angekündigte Frage. Versucht mal einen *direkten* Beweis, ohne `contrapose`.
**Du**: Da steht etwas über `contrapose` hier…
**Oddeus**: Das ist doch klar eine Aggression uns gegenüber!
**Robo**: Wartet mal, vielleicht wollte euch eure Schwester einfach von ihren neuen
Endeckungen zeigen. Schaut, darunter ist eine Aufgabe.
" "
-- Ein Beweis durch Kontraposition benützt im Grunde das eben bewiesene Lemma -- Ein Beweis durch Kontraposition benützt im Grunde das eben bewiesene Lemma
@ -45,26 +38,24 @@ Endeckungen zeigen. Schaut, darunter ist eine Aufgabe.
open Nat open Nat
Statement (n : ) (h : Odd (n ^ 2)): Odd n := by Statement (n : ) (h : Odd (n ^ 2)): Odd n := by
Hint "**Oddeus**: Wie soll das den gehen? Hint "**Robo**: Ich schlage vor, wir führen das auf das Lemma `even_square` zurück, das wir auf Quantus schon gezeigt hatten. Hier steht ja im Grunde `Odd (n^2) → Odd n`. Und unter Kontraposition ist das äquivalent zu `Even n → Even (n^2)`.
**Robo**: `contrapose` benutzt das Lemma eurer Gelehrter, `not_imp_not`. Also es wandelt **Du**: Richtig. Von hinten durch die Brust … Aber warte, im Moment steht da doch gar kein `→`.
ein Goal `A → B` zu `¬B → ¬A ` um.
**Du**: Aber das Goal ist doch gar keine Implikation? **Robo**: Erinner Dich an `revert`. Mit `revert {h}` kannst du die Annahme `{h}` als Implikationsannahme ins Beweissziel schieben."
**Robo**: Mit `revert {h}` kannst du die Annahme `{h}` als Implikationsannahme ins Goal
schieben."
revert h revert h
Hint "*Oddeus*: Ob man jetzt wohl dieses `contrapose` benutzen kann?" Hint "**Du**: Und jetzt kann ich dieses Kontrapositionslemma anwenden? Wie hieß das noch einmal?
**Robo**: Tatsächlich kannst auch einfach `contrapose` schreiben.
"
contrapose contrapose
Hint (hidden := true) "**Du**: Warte mal, jetzt kann man wohl `even_iff_not_odd` verwenden…" Hint (hidden := true) "**Robo**: Vielleicht hilft jetzt `even_iff_not_odd` weiter?"
rw [← even_iff_not_odd] rw [← even_iff_not_odd]
rw [← even_iff_not_odd] rw [← even_iff_not_odd]
Hint "**Robo**: Und den Rest hast du bei *Evenine* als Lemma gezeigt!" Hint "**Du**: Das sieht schon ganz gut aus. Jetzt kann ich tatsächlich das alte Lemma anwenden!"
apply even_square apply even_square
NewTactic contrapose NewTactic contrapose
DisabledTactic by_contra DisabledTactic by_contra
Conclusion "**Oddeus**: Ah ich sehe, die Aussage ist, dass wir das nur zusammen lösen konnten. Conclusion "**Benedictus**: Hervorragend! Ich glaube, damit seid Ihr jetzt ganz gut gewappnet."
Ich danke euch, darauf wäre ich nie gekommen."

@ -14,23 +14,25 @@ Title "Contradiction"
Introduction Introduction
" "
**Du**: Sag mal Robo, das hätte ich aber auch als Widerspruch anstatt Kontraposition **Du**: Aber hätten wir die letzte Aufgabe nicht genauso gut per Widerspruch beweisen können?
beweisen können?
**Robo**: Klar. `contrapose` ist eine Kontraposition, `by_contra` ein Widerspruchsbeweis. **Benedictus**: Klar. Ich dachte nur, ein zweiter Widerspruchsbeweis wäre langweilig. Aber Ihr könnt die Aufgabe gern noch einmal probieren. Hier, ich gebe Sie Euch mit auf die Reise. Aber nun seht zu, dass Ihr weiterkommt!"
Probiers doch einfach!
In diesem Kapitel hast du also folgende Taktiken kennengelernt:
-- Statt mit `contrapose` `by_contra` ein Widerspruchsbeweis.
-- Probiers doch einfach!
-- In diesem Kapitel hast du also folgende Taktiken kennengelernt:
Als Vergleich zwischen Beweisen \"per Widerspruch\"
und \"per Kontraposition\", beweise die Gleiche Aufgabe indem -- Als Vergleich zwischen Beweisen \"per Widerspruch\"
du mit `by_contra` einen Widerspruch suchst. -- und \"per Kontraposition\", beweise die Gleiche Aufgabe indem
" -- du mit `by_contra` einen Widerspruch suchst.
open Nat open Nat
Statement (n : ) (h : Odd (n ^ 2)) : Odd n := by Statement (n : ) (h : Odd (n ^ 2)) : Odd n := by
Hint "**Robo**: Fang diesmal mit `by_contra g` an!" Hint "Sobald Ihr Euch sicher vom Gravitationsfeld des Asteroiden befreit habt, beugt Ihr Euch wieder über die Aufgabe.
**Robo**: Ok, also diesmal fangen wir mit `by_contra g` an!"
by_contra g by_contra g
Hint "**Robo**: Jetzt würde ich einen Widerspruch zu `Odd (n ^ 2)` führen." Hint "**Robo**: Jetzt würde ich einen Widerspruch zu `Odd (n ^ 2)` führen."
Hint "**Robo**: Also `suffices g : ¬ Odd (n ^ 2)`." Hint "**Robo**: Also `suffices g : ¬ Odd (n ^ 2)`."
@ -42,15 +44,15 @@ Statement (n : ) (h : Odd (n ^ 2)) : Odd n := by
DisabledTactic contrapose revert DisabledTactic contrapose revert
Conclusion "**Robo**: Bravo! Hier nochmals ein Überblick, was wir jetzt alles auf diesem Conclusion "**Robo**: Bravo! Hier ein Überblick, was uns Benediktus gezeigt hat.
Mond gelernt haben:
| | Taktik | Beispiel | | | Taktik | Beispiel |
|:------|:----------------|:-------------------------------------------------------| |:------|:----------------|:-------------------------------------------------------|
| 177 | `have` | Zwischenresultat annehmen. | | 177 | `have` | Zwischenresultat annehmen |
| 18 | `suffices` | Zwischenresultat annehmen. | | 18 | `suffices` | Zwischenresultat annehmen |
| 19 | `by_contra` | Widerspruch. (startet einen Widerspruch) | | 19 | `by_contra` | Widerspruch *(startet einen Widerspruchsbeweis)* |
| *3* | `contradiction` | *(Schliesst einen Widerspruchsbeweis)* | | *3* | `contradiction` | *(schliesst einen Widerspruchsbeweis)* |
| 20 | `contrapose` | Kontraposition. | | 20 | `contrapose` | Kontraposition |
| *9* | `revert` | Nützlich um danach `contrapose` anzuwenden. | | *9* | `revert` | nützlich, um danach `contrapose` anzuwenden |
" "

@ -14,21 +14,24 @@ import Adam.Levels.Implication.L13_Summary
Game "Adam" Game "Adam"
World "Implication" World "Implication"
Title "Aussagenlogik 2" Title "Implis"
Introduction Introduction
" "
Zurück im Raumschiff macht ihr euch auf den Weg zum einem der beiden Monde, die ebenfalls Zurück im Raumschiff macht ihr euch auf den Weg zu einem der beiden Monde, die ebenfalls
beide bewohnt zu sein scheinen. bewohnt zu sein scheinen.
**Du**: Sag mal Robo, Königin *Logisindes* hat under anderem von Implikationen gesprochen, **Du**: Ich habe immer noch das Gefühl, dass ich die Aufgabe von Königin *Logisinde* ohne `tauto` nicht hätte lösen können.
aber niemand von den Einwohnern wusste was davon... Kamen in der Aufgabe nicht auch Implikationen vor?
**Robo**: Auf dem Mond *Implis* den wir gerade ansteuern können sie uns vielleicht mehr **Robo**: Vielleicht haben wir ja auf dem Mond *Implis*, den wir gerade ansteuern, Gelegenheit, noch etwas dazuzulernen. Festhalten bitte …
erzählen…
Und damit leitet Robo den Landeanflug ein. Implis scheint ein riesiger Tagbau zu sein auf Und damit leitet Robo den Landeanflug ein.
dem nach allem möglichen gegraben wird. Überall seht ihr Förderbänder kreuz und quer.
Implis scheint ein riesiger Tagebau zu sein.
Überall verlaufen Förderbänder, kreuz und quer, aber die meisten stehen still.
Ein schüchterner Operationsleiter erwartet Euch bereits.
**Operationsleiter**: Ihr kommt mir gerade recht! Ich habe schon gehört. Echte Mathematiker! Wisst Ihr, wir fördern hier Wahrheitswerte. Und dabei muss man höllisch aufpassen. Ein Fehler, und alles bricht zusammen. Aber ich bin sehr vorsichtig. Ich sage immer: Lieber Stillstand als Untergang!
Das Operationsteam begrüsst euch freundlich und lädt zum Essen im Kommandoturm.
" "

@ -11,24 +11,39 @@ Title "Intro"
Introduction Introduction
" "
**Operationsleiter**: Sagt mal, könnt ihr mir hier weiterhelfen? **Operationsleiter**: Hier, zum Beispiel:
" "
Statement (A B : Prop) (hb : B) : A → (A ∧ B) := by Statement (A B : Prop) (hb : B) : A → (A ∧ B) := by
Hint "**Du**: Einen Moment, das ist eine Implikation (`\\to`), Hint "
also `A` impliziert `A und B`, soweit so gut, also eine Tautologie. **Operationsleiter:** Die Arbeiten meinen, das wäre so richtig und wir würden das dringend brauchen. Aber keiner kann es mir beweisen.
**Robo**: Du hast recht, eigentlich könnte man `tauto` sagen, **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.
aber das scheinen die hier tauto nicht zu verstehen.
Implikationen kannst du aber mit `intro h` angehen." Der Operationsleiter sieht Dich erwartungsvoll an.
**Du** *(leise zu Robo)*: Soll ich ihm `tauto` aufschreiben?
**Robo** *(leise zurück)*: So wie der aussieht, fürchte ich, das wird er auch nicht verstehen.
Schreib den Beweis lieber aus.
*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}`."
intro hA intro hA
Hint "**Du**: Jetzt habe ich also angenommen, dass `A` wahr ist und muss `A ∧ B` zeigen, Hint "**Du**: OK. Jetzt habe ich also sowohl `{A}` als auch `{B}` in meinen Annahmen und muss `{A} ∧ {B}` zeigen.
das kennen wir ja schon."
**Robo**: Genau. Und wie das geht, weißt Du ja schon."
constructor constructor
assumption assumption
assumption assumption
Conclusion "Der Operationsleiter nickt bedacht." Conclusion "**Operationsleiter:** Perfekt! Danke schön!
Er geht zu einer Schalttafel und ein paar Knöpfe. Irgendwo setzt sich lautstark ein Förderband in Bewegung.
**Operationsleiter:** Habt Ihr vielleicht noch ein paar Minuten?
"
NewTactic intro NewTactic intro
DisabledTactic tauto DisabledTactic tauto

@ -9,22 +9,27 @@ Level 2
Title "Revert" Title "Revert"
Introduction Introduction
"Jemand aus der Gruppe gibt dir ein Blatt Papier mit einer Zeile Text:" "Der Operationsleiter holt aus einem Container einen Stapel Papier hervor.
**Operationsleiter:** Hier hat sich echt einiges angesammelt. Wäre echt super, wenn Ihr mir noch ein bisschen helfen könntet.
Er übergibt Euch das oberste Blatt."
Statement (A B : Prop) (ha : A) (h : A → B) : B := by Statement (A B : Prop) (ha : A) (h : A → B) : B := by
Hint "**Robo**: Mit `revert {ha}` kann man die Annahme `ha` als Hint "**Operationsleiter:** Das ist von einem Kollegen.
Implikationsprämisse vorne ans Goal anhängen, dann ist das Goal `{A} → {B}`.
**Robo**: Oh, das hab ich schon einmal irgendwo gelesen. Warte mal … Richtig! Das war damals, als ich Wikipedia gecrawlt habe: `Der Modus ponens ist eine schon in der antiken Logik geläufige Schlussfigur, die in vielen logischen …`
**Du**: Das wirkt etwas unnatürlich. **Du**: Robo! Gefragt ist ein Beweis und kein historischer Aufsatz! Oder komme ich hier etwa mit `mopo` oder so etwas weiter?
**Robo**: Schon, ja. Aber als Tool kann das manchmal nützlich sein." **Robo**: Ok, nein, sorry. `mopo` gibt es nicht. Probier lieber `revert {ha}`."
revert ha revert ha
assumption Hint "**Du**: Aha. `revert` ist qausi `intro` rückwärts.
Conclusion "**Du**: Aber das müsste doch auch anders gehen, ich hätte jetzt intuitiv **Robo:** Genau. `intro` nimmt die Prämisse aus einer Implikation `{A} \\to {B}` im Beweisziel und macht daraus eine Annahme. `revert` nimmt umgekehrt eine Annahme und setzt sie als Implikationsprämisse vor das Beweisziel. Aber nun mach schon fertig."
die Implikation $A \\Rightarrow B$ angewendet und behauptet, dass es genügt $A$ zu zeigen… assumption
Daraufhin lächelt der Fragende nur vorahnend." Conclusion "Der Operationsleiter nimmt erfreut Eure Lösung entgegen, und greift zum Telefon."
NewTactic revert NewTactic revert
DisabledTactic tauto DisabledTactic tauto

@ -9,21 +9,20 @@ Title "Apply"
Introduction Introduction
" "
Sein Kollege zieht eine Linie unter deinen Beweis, schreibt ein durchgestrichenes ~`revert`~ Leider läuft das Telefonat nicht so gut. Er legt wieder auf und schüttelt mit dem Kopf.
hin und gibt dir das Blatt wieder.
**Operationsleiter**: Der Kollege auf der anderen Seite des Mondes versteht kein `revert`. Oder er tut zumindest so. Habt Ihr noch eine andere Idee?
Er zieht eine Linie unter Euren Beweis, ergänzt ein durchgestrichenes ~`revert`~, und legt Euch das Blatt ein zweites Mal vor.
" "
Statement (A B : Prop) (hA : A) (h : A → B) : B := by Statement (A B : Prop) (hA : A) (h : A → B) : B := by
Hint "**Robo**: Da hat er natürlich recht, normalerweise ist es viel schöner mit Hint "**Robo**: Vielleicht wäre es ohnehin eleganter gewesen, mit Implikation mit `apply {h}` anzuwenden."
`apply {h}` die Implikation anzuwenden."
apply h apply h
Hint "**Du**: Und jetzt genügt es also `A` zu zeigen." Hint "**Du**: Ja, das kommt mir jetzt auch natürlich vor."
assumption assumption
Conclusion "**Robo** Übrigens mit `apply LEMMA` kannst auch jedes Lemma anwenden, dessen Conclusion "Diesmal scheint das Telefont erfolgreich zu verlaufen."
Aussage mit dem Goal übereinstimmt.
Die beiden Fragenden schauen das Blatt an und murmeln zustimmend."
NewTactic apply NewTactic apply
DisabledTactic revert tauto DisabledTactic revert tauto

@ -10,14 +10,7 @@ Title "Implikation"
Introduction Introduction
" "
**Du** *(zu Robo)*: Testen die uns eigentlich hier? **Operationsleiter**: Das hier ist jetzt weider ein lokales Problem.
Ein älteres Gruppenmitglied schiebt ein Tablet über den Tisch und beginnt in leiser
Stimme zu erklären.
**Mitarbeiterin**: Eines unserer Kontrollelemente ist kaputt und ist verwirrt, wo Sachen hinkommen.
Gesteuert werden diese über Panels, und hier hab ich das Übungspanel, mit dem wir neue
Ingeneure ausbilden:
" "
Statement (A B C : Prop) (f : A → B) (g : B → C) : A → C := by Statement (A B C : Prop) (f : A → B) (g : B → C) : A → C := by
@ -31,8 +24,6 @@ Statement (A B C : Prop) (f : A → B) (g : B → C) : A → C := by
apply f apply f
assumption assumption
Conclusion "**Du**: Ich hab das Konzept verstanden. Conclusion "**Operationsleiter**: Ihr seid echt super!"
Die Mitarbeiterin ist zufrieden und wünscht euch Glück auf der Mission."
DisabledTactic tauto DisabledTactic tauto

@ -8,45 +8,41 @@ Title "Implikation"
Introduction Introduction
" "
Selbstsicher folgt ihr den Anweisungen und geht nach draußen zum Die nächste Seite sieht ein bisschen komplizierter aus. Damit Ihr nicht die Übersicht verliert, fasst Robo sofort die verschiedenen Implikationen in einem Diagramm zusammen.
defekten Kontrollelement. Dieses zeigt ein kompliziertes Diagram: $$
$$ \\begin{CD}
\\begin{CD} A @>{f}>> B @<{g}<< C \\\\
A @>{f}>> B @<{g}<< C \\\\ @. @V{h}VV @V{m}VV \\\\
@. @V{h}VV @V{m}VV \\\\ D @>{i}>> E @>{k}>> F \\\\
D @>{i}>> E @>{k}>> F \\\\ @A{m}AA @A{n}AA @V{p}VV \\\\
@A{m}AA @A{n}AA @V{p}VV \\\\ G @<{q}<< H @>{r}>> I
G @<{q}<< H @>{r}>> I \\end{CD}
\\end{CD} $$
$$
" "
Statement Statement
(A B C D E F G H I : Prop) (A B C D E F G H I : Prop)
(f : A → B) (g : C → B) (h : B → E) (i : D → E) (k : E → F) (m : G → D) (f : A → B) (g : C → B) (h : B → E) (i : D → E) (k : E → F) (m : G → D)
(n : H → E) (p : F → I) (q : H → G) (r : H → I) : A → I := by (n : H → E) (p : F → I) (q : H → G) (r : H → I) : A → I := by
Hint "**Du**: Also ich muss einen Pfad von Implikationen $A \\Rightarrow I$ finden. Hint "**Du**: Also ich muss einen Pfad von Implikationen $A \\Rightarrow I$ finden.
**Robo**: Und dann fängst du am besten wieder mit `intro` an." **Robo**: Dann fängst du am besten wieder mit `intro` an."
intro ha intro ha
Branch Branch
apply r apply r
Hint "**Robo**: Das sieht nach einer Sackgasse aus…" Hint "**Robo**: Das sieht nach einer Sackgasse aus …"
Hint (hidden := true) "**Robo**: Na wieder `apply`, was sonst." Hint (hidden := true) "**Robo**: Na wieder `apply`, was sonst."
apply p apply p
apply k apply k
apply h apply h
Branch Branch
apply g apply g
Hint "**Robo**: Nah, da stimmt doch was nicht…" Hint "**Robo**: Nah, da stimmt doch was nicht …"
apply f apply f
assumption assumption
Conclusion Conclusion
"Mit einem lauten Ratteln springen die Förderbänder wieder an. "Der Operationsleiter bedankt sich wieder artig. Er drückt wieder auf ein paar Knöpfe, und mit einem lauten Ratteln springen mehrere Förderbänder gleichzeitig wieder an."
**Operationsleiter**: Vielen Dank euch! Kommt ich geb euch eine Führung und stell euch den
Technikern hier vor."
DisabledTactic tauto DisabledTactic tauto

@ -4,40 +4,35 @@ Game "Adam"
World "Implication" World "Implication"
Level 6 Level 6
Title "Genau dann wenn" Title "Genau dann, wenn"
Introduction Introduction
" "
Als erstes kommt ihr in einen kleinen Raum mit ganz vielen Bildschirmen. **Operationsleiter:** Wir hatten auch mal ein paar Förderbänder, die in beide Richtungen laufen konnten. Die hatte ich vorsichtshalber alle abgestellt, weil in den neusten Handbüchern von solchen Doppelbändern abgeraten wird. Aber vielleicht sind sie ja unter bestimmten Voraussetzungen doch sicher? Was meint Ihr zu diesem Fall?
Ein junges Wesen dreht sich auf dem Stuhl um, und sagt:
**Mitarbeiter**: Oh hallo! Schaut euch mal das hier an!
" "
Statement (A B : Prop) (mp : A → B) (mpr : B → A) : A ↔ B := by Statement (A B : Prop) (mp : A → B) (mpr : B → A) : A ↔ B := by
Hint "**Robo**: Das ist ein genau-dann-wenn Pfeil: `\\iff`. Er besteht aus zwei Teilen: Hint "**Robo**: `→` ist natürlich Leansch für `$\iff$`.
`A ↔ B` ist als `⟨A → B, B → A⟩` definiert. Die Aussage `A ↔ B` besteht also aus zwei Teilen; sie ist als `⟨A → B, B → A⟩` definiert.
**Du**: Also ganz ähnlich wie das UND, `A ∧ B`? **Du**: Also ganz ähnlich wie das UND, `A ∧ B`?
**Robo**: Genau. Entsprechend kannst du hier auch mit `constructor` anfangen." **Robo**: Genau. Entsprechend kannst Du auch hier mit `constructor` anfangen."
constructor constructor
Hint "**Du**: Ah und die beiden hab ich schon in den Annahmen." Hint "**Du**: Ah, und die beiden Teile habe ich schon in den Annahmen."
assumption assumption
assumption assumption
Conclusion Conclusion
" "
**Robo**: Übrigens, bei `(h : A ∧ B)` haben die beiden Teile `h.left` und `h.right` geheißen, **Operationsleiter**: Ok, das leuchtet mir ein.
hier bei `(h : A ↔ B)` heißen sie `h.mp` und `h.mpr`.
**Du**: Also `h.mp` ist `A → B`? Wieso `mp`? **Robo** *(zu Dir)*: Übrigens, so wie bei `(h : A ∧ B)` die beiden Teile `h.left` und `h.right` heißen,
heißen bei `(h : A ↔ B)` die beiden Teile `h.mp` und `h.mpr`.
**Operationsleiter**: \"Modulo Ponens\" ist ein lokaler Begriff hier, **Du**: Also `h.mp` ist `A → B`? Wieso `mp`?
aber das ist doch nicht wichtig.
**Robo**: Und das \"r\" in `mpr` stünde 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 NewTactic constructor

@ -9,19 +9,17 @@ Game "Adam"
World "Implication" World "Implication"
Level 7 Level 7
Title "Genau dann wenn" Title "Genau dann, wenn"
Introduction Introduction
" "
Als nächstes begenet ihr jemandem im Flur. **Operationsleiter**: Hier ist noch so etwas.
Dieser hat schon von euch gehört und will sofort wissen, ob ihr ihm helfen könnt:
" "
Statement (A B C D : Prop) (h₁ : C ↔ D) (h₂ : A ↔ B) (h₃ : A ↔ D) : B ↔ C := by Statement (A B C D : Prop) (h₁ : C ↔ D) (h₂ : A ↔ B) (h₃ : A ↔ D) : B ↔ C := by
Hint "**Du**: $B \\iff A \\iff D \\iff C$, die sind doch alle äquivalent… Hint "**Du**: $B \\iff A \\iff D \\iff C$, die sind doch alle äquivalent…
**Robo**: Ja aber du musst ihm helfen umzuschreiben. Mit `rw [h₁]` kannst du `C` durch `D` **Robo**: Ja, aber du musst ihm helfen, die Äquivalenzen umzuschreiben. Mit `rw [h₁]` kannst du `C` durch `D`
ersetzen." ersetzen."
rw [h₁] rw [h₁]
Hint "**Du** Und wenn ich in die andere Richtung umschreiben möchte? Hint "**Du** Und wenn ich in die andere Richtung umschreiben möchte?
@ -29,18 +27,18 @@ Statement (A B C D : Prop) (h₁ : C ↔ D) (h₂ : A ↔ B) (h₃ : A ↔ D) :
**Robo**: Dann schreibst du ein `←` vor den Namen, also `rw [← hₓ]`." **Robo**: Dann schreibst du ein `←` vor den Namen, also `rw [← hₓ]`."
Branch Branch
rw [← h₃] rw [← h₃]
Hint "**Du**: Ehm, das ist verkehrt. Hint "**Du**: Ehm, das war verkehrt.
**Robo**: Andersrum wär's besser gewesen, aber wenn du jetzt einfach weitermachst bis du **Robo**: Ja, anders herum wär's besser gewesen. Aber wenn du jetzt einfach weitermachst, bis Du
sowas wie `A ↔ A` kriegst, kann `rfl` das beweisen. sowas wie `A ↔ A` erhältst, kann `rfl` das beweisen.
**Robo: Da fällt mir ein, `rw` versucht automatisch `rfl` am Ende. Das heisst, du musst **Robo: Da fällt mir ein, `rw` wendet ohnehin auch versuchsweise `rfl` an.
das nicht einmal mehr schreiben." Das heißt, Du musst `rfl` nicht einmal ausschreiben."
rw [h₂] rw [h₂]
rw [←h₂] rw [←h₂]
assumption assumption
Conclusion "Ihr geht weiter und der Operationsleiter zeigt euch die Küche." Conclusion "**Operationsleiter**: Wenn Ihr so weitermacht, dann kommen wir ja durch den ganzen Packen durch!"
NewTactic rw assumption NewTactic rw assumption
DisabledTactic tauto DisabledTactic tauto

@ -10,35 +10,35 @@ Title "Genau dann wenn"
Introduction Introduction
" "
Der Koch kommt erfreut hinter einem grossen Topf hervor. **Operationsleiter**: Das hier ist wieder für meinen beschränkten Kollegen. Ich glaube, `rw` mag der auch nicht. Geht das trotzdem?
**Koch**: Sagt mal, gestern hat mir jemand was erzählt und es will einfach nicht aus
meinem Kopf…
" "
Statement (A B C : Prop) (h : A ↔ B) (g : B → C) : A → C := by Statement (A B C : Prop) (h : A ↔ B) (g : B → C) : A → C := by
Hint "**Du**: Naja ich kann wohl immerhin mal mit `intro` anfangen und annehmen, Hint "**Du**: Naja ich kann wohl immerhin mal mit `intro` anfangen und annehmen,
dass `{A}` wahr sei… dass `{A}` wahr sei
**Robo**: und dann schauen wir weiter!" **Robo**: und dann schauen wir weiter!"
intro hA intro hA
Hint "**Robo**: Also eine Implikation wendet man mit apply an… Hint "**Robo**: Also eine Implikation wendet man mit `apply` an
**Du**: Weiss ich ja!" **Du**: Weiß ich doch!"
apply g 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. `apply {h}.mp` anwenden.
**Du**: Aber ich könnte hier auch `rw [← h]` sagen, oder? **Du**: Aber normalerweise könnte ich hier auch `rw [← h]` sagen, oder?
**Robo**: Klar, aber offenbar versteht der Koch das `rw` nicht. **Robo**: Ja ja, nur nicht auf der anderen Seite des Mondes.
" "
apply h.mp apply h.mp
assumption assumption
Conclusion "**Koch**: Danke vielmals! Jetzt muss ich aber schauen dass die Suppe nicht verkocht! Conclusion "**Operationsleiter**: Ok, super. Das müsste passen.
Er telefoniert wieder.
Und er eilt davon." **Operationsleiter**: Bingo!
"
NewTactic apply assumption NewTactic apply assumption
DisabledTactic tauto rw DisabledTactic tauto rw

@ -10,32 +10,32 @@ Title "Genau dann wenn"
Introduction Introduction
" "
Noch während der Koch wieder zu seiner Suppe geht, kommt sein erster Gehilfe hervor. **Operationsleiter**: Ah, die nächste Seite ist auch von diesem Kollegen. Aber da ist noch eine Notiz bei. Wir hatten hierfür schon einmal einen Beweis, aber den mochte er nicht. Er wollte einen Beweis, der weder `rw` noch `apply` verwendet!!
**Gehilfe**: Ich hab gestern noch was anderes gehört, könnt ihr mir da auch helfen? Er holt tief Luft und seuft.
Aber ich versteh nicht ganz was ihr meinem Chef erklärt habt.
**Operationsleiter**: Ich glaube, der stellt sich immer viel dümmer, als er ist. Aber meint Ihr, Ihr schafft das?
" "
Statement (A B : Prop) : (A ↔ B) → (A → B) := by Statement (A B : Prop) : (A ↔ B) → (A → B) := by
Hint "**Du**: Hmm, mindestens mit der Implikation kann ich anfangen." Hint "**Du**: Hmm, mindestens mit der Implikation kann ich anfangen."
Hint (hidden := true) "**Robo**: Genau, das war `intro`." Hint (hidden := true) "**Robo**: Genau, das war `intro`."
intro h intro h
Hint "**Du**: Also ich kenn `rw [h]` und `apply h.mp`, aber das will er wohl nicht hören. 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." Teile aufteilen."
Branch Branch
intro a intro a
Hint "**Robo**: Hier müsstest du jetzt `rw [←h]` oder `apply h.mp` benützen, aber der Hint "**Robo**: Hier müsstest Du jetzt `rw [←h]` oder `apply h.mp` benutzen.
Gehilfe will, dass du zwingend eine dritte Variante benützt. Geh doch einen Geh lieber einen Schritt zurück, sodass das Goal `A → B` ist."
Schritt zurück so dass das Goal `A → B` ist."
rcases h with ⟨mp, mpr⟩ rcases h with ⟨mp, mpr⟩
Hint (hidden := true) "**Du**: Ah und jetzt ist das Resultat in den Annahmen." Hint (hidden := true) "**Du**: Ah, und jetzt ist das Beweisziel in den Annahmen."
assumption assumption
Conclusion Conclusion
" "
**Gehilfe**: Ah danke! Und jetzt versteh ich auch die Zusammenhänge! **Operationsleiter**: Perfekt, das sollte reichen!
" "
OnlyTactic intro rcases assumption OnlyTactic intro rcases assumption
DisabledTactic rw apply tauto DisabledTactic rw apply tauto

@ -11,38 +11,39 @@ Title "Lemmas"
Introduction Introduction
" "
Ihr setzt euch hin und der Gehilfe bringt euch allen Suppe. Neben euch sitzt eine Mechanikerin Beim nächsten Problem stutzt der Operationsleiter.
über ihre Suppe geneigt.
**Mechanikerin**: Sagt mal, ich hab unten über folgendes tiefgründiges Problem nachgedacht: **Operationsleiter**: Ehrlich gesagt weiß ich gar nicht, wo dieses Blatt herkommt. Das ist gar nicht von mir. Sieht aber irgendwie interessant aus.
" "
Statement (A : Prop) : ¬A A := by Statement (A : Prop) : ¬A A := by
Hint "**Du**: Das scheint ziemlich offensichtlich. Hint "**Du**: Das scheint wieder ziemlich offensichtlich.
**Robo**: Ich glaube, sie will eine detailierte Antwort. Ich kenne ein Lemma **Robo**: Nee, offensichtlich ist das nicht. Aber ich glaube, es gibt ein wohlbekanntens Lemma, das hier weiterhilft:
`not_or_of_imp`, was sagt `(A → B) → ¬ A B`. Da das Resultat des Lemmas mit `not_or_of_imp` besagt `(A → B) → ¬ A B`. Da die rechte Seite der Implikation mit Deinem Beweisziel übereinstimmt,
deinem Goal übreinstimmt, kannst du es mit `apply not_or_of_imp` anwenden." kannst Du es mit `apply not_or_of_imp` anwenden.
Branch
**Du**: `Wohlbekannt` auf Implis?
**Robo**: Werden wir sehen. Probiers aus!"
Branch
right right
Hint "**Du**: Und jetzt? Hint "**Du**: Und jetzt?
**Robo**: `right/left` funktioniert hier nicht, da du nicht weisst ob `A` wahr oder falsch **Robo**: `right/left` funktioniert hier nicht, da Du nicht weißt, ob `A` wahr oder falsch ist."
ist."
Branch Branch
left left
Hint "**Du**: Und jetzt? Hint "**Du**: Und jetzt?
**Robo**: `right/left` funktioniert hier nicht, da du nicht weisst ob `A` wahr oder falsch **Robo**: `right/left` funktioniert hier nicht, da Du nicht weißt, ob `A` wahr oder falsch ist."
ist."
apply not_or_of_imp apply not_or_of_imp
Hint (hidden := true) "**Robo**: Ich würd wieder mit `intro` weitermachen." Hint (hidden := true) "**Robo**: Ich würde wieder mit `intro` weitermachen."
intro intro
assumption assumption
Conclusion Conclusion
" "
**Mechanikerin**: Danke vielmals, jetzt bin ich schon viel ruhiger. Der Operationsleiter nickt zustimmend. Offenbar war ihm `not_or_of_imp` tatsächlich bekannt.
" "
LemmaTab "Logic" LemmaTab "Logic"

@ -11,19 +11,20 @@ Title "by_cases"
Introduction Introduction
" "
**Du**: Sagt mal, hätte ich da nicht auch einfach zwei Fälle anschauen können: **Du**: Sag mal, hätten wir nicht auch einfach zwei Fälle anschauen können?
Wenn `A` wahr ist, beweis ich die rechte Seite, sonst die Linke. Wenn `A` wahr ist, beweisen wir die rechte Seite, sonst die Linke.
**Robo**: Tatsächlich, `by_cases h : A` würde genau das machen! **Robo**: Tatsächlich, `by_cases h : A` würde genau das machen!
**Du** (zum Operationsleiter): Können wir das Blatt bitte noch einmal haben?
" "
Statement (A : Prop) : ¬A A := by Statement (A : Prop) : ¬A A := by
Hint (hidden := true) "**Du**: Wie? 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)`." Verfügung, im zweiten `(h : ¬ A)`."
by_cases h : A by_cases h : A
Hint "**Du**: "
right right
assumption assumption
left left
@ -31,7 +32,7 @@ Statement (A : Prop) : ¬A A := by
Conclusion Conclusion
" "
**Du**: Das kann noch ganz nützlich sein. **Du**: So gefällt mir der Beweis viel besser!
" "
NewTactic by_cases NewTactic by_cases

@ -11,19 +11,12 @@ Title "Lemmas"
Introduction Introduction
" "
Der Arbeitskollegin der Mechanikerin, der die ganze Zeit gespannt zugehört hat, dreht sich zu **Operationsleiter**: Wieder etwas für den Kollegen …. Und er wollte wieder einen Beweise ohne `apply`. Ich sehe hier auch, dass ich mir schon einmal etwas hierzu notiert hatte. Richtig, es gibt da dieses Lemma:
euch.
Er ist offensichtlich interessiert and existierenden Resultaten zu sein, aber offenbar
kann er nicht viel mit `apply` anfangen.
Er hat aber folgendes Resultat bereit:
``` ```
lemma not_not (A : Prop) : ¬¬A ↔ A lemma not_not (A : Prop) : ¬¬A ↔ A
``` ```
und stellt euch folgende Frage: **Operationsleiter**: Schafft Ihr das damit?
" "
Statement (A B C : Prop) : (A ∧ (¬¬C)) (¬¬B) ∧ C ↔ (A ∧ C) B ∧ (¬¬C) := by Statement (A B C : Prop) : (A ∧ (¬¬C)) (¬¬B) ∧ C ↔ (A ∧ C) B ∧ (¬¬C) := by
@ -33,17 +26,16 @@ Statement (A B C : Prop) : (A ∧ (¬¬C)) (¬¬B) ∧ C ↔ (A ∧ C) B
Hint "**Du**: Häh, wieso hat das jetzt 2 von 3 der `¬¬` umgeschrieben? Hint "**Du**: Häh, wieso hat das jetzt 2 von 3 der `¬¬` umgeschrieben?
**Robo**: `rw` schreibt nur das erste um, das es findet, also `¬¬C`. Aber weil dieses **Robo**: `rw` schreibt nur das erste um, das es findet, also `¬¬C`. Aber weil dieses
mehrmals vorkommt, werden die alle ersetzt… mehrmals vorkommt, werden die alle ersetzt
**Du**: Ah, und `¬¬B` ist was anderes, also brauch ich das Lemma nochmals." **Du**: Ah, und `¬¬B` ist etwas anderes, also brauche ich das Lemma nochmals."
rw [not_not] rw [not_not]
Conclusion Conclusion
" "
**Du**: Ah und wir sind fertig…? **Du**: Wir sind schon fertig …?
**Robo**: Ja, `rw` versucht immer anschliessend `rfl` aufzurufen, und das hat hier **Robo**: Ja, `rw` versucht immer anschließend `rfl` aufzurufen, und das hat hier funktioniert.
funktioniert.
" "
DisabledTactic tauto apply DisabledTactic tauto apply

@ -13,14 +13,11 @@ Title "Zusammenfassung"
Introduction Introduction
" "
**Operationsleiter**: Damit endet unsere Führung langsam. Bevor ihr weitergeht **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?
habe ich noch ein Problem, an dem ich mir die Zähne ausbeisse. Wir haben die
Herleitung eines unserer Programme `imp_iff_not_or` verloren, und wissen nicht mehr
ob es einwandfrei funktioniert.
**Du**: Nah gut, mal sehen. Robo, was hab ich denn alles hier gelernt? **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: **Robo**: Hier ist die Übersicht:
## Notationen / Begriffe ## Notationen / Begriffe
@ -44,34 +41,35 @@ ob es einwandfrei funktioniert.
Statement imp_iff_not_or (A B : Prop) : (A → B) ↔ ¬ A B := by Statement imp_iff_not_or (A B : Prop) : (A → B) ↔ ¬ A B := by
constructor constructor
Hint "**Du**: Das sieht kompliziert aus… Hint "**Du** *(flüsternd)*: Ist das nicht die Definition von `→`?
**Robo** *(flüsternd)*: Ja, aber die Richtung kennst du ja schon also Lemma, **Robo** *(flüsternd)*: Könnte man so sehen. Aber auf Leansch ist das bloß eine Äquivalenz.
wend doch einfach das an." So oder so kennst du ja eine Richtung schon als Lemma.
Also wende das doch einfach an."
apply not_or_of_imp apply not_or_of_imp
Hint "**Du**: Gibt es für die Gegenrichtung auch ein Lemma? Hint "**Du**: Gibt es für die Gegenrichtung auch ein Lemma?
**Robo**: Leider nicht. Da musst du manuell ran." **Robo**: Leider nicht. Da musst Du manuell ran."
Hint (hidden := true) "**Robo**: Na Implikationen fangst du immer mit `intro` an." Hint (hidden := true) "**Robo**: Na Implikationen gehst Du immer mit `intro` an."
intro h intro h
intro ha intro ha
Hint (hidden := true) "**Robo**: Ich wür mal die Annahme `h` mit `rcases` aufteilen." Hint (hidden := true) "**Robo**: Ich würde mal die Annahme `h` mit `rcases` aufteilen."
rcases h with h | h rcases h with h | h
contradiction contradiction
assumption assumption
DisabledTactic tauto DisabledTactic tauto
Conclusion "**Operationsleiter**: Damit gehen unsere Wege auseinander. Da fällt mir ein, seit Conclusion "**Operationsleiter**: Das ist ja fantastisch! Tausend Dank! Dann will ich Euch auch gar nicht länger aufhalten.
ihr auf dem Weg zu unserem Schwestermond? Ihr wollt bestimmt weiter zu Quantus, unserem Schestermond, oder?
**Du**: Könnten wir sein **Du**: Ehm, vielleicht
**Operationsleiter**: Ich hab hier einen Brief für *Evenine*, könntet ihr diesen mit euch führen? **Operationsleiter**: Dann habe ich noch eine letzte Bitte. Ich habe hier noch ein Päckchen für die Königin von Quantus! Auch schon von meinem Vorgänger geerbt. Die Post will es nicht annehmen, weil ich die Adresse nicht weiß. Könntet Ihr es vielleicht zu ihr mitnehmen?
**Du**: Klar! Robo, halt den mal. **Du**: Klar! Robo, halt mal.
Robo nimmt den Brief und lässt ihn irgendwo in seinem Innern verschwinden. Dabei bemerkt er Robo nimmt das Päckchen und lässt es irgendwo in seinem Innern verschwinden.
den besorgten Blick des Operationsleiters. Der Operationsleiter sieht ihn entgeistert an.
**Robo**: Keine Angst, ich verdaue nichts!" **Robo**: Keine Angst, ich verdaue nichts!"

@ -10,18 +10,35 @@ import Adam.Levels.Predicate.L09_PushNeg
Game "Adam" Game "Adam"
World "Predicate" World "Predicate"
Title "Prädikate" Title "Quantus"
Introduction "Eure Reise geht weiter zum zweiten Mond. Dieser ist etwas grösser und Introduction "Auf dem Schwestermond Quantus erwartet Euch bereits ein großer Ansammlung von Formalosopheninnen. Sie reden alle wild durcheinander und Ihr habt Probleme, Euch überhaupt Gehör zu verschaffen. Robo produziert schließlich ein lautes Gong-Geräusch, das sie kurzzeitig zur Ruhe bringt.
komplett mit buschartigen Pflanzen überwachsen. Der Landeanflug sit etwas kniffliger,
aber offenbar kann Robo nicht nur Lean übersetzen, sondern auch mit maschineller Genauigkeit
navigieren.
Ihr werdet sofort empfangen und man führt euch zur lokalen Machthaberin. **Du**: Wir haben einen Brief für Eure Königin. Könntet Ihr uns zu Eurer Königin führen?
Ihr kommt an verschiedensten riesigen Büschen vorbei, die offensichtlich innen Ausgehöhlt sind
und so als Wände für Behausungen der Wesen hier dienen.
Man führt euch in einen der Büsche. Nun entdecksts du dass das Blätterdach künstlich verstärkt ist, **Alle** *(im Chor)*: Wir sind schon alle hier!
offensichtlich um Regen abzuweisen.
Vor euch steht eine Frau, die euch als Machthabering *Evenine* vorgestellt wird." **Du**: Ok. Und wer von Euch ist die Königin?
Nun herrscht betretenes Schweigen. Alle zucken mit den Schultern.
**Du**: Habt Ihr überhaupt eine Königin?
**Alle** *(im Chor)*: Ja, ja. Wir haben eine Königen, wir haben eine Königen.
**Robo** *(zu Dir)*: Ich fasse mal zusammen. Es existiert eine Königen, aber keiner weiß, wer sie ist …
**Du**: Ist das nicht ein Widerspruch?
**Robo**: Fragst Du, Du als Mathematiker? Nein, das ist kein Widerspruch. Das ist einfach eine „reine Existenzaussage“.
Du bist Dir nicht ganz sicher, wie ernst er das meint.
**Du**: Dann ich schlage vor, wir übergeben das Päckchen einfach an *alle* Bewohner. Dann haben wir es ja insbesondere der Königin übergeben.
**Du** *(in die Menge*): Wir haben Euch ein Päckchen von Implis gebracht. Hier, das ist für Euch.
Robo spuckt es aus, wirft es in die Menge, und die Formalosophinnen reißen es auf. Darin befinden sich ein paar loser Seiten, die sie sofort eingehend studieren.
Zwei Minuten später liegen die Seiten wieder bei Euch. Es sind wieder mathematische Probleme. Und die Formalosophinnen wollen sehen, wie Ihr sie löst.
"

@ -10,27 +10,21 @@ Level 1
Title "Natürliche Zahlen" Title "Natürliche Zahlen"
Introduction Introduction
" ""
**Evenine**: Willkommen Reisende! Wir leben hier in Einklang mit der Natur und allem natürlichen,
so sagt mir, könnt ihr mit natürlichen Zahlen umgehen?
"
Statement (x y : ) : (x + y) ^ 2 = x ^ 2 + 2 * x * y + y ^ 2 := by Statement (x y : ) : (x + y) ^ 2 = x ^ 2 + 2 * x * y + y ^ 2 := by
Hint "**Du**: Das hab ich in der Schule gelernt, man rechnet das einfach aus, Hint "**Du**: Das ist doch Schulmathematik! Man rechnet das einfach aus,
indem man die Terme umsortiert. indem man die Terme umsortiert.
**Robo**: Behaupte doch mit `ring`, dass das so ist. **Robo**: Wenn die Gleichung stimmt, kannst Du auf Leansch sogar einfach mit `ring` beweisen, dass das so ist.
**Du**: Aber `` ist doch gar kein Ring? **Du**: Aber `` ist doch gar kein Ring?
**Robo**: `ring` funktioniert schon für Halbringe, aber sie heisst ring, weil sie auf **Robo**: `ring` funktioniert sogar für sogenannte Halbringe. Ich glaube, man sagt `ring`, weil es in (kommutativen) Ringen am besten funktioniert.
(kommutativen) Ringen am besten funktioniert.
" "
ring ring
Conclusion Conclusion
" ""
*Evenine: Ja das stimmt schon. Und das genügt uns auf diesem Planet auch als Antwort.*
"
NewTactic ring NewTactic ring

@ -8,19 +8,13 @@ Level 2
Title "Rewrite" Title "Rewrite"
Introduction Introduction
" ""
Robo spuckt den Brief aus, den er dabei hatte, und gibt ihn *Evenine*.
**Evenine**: Das verstehe ich nicht, wisst ihr was damit gemeint ist?
Und sie händigt Dir den Brief:
"
Statement (a b c d : ) (h₁ : c = d) (h₂ : a = b) (h₃ : a = d) : b = c := by Statement (a b c d : ) (h₁ : c = d) (h₂ : a = b) (h₃ : a = d) : b = c := by
Hint "**Du**: Schau mal, das ist ja fast genau, was wir auf *Implis* gemacht haben, Hint "**Du**: Schau mal, dieses Problem sieht so ähnlich aus wie eines, das wir auf *Implis* schon gelöst hatten.
nur jetzt mit Gleichheiten von Zahlen anstatt Genau-Dann-Wenn-Aussagen! Nur, das hier jetzt Gleichheiten von Zahlen statt Genau-Dann-Wenn-Aussagen stehen!
**Robo**: `=` und `↔` kannst du praktisch gleich behandeln wenns um `rw` geht." **Robo**: Richtig. Und im Grunde macht das gar keinen Unterscheid. Du kannst `=` und `↔` praktisch mit `rw` praktisch g"""""leich behandeln."
Hint (hidden := true) "**Du**: Also auch `rw [hₓ]` und `rw [← hₓ]`? Hint (hidden := true) "**Du**: Also auch `rw [hₓ]` und `rw [← hₓ]`?
**Robo**: Probiers doch einfach." **Robo**: Probiers doch einfach."
@ -32,8 +26,6 @@ Statement (a b c d : ) (h₁ : c = d) (h₂ : a = b) (h₃ : a = d) : b = c :
assumption assumption
Conclusion Conclusion
" ""
**Evenine**: Danke viemals, das hilft uns vermutlich, jetzt Frage ich mich aber…
"
NewTactic assumption rw NewTactic assumption rw

@ -8,9 +8,7 @@ Level 3
Title "Rewrite" Title "Rewrite"
Introduction Introduction
" ""
**Evenine**: Mit diesem neuen Wissen, könnt ihr mir bei folgendem helfen:
"
Statement Statement
" "
@ -23,14 +21,13 @@ $$
$$ $$
" "
(a b : ) (h : a = b) (g : a + a ^ 2 = b + 1) : b + b ^ 2 = b + 1 := by (a b : ) (h : a = b) (g : a + a ^ 2 = b + 1) : b + b ^ 2 = b + 1 := by
Hint "**Du**: Ah da ersetzt man ja einfach `{a}` durch `{b}` in der anderen Annahme! Hint "**Du**: Hier muss man, glaube ich, einfach in Annahme `{g}` die Variable `{a}` durch `{b}` ersetzen.
**Robo**: Genau! Das machst du mit `rw [{h}] at {g}`." **Robo**: Genau! Das machst Du mit `rw [{h}] at {g}`."
rw [h] at g rw [h] at g
Hint (hidden := true) "**Robo**: Schau mal durch die Annahmen." Hint (hidden := true) "**Robo**: Schau mal durch die Annahmen."
assumption assumption
Conclusion " Conclusion "
**Robo**: Noch ein Trick: Mit `rw [h] at *` kann man im weiteren `h` in **allen** Annahmen und **Robo**: Noch ein Trick: Mit `rw [{h}] at *` kann man gleichzeitig mittels `{h}` **alle** Annahmen und das Goal umschreiben.
dem Goal umschreiben.
" "

@ -8,28 +8,19 @@ Level 4
Title "Natürliche Zahlen" Title "Natürliche Zahlen"
Introduction Introduction
" ""
*Evenines* Berater meldet sich.
**Berater**: Das stimmt wohl, aber das Problem, das uns eigentlich beschäftigt hat, eure
Natürlichkeit, war folgendes:
"
Statement Statement
(x y z : ) (h : x = 2 * y + 1) (g : z = 3 * y + 1): x ^ 2 = 4 * y ^ 2 + z + y := by (x y z : ) (h : x = 2 * y + 1) (g : z = 3 * y + 1): x ^ 2 = 4 * y ^ 2 + z + y := by
Hint "**Du**: Ich versteh das Pattern. Wenn ich zuerst alles so umschreibe, dass Hint "**Du**: Ich vermute, wenn ich zuerst alles so umschreibe, dass
das Goal nur noch rechnen und umsortieren ist, dann kann `ring` den Rest machen! das Beweisziel nur noch rechnen und umsortieren zu beweisen ist, erledigt `ring` den Rest!
**Robo**: Noch ein Trick: Entweder kannst du zwei Befehle `rw [h₁]` und `rw [h₂]` schreiben, **Robo**: Genau. Und noch ein Trick: Zwei Schritte `rw [h₁]` und `rw [h₂]` kann man zu einem einzigen Schritt zusammenfassen: `rw [h₁, h₂]`."
oder du kannst das gleich in einem machen : rw [h₁, h₂]."
rw [h, g] rw [h, g]
ring ring
Conclusion Conclusion
" ""
*Evenine* bedankt sich nochmals für die Botschaft und ihr werdet zu einem kleineren Busch geführt,
der ein gemütlich warmes Innenleben an den Tag legt.
"
NewTactic ring rw NewTactic ring rw

@ -8,29 +8,24 @@ Title "Definitionally equal"
Introduction Introduction
" "
Müde ruht ihr euch in eurer Bleibe aus. Du schaust doch eine Lücke in den Blättern vielen Beim nächsten Problem bekommt ihr ausnahmsweise Hilfe vom Publikum.
kleinen Vögeln bei der Nahrungssuche zu.
**Du**: Sag mal Robo, ich hab vorhin ein Kind überhört, dass seinem Spielgefährten erklärt hat, **Alle**: `rfl`, `rfl`, …
folgendes sei mit `rfl` zu beweisen:
" "
Statement : 1 + 1 = 2 := by Statement : 1 + 1 = 2 := by
Hint "**Du**: Wieso nicht `ring`? Hint "**Du**: Wieso nicht `ring`?
**Robo**: Klar, `ring` geht auch und ist intuitiver. **Robo**: Klar, `ring` würde normalerweise auch funktioneren. Aber ich würde mich hier dem Mehrheitswillen beugen …"
Für `rfl` kommt es darauf an, wie die Sachen genau definiert sind: `1 + 1` ist als
`(0.succ).succ` definiert und `2` halt ebenfalls.
"
rfl rfl
OnlyTactic rfl OnlyTactic rfl
Conclusion Conclusion
" "
**Du**: Dann war das mehr Glück? **Robo**: Der Grund, warum hier ausnahmsweise auch mal `rfl` funktioniert hat, ist, dass auf beiden Seiten tatsächlich *per Definition* dasselbe steht. Das soll heißen, wenn man links in `1 + 1` die Definition von `1` und `+ 1` einsetzt, und rechts die Definition von `2`, dann erhält man *buchstäblich* dasselbe (nämlich `(0.succ).succ`).
**Robo**: Das ist eine Art die Welt zu sehen… **Du**: Na schön. Muss ich mir jetzt diese Definition von `2` merken?
Damit fällst du in einen ruhigen Schlaf. **Robo**: Ich glaube eher nicht.
" "

@ -16,8 +16,8 @@ Title "Gerade/Ungerade"
Introduction Introduction
" "
Am nächsten Tag erklärt euch *Evenine*, dass es auf dem Mond zwei Gruppierungen gibt, Ihr habt nun alle Fragen aus dem königlichen Päckchen beantwortet, und die Formalosophinnen applaudieren. Dann wollen Sie aber auch noch ein paar Fragen stellen, aber sie können sich nicht einigen, welche.
ihre und die ihres Halbbruders *Oddeus*. Die Mottos sind Ihr heute abwechselnd die Rufe „Even“ und „Odd“ aus der Menge heraus. Deshalb zeigt Dir Robo vorsichtshalber schon einmal die entsprechenden Definitionen an:
``` ```
def Even (n : ) : Prop := ∃ r, n = r + r def Even (n : ) : Prop := ∃ r, n = r + r
@ -29,18 +29,20 @@ und
def Odd (n : ) : Prop := ∃ r, n = 2 * r + 1 def Odd (n : ) : Prop := ∃ r, n = 2 * r + 1
``` ```
**Evenine**: Hier, ich zeige euch mal etwas was man bei uns machen kann: Schließlich taucht von irgendwo aus der Menge folgendes Papier auf:
" "
Statement even_square (n : ) (h : Even n) : Even (n ^ 2) := by Statement even_square (n : ) (h : Even n) : Even (n ^ 2) := by
Hint "**Robo**: Du kannst Dir mit `unfold Even` auch hier auf dem Papier die Definition sehen."
Branch Branch
unfold Even unfold Even
Hint "Rob**: Am besten machst du auch noch `unfold Even at h`, damit du verstehst was los ist." Hint "Robo**: Am besten machst Du auch noch `unfold Even at h`, damit Du verstehst, was los ist."
Hint "**Robo**: Wie du oben siehst, ist `Even n` dadurch definiert, Hint "**Robo**: Wie Du oben siehst, ist `Even n` dadurch definiert,
dass ein `r` existiert so dass `r + r = n`. Am besten dass ein `r` existiert so dass `r + r = n` ist. Am besten
öffnest du diese Definition mit `unfold Even at *` einmal, dann siehst du besser, was los ist. " öffnest du diese Definition mit `unfold Even at *` einmal.
Dann siehst Du besser, was los ist. "
unfold Even at * unfold Even at *
Hint "**Du**: Also von `{h}` weiss ich jetzt dass ein `r` existiert, so dass `r + r = n` Hint "**Du**: Also von `{h}` weiß ich jetzt, dass ein `r` existiert, so dass `r + r = n`
**Robo**: Mit `rcases h with ⟨r, hr⟩` kannst du dieses `r` tatsächlich einführen." **Robo**: Mit `rcases h with ⟨r, hr⟩` kannst du dieses `r` tatsächlich einführen."
rcases h with ⟨r, hr⟩ rcases h with ⟨r, hr⟩
@ -48,18 +50,18 @@ Statement even_square (n : ) (h : Even n) : Even (n ^ 2) := by
**Robo**: Genau. Und mit `use _` gibst du diese Zahl an." **Robo**: Genau. Und mit `use _` gibst du diese Zahl an."
Hint (hidden := true) "**Robo**: Also sowas ähnliches wie `use 4 * r ^ 3`, aber ich kann Hint (hidden := true) "**Robo**: Also sowas ähnliches wie `use 4 * r ^ 3`, aber ich kann
dir leider nicht sagen, welche Zahl passt. Dir leider nicht sagen, welche Zahl passt.
" "
Branch Branch
rw [hr] rw [hr]
Hint "**Robo**: Das geht auch, jetzt musst du aber wirklich `use` verwenden." Hint "**Robo**: Das geht auch, jetzt musst Du aber wirklich `use` verwenden."
use 2 * r ^ 2 use 2 * r ^ 2
ring ring
use 2 * r ^ 2 use 2 * r ^ 2
Hint "**Du**: Ah und jetzt `ring`! Hint "**Du**: Ah, und jetzt `ring`!
**Robo**: Aber zuerst must du noch mit **Robo**: Aber zuerst musst Du noch mit
`rw` `n` durch `r + r` ersetzen, da `ring` das sonst nicht weiss." `rw` `n` durch `r + r` ersetzen, da `ring` das sonst nicht weiß."
rw [hr] rw [hr]
ring ring
@ -70,4 +72,4 @@ Statement even_square (n : ) (h : Even n) : Even (n ^ 2) := by
NewTactic unfold use NewTactic unfold use
NewDefinition Even Odd NewDefinition Even Odd
Conclusion "**Evenine**: Seht ihr?" Conclusion "Applaus!"

@ -16,19 +16,18 @@ Title "Gerade/Ungerade"
Introduction Introduction
" "
**Du**: Aber, das sagt doch gar nichts aus, genau das gleiche könnte ich für `Odd` Sofort taucht das nächste Blatt auf. Anscheinend hatten sie sich auf einen Kompromiss geeinigt.
auch sagen. Hier seht!
" "
Statement odd_square (n : ) (h : Odd n) : Odd (n ^ 2) := by Statement odd_square (n : ) (h : Odd n) : Odd (n ^ 2) := by
unfold Odd at * unfold Odd at *
rcases h with ⟨r, hr⟩ rcases h with ⟨r, hr⟩
Hint "**Robo**: Ich hab noch einen Trick auf Lager: Hint "**Robo**: Ich hab noch einen Trick auf Lager:
Wenn du jetzt herausfinden willst, welche Zahl du einsetzen musst, könntest Wenn du jetzt herausfinden willst, welche Zahl Du einsetzen musst, könntest
du schon jetzt mit `rw [{hr}]` weitermachen…" Du schon jetzt mit `rw [{hr}]` weitermachen …"
rw [hr] rw [hr]
Hint "**Robo**: Wenn du jetzt `ring` benötigst, dann schreibt es einfach alles in Hint "**Robo**: Wenn Du jetzt `ring` benötigst, dann schreibt es einfach alles in
Normalform um, das hilft beim vergleichen." Normalform um, das hilft beim Vergleichen."
ring ring
Hint "**Du**: Was bedeutet `ring_nf`? Hint "**Du**: Was bedeutet `ring_nf`?
@ -39,5 +38,5 @@ Statement odd_square (n : ) (h : Odd n) : Odd (n ^ 2) := by
-- TODO: Allow `ring_nf` as part of `ring`. -- TODO: Allow `ring_nf` as part of `ring`.
Conclusion "**Evenine**: Tatsächlich. Vielleicht sind wir gar nich tso unterschiedlich. Könntet Conclusion "Applaus!"
ihr mal mit ihm reden gehen?"

@ -15,10 +15,7 @@ Title "Für alle"
Introduction Introduction
" "
Ihr macht euch also auf den Weg. Unterwegs trefft ihr einen Händler und ihr lässt euch von Nach längerem Durcheinander findet ein weiteres Blatt aus der Menge zu Euch.
ihm den Weg zeigen, sowie einige Tipps zu den beiden Geschwistern geben.
**Händler**: Also seht, die beiden sind gar nicht so verschieden. Ein altes Sprichwort sagt:
" "
-- Zum `∃` gehört auch das \"für alle\" `∀` (`\\forall`). -- Zum `∃` gehört auch das \"für alle\" `∀` (`\\forall`).
@ -40,7 +37,7 @@ ihm den Weg zeigen, sowie einige Tipps zu den beiden Geschwistern geben.
Statement : ∀ (x : ), (Even x) → Odd (1 + x) := by Statement : ∀ (x : ), (Even x) → Odd (1 + x) := by
Hint "**Du**: Das `∀` heisst sicher \"für alle\". Hint "**Du**: Das `∀` heisst sicher \"für alle\".
**Robo**: Und man schreibt `\\forall`. Ein `∀ x, …` im Goal kannst du wie eine **Robo**: Und man schreibt `\\forall`. Ein `∀ x, …` im Beweisziel kannst Du wie eine
Implikation mit `intro x` angehen." Implikation mit `intro x` angehen."
intro x h intro x h
unfold Even at h unfold Even at h
@ -50,4 +47,4 @@ Statement : ∀ (x : ), (Even x) → Odd (1 + x) := by
rw [hy] rw [hy]
ring ring
Conclusion "**Händler**: Sichere Reise!" Conclusion "Wieder werdet Ihr mit einem Applaus belohnt, und die Formalosophinnen beratschlagen sich, was sie Euch noch vorlegen wollen."

@ -14,9 +14,7 @@ Title "PushNeg"
Introduction Introduction
" "
Das Dorf von *Oddeus* scheint stärker befestigt zu sein, all jenes von *Evenine*. Ihr kommt Nach langem Hin und Her einigen sie sich schließlich auf folgende Frage:
and eine Wand aus Dornenranken. Beim Eingang steht eine Wache, die auch zuruft:
" "
-- Zum Schluss, immer wenn man irgendwo eine Verneinung `¬∃` oder `¬∀` sieht (`\\not`), kann man -- Zum Schluss, immer wenn man irgendwo eine Verneinung `¬∃` oder `¬∀` sieht (`\\not`), kann man
@ -32,58 +30,60 @@ and eine Wand aus Dornenranken. Beim Eingang steht eine Wache, die auch zuruft:
open Nat open Nat
Statement : ¬ ∃ (n : ), ∀ (k : ) , Odd (n + k) := by Statement : ¬ ∃ (n : ), ∀ (k : ) , Odd (n + k) := by
Hint "**Du**: Also ich kann mal das `¬` durch die Quantifier hindurchschieben. Hint "**Du**: Ich würde gern diese Negation `¬` am Quantor vorbeischieben.
**Robo**: `push_neg` macht genau das!
**Robo**: Intern braucht das zwei Lemmas **Robo**: `push_neg` macht genau das! Oder Du könntest `rw` mit den folgenden Lemmas verwenden:
``` ```
not_exists (A : Prop) : ¬ (∃ x, A) ↔ ∀x, (¬A) not_exists (A : Prop) : ¬ (∃ x, A) ↔ ∀x, (¬A)
not_forall (A : Prop) : ¬ (∀ x, A) ↔ ∃x, (¬A) not_forall (A : Prop) : ¬ (∀ x, A) ↔ ∃x, (¬A)
``` ```
die du natürlich auch mit `rw` gebrauchen könntest." "
Branch Branch
unfold Odd unfold Odd
push_neg push_neg
Hint "**Robo**: Der Weg ist etwas schwieriger. Ich würde nochmals zurück und schauen, Hint "**Robo**: Dieser Lösungsweg scheint mir etwas zu schwierig.
dass du irgendwann `¬Odd` kriegst, was du dann mit `rw [←even_iff_not_odd]` Ich würde nochmal zurückgehen und schauen,
zu `Even` umwandeln. dass Du irgendwie `¬Odd` erhältst.
kannst." Das kannst Du dann mit `rw [←even_iff_not_odd]`
zu `Even` umwandeln."
push_neg push_neg
intro n intro n
Hint "**Robo**: Welche Zahl du jetzt mit `use` brauchst, danach wirst du vermutlich das Hint "**Robo**: Jetzt brauchst Du eine Zahl mit `use`, und danach vermutlich das Lemma `←even_iff_not_odd` brauchen.
Lemma `←even_iff_not_odd` brauchen.
**Du**: Könnte ich jetzt schon `rw [←even_iff_not_odd]` machen? **Du**: Könnte ich jetzt schon `rw [←even_iff_not_odd]` anwenden?
**Robo**: Ne, `rw` kann nicht innerhalb von Quantifiern umschreiben. **Robo**: Nee, `rw` kann nicht innerhalb von Quantoren umschreiben.
**Du**: Aber wie würde ich das machen? **Du**: Aber wie würde ich das machen?
**Robo**: Zeig ich dir später, die Wache wird schon ganz ungeduldig! **Robo**: Zeig ich dir später, nicht hier vor großem Publikum.
Im Moment würde ich zuerst mit `use` eine richtige Zahl angeben, und danach umschreiben." Ich würde jetzt lieber mit `use` eine richtige Zahl angeben, und danach umschreiben."
Branch Branch
use n + 2 use n + 2
Hint "**Robo**: Gute Wahl! Jetzt kannst du `←even_iff_not_odd` verwenden." Hint "**Robo**: Gute Wahl! Jetzt kannst Du `←even_iff_not_odd` verwenden."
Branch Branch
use n + 4 use n + 4
Hint "**Robo**: Gute Wahl! Jetzt kannst du `←even_iff_not_odd` verwenden." Hint "**Robo**: Gute Wahl! Jetzt kannst Du `←even_iff_not_odd` verwenden."
use n use n
Hint "**Robo**: Gute Wahl! Jetzt kannst du `←even_iff_not_odd` verwenden." Hint "**Robo**: Gute Wahl! Jetzt kannst Du `←even_iff_not_odd` verwenden."
rw [←even_iff_not_odd] rw [←even_iff_not_odd]
unfold Even unfold Even
use n use n
--ring --ring
Conclusion "Damit werdet ihr eingelassen. Conclusion "Die Formalosophinnen sind ganz begeistert.
Nachdem sich der Beifall gelegt hat, hast Du auch einmal eine Frage.
**Du**: Kann uns hier irgendjemand vielleicht ein bisschen Orientierung im Formaloversum geben?
**Alle**: Ja, ja.
**Robo**: Entweder wir suchen direkt diesen *Oddeus*, oder wir schauen uns einmal um. Die Wahl **Du**: Wer denn?
ist deine!
**Du**: Kannst du mir nochmals einen Überblick geben, was wir gelernt haben? Die Frage war wieder zu konkret. Betretenes Schweigen.
**Robo**: **Robo**: Lass nur. Ich schlage vor, wir machen als nächstes einen Ausflug auf den Asteroiden da drüben. Und bevor Du fragst hier ist wieder ein Überblick, was Du auf diesem Planeten gelernt hast.
| | Beschreibung | | | Beschreibung |
|:--------------|:----------------------------| |:--------------|:----------------------------|

@ -15,7 +15,7 @@ import Adam.Levels.Proposition.L13_Summary
Game "Adam" Game "Adam"
World "Proposition" World "Proposition"
Title "Aussagenlogik 1" Title "Logo"
Introduction " Introduction "
Durch eine unvorhergesehene und nicht-kanonische Singularität in der Raumzeit Durch eine unvorhergesehene und nicht-kanonische Singularität in der Raumzeit

@ -21,7 +21,7 @@ Du siehst Robo hilflos an.
Statement "" Statement ""
(A B C : Prop) : (A B C : Prop) :
¬((¬B ¬ C) (A → B)) → (¬A B) ∧ ¬ (B ∧ C) := by ¬((¬B ¬ C) (A → B)) → (¬A B) ∧ ¬ (B ∧ C) := by
Hint "**Robo** Das ist ganz einfach. Mit `{A} {B} {C} : Prop` meint er: Hint "**Robo** Das ist ganz einfach. Mit `{A} {B} {C} : Prop` meint sie:
`{A}`, `{B}` und `{C}` sind irgendwelche Aussagen (*propositions*). `{A}`, `{B}` und `{C}` sind irgendwelche Aussagen (*propositions*).
Und mit `→` meint sie ⇒, also “impliziert”. Die anderen Symbole kennst Du, oder? Und mit `→` meint sie ⇒, also “impliziert”. Die anderen Symbole kennst Du, oder?

@ -6,7 +6,7 @@ Game "Adam"
World "Proposition" World "Proposition"
Level 7 Level 7
Title "Widerspruch beweist alles." Title "Aus Falschem folgt vieles."
Introduction Introduction
" "

@ -8,7 +8,7 @@ Game "Adam"
World "Proposition" World "Proposition"
Level 8 Level 8
Title "Widerspruch" Title "Aus Falschem folgt vieles."
Introduction Introduction
" "

@ -8,7 +8,7 @@ Game "Adam"
World "Proposition" World "Proposition"
Level 9 Level 9
Title "Widerspruch" Title "Aus Falschem folgt vieles."
Introduction Introduction
" "

@ -11,7 +11,7 @@ Title "Und"
Introduction Introduction
" "
Langsam wird die Schlange kürzer. Die nächste Formalosophin hat folgendes Anliegen: Langsam wird die Schlange kürzer. Die nächste Formalosophin, ebenfalls häkelnd, hat folgendes Anliegen.
" "
Statement "" Statement ""

Loading…
Cancel
Save