import TestGame.Metadata
import Mathlib

Game "TestGame"
World "SetFunction"
Level 1

Title ""

open Set

Introduction
"
Wenn man mit Abildungen auf Mengen arbeitet, muss man in Lean etwas aufpassen, um
die Typen (z.B. `(U : Type _)`) und Mengen von diesen Typen (z.B. `(S : Set U)`)
zu unterscheiden.

Abbildungen sind prinzipiell immer auf Typen definiert. Wenn eine Funktion nicht
auf dem ganzen Typen definiert ist, hat man prinzipiell zwei Optionen:

1. Nach dem Motto \"Chunk in, chunk out\" werden in der Mathlib Funktionen
oft einfach auf irgendwas gesetzt wenn sie nicht definiert sind, so gibt `1 / 0` in `ℕ`
einfach `0`. Dies funktioniert, weil dann alle relevanten Theoreme, die von `x / n`
handeln, dann Annahmen der Form `(h : n ≠ 0)` haben.
2. Man kann auch Funktionen auf *Subtypen* definieren, also z.B. auf `ℕ+`.


"


--     /- Image of Union -/
-- lemma image_unionₓ

Statement
""
    (S T : Set ℕ) (f : ℕ → ℕ) : (f '' S) ∪ (f '' T) = f '' (S ∪ T) := by
  ext i
  rw [mem_union]
  simp_rw [mem_image]
  constructor
  intro h
  rcases h with ⟨x, hx, hx'⟩ | ⟨x, hx, hx'⟩
  use x
  constructor
  apply mem_union_left
  assumption
  assumption
  use x
  constructor
  apply mem_union_right
  assumption
  assumption
  rintro ⟨x, hx, hx'⟩
  rw [mem_union] at hx
  rcases hx with hx | hx
  left
  use x
  constructor
  assumption
  assumption
  right
  use x
  constructor
  assumption
  assumption
