Theorem: DFA.evalFrom_of_pow
File: Mathlib/Computability/DFA.lean

tactic: rw [Language.mem_kstar] at hy
state_before: α : Type u
σ : Type v
M : DFA α σ
x y : List α
s : σ
hx : evalFrom M s x = s
hy : y ∈ {x}∗
⊢ evalFrom M s y = s

tactic: rcases hy with ⟨S, rfl, hS⟩
state_before: α : Type u
σ : Type v
M : DFA α σ
x y : List α
s : σ
hx : evalFrom M s x = s
hy : ∃ L, y = List.join L ∧ ∀ (y : List α), y ∈ L → y ∈ {x}
⊢ evalFrom M s y = s

tactic: induction' S with a S ih
state_before: case intro.intro
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S : List (List α)
hS : ∀ (y : List α), y ∈ S → y ∈ {x}
⊢ evalFrom M s (List.join S) = s

tactic: rfl
state_before: case intro.intro.nil
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S : List (List α)
hS✝ : ∀ (y : List α), y ∈ S → y ∈ {x}
hS : ∀ (y : List α), y ∈ [] → y ∈ {x}
⊢ evalFrom M s (List.join []) = s

tactic: have ha := hS a (List.mem_cons_self _ _)
state_before: case intro.intro.cons
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S✝ : List (List α)
hS✝ : ∀ (y : List α), y ∈ S✝ → y ∈ {x}
a : List α
S : List (List α)
ih : (∀ (y : List α), y ∈ S → y ∈ {x}) → evalFrom M s (List.join S) = s
hS : ∀ (y : List α), y ∈ a :: S → y ∈ {x}
⊢ evalFrom M s (List.join (a :: S)) = s

tactic: rw [Set.mem_singleton_iff] at ha
state_before: case intro.intro.cons
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S✝ : List (List α)
hS✝ : ∀ (y : List α), y ∈ S✝ → y ∈ {x}
a : List α
S : List (List α)
ih : (∀ (y : List α), y ∈ S → y ∈ {x}) → evalFrom M s (List.join S) = s
hS : ∀ (y : List α), y ∈ a :: S → y ∈ {x}
ha : a ∈ {x}
⊢ evalFrom M s (List.join (a :: S)) = s

tactic: rw [List.join, evalFrom_of_append, ha, hx]
state_before: case intro.intro.cons
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S✝ : List (List α)
hS✝ : ∀ (y : List α), y ∈ S✝ → y ∈ {x}
a : List α
S : List (List α)
ih : (∀ (y : List α), y ∈ S → y ∈ {x}) → evalFrom M s (List.join S) = s
hS : ∀ (y : List α), y ∈ a :: S → y ∈ {x}
ha : a = x
⊢ evalFrom M s (List.join (a :: S)) = s

tactic: apply ih
state_before: case intro.intro.cons
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S✝ : List (List α)
hS✝ : ∀ (y : List α), y ∈ S✝ → y ∈ {x}
a : List α
S : List (List α)
ih : (∀ (y : List α), y ∈ S → y ∈ {x}) → evalFrom M s (List.join S) = s
hS : ∀ (y : List α), y ∈ a :: S → y ∈ {x}
ha : a = x
⊢ evalFrom M s (List.join S) = s

tactic: intro z hz
state_before: case intro.intro.cons
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S✝ : List (List α)
hS✝ : ∀ (y : List α), y ∈ S✝ → y ∈ {x}
a : List α
S : List (List α)
ih : (∀ (y : List α), y ∈ S → y ∈ {x}) → evalFrom M s (List.join S) = s
hS : ∀ (y : List α), y ∈ a :: S → y ∈ {x}
ha : a = x
⊢ ∀ (y : List α), y ∈ S → y ∈ {x}

tactic: exact hS z (List.mem_cons_of_mem a hz)
state_before: case intro.intro.cons
α : Type u
σ : Type v
M : DFA α σ
x : List α
s : σ
hx : evalFrom M s x = s
S✝ : List (List α)
hS✝ : ∀ (y : List α), y ∈ S✝ → y ∈ {x}
a : List α
S : List (List α)
ih : (∀ (y : List α), y ∈ S → y ∈ {x}) → evalFrom M s (List.join S) = s
hS : ∀ (y : List α), y ∈ a :: S → y ∈ {x}
ha : a = x
z : List α
hz : z ∈ S
⊢ z ∈ {x}