import Adam.Metadata
import Std.Tactic.RCases
import Mathlib.Tactic.LeftRight
import Mathlib.Tactic.Contrapose
import Mathlib.Tactic.Use
import Mathlib.Tactic.Ring

import Adam.ToBePorted

Game "Adam"
World "Contradiction"
Level 1

Title "Have"

Introduction
"
**Oddeus**: Willkommen Reisende! Ich muss eingestehen ich bin in Gedanken noch
an etwas, könnt ihr mir bei diesem widersprüchlichen Problem helfen?
"

-- Manchmal, wollen wir nicht am aktuellen Goal arbeiten, sondern zuerst ein
-- Zwischenresultat beweisen, welches wir dann benützen können.

-- Mit `have [Name] : [Aussage]` kann man ein Zwischenresultat erstellen,
-- dass man anschliessen beweisen muss.

-- Wenn du zum Beispiel die Annahmen `(h : A → ¬ B)` und `(ha : A)` hast, kannst
-- du mit
-- ```
-- have g : ¬ B
-- apply h
-- assumption
-- ```
-- eine neue Annahme `(g : ¬ B)` erstellen. Danach beweist du zuerst diese Annahme,
-- bevor du dann mit dem Beweis forfährst.

Statement (A B : Prop) (h : A → ¬ B) (k : A ∧ B) : False := by
  Hint "**Du**: Also als erstes Teile ich wohl mal das Und (`∧`) auf."
  rcases k with ⟨h₁, h₂⟩
  Hint "**Du**: Aber jetzt…

  **Robo**: Du könntest dir ein passendes Zwischenresultat zurechtlegen, das dir hilft:
  Mach mal `have g : ¬ B`!"
  have g : ¬ B
  · Hint "**Du**: Was und jetzt hab ich einfach angenommen das sei richtig?

    **Robo**: Ne, jetzt musst du das zuerst beweisen bevor du es dann benützen kannst."
    Hint (hidden := true) "**Robo**: `apply` scheint passend zu sein."
    apply h
    assumption
  · Hint (hidden := true) "**Du**: Und wie war das nochmals wenn zwei Annahmen sich widersprechen?

    **Robo**: `contradiction`."
    contradiction

NewTactic «have»
DisabledTactic «suffices»

Conclusion "*Oddeus*: Das stimmt wohl."
