|
|
import Adam.Metadata
|
|
|
import Std.Tactic.RCases
|
|
|
import Mathlib.Tactic.Contrapose
|
|
|
import Mathlib.Tactic.Use
|
|
|
import Mathlib.Tactic.Ring
|
|
|
|
|
|
import Adam.ToBePorted
|
|
|
|
|
|
Game "Adam"
|
|
|
World "Contradiction"
|
|
|
Level 5
|
|
|
|
|
|
Title "Kontraposition"
|
|
|
|
|
|
Introduction
|
|
|
"
|
|
|
**Benedictus**: Gut, hier ist die angekündigte Frage. Versucht mal einen *direkten* Beweis, ohne `contrapose`.
|
|
|
"
|
|
|
|
|
|
-- Ein Beweis durch Kontraposition benützt im Grunde das eben bewiesene Lemma
|
|
|
|
|
|
-- ```
|
|
|
-- lemma not_imp_not (A B : Prop) : (A → B) ↔ (¬ B → ¬ A) := by
|
|
|
-- [...]
|
|
|
-- ```
|
|
|
|
|
|
-- Dazu gibt es die Taktik `contrapose`, welche eine Implikation im Goal
|
|
|
-- entsprechend umdreht.
|
|
|
|
|
|
-- Wir erinnern hier an die Taktik `revert h`, die aus der Annahme `h` eine Implikation
|
|
|
-- im Goal erstellt.
|
|
|
|
|
|
-- 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.
|
|
|
open Nat
|
|
|
|
|
|
Statement (n : ℕ) (h : Odd (n ^ 2)): Odd n := by
|
|
|
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)`.
|
|
|
|
|
|
**Du**: Richtig. Von hinten durch die Brust … Aber warte, im Moment steht da doch gar kein `→`.
|
|
|
|
|
|
**Robo**: Erinner Dich an `revert`. Mit `revert {h}` kannst du die Annahme `{h}` als Implikationsannahme ins Beweissziel schieben."
|
|
|
revert h
|
|
|
Hint "**Du**: Und jetzt kann ich dieses Kontrapositionslemma anwenden? Wie hieß das noch einmal?
|
|
|
|
|
|
**Robo**: Tatsächlich kannst auch einfach `contrapose` schreiben.
|
|
|
"
|
|
|
contrapose
|
|
|
Hint (hidden := true) "**Robo**: Vielleicht hilft jetzt `even_iff_not_odd` weiter?"
|
|
|
rw [← even_iff_not_odd]
|
|
|
rw [← even_iff_not_odd]
|
|
|
Hint "**Du**: Das sieht schon ganz gut aus. Jetzt kann ich tatsächlich das alte Lemma anwenden!"
|
|
|
apply even_square
|
|
|
|
|
|
NewTactic contrapose
|
|
|
DisabledTactic by_contra
|
|
|
|
|
|
Conclusion "**Benedictus**: Hervorragend! Ich glaube, damit seid Ihr jetzt ganz gut gewappnet."
|