import Adam.Metadata import Std.Tactic.RCases import Mathlib.Tactic.Contrapose import Mathlib.Tactic.Use import Mathlib.Tactic.Ring import Mathlib.Algebra.Parity set_option tactic.hygienic false Game "Adam" World "Predicate" Level 6 Title "Gerade/Ungerade" Introduction " 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. 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 ``` und ``` def Odd (n : ℕ) : Prop := ∃ r, n = 2 * r + 1 ``` Schließlich taucht von irgendwo aus der Menge folgendes Papier auf: " 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 unfold Even 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, 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. " unfold Even at * 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." rcases h with ⟨r, hr⟩ Hint "**Du**: Und jetzt muss ich eine passende Zahl finden, so dass `x + x = n^2`? **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 Dir leider nicht sagen, welche Zahl passt. " Branch rw [hr] Hint "**Robo**: Das geht auch, jetzt musst Du aber wirklich `use` verwenden." use 2 * r ^ 2 ring use 2 * r ^ 2 Hint "**Du**: Ah, und jetzt `ring`! **Robo**: Aber zuerst musst Du noch mit `rw` `n` durch `r + r` ersetzen, da `ring` das sonst nicht weiß." rw [hr] ring -- TODO: [Comment] For me the expected behaviour of `(strict := true)` would -- be that it distinguishes between the defEq states while `(strict := false)` -- would show the hint regardless of a `unfold Even`. NewTactic unfold use NewDefinition Even Odd Conclusion "Applaus!"