|
|
|
|
import TestGame.Metadata
|
|
|
|
|
import Std.Tactic.RCases
|
|
|
|
|
import Mathlib.Tactic.LeftRight
|
|
|
|
|
|
|
|
|
|
--set_option tactic.hygienic false
|
|
|
|
|
|
|
|
|
|
--set_option autoImplicit false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Game "TestGame"
|
|
|
|
|
World "Proposition"
|
|
|
|
|
Level 13
|
|
|
|
|
|
|
|
|
|
Title "Oder"
|
|
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
|
"
|
|
|
|
|
Wenn man hingegen ein ODER `(h : A ∨ B)` in den Annahmen hat, kann man dieses
|
|
|
|
|
ähnlich wie beim UND mit `rcases h` aufteilen.
|
|
|
|
|
|
|
|
|
|
**Wichtig:** der Syntax dafür ist `rcases h with h | h`. Das \"`h | h`\" bedeutet, dass
|
|
|
|
|
wir in beiden Fälle (linke oder rechte Seite wahr) diese Seite wieder `h` nennen wollen.
|
|
|
|
|
|
|
|
|
|
Der Unterschied ist, dass man beim UND eine Annahme in zwei Einzelteile zerlegt (mit `⟨h₁, h₂⟩`).
|
|
|
|
|
Beim ODER hingegen, kriegt man stattdessen zwei *Goals*, nämlich eines wo man annimmt,
|
|
|
|
|
die linke Seite sei wahr und eines wo man annimmt, rechts sei wahr.
|
|
|
|
|
|
|
|
|
|
*Notiz:* UND hat stärkere Bindung als ODER, und beide binden rechts, d.h.
|
|
|
|
|
`A ∨ B ∧ C` wird als `A ∨ (B ∧ C)` gelesen. Zudem binden beide nach rechts,
|
|
|
|
|
also `A ∨ B ∨ C` ist `A ∨ (B ∨ C)`.
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
Statement
|
|
|
|
|
"Angenommen \"$A$ oder ($A$ und $B$)\" wahr ist, zeige, dass $A$ wahr ist."
|
|
|
|
|
(A B : Prop) (h : A ∨ (A ∧ B)) : A := by
|
|
|
|
|
rcases h with h | h
|
|
|
|
|
assumption
|
|
|
|
|
rcases h with ⟨h₁, h₂⟩
|
|
|
|
|
assumption
|
|
|
|
|
|
|
|
|
|
HiddenHint (A : Prop) (B : Prop) (h : A ∨ (A ∧ B)) : A =>
|
|
|
|
|
"Als erstes kannst du das ODER in den Annahmen mit `rcases h with h | h` zerlegen."
|
|
|
|
|
|
|
|
|
|
Hint (A : Prop) (B : Prop) (h : A ∧ B) : A =>
|
|
|
|
|
"Jetzt noch das UND in den Annahmen mit `rcases h with ⟨h₁, h₂⟩` zerlegen."
|
|
|
|
|
|
|
|
|
|
NewTactics assumption rcases
|
|
|
|
|
DisabledTactics tauto
|