|
|
|
|
import TestGame.Metadata
|
|
|
|
|
import Std.Tactic.RCases
|
|
|
|
|
import Mathlib.Tactic.Contrapose
|
|
|
|
|
import Mathlib.Tactic.Use
|
|
|
|
|
import Mathlib.Tactic.Ring
|
|
|
|
|
|
|
|
|
|
import TestGame.ToBePorted
|
|
|
|
|
|
|
|
|
|
Game "TestGame"
|
|
|
|
|
World "Proving"
|
|
|
|
|
Level 3
|
|
|
|
|
|
|
|
|
|
Title "Kontraposition"
|
|
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
|
"
|
|
|
|
|
Im Gegensatz dazu kann man auch einen Beweis durch Kontraposition führen.
|
|
|
|
|
Das ist kein Widerspruch, sondern benützt dass `A → B` und `(¬ B) → (¬ A)`
|
|
|
|
|
logisch equivalent sind.
|
|
|
|
|
|
|
|
|
|
Wenn das Goal eine Implikation ist, kann man `contrapose` anwenden.
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
Statement
|
|
|
|
|
"Ist n² ungerade, so ist auch n ungerade. Beweise durch Kontraposition."
|
|
|
|
|
(n : ℕ) : Odd (n ^ 2) → Odd n := by
|
|
|
|
|
contrapose
|
|
|
|
|
rw [not_odd]
|
|
|
|
|
rw [not_odd]
|
|
|
|
|
apply even_square
|
|
|
|
|
|
|
|
|
|
Message (n : ℕ) (h : Odd (n ^ 2)) : Odd n =>
|
|
|
|
|
"`intro` wär generell ein guter Ansatz! Aber hier wollen wir `contrapose` benützen, was eine
|
|
|
|
|
Implikation benötigt, deshalb ist `intro` hier der falsche Weg!"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Message (n : ℕ) : Odd (n ^ 2) → Odd n =>
|
|
|
|
|
"Mit `contrapose` kann man die Implikation zu
|
|
|
|
|
`¬ (even n) → ¬ (even n^2)` umkehren."
|
|
|
|
|
|
|
|
|
|
Hint (n : ℕ) : ¬Odd n → ¬Odd (n ^ 2) => "Du kennst bereits ein Lemma um `¬ odd ...` mit `rw`
|
|
|
|
|
umzuschreiben"
|
|
|
|
|
|
|
|
|
|
Message (n : ℕ) : Even n → ¬Odd (n ^ 2) => "rw [not_odd] muss hier zweimal angewendet werden,
|
|
|
|
|
da rw das erste Mal `not_odd n` gebraucht hat und das zweite Mal `not_odd (n^2)` benützt."
|
|
|
|
|
|
|
|
|
|
Message (n : ℕ) : Even n → Even (n ^ 2) => "Diese Aussage hast du bereits als Lemma bewiesen."
|
|
|
|
|
|
|
|
|
|
Tactics contrapose rw apply
|
|
|
|
|
Lemmas Even Odd not_even not_odd even_square
|