Theorem: Language.kstar_def_nonempty
File: Mathlib/Computability/Language.lean

tactic: ext x
state_before: α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
⊢ l∗ = {x | ∃ S, x = join S ∧ ∀ (y : List α), y ∈ S → y ∈ l ∧ y ≠ []}

tactic: constructor
state_before: case h
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x✝ : List α
l : Language α
x : List α
⊢ x ∈ l∗ ↔ x ∈ {x | ∃ S, x = join S ∧ ∀ (y : List α), y ∈ S → y ∈ l ∧ y ≠ []}

tactic: rintro ⟨S, rfl, h⟩
state_before: case h.mp
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x✝ : List α
l : Language α
x : List α
⊢ x ∈ l∗ → x ∈ {x | ∃ S, x = join S ∧ ∀ (y : List α), y ∈ S → y ∈ l ∧ y ≠ []}

tactic: refine' ⟨S.filter fun l ↦ ¬List.isEmpty l, by simp, fun y hy ↦ _⟩
state_before: case h.mp.intro.intro
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
S : List (List α)
h : ∀ (y : List α), y ∈ S → y ∈ l
⊢ join S ∈ {x | ∃ S, x = join S ∧ ∀ (y : List α), y ∈ S → y ∈ l ∧ y ≠ []}

tactic: simp [mem_filter, List.isEmpty_iff_eq_nil] at hy
state_before: case h.mp.intro.intro
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
S : List (List α)
h : ∀ (y : List α), y ∈ S → y ∈ l
y : List α
hy : y ∈ filter (fun l => decide ¬isEmpty l = true) S
⊢ y ∈ l ∧ y ≠ []

tactic: let ⟨hyl, hyr⟩ := hy
state_before: case h.mp.intro.intro
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
S : List (List α)
h : ∀ (y : List α), y ∈ S → y ∈ l
y : List α
hy : y ∈ S ∧ isEmpty y = false
⊢ y ∈ l ∧ y ≠ []

tactic: apply And.intro (h y hyl)
state_before: case h.mp.intro.intro
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
S : List (List α)
h : ∀ (y : List α), y ∈ S → y ∈ l
y : List α
hy : y ∈ S ∧ isEmpty y = false
hyl : y ∈ S
hyr : isEmpty y = false
⊢ y ∈ l ∧ y ≠ []

tactic: cases y <;> simp only [ne_eq, not_true, not_false_iff]
state_before: case h.mp.intro.intro
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
S : List (List α)
h : ∀ (y : List α), y ∈ S → y ∈ l
y : List α
hy : y ∈ S ∧ isEmpty y = false
hyl : y ∈ S
hyr : isEmpty y = false
⊢ y ≠ []

tactic: contradiction
state_before: case h.mp.intro.intro.nil
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
S : List (List α)
h : ∀ (y : List α), y ∈ S → y ∈ l
hy : [] ∈ S ∧ isEmpty [] = false
hyl : [] ∈ S
hyr : isEmpty [] = false
⊢ False

tactic: simp
state_before: α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x : List α
l : Language α
S : List (List α)
h : ∀ (y : List α), y ∈ S → y ∈ l
⊢ join S = join (filter (fun l => decide ¬isEmpty l = true) S)

tactic: rintro ⟨S, hx, h⟩
state_before: case h.mpr
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x✝ : List α
l : Language α
x : List α
⊢ x ∈ {x | ∃ S, x = join S ∧ ∀ (y : List α), y ∈ S → y ∈ l ∧ y ≠ []} → x ∈ l∗

tactic: exact ⟨S, hx, fun y hy ↦ (h y hy).1⟩
state_before: case h.mpr.intro.intro
α : Type u_1
β : Type ?u.86402
γ : Type ?u.86405
l✝ m : Language α
a b x✝ : List α
l : Language α
x : List α
S : List (List α)
hx : x = join S
h : ∀ (y : List α), y ∈ S → y ∈ l ∧ y ≠ []
⊢ x ∈ l∗