import TestGame.Metadata
import Mathlib.Tactic.PushNeg
import Mathlib

import Mathlib.Algebra.Parity

import TestGame.ToBePorted

Game "TestGame"
World "Predicate"
Level 8

Title "PushNeg"

Introduction
"
Zum Schluss, immer wenn man irgendwo eine Verneinung `¬∃` oder `¬∀` sieht (`\\not`), kann man
mit `push_neg` das `¬` durch den Quantor hindurchschieben.

Das braucht intern die Lemmas

- `not_exists (A : Prop) : ¬ (∃ x, A) ↔ ∀x, (¬A)`
- `not_forall (A : Prop) : ¬ (∀ x, A) ↔ ∃x, (¬A)`

(welche man auch mit `rw` explizit benutzen könnte.)
"

Statement
    "Es existiert keine natürliche Zahl $n$, sodass $n + k$ immer ungerade ist.":
    ¬ ∃ (n : ℕ), ∀ (k : ℕ) , Odd (n + k) := by
  push_neg
  intro n
  use n
  rw [not_odd]
  unfold Even
  use n

Hint : ¬ ∃ (n : ℕ), ∀ (k : ℕ) , Odd (n + k) =>
"`push_neg` schiebt die Negierung an den Quantoren vorbei."


Hint (n : ℕ) : (∃ k, ¬Odd (n + k)) =>
"An dieser Stelle musst du nun ein `k` angeben, sodass `n + k` gerade ist... Benutze `use`
mit der richtigen Zahl."


HiddenHint (n : ℕ) : ¬Odd (n + n) =>
"Du kennst ein Lemma um mit `¬odd` umzugehen."

-- HiddenHint (n : ℕ) (k : ℕ) : ¬odd (n + k) =>
-- "Du kennst ein Lemma um mit `¬odd` umzugehen."

HiddenHint (n : ℕ) : Even (n + n) =>
"`unfold even` hilft, anzuschauen, was hinter `even` steckt.

Danach musst du wieder mit `use r` ein `(r : ℕ)` angeben, dass du benützen möchtest."

-- HiddenHint (n : ℕ) (k : ℕ) : even (n + k) =>
-- "`unfold even` hilft hier weiter."

Hint (n : ℕ) : n + n = 2 * n => "Recap: `ring` löst Gleichungen in `ℕ`."

Conclusion ""

NewTactics push_neg intro use rw unfold ring

NewLemmas Even Odd not_even not_odd not_exists not_forall
