import Adam.Metadata import Mathlib.Tactic.PushNeg import Mathlib import Mathlib.Algebra.Parity import Adam.ToBePorted Game "Adam" World "Predicate" Level 9 Title "PushNeg" Introduction " Nach langem Hin und Her einigen sie sich schließlich auf folgende Frage: " -- Zum Schluss, immer wenn man irgendwo eine Verneinung `¬∃` oder `¬∀` sieht (`\\not`), kann man -- mit `push_neg` das `¬` durch den Quantor hindurchschieben. -- Das braucht intern die Lemmas -- - `not_exists (A : Prop) : ¬ (∃ x, A) ↔ ∀x, (¬A)` -- - `not_forall (A : Prop) : ¬ (∀ x, A) ↔ ∃x, (¬A)` -- (welche man auch mit `rw` explizit benutzen könnte.) open Nat Statement : ¬ ∃ (n : ℕ), ∀ (k : ℕ) , Odd (n + k) := by Hint "**Du**: Ich würde gern diese Negation `¬` am Quantor vorbeischieben. **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_forall (A : Prop) : ¬ (∀ x, A) ↔ ∃x, (¬A) ``` " Branch unfold Odd push_neg Hint "**Robo**: Dieser Lösungsweg scheint mir etwas zu schwierig. Ich würde nochmal zurückgehen und schauen, dass Du irgendwie `¬Odd` erhältst. Das kannst Du dann mit `rw [←even_iff_not_odd]` zu `Even` umwandeln." push_neg intro n Hint "**Robo**: Jetzt brauchst Du eine Zahl mit `use`, und danach vermutlich das Lemma `←even_iff_not_odd` brauchen. **Du**: Könnte ich jetzt schon `rw [←even_iff_not_odd]` anwenden? **Robo**: Nee, `rw` kann nicht innerhalb von Quantoren umschreiben. **Du**: Aber wie würde ich das machen? **Robo**: Zeig ich dir später, nicht hier vor großem Publikum. Ich würde jetzt lieber mit `use` eine richtige Zahl angeben, und danach umschreiben." Branch use n + 2 Hint "**Robo**: Gute Wahl! Jetzt kannst Du `←even_iff_not_odd` verwenden." Branch use n + 4 Hint "**Robo**: Gute Wahl! Jetzt kannst Du `←even_iff_not_odd` verwenden." use n Hint "**Robo**: Gute Wahl! Jetzt kannst Du `←even_iff_not_odd` verwenden." rw [←even_iff_not_odd] unfold Even use n --ring 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. **Du**: Wer denn? Die Frage war wieder zu konkret. Betretenes Schweigen. **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 | |:--------------|:----------------------------| | `ℕ` | Die natürlichen Zahlen. | | `∃` | Existential-Quantifier | | `∀` | Forall-Quantifier | | `Even n` | `n` ist gerade | | `Odd n` | `n` ist ungerade | | | Taktik | Beispiel | |:------|:--------------------------|:-------------------------------------------------------| | *12ᶜ* | `rw` | Umschreiben mit Gleichungen. | | 13 | `ring` | Löst Gleichungen mit `+, -, *, ^`. | | 14 | `unfold` | Setzt visuell die Bedeutung einer Definition ein. | | 15 | `use` | Um ein `∃` im Goal anzugehen. | | *7ᶜ* | `rcases h with ⟨x, hx⟩` | Um ein `∃` in den Annahmen zu zerlegen. | | *8ᵇ* | `intro` | Um ein `∀` im Goal anzugehen. | | 16 | `push_neg` | Für `¬∃` und `¬∀` im Goal. | " NewTactic push_neg NewLemma Nat.even_iff_not_odd Nat.odd_iff_not_even not_exists not_forall