Theorem: Turing.TM2.step_supports
File: Mathlib/Computability/TuringMachine.lean

tactic: replace h₂ := ss.2 _ (Finset.some_mem_insertNone.1 h₂)
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v : σ
T : (k : K) → List (Γ k)
c' : Cfg₂
h₁ : c' ∈ step M { l := some l₁, var := v, stk := T }
h₂ : { l := some l₁, var := v, stk := T }.l ∈ ↑Finset.insertNone S
⊢ c'.l ∈ ↑Finset.insertNone S

tactic: simp only [step, Option.mem_def, Option.some.injEq] at h₁
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v : σ
T : (k : K) → List (Γ k)
c' : Cfg₂
h₁ : c' ∈ step M { l := some l₁, var := v, stk := T }
h₂ : SupportsStmt S (M l₁)
⊢ c'.l ∈ ↑Finset.insertNone S

tactic: subst c'
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v : σ
T : (k : K) → List (Γ k)
c' : Cfg₂
h₂ : SupportsStmt S (M l₁)
h₁ : stepAux (M l₁) v T = c'
⊢ c'.l ∈ ↑Finset.insertNone S

tactic: revert h₂
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v : σ
T : (k : K) → List (Γ k)
h₂ : SupportsStmt S (M l₁)
⊢ (stepAux (M l₁) v T).l ∈ ↑Finset.insertNone S

tactic: induction' M l₁ with _ _ q IH _ _ q IH _ _ q IH _ q IH generalizing v T <;> intro hs
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v : σ
T : (k : K) → List (Γ k)
⊢ SupportsStmt S (M l₁) → (stepAux (M l₁) v T).l ∈ ↑Finset.insertNone S

tactic: iterate 4 exact IH _ _ hs
state_before: case push
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
k✝ : K
a✝ : σ → Γ k✝
q : Stmt₂
IH : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q → (stepAux q v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (push k✝ a✝ q)
⊢ (stepAux (push k✝ a✝ q) v T).l ∈ ↑Finset.insertNone S

case peek
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
k✝ : K
a✝ : σ → Option (Γ k✝) → σ
q : Stmt₂
IH : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q → (stepAux q v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (peek k✝ a✝ q)
⊢ (stepAux (peek k✝ a✝ q) v T).l ∈ ↑Finset.insertNone S

case pop
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
k✝ : K
a✝ : σ → Option (Γ k✝) → σ
q : Stmt₂
IH : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q → (stepAux q v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (pop k✝ a✝ q)
⊢ (stepAux (pop k✝ a✝ q) v T).l ∈ ↑Finset.insertNone S

case load
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝ : σ → σ
q : Stmt₂
IH : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q → (stepAux q v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (load a✝ q)
⊢ (stepAux (load a✝ q) v T).l ∈ ↑Finset.insertNone S

case branch
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝² : σ → Bool
a✝¹ a✝ : Stmt₂
a_ih✝¹ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S a✝¹ → (stepAux a✝¹ v T).l ∈ ↑Finset.insertNone S
a_ih✝ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S a✝ → (stepAux a✝ v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (branch a✝² a✝¹ a✝)
⊢ (stepAux (branch a✝² a✝¹ a✝) v T).l ∈ ↑Finset.insertNone S

case goto
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝ : σ → Λ
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (goto a✝)
⊢ (stepAux (goto a✝) v T).l ∈ ↑Finset.insertNone S

case halt
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S halt
⊢ (stepAux halt v T).l ∈ ↑Finset.insertNone S

tactic: case goto => exact Finset.some_mem_insertNone.2 (hs _)
state_before: case goto
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝ : σ → Λ
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (goto a✝)
⊢ (stepAux (goto a✝) v T).l ∈ ↑Finset.insertNone S

case halt
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S halt
⊢ (stepAux halt v T).l ∈ ↑Finset.insertNone S

tactic: case halt => apply Multiset.mem_cons_self
state_before: case halt
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S halt
⊢ (stepAux halt v T).l ∈ ↑Finset.insertNone S

tactic: exact IH _ _ hs
state_before: case load
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝ : σ → σ
q : Stmt₂
IH : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q → (stepAux q v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (load a✝ q)
⊢ (stepAux (load a✝ q) v T).l ∈ ↑Finset.insertNone S

case branch
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝² : σ → Bool
a✝¹ a✝ : Stmt₂
a_ih✝¹ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S a✝¹ → (stepAux a✝¹ v T).l ∈ ↑Finset.insertNone S
a_ih✝ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S a✝ → (stepAux a✝ v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (branch a✝² a✝¹ a✝)
⊢ (stepAux (branch a✝² a✝¹ a✝) v T).l ∈ ↑Finset.insertNone S

case goto
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝ : σ → Λ
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (goto a✝)
⊢ (stepAux (goto a✝) v T).l ∈ ↑Finset.insertNone S

case halt
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S halt
⊢ (stepAux halt v T).l ∈ ↑Finset.insertNone S

tactic: unfold stepAux
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
p : σ → Bool
q₁' q₂' : Stmt₂
IH₁ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₁' → (stepAux q₁' v T).l ∈ ↑Finset.insertNone S
IH₂ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₂' → (stepAux q₂' v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (branch p q₁' q₂')
⊢ (stepAux (branch p q₁' q₂') v T).l ∈ ↑Finset.insertNone S

tactic: cases p v
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
p : σ → Bool
q₁' q₂' : Stmt₂
IH₁ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₁' → (stepAux q₁' v T).l ∈ ↑Finset.insertNone S
IH₂ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₂' → (stepAux q₂' v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (branch p q₁' q₂')
⊢ (bif p v then stepAux q₁' v T else stepAux q₂' v T).l ∈ ↑Finset.insertNone S

tactic: exact IH₂ _ _ hs.2
state_before: case false
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
p : σ → Bool
q₁' q₂' : Stmt₂
IH₁ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₁' → (stepAux q₁' v T).l ∈ ↑Finset.insertNone S
IH₂ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₂' → (stepAux q₂' v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (branch p q₁' q₂')
⊢ (bif false then stepAux q₁' v T else stepAux q₂' v T).l ∈ ↑Finset.insertNone S

tactic: exact IH₁ _ _ hs.1
state_before: case true
K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
p : σ → Bool
q₁' q₂' : Stmt₂
IH₁ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₁' → (stepAux q₁' v T).l ∈ ↑Finset.insertNone S
IH₂ : ∀ (v : σ) (T : (k : K) → List (Γ k)), SupportsStmt S q₂' → (stepAux q₂' v T).l ∈ ↑Finset.insertNone S
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (branch p q₁' q₂')
⊢ (bif true then stepAux q₁' v T else stepAux q₂' v T).l ∈ ↑Finset.insertNone S

tactic: exact Finset.some_mem_insertNone.2 (hs _)
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
a✝ : σ → Λ
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S (goto a✝)
⊢ (stepAux (goto a✝) v T).l ∈ ↑Finset.insertNone S

tactic: apply Multiset.mem_cons_self
state_before: K : Type u_1
inst✝¹ : DecidableEq K
Γ : K → Type u_2
Λ : Type u_3
σ : Type u_4
inst✝ : Inhabited Λ
M : Λ → Stmt₂
S : Finset Λ
ss : Supports M S
l₁ : Λ
v✝ : σ
T✝ : (k : K) → List (Γ k)
v : σ
T : (k : K) → List (Γ k)
hs : SupportsStmt S halt
⊢ (stepAux halt v T).l ∈ ↑Finset.insertNone S