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 12

Title "Oder - Bonus"

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₂`.

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.
"

Statement distributivity
    "Angenommen $ A \\lor (B \\land C)$ is wahr, zeige, dass $(A \\lor B) \\land (A \\lor C)$."
    (A B C : Prop) (h : A ∨ (B ∧ C)) : (A ∨ B) ∧ (A ∨ C) := by
  rcases h with ha | h
  constructor
  left
  assumption
  left
  assumption
  rcases h with ⟨h₁, h₂⟩
  constructor
  right
  assumption
  right
  assumption

Message (A : Prop) (B : Prop) (C : Prop) (h : A ∨ (B ∧ C)) : (A ∨ B) ∧ (A ∨ C) =>
"Als erstes solltest du das OR in der Annahme `(h: A ∨ (B ∧ C))` aufteilen:"

Hint (A : Prop) (B : Prop) (C : Prop) (h : A) : (A ∨ B) ∧ (A ∨ C) =>
"Wie wär's mit zerlegen?"

Hint (A : Prop) (B : Prop) : (A ∨ B) =>
"`left` oder `right`?"

Message (A : Prop) (B : Prop) (C : Prop) (h : (B ∧ C)) : (A ∨ B) ∧ (A ∨ C) =>
"Und jetzt der Fall, falls die rechte Seite $B \\land C$ wahr ist. Zerlege diese
Annahme doch als erstes."

Message (A : Prop) (B : Prop) (C : Prop) (h : A ∨ (B ∧ C)) : (A ∨ B) =>
"Jetzt musst du die Annahme $A \\lor (B \\land C)$ trotzdem noch mit `rcases` zerlegen."

Message (A : Prop) (B : Prop) (C : Prop) (h : A ∨ (B ∧ C)) : (A ∨ C) =>
"So musst du die Annahme $A \\lor (B \\land C)$ nochmals mit `rcases` zerlegen...

Wenn du am Anfang zuerst `rcases` und dann `constructor` aufrufst,
musst du das hier nur einmal machen..."

Message (A : Prop) (B : Prop) (C : Prop) (h : B ∧ C) : A ∨ B =>
"Die Annahme `B ∧ C` kannst du auch mit `rcases` zerlegen."

Message (A : Prop) (B : Prop) (C : Prop) (h : B ∧ C) : A ∨ C =>
"Die Annahme `B ∧ C` kannst du auch mit `rcases` zerlegen."

Message (A : Prop) (B : Prop) (C : Prop) (h : B ∧ C) : C =>
"Die Annahme `B ∧ C` kannst du auch mit `rcases` zerlegen."


-- Statement umsortieren
--     "Angenommen $(A \\land B) \\lor (D \\lor C)$ is wahr, zeige, dass "
--     (A B C D : Prop) (h : (A ∧ B) ∨ (D ∨ C)) : (A ∧ B) ∨ (C ∨ D) := by
--   rcases h with x | (h | h)
--   left
--   assumption
--   right
--   right
--   assumption
--   right
--   left
--   assumption

-- Message (A : Prop) (B : Prop) (C : Prop) (D : Prop) (h : (A ∧ B) ∨ (D ∨ C)) : (A ∧ B) ∨ (C ∨ D) =>
-- "Man kann hier entweder in mehren Schritten `rcases` anwenden:
-- ```
--   rcases h with h₁ | h₂
--   rcases h₁ with ⟨hA, hB⟩
--   [...]
--   rcases h₂ with h | h
-- ```
-- oder man kann dies in einem Schritt verschachteln:
-- ```
-- rcases h with ⟨ha, hb⟩ | (h | h)
-- ```
-- "

Tactics left right assumption constructor rcases apply
