|
|
import TestGame.Metadata
|
|
|
import Std.Tactic.RCases
|
|
|
|
|
|
set_option tactic.hygienic false
|
|
|
|
|
|
Game "TestGame"
|
|
|
World "Proposition"
|
|
|
Level 9
|
|
|
|
|
|
Title "Und"
|
|
|
|
|
|
Introduction
|
|
|
"
|
|
|
Zusätzlich zur Verneinung (`¬`) können wir logische Aussagen auch mit UND (`∧`) und ODER (`∨`) kombinieren.
|
|
|
|
|
|
In einer Mathevorlesung würde man vielleicht `A ∧ B` als Tupel `⟨A, B⟩` definieren. In Lean
|
|
|
sind dies *Strukturen*. Eine Struktur hat mehrere Felder, in diesem Fall zwei,
|
|
|
nämlich die linke und die rechte Seite.
|
|
|
|
|
|
Will man eine Aussage `A ∧ B` beweisen (im Goal), dann kann man diese mit der Taktik
|
|
|
`constructor` in die einzelnen Felder aufteilen.
|
|
|
"
|
|
|
|
|
|
Statement "" (A B : Prop) (hA : A) (hB : B) : A ∧ B := by
|
|
|
constructor
|
|
|
assumption
|
|
|
assumption
|
|
|
|
|
|
Hint (A : Prop) (B : Prop) (hA : A) (hB : B) : A ∧ B =>
|
|
|
"`constructor` zerlegt die Struktur in Einzelteile."
|
|
|
|
|
|
Hint (A : Prop) (hA : A) : A =>
|
|
|
"Du hast einen Beweis dafür in den *Annahmen*."
|
|
|
|
|
|
Tactics constructor assumption
|
|
|
|
|
|
-- Statement
|
|
|
-- "Zeige $(A \\land (A \\Rightarrow B)) \\iff (A \\land B)$."
|
|
|
-- (A B : Prop) : (A ∧ (A → B)) ↔ (A ∧ B) := by
|
|
|
-- constructor
|
|
|
-- intro h
|
|
|
-- rcases h with ⟨h₁, h₂⟩
|
|
|
-- constructor
|
|
|
-- assumption
|
|
|
-- apply h₂
|
|
|
-- assumption
|
|
|
-- intro h
|
|
|
-- rcases h with ⟨h₁, h₂⟩
|
|
|
-- constructor
|
|
|
-- assumption
|
|
|
-- intro
|
|
|
-- assumption
|
|
|
|
|
|
-- Message (A : Prop) (B : Prop) : A ∧ (A → B) ↔ A ∧ B =>
|
|
|
-- "`↔` oder `∧` im Goal kann man mit `constructor` zerlegen."
|
|
|
|
|
|
-- Message (A : Prop) (B : Prop) : A ∧ (A → B) → A ∧ B =>
|
|
|
-- "Hier würdest du mit `intro` die Implikation angehen.
|
|
|
|
|
|
-- (Experten können mit `intro ⟨h₁, h₂⟩` im gleichen Schritt noch ein `rcases` auf
|
|
|
-- das UND in der Implikationsannahme)"
|
|
|
|
|
|
-- -- if they don't use `intro ⟨_, _⟩`.
|
|
|
-- Message (A : Prop) (B : Prop) (h : A ∧ (A → B)) : A ∧ B =>
|
|
|
-- "Jetzt erst mal noch schnell die Annahme `A ∧ (A → B)` mit `rcases` aufteilen."
|
|
|
|
|
|
-- Hint (A : Prop) (B : Prop) (hA : A) (h : A → B) : B =>
|
|
|
-- "Wie wär's mit `apply`? Hast du ne Implikation, die anwendbar ist?"
|
|
|
|
|
|
-- -- Rückrichtung
|
|
|
-- Message (A : Prop) (B : Prop) : A ∧ B → A ∧ (A → B) =>
|
|
|
-- "Das Goal ist ne Implikation $\\ldots \\Rightarrow \\ldots$
|
|
|
-- Da hilft `intro`.
|
|
|
|
|
|
-- (auch hier kann man wieder mit `intro ⟨ha, hb⟩` gleich noch die Premisse zerlegen.)"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- -- if they don't use `intro ⟨_, _⟩`.
|
|
|
-- Message (A : Prop) (B : Prop) (h : A ∧ B) : A ∧ (A → B) =>
|
|
|
-- "Jetzt erst mal noch schnell die Annahme `A ∧ B` mit `rcases` zerlegen."
|
|
|
|
|
|
-- Message (A : Prop) (B : Prop) (hA : A) (h : A → B) : A ∧ B =>
|
|
|
-- "Wieder in Einzelteile zerlegen..."
|
|
|
|
|
|
-- Message (A : Prop) (B : Prop) (ha : A) (hb : B) : A ∧ (A → B) =>
|
|
|
-- "Immer das gleiche ... noch mehr zerlegen."
|
|
|
|
|
|
-- -- Message (A : Prop) (B : Prop) (h₁: A) (h₂: B) : A → B =>
|
|
|
-- -- "Das ist jetzt vielleicht etwas verwirrend: Wir wollen die Implikation `A → B` zeigen,
|
|
|
-- -- wissen aber, dass `B` immer wahr ist (habe eine Annahme der Form `(hB : B)`).
|
|
|
|
|
|
-- -- Mit intro können wir einfach nochmal annehmen, dass `A` wahr ist. Es stört uns nicht,
|
|
|
-- -- dass wir das schon wissen und auch gar nicht brauchen. Damit müssen wir nur noch zeigen,
|
|
|
-- -- dass `B` wahr ist."
|
|
|
|
|
|
|
|
|
|
|
|
-- -- TODO
|
|
|
|
|
|
|
|
|
-- Tactics apply rcases
|
|
|
-- Tactics assumption
|