computability.turing_machine
⟷
Mathlib.Computability.TuringMachine
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -352,7 +352,7 @@ def ListBlank.nth {Γ} [Inhabited Γ] (l : ListBlank Γ) (n : ℕ) : Γ :=
cases' lt_or_le _ _ with h h; · rw [List.getI_append _ _ _ h]
rw [List.getI_eq_default _ h]
cases' le_or_lt _ _ with h₂ h₂; · rw [List.getI_eq_default _ h₂]
- rw [List.getI_eq_nthLe _ h₂, List.nthLe_append_right h, List.nthLe_replicate])
+ rw [List.getI_eq_get _ h₂, List.nthLe_append_right h, List.nthLe_replicate])
#align turing.list_blank.nth Turing.ListBlank.nth
-/
@@ -404,10 +404,10 @@ theorem ListBlank.ext {Γ} [Inhabited Γ] {L₁ L₂ : ListBlank Γ} :
cases' lt_or_le i l₁.length with h' h'
·
simp only [List.nthLe_append _ h', List.nthLe_get? h, List.nthLe_get? h', ←
- List.getI_eq_nthLe _ h, ← List.getI_eq_nthLe _ h', H]
+ List.getI_eq_get _ h, ← List.getI_eq_get _ h', H]
·
simp only [List.nthLe_append_right h', List.nthLe_replicate, List.nthLe_get? h,
- List.get?_len_le h', ← List.getI_eq_default _ h', H, List.getI_eq_nthLe _ h]
+ List.get?_len_le h', ← List.getI_eq_default _ h', H, List.getI_eq_get _ h]
#align turing.list_blank.ext Turing.ListBlank.ext
-/
@@ -3040,7 +3040,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
· subst k';
split_ifs <;> simp only [List.reverse_cons, Function.update_same, list_blank.nth_mk, List.map]
·
- rw [List.getI_eq_nthLe, List.nthLe_append_right] <;>
+ rw [List.getI_eq_get, List.nthLe_append_right] <;>
simp only [h, List.nthLe_singleton, List.length_map, List.length_reverse, Nat.succ_pos',
List.length_append, lt_add_iff_pos_right, List.length]
rw [← proj_map_nth, hL, list_blank.nth_mk]
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -7,7 +7,7 @@ import Data.Fintype.Option
import Data.Fintype.Prod
import Data.Fintype.Pi
import Data.Vector.Basic
-import Data.Pfun
+import Data.PFun
import Logic.Function.Iterate
import Order.Basic
import Tactic.ApplyFun
@@ -811,7 +811,7 @@ theorem Tape.move_left_nth {Γ} [Inhabited Γ] :
| ⟨a, L, R⟩, 0 => (ListBlank.nth_zero _).symm
| ⟨a, L, R⟩, 1 => (ListBlank.nth_zero _).trans (ListBlank.head_cons _ _)
| ⟨a, L, R⟩, (n + 1 : ℕ) + 1 => by
- rw [add_sub_cancel]
+ rw [add_sub_cancel_right]
change (R.cons a).get? (n + 1) = R.nth n
rw [list_blank.nth_succ, list_blank.tail_cons]
#align turing.tape.move_left_nth Turing.Tape.move_left_nth
@@ -824,7 +824,7 @@ theorem Tape.move_right_nth {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℤ) :
conv =>
rhs
rw [← T.move_right_left] <;>
- rw [tape.move_left_nth, add_sub_cancel]
+ rw [tape.move_left_nth, add_sub_cancel_right]
#align turing.tape.move_right_nth Turing.Tape.move_right_nth
-/
@@ -3118,7 +3118,7 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:642:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
#print Turing.TM2to1.tr_respects_aux₁ /-
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (_ : n ≤ S.length) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -100,7 +100,7 @@ theorem BlankExtends.below_of_le {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} :
BlankExtends l l₁ → BlankExtends l l₂ → l₁.length ≤ l₂.length → BlankExtends l₁ l₂ :=
by
rintro ⟨i, rfl⟩ ⟨j, rfl⟩ h; use j - i
- simp only [List.length_append, add_le_add_iff_left, List.length_replicate] at h
+ simp only [List.length_append, add_le_add_iff_left, List.length_replicate] at h
simp only [← List.replicate_add, add_tsub_cancel_of_le h, List.append_assoc]
#align turing.blank_extends.below_of_le Turing.BlankExtends.below_of_le
-/
@@ -122,8 +122,8 @@ theorem BlankExtends.above_of_le {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} :
rintro ⟨i, rfl⟩ ⟨j, e⟩ h; use i - j
refine' List.append_cancel_right (e.symm.trans _)
rw [List.append_assoc, ← List.replicate_add, tsub_add_cancel_of_le]
- apply_fun List.length at e
- simp only [List.length_append, List.length_replicate] at e
+ apply_fun List.length at e
+ simp only [List.length_append, List.length_replicate] at e
rwa [← add_le_add_iff_left, e, add_le_add_iff_right]
#align turing.blank_extends.above_of_le Turing.BlankExtends.above_of_le
-/
@@ -400,7 +400,7 @@ theorem ListBlank.ext {Γ} [Inhabited Γ] {L₁ L₂ : ListBlank Γ} :
refine' Quotient.sound' (Or.inl ⟨l₂.length - l₁.length, _⟩)
refine' List.ext_nthLe _ fun i h h₂ => Eq.symm _
· simp only [add_tsub_cancel_of_le h, List.length_append, List.length_replicate]
- simp only [list_blank.nth_mk] at H
+ simp only [list_blank.nth_mk] at H
cases' lt_or_le i l₁.length with h' h'
·
simp only [List.nthLe_append _ h', List.nthLe_get? h, List.nthLe_get? h', ←
@@ -1073,7 +1073,7 @@ theorem mem_eval {σ} {f : σ → Option σ} {a b} : b ∈ eval f a ↔ Reaches
· rw [Part.mem_unique h
(PFun.mem_fix_iff.2 <| Or.inl <| Part.mem_some_iff.2 <| by rw [e] <;> rfl)]
exact ⟨refl_trans_gen.refl, e⟩
- · rcases PFun.mem_fix_iff.1 h with (h | ⟨_, h, _⟩) <;> rw [e] at h <;>
+ · rcases PFun.mem_fix_iff.1 h with (h | ⟨_, h, _⟩) <;> rw [e] at h <;>
cases Part.mem_some_iff.1 h
cases' IH a' (by rwa [e]) with h₁ h₂
exact ⟨refl_trans_gen.head e h₁, h₂⟩, fun ⟨h₁, h₂⟩ =>
@@ -1140,10 +1140,10 @@ theorem tr_reaches₁ {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H
by
induction' ab with c₁ ac c₁ d₁ ac cd IH
· have := H aa
- rwa [show f₁ a₁ = _ from ac] at this
+ rwa [show f₁ a₁ = _ from ac] at this
· rcases IH with ⟨c₂, cc, ac₂⟩
have := H cc
- rw [show f₁ c₁ = _ from cd] at this
+ rw [show f₁ c₁ = _ from cd] at this
rcases this with ⟨d₂, dd, cd₂⟩
exact ⟨_, dd, ac₂.trans cd₂⟩
#align turing.tr_reaches₁ Turing.tr_reaches₁
@@ -1190,7 +1190,7 @@ theorem tr_eval {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Res
cases' mem_eval.1 ab with ab b0
rcases tr_reaches H aa ab with ⟨b₂, bb, ab⟩
refine' ⟨_, bb, mem_eval.2 ⟨ab, _⟩⟩
- have := H bb; rwa [b0] at this
+ have := H bb; rwa [b0] at this
#align turing.tr_eval Turing.tr_eval
-/
@@ -1255,7 +1255,7 @@ theorem tr_eval' {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ →
fun h => by
rcases(Part.mem_map_iff _).1 h with ⟨b₁, ab, bb⟩
rcases tr_eval H rfl ab with ⟨_, rfl, h⟩
- rwa [bb] at h ⟩
+ rwa [bb] at h⟩
#align turing.tr_eval' Turing.tr_eval'
-/
@@ -1640,14 +1640,14 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
by
intro h₁₂ q₀ h₀₁
induction' q₂ with _ q IH _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
- simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂
+ simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂
iterate 3
rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁ ; exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (IH h₁₂)
case branch p q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
- · unfold stmts₁ at h₀₁ ; exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ <| IH₁ h₁₂)
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ <| IH₂ h₁₂)
case goto l => subst h₁₂; exact h₀₁
@@ -1661,7 +1661,7 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
by
induction' q₂ with _ q IH _ q IH _ q IH <;>
simp only [stmts₁, supports_stmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at
- h hs
+ h hs
iterate 3 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
@@ -1712,7 +1712,7 @@ theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
by
replace h₂ := ss.2 _ (Finset.some_mem_insertNone.1 h₂)
- simp only [step, Option.mem_def] at h₁ ; subst c'
+ simp only [step, Option.mem_def] at h₁; subst c'
revert h₂; induction' M l₁ with _ q IH _ q IH _ q IH generalizing v T <;> intro hs
iterate 3 exact IH _ _ hs
case branch p q₁' q₂' IH₁ IH₂ =>
@@ -1887,7 +1887,7 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr
cases' q' with q' v';
simp only [tr_stmts, Finset.mem_coe, Finset.mem_product, Finset.mem_univ, and_true_iff] at h₂ ⊢
cases q'; · exact Multiset.mem_cons_self _ _
- simp only [tr, Option.mem_def] at h₁
+ simp only [tr, Option.mem_def] at h₁
have := TM1.stmts_supports_stmt ss h₂
revert this; induction q generalizing v <;> intro hs
case move d q =>
@@ -1904,7 +1904,7 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr
exact Finset.mem_insert_of_mem TM1.stmts₁_self
case branch p q₁ q₂ IH₁
IH₂ =>
- change cond (p a v) _ _ = ((some q', v'), s) at h₁
+ change cond (p a v) _ _ = ((some q', v'), s) at h₁
cases p a v
· refine' IH₂ (TM1.stmts_trans _ h₂) _ h₁ hs.2
unfold TM1.stmts₁
@@ -2596,14 +2596,14 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
by
intro h₁₂ q₀ h₀₁
induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
- simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂
+ simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂
iterate 4
rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁ ; exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (IH h₁₂)
case branch f q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
- · unfold stmts₁ at h₀₁ ; exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ (IH₁ h₁₂))
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ (IH₂ h₁₂))
case goto l => subst h₁₂; exact h₀₁
@@ -2617,7 +2617,7 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
by
induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;>
simp only [stmts₁, supports_stmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at
- h hs
+ h hs
iterate 4 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
@@ -2666,7 +2666,7 @@ theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
by
replace h₂ := ss.2 _ (Finset.some_mem_insertNone.1 h₂)
- simp only [step, Option.mem_def] at h₁ ; subst c'
+ simp only [step, Option.mem_def] at h₁; subst c'
revert h₂; induction' M l₁ with _ _ q IH _ _ q IH _ _ q IH _ q IH generalizing v T <;> intro hs
iterate 4 exact IH _ _ hs
case branch p q₁' q₂' IH₁ IH₂ =>
@@ -3029,7 +3029,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
case push
f =>
have := tape.write_move_right_n fun a : Γ' => (a.1, update a.2 k (some (f v)))
- dsimp only at this
+ dsimp only at this
refine'
⟨_, fun k' => _, by
rw [tape.move_right_n_head, List.length, tape.mk'_nth_nat, this,
@@ -3046,7 +3046,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
rw [← proj_map_nth, hL, list_blank.nth_mk]
cases' lt_or_gt_of_ne h with h h
· rw [List.getI_append]; simpa only [List.length_map, List.length_reverse] using h
- · rw [gt_iff_lt] at h
+ · rw [gt_iff_lt] at h
rw [List.getI_eq_default, List.getI_eq_default] <;>
simp only [Nat.add_one_le_iff, h, List.length, le_of_lt, List.length_reverse,
List.length_append, List.length_map]
@@ -3083,7 +3083,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
rw [← proj_map_nth, hL, list_blank.nth_mk, e, List.map, List.reverse_cons]
cases' lt_or_gt_of_ne h with h h
· rw [List.getI_append]; simpa only [List.length_map, List.length_reverse] using h
- · rw [gt_iff_lt] at h ;
+ · rw [gt_iff_lt] at h;
rw [List.getI_eq_default, List.getI_eq_default] <;>
simp only [Nat.add_one_le_iff, h, List.length, le_of_lt, List.length_reverse,
List.length_append, List.length_map]
@@ -3168,7 +3168,7 @@ theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
have := hgo.tail' rfl
rw [tr, TM1.step_aux, tape.move_right_n_head, tape.mk'_nth_nat, add_bottom_nth_snd,
stk_nth_val _ (hT k), List.get?_len_le (le_of_eq (List.length_reverse _)), Option.isNone, cond,
- hrun, TM1.step_aux] at this
+ hrun, TM1.step_aux] at this
obtain ⟨c, gc, rc⟩ := IH hT'
refine' ⟨c, gc, (this.to₀.trans hret c (trans_gen.head' rfl _)).to_reflTransGen⟩
rw [tr, TM1.step_aux, tape.mk'_head, add_bottom_head_fst]
@@ -3259,17 +3259,17 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1; exact this.2 _ h]
clear h l'; refine' stmt_st_rec _ _ _ _ _ <;> intros
· -- stack op
- rw [TM2to1.supports_run] at ss'
+ rw [TM2to1.supports_run] at ss'
simp only [TM2to1.tr_stmts₁_run, Finset.mem_union, Finset.mem_insert, Finset.mem_singleton] at
- sub
+ sub
have hgo := sub _ (Or.inl <| Or.inl rfl)
have hret := sub _ (Or.inl <| Or.inr rfl)
cases' IH ss' fun x hx => sub x <| Or.inr hx with IH₁ IH₂
refine'
⟨by simp only [tr_normal_run, TM1.supports_stmt] <;> intros <;> exact hgo, fun l h => _⟩
- rw [tr_stmts₁_run] at h
+ rw [tr_stmts₁_run] at h
simp only [TM2to1.tr_stmts₁_run, Finset.mem_union, Finset.mem_insert, Finset.mem_singleton] at
- h
+ h
rcases h with (⟨rfl | rfl⟩ | h)
· unfold TM1.supports_stmt TM2to1.tr
rcases s with (_ | _ | _)
@@ -3283,15 +3283,15 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
unfold TM2to1.tr_stmts₁ at ss' sub ⊢
exact IH ss' sub
· -- branch
- unfold TM2to1.tr_stmts₁ at sub
+ unfold TM2to1.tr_stmts₁ at sub
cases' IH₁ ss'.1 fun x hx => sub x <| Finset.mem_union_left _ hx with IH₁₁ IH₁₂
cases' IH₂ ss'.2 fun x hx => sub x <| Finset.mem_union_right _ hx with IH₂₁ IH₂₂
refine' ⟨⟨IH₁₁, IH₂₁⟩, fun l h => _⟩
- rw [tr_stmts₁] at h
+ rw [tr_stmts₁] at h
rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h; exact IH₂₂ _ h]
· -- goto
rw [tr_stmts₁]; unfold TM2to1.tr_normal TM1.supports_stmt
- unfold TM2.supports_stmt at ss'
+ unfold TM2.supports_stmt at ss'
exact
⟨fun _ v => Finset.mem_biUnion.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩, fun _ =>
False.elim⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -1967,6 +1967,8 @@ theorem exists_enc_dec [Fintype Γ] :
Bool.of_decide_true <| (congr_fun h b).trans <| Bool.decide_true rfl⟩
let H := (F.to_embedding.trans G).trans (Equiv.vectorEquivFin _ _).symm.toEmbedding
classical
+ let enc := H.set_value default (Vector.replicate n ff)
+ exact ⟨_, enc, Function.invFun enc, H.set_value_eq _ _, Function.leftInverse_invFun enc.2⟩
#align turing.TM1to1.exists_enc_dec Turing.TM1to1.exists_enc_dec
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -1967,8 +1967,6 @@ theorem exists_enc_dec [Fintype Γ] :
Bool.of_decide_true <| (congr_fun h b).trans <| Bool.decide_true rfl⟩
let H := (F.to_embedding.trans G).trans (Equiv.vectorEquivFin _ _).symm.toEmbedding
classical
- let enc := H.set_value default (Vector.replicate n ff)
- exact ⟨_, enc, Function.invFun enc, H.set_value_eq _ _, Function.leftInverse_invFun enc.2⟩
#align turing.TM1to1.exists_enc_dec Turing.TM1to1.exists_enc_dec
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -120,7 +120,7 @@ theorem BlankExtends.above_of_le {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} :
BlankExtends l₁ l → BlankExtends l₂ l → l₁.length ≤ l₂.length → BlankExtends l₁ l₂ :=
by
rintro ⟨i, rfl⟩ ⟨j, e⟩ h; use i - j
- refine' List.append_right_cancel (e.symm.trans _)
+ refine' List.append_cancel_right (e.symm.trans _)
rw [List.append_assoc, ← List.replicate_add, tsub_add_cancel_of_le]
apply_fun List.length at e
simp only [List.length_append, List.length_replicate] at e
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,14 +3,14 @@ Copyright (c) 2018 Mario Carneiro. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mario Carneiro
-/
-import Mathbin.Data.Fintype.Option
-import Mathbin.Data.Fintype.Prod
-import Mathbin.Data.Fintype.Pi
-import Mathbin.Data.Vector.Basic
-import Mathbin.Data.Pfun
-import Mathbin.Logic.Function.Iterate
-import Mathbin.Order.Basic
-import Mathbin.Tactic.ApplyFun
+import Data.Fintype.Option
+import Data.Fintype.Prod
+import Data.Fintype.Pi
+import Data.Vector.Basic
+import Data.Pfun
+import Logic.Function.Iterate
+import Order.Basic
+import Tactic.ApplyFun
#align_import computability.turing_machine from "leanprover-community/mathlib"@"e97cf15cd1aec9bd5c193b2ffac5a6dc9118912b"
@@ -3118,7 +3118,7 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
#print Turing.TM2to1.tr_respects_aux₁ /-
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (_ : n ≤ S.length) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -598,7 +598,7 @@ def ListBlank.bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (l : ListBlank Γ) (f
l.liftOn (fun l => ListBlank.mk (List.bind l f))
(by
rintro l _ ⟨i, rfl⟩; cases' hf with n e; refine' Quotient.sound' (Or.inl ⟨i * n, _⟩)
- rw [List.bind_append, mul_comm]; congr
+ rw [List.append_bind, mul_comm]; congr
induction' i with i IH; rfl
simp only [IH, e, List.replicate_add, Nat.mul_succ, add_comm, List.replicate_succ,
List.cons_bind])
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2018 Mario Carneiro. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mario Carneiro
-
-! This file was ported from Lean 3 source module computability.turing_machine
-! leanprover-community/mathlib commit e97cf15cd1aec9bd5c193b2ffac5a6dc9118912b
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Data.Fintype.Option
import Mathbin.Data.Fintype.Prod
@@ -17,6 +12,8 @@ import Mathbin.Logic.Function.Iterate
import Mathbin.Order.Basic
import Mathbin.Tactic.ApplyFun
+#align_import computability.turing_machine from "leanprover-community/mathlib"@"e97cf15cd1aec9bd5c193b2ffac5a6dc9118912b"
+
/-!
# Turing machines
@@ -3121,7 +3118,7 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
#print Turing.TM2to1.tr_respects_aux₁ /-
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (_ : n ≤ S.length) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -423,6 +423,7 @@ def ListBlank.modifyNth {Γ} [Inhabited Γ] (f : Γ → Γ) : ℕ → ListBlank
#align turing.list_blank.modify_nth Turing.ListBlank.modifyNth
-/
+#print Turing.ListBlank.nth_modifyNth /-
theorem ListBlank.nth_modifyNth {Γ} [Inhabited Γ] (f : Γ → Γ) (n i) (L : ListBlank Γ) :
(L.modifyNth f n).get? i = if i = n then f (L.get? i) else L.get? i :=
by
@@ -436,6 +437,7 @@ theorem ListBlank.nth_modifyNth {Γ} [Inhabited Γ] (f : Γ → Γ) (n i) (L : L
simp only [list_blank.nth_zero, list_blank.head_cons, list_blank.modify_nth]
· simp only [IH, list_blank.modify_nth, list_blank.nth_succ, list_blank.tail_cons]
#align turing.list_blank.nth_modify_nth Turing.ListBlank.nth_modifyNth
+-/
#print Turing.PointedMap /-
/-- A pointed map of `inhabited` types is a map that sends one default value to the other. -/
@@ -452,23 +454,29 @@ instance {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] : Inhabited (PointedMap Γ Γ')
instance {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] : CoeFun (PointedMap Γ Γ') fun _ => Γ → Γ' :=
⟨PointedMap.f⟩
+#print Turing.PointedMap.mk_val /-
@[simp]
theorem PointedMap.mk_val {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : Γ → Γ') (pt) :
(PointedMap.mk f pt : Γ → Γ') = f :=
rfl
#align turing.pointed_map.mk_val Turing.PointedMap.mk_val
+-/
+#print Turing.PointedMap.map_pt /-
@[simp]
theorem PointedMap.map_pt {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') :
f default = default :=
PointedMap.map_pt' _
#align turing.pointed_map.map_pt Turing.PointedMap.map_pt
+-/
+#print Turing.PointedMap.headI_map /-
@[simp]
theorem PointedMap.headI_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : List Γ) : (l.map f).headI = f l.headI := by
cases l <;> [exact (pointed_map.map_pt f).symm; rfl]
#align turing.pointed_map.head_map Turing.PointedMap.headI_map
+-/
#print Turing.ListBlank.map /-
/-- The `map` function on lists is well defined on `list_blank`s provided that the map is
@@ -482,12 +490,15 @@ def ListBlank.map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ'
#align turing.list_blank.map Turing.ListBlank.map
-/
+#print Turing.ListBlank.map_mk /-
@[simp]
theorem ListBlank.map_mk {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (l : List Γ) :
(ListBlank.mk l).map f = ListBlank.mk (l.map f) :=
rfl
#align turing.list_blank.map_mk Turing.ListBlank.map_mk
+-/
+#print Turing.ListBlank.head_map /-
@[simp]
theorem ListBlank.head_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) : (l.map f).headI = f l.headI :=
@@ -497,7 +508,9 @@ theorem ListBlank.head_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedM
rw [← list_blank.cons_head_tail l]
exact Quotient.inductionOn' l fun a => rfl
#align turing.list_blank.head_map Turing.ListBlank.head_map
+-/
+#print Turing.ListBlank.tail_map /-
@[simp]
theorem ListBlank.tail_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) : (l.map f).tail = l.tail.map f :=
@@ -507,7 +520,9 @@ theorem ListBlank.tail_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedM
rw [← list_blank.cons_head_tail l]
exact Quotient.inductionOn' l fun a => rfl
#align turing.list_blank.tail_map Turing.ListBlank.tail_map
+-/
+#print Turing.ListBlank.map_cons /-
@[simp]
theorem ListBlank.map_cons {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) (a : Γ) : (l.cons a).map f = (l.map f).cons (f a) :=
@@ -515,7 +530,9 @@ theorem ListBlank.map_cons {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedM
refine' (list_blank.cons_head_tail _).symm.trans _
simp only [list_blank.head_map, list_blank.head_cons, list_blank.tail_map, list_blank.tail_cons]
#align turing.list_blank.map_cons Turing.ListBlank.map_cons
+-/
+#print Turing.ListBlank.nth_map /-
@[simp]
theorem ListBlank.nth_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) (n : ℕ) : (l.map f).get? n = f (l.get? n) :=
@@ -525,6 +542,7 @@ theorem ListBlank.nth_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMa
simp only [List.get?_map, list_blank.map_mk, list_blank.nth_mk, List.getI_eq_iget_get?]
cases l.nth n; · exact f.2.symm; · rfl)
#align turing.list_blank.nth_map Turing.ListBlank.nth_map
+-/
#print Turing.proj /-
/-- The `i`-th projection as a pointed map. -/
@@ -534,10 +552,13 @@ def proj {ι : Type _} {Γ : ι → Type _} [∀ i, Inhabited (Γ i)] (i : ι) :
#align turing.proj Turing.proj
-/
+#print Turing.proj_map_nth /-
theorem proj_map_nth {ι : Type _} {Γ : ι → Type _} [∀ i, Inhabited (Γ i)] (i : ι) (L n) :
(ListBlank.map (@proj ι Γ _ i) L).get? n = L.get? n i := by rw [list_blank.nth_map] <;> rfl
#align turing.proj_map_nth Turing.proj_map_nth
+-/
+#print Turing.ListBlank.map_modifyNth /-
theorem ListBlank.map_modifyNth {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (F : PointedMap Γ Γ')
(f : Γ → Γ) (f' : Γ' → Γ') (H : ∀ x, F (f x) = f' (F x)) (n) (L : ListBlank Γ) :
(L.modifyNth f n).map F = (L.map F).modifyNth f' n := by
@@ -545,6 +566,7 @@ theorem ListBlank.map_modifyNth {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (F : Poi
simp only [*, list_blank.head_map, list_blank.modify_nth, list_blank.map_cons,
list_blank.tail_map]
#align turing.list_blank.map_modify_nth Turing.ListBlank.map_modifyNth
+-/
#print Turing.ListBlank.append /-
/-- Append a list on the left side of a list_blank. -/
@@ -586,12 +608,15 @@ def ListBlank.bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (l : ListBlank Γ) (f
#align turing.list_blank.bind Turing.ListBlank.bind
-/
+#print Turing.ListBlank.bind_mk /-
@[simp]
theorem ListBlank.bind_mk {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (l : List Γ) (f : Γ → List Γ') (hf) :
(ListBlank.mk l).bind f hf = ListBlank.mk (l.bind f) :=
rfl
#align turing.list_blank.bind_mk Turing.ListBlank.bind_mk
+-/
+#print Turing.ListBlank.cons_bind /-
@[simp]
theorem ListBlank.cons_bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (a : Γ) (l : ListBlank Γ)
(f : Γ → List Γ') (hf) : (l.cons a).bind f hf = (l.bind f hf).append (f a) :=
@@ -599,6 +624,7 @@ theorem ListBlank.cons_bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (a : Γ) (l
intro <;>
simp only [list_blank.append_mk, list_blank.bind_mk, list_blank.cons_mk, List.cons_bind]
#align turing.list_blank.cons_bind Turing.ListBlank.cons_bind
+-/
#print Turing.Tape /-
/-- The tape of a Turing machine is composed of a head element (which we imagine to be the
@@ -827,6 +853,7 @@ theorem Tape.write_self {Γ} [Inhabited Γ] : ∀ T : Tape Γ, T.write T.1 = T :
#align turing.tape.write_self Turing.Tape.write_self
-/
+#print Turing.Tape.write_nth /-
@[simp]
theorem Tape.write_nth {Γ} [Inhabited Γ] (b : Γ) :
∀ (T : Tape Γ) {i : ℤ}, (T.write b).get? i = if i = 0 then b else T.get? i
@@ -834,6 +861,7 @@ theorem Tape.write_nth {Γ} [Inhabited Γ] (b : Γ) :
| ⟨a, L, R⟩, (n + 1 : ℕ) => rfl
| ⟨a, L, R⟩, -[n+1] => rfl
#align turing.tape.write_nth Turing.Tape.write_nth
+-/
#print Turing.Tape.write_mk' /-
@[simp]
@@ -851,15 +879,19 @@ def Tape.map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (T
#align turing.tape.map Turing.Tape.map
-/
+#print Turing.Tape.map_fst /-
@[simp]
theorem Tape.map_fst {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') :
∀ T : Tape Γ, (T.map f).1 = f T.1 := by rintro ⟨⟩ <;> rfl
#align turing.tape.map_fst Turing.Tape.map_fst
+-/
+#print Turing.Tape.map_write /-
@[simp]
theorem Tape.map_write {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (b : Γ) :
∀ T : Tape Γ, (T.write b).map f = (T.map f).write (f b) := by rintro ⟨⟩ <;> rfl
#align turing.tape.map_write Turing.Tape.map_write
+-/
#print Turing.Tape.write_move_right_n /-
@[simp]
@@ -875,28 +907,36 @@ theorem Tape.write_move_right_n {Γ} [Inhabited Γ] (f : Γ → Γ) (L R : ListB
#align turing.tape.write_move_right_n Turing.Tape.write_move_right_n
-/
+#print Turing.Tape.map_move /-
theorem Tape.map_move {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (T : Tape Γ) (d) :
(T.move d).map f = (T.map f).move d := by
cases T <;> cases d <;>
simp only [tape.move, tape.map, list_blank.head_map, eq_self_iff_true, list_blank.map_cons,
and_self_iff, list_blank.tail_map]
#align turing.tape.map_move Turing.Tape.map_move
+-/
+#print Turing.Tape.map_mk' /-
theorem Tape.map_mk' {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (L R : ListBlank Γ) :
(Tape.mk' L R).map f = Tape.mk' (L.map f) (R.map f) := by
simp only [tape.mk', tape.map, list_blank.head_map, eq_self_iff_true, and_self_iff,
list_blank.tail_map]
#align turing.tape.map_mk' Turing.Tape.map_mk'
+-/
+#print Turing.Tape.map_mk₂ /-
theorem Tape.map_mk₂ {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (L R : List Γ) :
(Tape.mk₂ L R).map f = Tape.mk₂ (L.map f) (R.map f) := by
simp only [tape.mk₂, tape.map_mk', list_blank.map_mk]
#align turing.tape.map_mk₂ Turing.Tape.map_mk₂
+-/
+#print Turing.Tape.map_mk₁ /-
theorem Tape.map_mk₁ {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (l : List Γ) :
(Tape.mk₁ l).map f = Tape.mk₁ (l.map f) :=
Tape.map_mk₂ _ _ _
#align turing.tape.map_mk₁ Turing.Tape.map_mk₁
+-/
#print Turing.eval /-
/-- Run a state transition function `σ → option σ` "to completion". The return value is the last
@@ -1097,6 +1137,7 @@ def Respects {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ → Opt
#align turing.respects Turing.Respects
-/
+#print Turing.tr_reaches₁ /-
theorem tr_reaches₁ {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) {b₁} (ab : Reaches₁ f₁ a₁ b₁) : ∃ b₂, tr b₁ b₂ ∧ Reaches₁ f₂ a₂ b₂ :=
by
@@ -1109,7 +1150,9 @@ theorem tr_reaches₁ {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H
rcases this with ⟨d₂, dd, cd₂⟩
exact ⟨_, dd, ac₂.trans cd₂⟩
#align turing.tr_reaches₁ Turing.tr_reaches₁
+-/
+#print Turing.tr_reaches /-
theorem tr_reaches {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) {b₁} (ab : Reaches f₁ a₁ b₁) : ∃ b₂, tr b₁ b₂ ∧ Reaches f₂ a₂ b₂ :=
by
@@ -1120,7 +1163,9 @@ theorem tr_reaches {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H :
let ⟨b₂, bb, h⟩ := tr_reaches₁ H aa ab
⟨b₂, bb, h.to_reflTransGen⟩
#align turing.tr_reaches Turing.tr_reaches
+-/
+#print Turing.tr_reaches_rev /-
theorem tr_reaches_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) {b₂} (ab : Reaches f₂ a₂ b₂) :
∃ c₁ c₂, Reaches f₂ b₂ c₂ ∧ tr c₁ c₂ ∧ Reaches f₁ a₁ c₁ :=
@@ -1139,7 +1184,9 @@ theorem tr_reaches_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (
· cases Option.mem_unique cd cd'
exact ⟨_, _, de, ee, ae⟩
#align turing.tr_reaches_rev Turing.tr_reaches_rev
+-/
+#print Turing.tr_eval /-
theorem tr_eval {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ b₁ a₂}
(aa : tr a₁ a₂) (ab : b₁ ∈ eval f₁ a₁) : ∃ b₂, tr b₁ b₂ ∧ b₂ ∈ eval f₂ a₂ :=
by
@@ -1148,7 +1195,9 @@ theorem tr_eval {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Res
refine' ⟨_, bb, mem_eval.2 ⟨ab, _⟩⟩
have := H bb; rwa [b0] at this
#align turing.tr_eval Turing.tr_eval
+-/
+#print Turing.tr_eval_rev /-
theorem tr_eval_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ b₂ a₂}
(aa : tr a₁ a₂) (ab : b₂ ∈ eval f₂ a₂) : ∃ b₁, tr b₁ b₂ ∧ b₁ ∈ eval f₁ a₁ :=
by
@@ -1161,7 +1210,9 @@ theorem tr_eval_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H :
rcases trans_gen.head'_iff.1 bd with ⟨e, h, _⟩
cases b0.symm.trans h
#align turing.tr_eval_rev Turing.tr_eval_rev
+-/
+#print Turing.tr_eval_dom /-
theorem tr_eval_dom {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) : (eval f₂ a₂).Dom ↔ (eval f₁ a₁).Dom :=
⟨fun h =>
@@ -1171,6 +1222,7 @@ theorem tr_eval_dom {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H :
let ⟨b₂, tr, h, _⟩ := tr_eval H aa ⟨h, rfl⟩
h⟩
#align turing.tr_eval_dom Turing.tr_eval_dom
+-/
#print Turing.FRespects /-
/-- A simpler version of `respects` when the state transition relation `tr` is a function. -/
@@ -1180,18 +1232,23 @@ def FRespects {σ₁ σ₂} (f₂ : σ₂ → Option σ₂) (tr : σ₁ → σ
#align turing.frespects Turing.FRespects
-/
+#print Turing.frespects_eq /-
theorem frespects_eq {σ₁ σ₂} {f₂ : σ₂ → Option σ₂} {tr : σ₁ → σ₂} {a₂ b₂} (h : f₂ a₂ = f₂ b₂) :
∀ {b₁}, FRespects f₂ tr a₂ b₁ ↔ FRespects f₂ tr b₂ b₁
| some b₁ => reaches₁_eq h
| none => by unfold frespects <;> rw [h]
#align turing.frespects_eq Turing.frespects_eq
+-/
+#print Turing.fun_respects /-
theorem fun_respects {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂} :
(Respects f₁ f₂ fun a b => tr a = b) ↔ ∀ ⦃a₁⦄, FRespects f₂ tr (tr a₁) (f₁ a₁) :=
forall_congr' fun a₁ => by
cases f₁ a₁ <;> simp only [frespects, respects, exists_eq_left', forall_eq']
#align turing.fun_respects Turing.fun_respects
+-/
+#print Turing.tr_eval' /-
theorem tr_eval' {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ → Option σ₂) (tr : σ₁ → σ₂)
(H : Respects f₁ f₂ fun a b => tr a = b) (a₁) : eval f₂ (tr a₁) = tr <$> eval f₁ a₁ :=
Part.ext fun b₂ =>
@@ -1203,6 +1260,7 @@ theorem tr_eval' {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ →
rcases tr_eval H rfl ab with ⟨_, rfl, h⟩
rwa [bb] at h ⟩
#align turing.tr_eval' Turing.tr_eval'
+-/
/-!
## The TM0 model
@@ -1238,6 +1296,7 @@ parameter (Γ : Type _) [Inhabited Γ]
-- type of tape symbols
parameter (Λ : Type _) [Inhabited Λ]
+#print Turing.TM0.Stmt /-
-- type of "labels" or TM states
/-- A Turing machine "statement" is just a command to either move
left or right, or write a symbol on the tape. -/
@@ -1245,6 +1304,7 @@ inductive Stmt
| move : Dir → stmt
| write : Γ → stmt
#align turing.TM0.stmt Turing.TM0.Stmt
+-/
#print Turing.TM0.Stmt.inhabited /-
instance Stmt.inhabited : Inhabited stmt :=
@@ -1252,6 +1312,7 @@ instance Stmt.inhabited : Inhabited stmt :=
#align turing.TM0.stmt.inhabited Turing.TM0.Stmt.inhabited
-/
+#print Turing.TM0.Machine /-
-- [inhabited Λ]: this is a deliberate addition, see comment
/-- A Post-Turing machine with symbol type `Γ` and label type `Λ`
is a function which, given the current state `q : Λ` and
@@ -1266,10 +1327,14 @@ instance Stmt.inhabited : Inhabited stmt :=
def Machine :=
Λ → Γ → Option (Λ × stmt)
#align turing.TM0.machine Turing.TM0.Machine
+-/
+#print Turing.TM0.Machine.inhabited /-
instance Machine.inhabited : Inhabited machine := by unfold machine <;> infer_instance
#align turing.TM0.machine.inhabited Turing.TM0.Machine.inhabited
+-/
+#print Turing.TM0.Cfg /-
/-- The configuration state of a Turing machine during operation
consists of a label (machine state), and a tape, represented in
the form `(a, L, R)` meaning the tape looks like `L.rev ++ [a] ++ R`
@@ -1279,6 +1344,7 @@ structure Cfg where
q : Λ
Tape : Tape Γ
#align turing.TM0.cfg Turing.TM0.Cfg
+-/
#print Turing.TM0.Cfg.inhabited /-
instance Cfg.inhabited : Inhabited cfg :=
@@ -1323,6 +1389,7 @@ def eval (M : machine) (l : List Γ) : Part (ListBlank Γ) :=
#align turing.TM0.eval Turing.TM0.eval
-/
+#print Turing.TM0.Supports /-
/-- The raw definition of a Turing machine does not require that
`Γ` and `Λ` are finite, and in practice we will be interested
in the infinite `Λ` case. We recover instead a notion of
@@ -1333,7 +1400,9 @@ def eval (M : machine) (l : List Γ) : Part (ListBlank Γ) :=
def Supports (M : machine) (S : Set Λ) :=
default ∈ S ∧ ∀ {q a q' s}, (q', s) ∈ M q a → q ∈ S → q' ∈ S
#align turing.TM0.supports Turing.TM0.Supports
+-/
+#print Turing.TM0.step_supports /-
theorem step_supports (M : machine) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.q ∈ S → c'.q ∈ S
| ⟨q, T⟩, c', h₁, h₂ =>
@@ -1341,10 +1410,13 @@ theorem step_supports (M : machine) {S} (ss : supports M S) :
rcases Option.map_eq_some'.1 h₁ with ⟨⟨q', a⟩, h, rfl⟩
exact ss.2 h h₂
#align turing.TM0.step_supports Turing.TM0.step_supports
+-/
+#print Turing.TM0.univ_supports /-
theorem univ_supports (M : machine) : supports M Set.univ :=
⟨trivial, fun q a q' s h₁ h₂ => trivial⟩
#align turing.TM0.univ_supports Turing.TM0.univ_supports
+-/
end
@@ -1367,11 +1439,13 @@ def Stmt.map (f : PointedMap Γ Γ') : Stmt Γ → Stmt Γ'
#align turing.TM0.stmt.map Turing.TM0.Stmt.map
-/
+#print Turing.TM0.Cfg.map /-
/-- Map a configuration across a function, given `f : Γ → Γ'` a map of the alphabets and
`g : Λ → Λ'` a map of the machine states. -/
def Cfg.map (f : PointedMap Γ Γ') (g : Λ → Λ') : Cfg Γ Λ → Cfg Γ' Λ'
| ⟨q, T⟩ => ⟨g q, T.map f⟩
#align turing.TM0.cfg.map Turing.TM0.Cfg.map
+-/
variable (M : Machine Γ Λ) (f₁ : PointedMap Γ Γ') (f₂ : PointedMap Γ' Γ) (g₁ : Λ → Λ') (g₂ : Λ' → Λ)
@@ -1384,6 +1458,7 @@ def Machine.map : Machine Γ' Λ'
#align turing.TM0.machine.map Turing.TM0.Machine.map
-/
+#print Turing.TM0.Machine.map_step /-
theorem Machine.map_step {S : Set Λ} (f₂₁ : Function.RightInverse f₁ f₂)
(g₂₁ : ∀ q ∈ S, g₂ (g₁ q) = q) :
∀ c : Cfg Γ Λ,
@@ -1395,11 +1470,15 @@ theorem Machine.map_step {S : Set Λ} (f₂₁ : Function.RightInverse f₁ f₂
· simp only [step, cfg.map, Option.map_some', tape.map_move f₁]; rfl
· simp only [step, cfg.map, Option.map_some', tape.map_write]; rfl
#align turing.TM0.machine.map_step Turing.TM0.Machine.map_step
+-/
+#print Turing.TM0.map_init /-
theorem map_init (g₁ : PointedMap Λ Λ') (l : List Γ) : (init l).map f₁ g₁ = init (l.map f₁) :=
congr (congr_arg Cfg.mk g₁.map_pt) (Tape.map_mk₁ _ _)
#align turing.TM0.map_init Turing.TM0.map_init
+-/
+#print Turing.TM0.Machine.map_respects /-
theorem Machine.map_respects (g₁ : PointedMap Λ Λ') (g₂ : Λ' → Λ) {S} (ss : Supports M S)
(f₂₁ : Function.RightInverse f₁ f₂) (g₂₁ : ∀ q ∈ S, g₂ (g₁ q) = q) :
Respects (step M) (step (M.map f₁ f₂ g₁ g₂)) fun a b => a.q ∈ S ∧ Cfg.map f₁ g₁ a = b
@@ -1409,6 +1488,7 @@ theorem Machine.map_respects (g₁ : PointedMap Λ Λ') (g₂ : Λ' → Λ) {S}
· refine' ⟨_, ⟨step_supports M ss e cs, rfl⟩, trans_gen.single _⟩
rw [← M.map_step f₁ f₂ g₁ g₂ f₂₁ g₂₁ _ cs, e]; exact rfl
#align turing.TM0.machine.map_respects Turing.TM0.Machine.map_respects
+-/
end
@@ -1456,6 +1536,7 @@ parameter (Λ : Type _)
-- Type of function labels
parameter (σ : Type _)
+#print Turing.TM1.Stmt /-
-- Type of variable settings
/-- The TM1 model is a simplification and extension of TM0
(Post-Turing model) in the direction of Wang B-machines. The machine's
@@ -1477,12 +1558,15 @@ inductive Stmt
| goto : (Γ → σ → Λ) → stmt
| halt : stmt
#align turing.TM1.stmt Turing.TM1.Stmt
+-/
open Stmt
+#print Turing.TM1.Stmt.inhabited /-
instance Stmt.inhabited : Inhabited stmt :=
⟨halt⟩
#align turing.TM1.stmt.inhabited Turing.TM1.Stmt.inhabited
+-/
#print Turing.TM1.Cfg /-
/-- The configuration of a TM1 machine is given by the currently
@@ -1522,6 +1606,7 @@ def step (M : Λ → stmt) : cfg → Option cfg
#align turing.TM1.step Turing.TM1.step
-/
+#print Turing.TM1.SupportsStmt /-
/-- A set `S` of labels supports the statement `q` if all the `goto`
statements in `q` refer only to other functions in `S`. -/
def SupportsStmt (S : Finset Λ) : stmt → Prop
@@ -1532,9 +1617,11 @@ def SupportsStmt (S : Finset Λ) : stmt → Prop
| goto l => ∀ a v, l a v ∈ S
| halt => True
#align turing.TM1.supports_stmt Turing.TM1.SupportsStmt
+-/
open scoped Classical
+#print Turing.TM1.stmts₁ /-
/-- The subterm closure of a statement. -/
noncomputable def stmts₁ : stmt → Finset stmt
| Q@(move d q) => insert Q (stmts₁ q)
@@ -1543,11 +1630,15 @@ noncomputable def stmts₁ : stmt → Finset stmt
| Q@(branch p q₁ q₂) => insert Q (stmts₁ q₁ ∪ stmts₁ q₂)
| Q => {Q}
#align turing.TM1.stmts₁ Turing.TM1.stmts₁
+-/
+#print Turing.TM1.stmts₁_self /-
theorem stmts₁_self {q} : q ∈ stmts₁ q := by
cases q <;> apply_rules [Finset.mem_insert_self, Finset.mem_singleton_self]
#align turing.TM1.stmts₁_self Turing.TM1.stmts₁_self
+-/
+#print Turing.TM1.stmts₁_trans /-
theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ :=
by
intro h₁₂ q₀ h₀₁
@@ -1565,7 +1656,9 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
case goto l => subst h₁₂; exact h₀₁
case halt => subst h₁₂; exact h₀₁
#align turing.TM1.stmts₁_trans Turing.TM1.stmts₁_trans
+-/
+#print Turing.TM1.stmts₁_supportsStmt_mono /-
theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (hs : supports_stmt S q₂) :
supports_stmt S q₁ :=
by
@@ -1577,36 +1670,46 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
case goto l => subst h; exact hs
case halt => subst h; trivial
#align turing.TM1.stmts₁_supports_stmt_mono Turing.TM1.stmts₁_supportsStmt_mono
+-/
+#print Turing.TM1.stmts /-
/-- The set of all statements in a turing machine, plus one extra value `none` representing the
halt state. This is used in the TM1 to TM0 reduction. -/
noncomputable def stmts (M : Λ → stmt) (S : Finset Λ) : Finset (Option stmt) :=
(S.biUnion fun q => stmts₁ (M q)).insertNone
#align turing.TM1.stmts Turing.TM1.stmts
+-/
+#print Turing.TM1.stmts_trans /-
theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h₂ => ⟨_, ls, stmts₁_trans h₂ h₁⟩
#align turing.TM1.stmts_trans Turing.TM1.stmts_trans
+-/
variable [Inhabited Λ]
+#print Turing.TM1.Supports /-
/-- A set `S` of labels supports machine `M` if all the `goto`
statements in the functions in `S` refer only to other functions
in `S`. -/
def Supports (M : Λ → stmt) (S : Finset Λ) :=
default ∈ S ∧ ∀ q ∈ S, supports_stmt S (M q)
#align turing.TM1.supports Turing.TM1.Supports
+-/
+#print Turing.TM1.stmts_supportsStmt /-
theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
some q ∈ stmts M S → supports_stmt S q := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h => stmts₁_supports_stmt_mono h (ss.2 _ ls)
#align turing.TM1.stmts_supports_stmt Turing.TM1.stmts_supportsStmt
+-/
+#print Turing.TM1.step_supports /-
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
@@ -1622,6 +1725,7 @@ theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
case goto => exact Finset.some_mem_insertNone.2 (hs _ _)
case halt => apply Multiset.mem_cons_self
#align turing.TM1.step_supports Turing.TM1.step_supports
+-/
variable [Inhabited σ]
@@ -1674,19 +1778,15 @@ parameter {Λ : Type _} [Inhabited Λ]
parameter {σ : Type _} [Inhabited σ]
--- mathport name: exprstmt₁
local notation "stmt₁" => TM1.Stmt Γ Λ σ
--- mathport name: exprcfg₁
local notation "cfg₁" => TM1.Cfg Γ Λ σ
--- mathport name: exprstmt₀
local notation "stmt₀" => TM0.Stmt Γ
parameter (M : Λ → stmt₁)
-include M
-
+#print Turing.TM1to0.Λ' /-
-- [inhabited Λ] [inhabited σ] (M : Λ → stmt₁): We need the M assumption
-- because of the inhabited instance, but we could avoid the inhabited instances on Λ and σ here.
-- But they are parameters so we cannot easily skip them for just this definition.
@@ -1699,12 +1799,14 @@ reachable. -/
def Λ' :=
Option stmt₁ × σ
#align turing.TM1to0.Λ' Turing.TM1to0.Λ'
+-/
instance : Inhabited Λ' :=
⟨(some (M default), default)⟩
open TM0.Stmt
+#print Turing.TM1to0.trAux /-
/-- The core TM1 → TM0 translation function. Here `s` is the current value on the tape, and the
`stmt₁` is the TM1 statement to translate, with local state `v : σ`. We evaluate all regular
instructions recursively until we reach either a `move` or `write` command, or a `goto`; in the
@@ -1717,20 +1819,24 @@ def trAux (s : Γ) : stmt₁ → σ → Λ' × stmt₀
| TM1.stmt.goto l, v => ((some (M (l s v)), v), write s)
| TM1.stmt.halt, v => ((none, v), write s)
#align turing.TM1to0.tr_aux Turing.TM1to0.trAux
+-/
--- mathport name: exprcfg₀
local notation "cfg₀" => TM0.Cfg Γ Λ'
+#print Turing.TM1to0.tr /-
/-- The translated TM0 machine (given the TM1 machine input). -/
def tr : TM0.Machine Γ Λ'
| (none, v), s => none
| (some q, v), s => some (tr_aux s q v)
#align turing.TM1to0.tr Turing.TM1to0.tr
+-/
+#print Turing.TM1to0.trCfg /-
/-- Translate configurations from TM1 to TM0. -/
def trCfg : cfg₁ → cfg₀
| ⟨l, v, T⟩ => ⟨(l.map M, v), T⟩
#align turing.TM1to0.tr_cfg Turing.TM1to0.trCfg
+-/
#print Turing.TM1to0.tr_respects /-
theorem tr_respects : Respects (TM1.step M) (TM0.step tr) fun c₁ c₂ => tr_cfg c₁ = c₂ :=
@@ -1750,26 +1856,31 @@ theorem tr_respects : Respects (TM1.step M) (TM0.step tr) fun c₁ c₂ => tr_cf
#align turing.TM1to0.tr_respects Turing.TM1to0.tr_respects
-/
+#print Turing.TM1to0.tr_eval /-
theorem tr_eval (l : List Γ) : TM0.eval tr l = TM1.eval M l :=
(congr_arg _ (tr_eval' _ _ _ tr_respects ⟨some _, _, _⟩)).trans
(by
rw [Part.map_eq_map, Part.map_map, TM1.eval]
congr with ⟨⟩; rfl)
#align turing.TM1to0.tr_eval Turing.TM1to0.tr_eval
+-/
variable [Fintype σ]
/- ./././Mathport/Syntax/Translate/Expr.lean:177:8: unsupported: ambiguous notation -/
+#print Turing.TM1to0.trStmts /-
/-- Given a finite set of accessible `Λ` machine states, there is a finite set of accessible
machine states in the target (even though the type `Λ'` is infinite). -/
noncomputable def trStmts (S : Finset Λ) : Finset Λ' :=
TM1.stmts M S ×ˢ Finset.univ
#align turing.TM1to0.tr_stmts Turing.TM1to0.trStmts
+-/
open scoped Classical
attribute [local simp] TM1.stmts₁_self
+#print Turing.TM1to0.tr_supports /-
theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr ↑(tr_stmts S) :=
⟨Finset.mem_product.2
⟨Finset.some_mem_insertNone.2 (Finset.mem_biUnion.2 ⟨_, ss.1, TM1.stmts₁_self⟩),
@@ -1808,6 +1919,7 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr
exact Finset.some_mem_insertNone.2 (Finset.mem_biUnion.2 ⟨_, hs _ _, TM1.stmts₁_self⟩)
case halt => cases h₁⟩
#align turing.TM1to0.tr_supports Turing.TM1to0.tr_supports
+-/
end
@@ -1867,27 +1979,26 @@ parameter {Λ : Type _} [Inhabited Λ]
parameter {σ : Type _} [Inhabited σ]
--- mathport name: exprstmt₁
local notation "stmt₁" => Stmt Γ Λ σ
--- mathport name: exprcfg₁
local notation "cfg₁" => Cfg Γ Λ σ
+#print Turing.TM1to1.Λ' /-
/-- The configuration state of the TM. -/
inductive Λ' : Type max u_1 u_2 u_3
| Normal : Λ → Λ'
| write : Γ → stmt₁ → Λ'
#align turing.TM1to1.Λ' Turing.TM1to1.Λ'
+-/
instance : Inhabited Λ' :=
⟨Λ'.normal default⟩
--- mathport name: exprstmt'
local notation "stmt'" => Stmt Bool Λ' σ
--- mathport name: exprcfg'
local notation "cfg'" => Cfg Bool Λ' σ
+#print Turing.TM1to1.readAux /-
/-- Read a vector of length `n` from the tape. -/
def readAux : ∀ n, (Vector Bool n → stmt') → stmt'
| 0, f => f Vector.nil
@@ -1895,26 +2006,34 @@ def readAux : ∀ n, (Vector Bool n → stmt') → stmt'
Stmt.branch (fun a s => a) (Stmt.move Dir.right <| read_aux i fun v => f (true ::ᵥ v))
(Stmt.move Dir.right <| read_aux i fun v => f (false ::ᵥ v))
#align turing.TM1to1.read_aux Turing.TM1to1.readAux
+-/
parameter {n : ℕ} (enc : Γ → Vector Bool n) (dec : Vector Bool n → Γ)
+#print Turing.TM1to1.move /-
/-- A move left or right corresponds to `n` moves across the super-cell. -/
def move (d : Dir) (q : stmt') : stmt' :=
(Stmt.move d^[n]) q
#align turing.TM1to1.move Turing.TM1to1.move
+-/
+#print Turing.TM1to1.read /-
/-- To read a symbol from the tape, we use `read_aux` to traverse the symbol,
then return to the original position with `n` moves to the left. -/
def read (f : Γ → stmt') : stmt' :=
read_aux n fun v => move Dir.left <| f (dec v)
#align turing.TM1to1.read Turing.TM1to1.read
+-/
+#print Turing.TM1to1.write /-
/-- Write a list of bools on the tape. -/
def write : List Bool → stmt' → stmt'
| [], q => q
| a :: l, q => (Stmt.write fun _ _ => a) <| Stmt.move Dir.right <| write l q
#align turing.TM1to1.write Turing.TM1to1.write
+-/
+#print Turing.TM1to1.trNormal /-
/-- Translate a normal instruction. For the `write` command, we use a `goto` indirection so that
we can access the current value of the tape. -/
def trNormal : stmt₁ → stmt'
@@ -1926,7 +2045,9 @@ def trNormal : stmt₁ → stmt'
| stmt.goto l => read fun a => Stmt.goto fun _ s => Λ'.normal (l a s)
| stmt.halt => Stmt.halt
#align turing.TM1to1.tr_normal Turing.TM1to1.trNormal
+-/
+#print Turing.TM1to1.stepAux_move /-
theorem stepAux_move (d q v T) : stepAux (move d q) v T = stepAux q v ((Tape.move d^[n]) T) :=
by
suffices : ∀ i, step_aux ((stmt.move d^[i]) q) v T = step_aux q v ((tape.move d^[i]) T)
@@ -1934,17 +2055,23 @@ theorem stepAux_move (d q v T) : stepAux (move d q) v T = stepAux q v ((Tape.mov
intro; induction' i with i IH generalizing T; · rfl
rw [iterate_succ', step_aux, IH, iterate_succ]
#align turing.TM1to1.step_aux_move Turing.TM1to1.stepAux_move
+-/
+#print Turing.TM1to1.supportsStmt_move /-
theorem supportsStmt_move {S d q} : SupportsStmt S (move d q) = SupportsStmt S q :=
by
suffices ∀ {i}, SupportsStmt S ((Stmt.move d^[i]) q) = _ from this
intro <;> induction i generalizing q <;> simp only [*, iterate] <;> rfl
#align turing.TM1to1.supports_stmt_move Turing.TM1to1.supportsStmt_move
+-/
+#print Turing.TM1to1.supportsStmt_write /-
theorem supportsStmt_write {S l q} : SupportsStmt S (write l q) = SupportsStmt S q := by
induction' l with a l IH <;> simp only [write, supports_stmt, *]
#align turing.TM1to1.supports_stmt_write Turing.TM1to1.supportsStmt_write
+-/
+#print Turing.TM1to1.supportsStmt_read /-
theorem supportsStmt_read {S} :
∀ {f : Γ → stmt'}, (∀ a, SupportsStmt S (f a)) → SupportsStmt S (read f) :=
suffices
@@ -1954,6 +2081,7 @@ theorem supportsStmt_read {S} :
induction' i with i IH; · exact hf _
constructor <;> apply IH <;> intro <;> apply hf
#align turing.TM1to1.supports_stmt_read Turing.TM1to1.supportsStmt_read
+-/
parameter (enc0 : enc default = Vector.replicate n false)
@@ -1961,8 +2089,6 @@ section
parameter {enc}
-include enc0
-
#print Turing.TM1to1.trTape' /-
/-- The low level tape corresponding to the given tape over alphabet `Γ`. -/
def trTape' (L R : ListBlank Γ) : Tape Bool := by
@@ -1990,21 +2116,23 @@ end
parameter (M : Λ → stmt₁)
+#print Turing.TM1to1.tr /-
/-- The top level program. -/
def tr : Λ' → stmt'
| Λ'.normal l => tr_normal (M l)
| Λ'.write a q => write (enc a).toList <| move Dir.left <| tr_normal q
#align turing.TM1to1.tr Turing.TM1to1.tr
+-/
+#print Turing.TM1to1.trCfg /-
/-- The machine configuration translation. -/
def trCfg : cfg₁ → cfg'
| ⟨l, v, T⟩ => ⟨l.map Λ'.normal, v, tr_tape T⟩
#align turing.TM1to1.tr_cfg Turing.TM1to1.trCfg
+-/
parameter {enc}
-include enc0
-
#print Turing.TM1to1.trTape'_move_left /-
theorem trTape'_move_left (L R) :
(Tape.move Dir.left^[n]) (tr_tape' L R) = tr_tape' L.tail (R.cons L.headI) :=
@@ -2040,6 +2168,7 @@ theorem trTape'_move_right (L R) :
#align turing.TM1to1.tr_tape'_move_right Turing.TM1to1.trTape'_move_right
-/
+#print Turing.TM1to1.stepAux_write /-
theorem stepAux_write (q v a b L R) :
stepAux (write (enc a).toList q) v (tr_tape' L (ListBlank.cons b R)) =
stepAux q v (tr_tape' (ListBlank.cons a L) R) :=
@@ -2059,11 +2188,11 @@ theorem stepAux_write (q v a b L R) :
simp only [list_blank.head_cons, list_blank.tail_cons, list_blank.append, tape.move_right_mk',
tape.write_mk']
#align turing.TM1to1.step_aux_write Turing.TM1to1.stepAux_write
+-/
parameter (encdec : ∀ a, dec (enc a) = a)
-include encdec
-
+#print Turing.TM1to1.stepAux_read /-
theorem stepAux_read (f v L R) :
stepAux (read f) v (tr_tape' L R) = stepAux (f R.headI) v (tr_tape' L R) :=
by
@@ -2090,7 +2219,9 @@ theorem stepAux_read (f v L R) :
· dsimp [read_aux, step_aux]; simp; cases a <;> rfl
rw [← list_blank.append, IH]; rfl
#align turing.TM1to1.step_aux_read Turing.TM1to1.stepAux_read
+-/
+#print Turing.TM1to1.tr_respects /-
theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ = c₂ :=
fun_respects.2 fun ⟨l₁, v, T⟩ =>
by
@@ -2134,13 +2265,13 @@ theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ =
tr_tape'_move_right enc0, tr_tape_mk']
apply refl_trans_gen.refl
#align turing.TM1to1.tr_respects Turing.TM1to1.tr_respects
-
-omit enc0 encdec
+-/
open scoped Classical
parameter [Fintype Γ]
+#print Turing.TM1to1.writes /-
/-- The set of accessible `Λ'.write` machine states. -/
noncomputable def writes : stmt₁ → Finset Λ'
| stmt.move d q => writes q
@@ -2150,13 +2281,17 @@ noncomputable def writes : stmt₁ → Finset Λ'
| stmt.goto l => ∅
| stmt.halt => ∅
#align turing.TM1to1.writes Turing.TM1to1.writes
+-/
+#print Turing.TM1to1.trSupp /-
/-- The set of accessible machine states, assuming that the input machine is supported on `S`,
are the normal states embedded from `S`, plus all write states accessible from these states. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ' :=
S.biUnion fun l => insert (Λ'.normal l) (writes (M l))
#align turing.TM1to1.tr_supp Turing.TM1to1.trSupp
+-/
+#print Turing.TM1to1.tr_supports /-
theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert_self _ _⟩, fun q h =>
by
@@ -2204,6 +2339,7 @@ theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
refine' ⟨_, fun _ => False.elim⟩
simp only [supports_stmt, supports_stmt_move, tr_normal]⟩
#align turing.TM1to1.tr_supports Turing.TM1to1.tr_supports
+-/
end
@@ -2232,6 +2368,7 @@ parameter {Γ : Type _} [Inhabited Γ]
parameter {Λ : Type _} [Inhabited Λ]
+#print Turing.TM0to1.Λ' /-
/-- The machine states for a TM1 emulating a TM0 machine. States of the TM0 machine are embedded
as `normal q` states, but the actual operation is split into two parts, a jump to `act s q`
followed by the action and a jump to the next `normal` state. -/
@@ -2239,23 +2376,22 @@ inductive Λ'
| Normal : Λ → Λ'
| act : TM0.Stmt Γ → Λ → Λ'
#align turing.TM0to1.Λ' Turing.TM0to1.Λ'
+-/
instance : Inhabited Λ' :=
⟨Λ'.normal default⟩
--- mathport name: exprcfg₀
local notation "cfg₀" => TM0.Cfg Γ Λ
--- mathport name: exprstmt₁
local notation "stmt₁" => TM1.Stmt Γ Λ' Unit
--- mathport name: exprcfg₁
local notation "cfg₁" => TM1.Cfg Γ Λ' Unit
parameter (M : TM0.Machine Γ Λ)
open TM1.Stmt
+#print Turing.TM0to1.tr /-
/-- The program. -/
def tr : Λ' → stmt₁
| Λ'.normal q =>
@@ -2270,6 +2406,7 @@ def tr : Λ' → stmt₁
| Λ'.act (TM0.stmt.move d) q => move d <| goto fun _ _ => Λ'.normal q
| Λ'.act (TM0.stmt.write a) q => (write fun _ _ => a) <| goto fun _ _ => Λ'.normal q
#align turing.TM0to1.tr Turing.TM0to1.tr
+-/
#print Turing.TM0to1.trCfg /-
/-- The configuration translation. -/
@@ -2347,6 +2484,7 @@ parameter (Λ : Type _)
-- Type of function labels
parameter (σ : Type _)
+#print Turing.TM2.Stmt /-
-- Type of variable settings
/-- The TM2 model removes the tape entirely from the TM1 model,
replacing it with an arbitrary (finite) collection of stacks.
@@ -2363,13 +2501,17 @@ inductive Stmt
| goto : (σ → Λ) → stmt
| halt : stmt
#align turing.TM2.stmt Turing.TM2.Stmt
+-/
open Stmt
+#print Turing.TM2.Stmt.inhabited /-
instance Stmt.inhabited : Inhabited stmt :=
⟨halt⟩
#align turing.TM2.stmt.inhabited Turing.TM2.Stmt.inhabited
+-/
+#print Turing.TM2.Cfg /-
/-- A configuration in the TM2 model is a label (or `none` for the halt state), the state of
local variables, and the stacks. (Note that the stacks are not `list_blank`s, they have a definite
size.) -/
@@ -2378,10 +2520,13 @@ structure Cfg where
var : σ
stk : ∀ k, List (Γ k)
#align turing.TM2.cfg Turing.TM2.Cfg
+-/
+#print Turing.TM2.Cfg.inhabited /-
instance Cfg.inhabited [Inhabited σ] : Inhabited cfg :=
⟨⟨default, default, default⟩⟩
#align turing.TM2.cfg.inhabited Turing.TM2.Cfg.inhabited
+-/
parameter {Γ Λ σ K}
@@ -2415,6 +2560,7 @@ def Reaches (M : Λ → stmt) : cfg → cfg → Prop :=
#align turing.TM2.reaches Turing.TM2.Reaches
-/
+#print Turing.TM2.SupportsStmt /-
/-- Given a set `S` of states, `support_stmt S q` means that `q` only jumps to states in `S`. -/
def SupportsStmt (S : Finset Λ) : stmt → Prop
| push k f q => supports_stmt q
@@ -2425,9 +2571,11 @@ def SupportsStmt (S : Finset Λ) : stmt → Prop
| goto l => ∀ v, l v ∈ S
| halt => True
#align turing.TM2.supports_stmt Turing.TM2.SupportsStmt
+-/
open scoped Classical
+#print Turing.TM2.stmts₁ /-
/-- The set of subtree statements in a statement. -/
noncomputable def stmts₁ : stmt → Finset stmt
| Q@(push k f q) => insert Q (stmts₁ q)
@@ -2438,11 +2586,15 @@ noncomputable def stmts₁ : stmt → Finset stmt
| Q@(goto l) => {Q}
| Q@halt => {Q}
#align turing.TM2.stmts₁ Turing.TM2.stmts₁
+-/
+#print Turing.TM2.stmts₁_self /-
theorem stmts₁_self {q} : q ∈ stmts₁ q := by
cases q <;> apply_rules [Finset.mem_insert_self, Finset.mem_singleton_self]
#align turing.TM2.stmts₁_self Turing.TM2.stmts₁_self
+-/
+#print Turing.TM2.stmts₁_trans /-
theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ :=
by
intro h₁₂ q₀ h₀₁
@@ -2460,7 +2612,9 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
case goto l => subst h₁₂; exact h₀₁
case halt => subst h₁₂; exact h₀₁
#align turing.TM2.stmts₁_trans Turing.TM2.stmts₁_trans
+-/
+#print Turing.TM2.stmts₁_supportsStmt_mono /-
theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (hs : supports_stmt S q₂) :
supports_stmt S q₁ :=
by
@@ -2472,34 +2626,44 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
case goto l => subst h; exact hs
case halt => subst h; trivial
#align turing.TM2.stmts₁_supports_stmt_mono Turing.TM2.stmts₁_supportsStmt_mono
+-/
+#print Turing.TM2.stmts /-
/-- The set of statements accessible from initial set `S` of labels. -/
noncomputable def stmts (M : Λ → stmt) (S : Finset Λ) : Finset (Option stmt) :=
(S.biUnion fun q => stmts₁ (M q)).insertNone
#align turing.TM2.stmts Turing.TM2.stmts
+-/
+#print Turing.TM2.stmts_trans /-
theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h₂ => ⟨_, ls, stmts₁_trans h₂ h₁⟩
#align turing.TM2.stmts_trans Turing.TM2.stmts_trans
+-/
variable [Inhabited Λ]
+#print Turing.TM2.Supports /-
/-- Given a TM2 machine `M` and a set `S` of states, `supports M S` means that all states in
`S` jump only to other states in `S`. -/
def Supports (M : Λ → stmt) (S : Finset Λ) :=
default ∈ S ∧ ∀ q ∈ S, supports_stmt S (M q)
#align turing.TM2.supports Turing.TM2.Supports
+-/
+#print Turing.TM2.stmts_supportsStmt /-
theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
some q ∈ stmts M S → supports_stmt S q := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h => stmts₁_supports_stmt_mono h (ss.2 _ ls)
#align turing.TM2.stmts_supports_stmt Turing.TM2.stmts_supportsStmt
+-/
+#print Turing.TM2.step_supports /-
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
@@ -2515,6 +2679,7 @@ theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
case goto => exact Finset.some_mem_insertNone.2 (hs _)
case halt => apply Multiset.mem_cons_self
#align turing.TM2.step_supports Turing.TM2.step_supports
+-/
variable [Inhabited σ]
@@ -2577,6 +2742,7 @@ steps to run when emulated in TM1, where `m` is the length of the input.
namespace TM2to1
+#print Turing.TM2to1.stk_nth_val /-
-- A displaced lemma proved in unnecessary generality
theorem stk_nth_val {K : Type _} {Γ : K → Type _} {L : ListBlank (∀ k, Option (Γ k))} {k S} (n)
(hL : ListBlank.map (proj k) L = ListBlank.mk (List.map some S).reverse) :
@@ -2586,6 +2752,7 @@ theorem stk_nth_val {K : Type _} {Γ : K → Type _} {L : ListBlank (∀ k, Opti
List.get?_map]
cases S.reverse.nth n <;> rfl
#align turing.TM2to1.stk_nth_val Turing.TM2to1.stk_nth_val
+-/
section
@@ -2597,12 +2764,11 @@ parameter {Λ : Type _} [Inhabited Λ]
parameter {σ : Type _} [Inhabited σ]
--- mathport name: exprstmt₂
local notation "stmt₂" => TM2.Stmt Γ Λ σ
--- mathport name: exprcfg₂
local notation "cfg₂" => TM2.Cfg Γ Λ σ
+#print Turing.TM2to1.Γ' /-
-- [decidable_eq K]: Because K is a parameter, we cannot easily skip
-- the decidable_eq assumption, and this is a local definition anyway so it's not important.
/-- The alphabet of the TM2 simulator on TM1 is a marker for the stack bottom,
@@ -2611,10 +2777,13 @@ plus a vector of stack elements for each stack, or none if the stack does not ex
def Γ' :=
Bool × ∀ k, Option (Γ k)
#align turing.TM2to1.Γ' Turing.TM2to1.Γ'
+-/
+#print Turing.TM2to1.Γ'.inhabited /-
instance Γ'.inhabited : Inhabited Γ' :=
⟨⟨false, fun _ => none⟩⟩
#align turing.TM2to1.Γ'.inhabited Turing.TM2to1.Γ'.inhabited
+-/
#print Turing.TM2to1.Γ'.fintype /-
instance Γ'.fintype [Fintype K] [∀ k, Fintype (Γ k)] : Fintype Γ' :=
@@ -2622,19 +2791,24 @@ instance Γ'.fintype [Fintype K] [∀ k, Fintype (Γ k)] : Fintype Γ' :=
#align turing.TM2to1.Γ'.fintype Turing.TM2to1.Γ'.fintype
-/
+#print Turing.TM2to1.addBottom /-
/-- The bottom marker is fixed throughout the calculation, so we use the `add_bottom` function
to express the program state in terms of a tape with only the stacks themselves. -/
def addBottom (L : ListBlank (∀ k, Option (Γ k))) : ListBlank Γ' :=
ListBlank.cons (true, L.headI) (L.tail.map ⟨Prod.mk false, rfl⟩)
#align turing.TM2to1.add_bottom Turing.TM2to1.addBottom
+-/
+#print Turing.TM2to1.addBottom_map /-
theorem addBottom_map (L) : (add_bottom L).map ⟨Prod.snd, rfl⟩ = L :=
by
simp only [add_bottom, list_blank.map_cons] <;> convert list_blank.cons_head_tail _
generalize list_blank.tail L = L'
refine' L'.induction_on fun l => _; simp
#align turing.TM2to1.add_bottom_map Turing.TM2to1.addBottom_map
+-/
+#print Turing.TM2to1.addBottom_modifyNth /-
theorem addBottom_modifyNth (f : (∀ k, Option (Γ k)) → ∀ k, Option (Γ k)) (L n) :
(add_bottom L).modifyNth (fun a => (a.1, f a.2)) n = add_bottom (L.modifyNth f n) :=
by
@@ -2642,22 +2816,30 @@ theorem addBottom_modifyNth (f : (∀ k, Option (Γ k)) → ∀ k, Option (Γ k)
simp only [add_bottom, list_blank.head_cons, list_blank.modify_nth, list_blank.tail_cons]
congr; symm; apply list_blank.map_modify_nth; intro; rfl
#align turing.TM2to1.add_bottom_modify_nth Turing.TM2to1.addBottom_modifyNth
+-/
+#print Turing.TM2to1.addBottom_nth_snd /-
theorem addBottom_nth_snd (L n) : ((add_bottom L).get? n).2 = L.get? n := by
conv =>
rhs
rw [← add_bottom_map L, list_blank.nth_map] <;>
rfl
#align turing.TM2to1.add_bottom_nth_snd Turing.TM2to1.addBottom_nth_snd
+-/
+#print Turing.TM2to1.addBottom_nth_succ_fst /-
theorem addBottom_nth_succ_fst (L n) : ((add_bottom L).get? (n + 1)).1 = false := by
rw [list_blank.nth_succ, add_bottom, list_blank.tail_cons, list_blank.nth_map] <;> rfl
#align turing.TM2to1.add_bottom_nth_succ_fst Turing.TM2to1.addBottom_nth_succ_fst
+-/
+#print Turing.TM2to1.addBottom_head_fst /-
theorem addBottom_head_fst (L) : (add_bottom L).headI.1 = true := by
rw [add_bottom, list_blank.head_cons] <;> rfl
#align turing.TM2to1.add_bottom_head_fst Turing.TM2to1.addBottom_head_fst
+-/
+#print Turing.TM2to1.StAct /-
/-- A stack action is a command that interacts with the top of a stack. Our default position
is at the bottom of all the stacks, so we have to hold on to this action while going to the end
to modify the stack. -/
@@ -2666,15 +2848,19 @@ inductive StAct (k : K)
| peek : (σ → Option (Γ k) → σ) → st_act
| pop : (σ → Option (Γ k) → σ) → st_act
#align turing.TM2to1.st_act Turing.TM2to1.StAct
+-/
+#print Turing.TM2to1.StAct.inhabited /-
instance StAct.inhabited {k} : Inhabited (st_act k) :=
⟨st_act.peek fun s _ => s⟩
#align turing.TM2to1.st_act.inhabited Turing.TM2to1.StAct.inhabited
+-/
section
open StAct
+#print Turing.TM2to1.stRun /-
-- [inhabited Λ]: as this is a local definition it is more trouble than
-- it is worth to omit the typeclass assumption without breaking the parameters
/-- The TM2 statement corresponding to a stack action. -/
@@ -2684,21 +2870,27 @@ def stRun {k : K} : st_act k → stmt₂ → stmt₂
| peek f => TM2.Stmt.peek k f
| pop f => TM2.Stmt.pop k f
#align turing.TM2to1.st_run Turing.TM2to1.stRun
+-/
+#print Turing.TM2to1.stVar /-
/-- The effect of a stack action on the local variables, given the value of the stack. -/
def stVar {k : K} (v : σ) (l : List (Γ k)) : st_act k → σ
| push f => v
| peek f => f v l.head?
| pop f => f v l.head?
#align turing.TM2to1.st_var Turing.TM2to1.stVar
+-/
+#print Turing.TM2to1.stWrite /-
/-- The effect of a stack action on the stack. -/
def stWrite {k : K} (v : σ) (l : List (Γ k)) : st_act k → List (Γ k)
| push f => f v :: l
| peek f => l
| pop f => l.tail
#align turing.TM2to1.st_write Turing.TM2to1.stWrite
+-/
+#print Turing.TM2to1.stmtStRec /-
/-- We have partitioned the TM2 statements into "stack actions", which require going to the end
of the stack, and all other actions, which do not. This is a modified recursor which lumps the
stack actions into one. -/
@@ -2715,13 +2907,17 @@ def stmtStRec.{l} {C : stmt₂ → Sort l} (H₁ : ∀ (k) (s : st_act k) (q) (I
| TM2.stmt.goto l => H₄ _
| TM2.stmt.halt => H₅
#align turing.TM2to1.stmt_st_rec Turing.TM2to1.stmtStRec
+-/
+#print Turing.TM2to1.supports_run /-
theorem supports_run (S : Finset Λ) {k} (s : st_act k) (q) :
TM2.SupportsStmt S (st_run s q) ↔ TM2.SupportsStmt S q := by rcases s with (_ | _ | _) <;> rfl
#align turing.TM2to1.supports_run Turing.TM2to1.supports_run
+-/
end
+#print Turing.TM2to1.Λ' /-
/-- The machine states of the TM2 emulator. We can either be in a normal state when waiting for the
next TM2 action, or we can be in the "go" and "return" states to go to the top of the stack and
return to the bottom, respectively. -/
@@ -2730,21 +2926,23 @@ inductive Λ' : Type max u_1 u_2 u_3 u_4
| go (k) : st_act k → stmt₂ → Λ'
| ret : stmt₂ → Λ'
#align turing.TM2to1.Λ' Turing.TM2to1.Λ'
+-/
open Λ'
+#print Turing.TM2to1.Λ'.inhabited /-
instance Λ'.inhabited : Inhabited Λ' :=
⟨Normal default⟩
#align turing.TM2to1.Λ'.inhabited Turing.TM2to1.Λ'.inhabited
+-/
--- mathport name: exprstmt₁
local notation "stmt₁" => TM1.Stmt Γ' Λ' σ
--- mathport name: exprcfg₁
local notation "cfg₁" => TM1.Cfg Γ' Λ' σ
open TM1.Stmt
+#print Turing.TM2to1.trStAct /-
/-- The program corresponding to state transitions at the end of a stack. Here we start out just
after the top of the stack, and should end just after the new top of the stack. -/
def trStAct {k} (q : stmt₁) : st_act k → stmt₁
@@ -2755,6 +2953,7 @@ def trStAct {k} (q : stmt₁) : st_act k → stmt₁
(move Dir.left <|
(load fun a s => f s (a.2 k)) <| write (fun a s => (a.1, update a.2 k none)) q)
#align turing.TM2to1.tr_st_act Turing.TM2to1.trStAct
+-/
#print Turing.TM2to1.trInit /-
/-- The initial state for the TM2 emulator, given an initial TM2 state. All stacks start out empty
@@ -2765,6 +2964,7 @@ def trInit (k) (L : List (Γ k)) : List Γ' :=
#align turing.TM2to1.tr_init Turing.TM2to1.trInit
-/
+#print Turing.TM2to1.step_run /-
theorem step_run {k : K} (q v S) :
∀ s : st_act k,
TM2.stepAux (st_run s q) v S =
@@ -2773,7 +2973,9 @@ theorem step_run {k : K} (q v S) :
| st_act.peek f => by unfold st_write <;> rw [Function.update_eq_self] <;> rfl
| st_act.pop f => rfl
#align turing.TM2to1.step_run Turing.TM2to1.step_run
+-/
+#print Turing.TM2to1.trNormal /-
/-- The translation of TM2 statements to TM1 statements. regular actions have direct equivalents,
but stack actions are deferred by going to the corresponding `go` state, so that we can find the
appropriate stack top. -/
@@ -2786,13 +2988,17 @@ def trNormal : stmt₂ → stmt₁
| TM2.stmt.goto l => goto fun a s => Normal (l s)
| TM2.stmt.halt => halt
#align turing.TM2to1.tr_normal Turing.TM2to1.trNormal
+-/
+#print Turing.TM2to1.trNormal_run /-
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_run
+-/
open scoped Classical
+#print Turing.TM2to1.trStmts₁ /-
/-- The set of machine states accessible from an initial TM2 statement. -/
noncomputable def trStmts₁ : stmt₂ → Finset Λ'
| TM2.stmt.push k f q => {go k (st_act.push f) q, ret q} ∪ tr_stmts₁ q
@@ -2802,11 +3008,15 @@ noncomputable def trStmts₁ : stmt₂ → Finset Λ'
| TM2.stmt.branch f q₁ q₂ => tr_stmts₁ q₁ ∪ tr_stmts₁ q₂
| _ => ∅
#align turing.TM2to1.tr_stmts₁ Turing.TM2to1.trStmts₁
+-/
+#print Turing.TM2to1.trStmts₁_run /-
theorem trStmts₁_run {k s q} : tr_stmts₁ (st_run s q) = {go k s q, ret q} ∪ tr_stmts₁ q := by
rcases s with (_ | _ | _) <;> unfold tr_stmts₁ st_run
#align turing.TM2to1.tr_stmts₁_run Turing.TM2to1.trStmts₁_run
+-/
+#print Turing.TM2to1.tr_respects_aux₂ /-
theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : ∀ k, L.map (proj k) = ListBlank.mk ((S k).map some).reverse) (o) :
let v' := st_var v (S k) o
@@ -2883,11 +3093,11 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
· split_ifs <;> rw [Function.update_noteq h', ← proj_map_nth, hL]
rw [Function.update_noteq h']
#align turing.TM2to1.tr_respects_aux₂ Turing.TM2to1.tr_respects_aux₂
+-/
parameter (M : Λ → stmt₂)
-include M
-
+#print Turing.TM2to1.tr /-
/-- The TM2 emulator machine states written as a TM1 program.
This handles the `go` and `ret` states, which shuttle to and from a stack top. -/
def tr : Λ' → stmt₁
@@ -2897,9 +3107,11 @@ def tr : Λ' → stmt₁
(move Dir.right <| goto fun _ _ => go k s q)
| ret q => branch (fun a s => a.1) (tr_normal q) (move Dir.left <| goto fun _ _ => ret q)
#align turing.TM2to1.tr Turing.TM2to1.tr
+-/
attribute [local pp_using_anonymous_constructor] Turing.TM1.Cfg
+#print Turing.TM2to1.TrCfg /-
/-- The relation between TM2 configurations and TM1 configurations of the TM2 emulator. -/
inductive TrCfg : cfg₂ → cfg₁ → Prop
|
@@ -2907,8 +3119,10 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
(∀ k, L.map (proj k) = ListBlank.mk ((S k).map some).reverse) →
tr_cfg ⟨q, v, S⟩ ⟨q.map Normal, v, Tape.mk' ∅ (add_bottom L)⟩
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
+-/
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
+#print Turing.TM2to1.tr_respects_aux₁ /-
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (_ : n ≤ S.length) :
Reaches₀ (TM1.step tr) ⟨some (go k o q), v, Tape.mk' ∅ (add_bottom L)⟩
@@ -2921,7 +3135,9 @@ theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k,
add_bottom_nth_snd, Option.mem_def]
rw [stk_nth_val _ hL, List.nthLe_get?]; rfl; rwa [List.length_reverse]
#align turing.TM2to1.tr_respects_aux₁ Turing.TM2to1.tr_respects_aux₁
+-/
+#print Turing.TM2to1.tr_respects_aux₃ /-
theorem tr_respects_aux₃ {q v} {L : ListBlank (∀ k, Option (Γ k))} (n) :
Reaches₀ (TM1.step tr) ⟨some (ret q), v, (Tape.move Dir.right^[n]) (Tape.mk' ∅ (add_bottom L))⟩
⟨some (ret q), v, Tape.mk' ∅ (add_bottom L)⟩ :=
@@ -2932,7 +3148,9 @@ theorem tr_respects_aux₃ {q v} {L : ListBlank (∀ k, Option (Γ k))} (n) :
add_bottom_nth_succ_fst, TM1.step_aux, iterate_succ', tape.move_right_left]
rfl
#align turing.TM2to1.tr_respects_aux₃ Turing.TM2to1.tr_respects_aux₃
+-/
+#print Turing.TM2to1.tr_respects_aux /-
theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
(hT : ∀ k, ListBlank.map (proj k) T = ListBlank.mk ((S k).map some).reverse) (o : st_act k)
(IH :
@@ -2959,9 +3177,11 @@ theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
rw [tr, TM1.step_aux, tape.mk'_head, add_bottom_head_fst]
exact rc
#align turing.TM2to1.tr_respects_aux Turing.TM2to1.tr_respects_aux
+-/
attribute [local simp] respects TM2.step TM2.step_aux tr_normal
+#print Turing.TM2to1.tr_respects /-
theorem tr_respects : Respects (TM2.step M) (TM1.step tr) tr_cfg := fun c₁ c₂ h =>
by
cases' h with l v S L hT; clear h
@@ -2978,7 +3198,9 @@ theorem tr_respects : Respects (TM2.step M) (TM1.step tr) tr_cfg := fun c₁ c
· exact ⟨_, ⟨_, hT⟩, refl_trans_gen.refl⟩
· exact ⟨_, ⟨_, hT⟩, refl_trans_gen.refl⟩
#align turing.TM2to1.tr_respects Turing.TM2to1.tr_respects
+-/
+#print Turing.TM2to1.trCfg_init /-
theorem trCfg_init (k) (L : List (Γ k)) : tr_cfg (TM2.init k L) (TM1.init (tr_init k L)) :=
by
rw [(_ : TM1.init _ = _)]
@@ -2995,11 +3217,15 @@ theorem trCfg_init (k) (L : List (Γ k)) : tr_cfg (TM2.init k L) (TM1.init (tr_i
· rw [tr_init, TM1.init]; dsimp only; congr <;> cases L.reverse <;> try rfl
simp only [List.map_map, List.tail_cons, List.map]; rfl
#align turing.TM2to1.tr_cfg_init Turing.TM2to1.trCfg_init
+-/
+#print Turing.TM2to1.tr_eval_dom /-
theorem tr_eval_dom (k) (L : List (Γ k)) : (TM1.eval tr (tr_init k L)).Dom ↔ (TM2.eval M k L).Dom :=
tr_eval_dom tr_respects (tr_cfg_init _ _)
#align turing.TM2to1.tr_eval_dom Turing.TM2to1.tr_eval_dom
+-/
+#print Turing.TM2to1.tr_eval /-
theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval tr (tr_init k L))
(H₂ : L₂ ∈ TM2.eval M k L) :
∃ (S : ∀ k, List (Γ k)) (L' : ListBlank (∀ k, Option (Γ k))),
@@ -3012,12 +3238,16 @@ theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval tr (
cases Part.mem_unique h₁ h₃
exact ⟨_, L', by simp only [tape.mk'_right₀], hT, rfl⟩
#align turing.TM2to1.tr_eval Turing.TM2to1.tr_eval
+-/
+#print Turing.TM2to1.trSupp /-
/-- The support of a set of TM2 states in the TM2 emulator. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ' :=
S.biUnion fun l => insert (Normal l) (tr_stmts₁ (M l))
#align turing.TM2to1.tr_supp Turing.TM2to1.trSupp
+-/
+#print Turing.TM2to1.tr_supports /-
theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert.2 <| Or.inl rfl⟩, fun l' h =>
by
@@ -3070,6 +3300,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
False.elim⟩
· exact ⟨trivial, fun _ => False.elim⟩⟩
#align turing.TM2to1.tr_supports Turing.TM2to1.tr_supports
+-/
-- halt
end
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -1875,7 +1875,7 @@ local notation "cfg₁" => Cfg Γ Λ σ
/-- The configuration state of the TM. -/
inductive Λ' : Type max u_1 u_2 u_3
- | normal : Λ → Λ'
+ | Normal : Λ → Λ'
| write : Γ → stmt₁ → Λ'
#align turing.TM1to1.Λ' Turing.TM1to1.Λ'
@@ -2236,7 +2236,7 @@ parameter {Λ : Type _} [Inhabited Λ]
as `normal q` states, but the actual operation is split into two parts, a jump to `act s q`
followed by the action and a jump to the next `normal` state. -/
inductive Λ'
- | normal : Λ → Λ'
+ | Normal : Λ → Λ'
| act : TM0.Stmt Γ → Λ → Λ'
#align turing.TM0to1.Λ' Turing.TM0to1.Λ'
@@ -2726,7 +2726,7 @@ end
next TM2 action, or we can be in the "go" and "return" states to go to the top of the stack and
return to the bottom, respectively. -/
inductive Λ' : Type max u_1 u_2 u_3 u_4
- | normal : Λ → Λ'
+ | Normal : Λ → Λ'
| go (k) : st_act k → stmt₂ → Λ'
| ret : stmt₂ → Λ'
#align turing.TM2to1.Λ' Turing.TM2to1.Λ'
@@ -2734,7 +2734,7 @@ inductive Λ' : Type max u_1 u_2 u_3 u_4
open Λ'
instance Λ'.inhabited : Inhabited Λ' :=
- ⟨normal default⟩
+ ⟨Normal default⟩
#align turing.TM2to1.Λ'.inhabited Turing.TM2to1.Λ'.inhabited
-- mathport name: exprstmt₁
@@ -2783,7 +2783,7 @@ def trNormal : stmt₂ → stmt₁
| TM2.stmt.pop k f q => goto fun _ _ => go k (st_act.pop f) q
| TM2.stmt.load a q => load (fun _ => a) (tr_normal q)
| TM2.stmt.branch f q₁ q₂ => branch (fun a => f) (tr_normal q₁) (tr_normal q₂)
- | TM2.stmt.goto l => goto fun a s => normal (l s)
+ | TM2.stmt.goto l => goto fun a s => Normal (l s)
| TM2.stmt.halt => halt
#align turing.TM2to1.tr_normal Turing.TM2to1.trNormal
@@ -2891,7 +2891,7 @@ include M
/-- The TM2 emulator machine states written as a TM1 program.
This handles the `go` and `ret` states, which shuttle to and from a stack top. -/
def tr : Λ' → stmt₁
- | normal q => tr_normal (M q)
+ | Normal q => tr_normal (M q)
| go k s q =>
branch (fun a s => (a.2 k).isNone) (tr_st_act (goto fun _ _ => ret q) s)
(move Dir.right <| goto fun _ _ => go k s q)
@@ -2905,7 +2905,7 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
|
mk {q v} {S : ∀ k, List (Γ k)} (L : ListBlank (∀ k, Option (Γ k))) :
(∀ k, L.map (proj k) = ListBlank.mk ((S k).map some).reverse) →
- tr_cfg ⟨q, v, S⟩ ⟨q.map normal, v, Tape.mk' ∅ (add_bottom L)⟩
+ tr_cfg ⟨q, v, S⟩ ⟨q.map Normal, v, Tape.mk' ∅ (add_bottom L)⟩
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
@@ -3015,7 +3015,7 @@ theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval tr (
/-- The support of a set of TM2 states in the TM2 emulator. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ' :=
- S.biUnion fun l => insert (normal l) (tr_stmts₁ (M l))
+ S.biUnion fun l => insert (Normal l) (tr_stmts₁ (M l))
#align turing.TM2to1.tr_supp Turing.TM2to1.trSupp
theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/31c24aa72e7b3e5ed97a8412470e904f82b81004
@@ -2908,7 +2908,7 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
tr_cfg ⟨q, v, S⟩ ⟨q.map normal, v, Tape.mk' ∅ (add_bottom L)⟩
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (_ : n ≤ S.length) :
Reaches₀ (TM1.step tr) ⟨some (go k o q), v, Tape.mk' ∅ (add_bottom L)⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -125,7 +125,7 @@ theorem BlankExtends.above_of_le {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} :
rintro ⟨i, rfl⟩ ⟨j, e⟩ h; use i - j
refine' List.append_right_cancel (e.symm.trans _)
rw [List.append_assoc, ← List.replicate_add, tsub_add_cancel_of_le]
- apply_fun List.length at e
+ apply_fun List.length at e
simp only [List.length_append, List.length_replicate] at e
rwa [← add_le_add_iff_left, e, add_le_add_iff_right]
#align turing.blank_extends.above_of_le Turing.BlankExtends.above_of_le
@@ -1233,10 +1233,10 @@ namespace TM0
section
-parameter (Γ : Type _)[Inhabited Γ]
+parameter (Γ : Type _) [Inhabited Γ]
-- type of tape symbols
-parameter (Λ : Type _)[Inhabited Λ]
+parameter (Λ : Type _) [Inhabited Λ]
-- type of "labels" or TM states
/-- A Turing machine "statement" is just a command to either move
@@ -1448,7 +1448,7 @@ namespace TM1
section
-parameter (Γ : Type _)[Inhabited Γ]
+parameter (Γ : Type _) [Inhabited Γ]
-- Type of tape symbols
parameter (Λ : Type _)
@@ -1668,11 +1668,11 @@ namespace TM1to0
section
-parameter {Γ : Type _}[Inhabited Γ]
+parameter {Γ : Type _} [Inhabited Γ]
-parameter {Λ : Type _}[Inhabited Λ]
+parameter {Λ : Type _} [Inhabited Λ]
-parameter {σ : Type _}[Inhabited σ]
+parameter {σ : Type _} [Inhabited σ]
-- mathport name: exprstmt₁
local notation "stmt₁" => TM1.Stmt Γ Λ σ
@@ -1843,7 +1843,7 @@ open TM1
section
-parameter {Γ : Type _}[Inhabited Γ]
+parameter {Γ : Type _} [Inhabited Γ]
#print Turing.TM1to1.exists_enc_dec /-
theorem exists_enc_dec [Fintype Γ] :
@@ -1858,14 +1858,14 @@ theorem exists_enc_dec [Fintype Γ] :
Bool.of_decide_true <| (congr_fun h b).trans <| Bool.decide_true rfl⟩
let H := (F.to_embedding.trans G).trans (Equiv.vectorEquivFin _ _).symm.toEmbedding
classical
- let enc := H.set_value default (Vector.replicate n ff)
- exact ⟨_, enc, Function.invFun enc, H.set_value_eq _ _, Function.leftInverse_invFun enc.2⟩
+ let enc := H.set_value default (Vector.replicate n ff)
+ exact ⟨_, enc, Function.invFun enc, H.set_value_eq _ _, Function.leftInverse_invFun enc.2⟩
#align turing.TM1to1.exists_enc_dec Turing.TM1to1.exists_enc_dec
-/
-parameter {Λ : Type _}[Inhabited Λ]
+parameter {Λ : Type _} [Inhabited Λ]
-parameter {σ : Type _}[Inhabited σ]
+parameter {σ : Type _} [Inhabited σ]
-- mathport name: exprstmt₁
local notation "stmt₁" => Stmt Γ Λ σ
@@ -1896,7 +1896,7 @@ def readAux : ∀ n, (Vector Bool n → stmt') → stmt'
(Stmt.move Dir.right <| read_aux i fun v => f (false ::ᵥ v))
#align turing.TM1to1.read_aux Turing.TM1to1.readAux
-parameter {n : ℕ}(enc : Γ → Vector Bool n)(dec : Vector Bool n → Γ)
+parameter {n : ℕ} (enc : Γ → Vector Bool n) (dec : Vector Bool n → Γ)
/-- A move left or right corresponds to `n` moves across the super-cell. -/
def move (d : Dir) (q : stmt') : stmt' :=
@@ -2228,9 +2228,9 @@ namespace TM0to1
section
-parameter {Γ : Type _}[Inhabited Γ]
+parameter {Γ : Type _} [Inhabited Γ]
-parameter {Λ : Type _}[Inhabited Λ]
+parameter {Λ : Type _} [Inhabited Λ]
/-- The machine states for a TM1 emulating a TM0 machine. States of the TM0 machine are embedded
as `normal q` states, but the actual operation is split into two parts, a jump to `act s q`
@@ -2336,7 +2336,7 @@ namespace TM2
section
-parameter {K : Type _}[DecidableEq K]
+parameter {K : Type _} [DecidableEq K]
-- Index type of stacks
parameter (Γ : K → Type _)
@@ -2589,13 +2589,13 @@ theorem stk_nth_val {K : Type _} {Γ : K → Type _} {L : ListBlank (∀ k, Opti
section
-parameter {K : Type _}[DecidableEq K]
+parameter {K : Type _} [DecidableEq K]
parameter {Γ : K → Type _}
-parameter {Λ : Type _}[Inhabited Λ]
+parameter {Λ : Type _} [Inhabited Λ]
-parameter {σ : Type _}[Inhabited σ]
+parameter {σ : Type _} [Inhabited σ]
-- mathport name: exprstmt₂
local notation "stmt₂" => TM2.Stmt Γ Λ σ
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -103,7 +103,7 @@ theorem BlankExtends.below_of_le {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} :
BlankExtends l l₁ → BlankExtends l l₂ → l₁.length ≤ l₂.length → BlankExtends l₁ l₂ :=
by
rintro ⟨i, rfl⟩ ⟨j, rfl⟩ h; use j - i
- simp only [List.length_append, add_le_add_iff_left, List.length_replicate] at h
+ simp only [List.length_append, add_le_add_iff_left, List.length_replicate] at h
simp only [← List.replicate_add, add_tsub_cancel_of_le h, List.append_assoc]
#align turing.blank_extends.below_of_le Turing.BlankExtends.below_of_le
-/
@@ -125,8 +125,8 @@ theorem BlankExtends.above_of_le {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} :
rintro ⟨i, rfl⟩ ⟨j, e⟩ h; use i - j
refine' List.append_right_cancel (e.symm.trans _)
rw [List.append_assoc, ← List.replicate_add, tsub_add_cancel_of_le]
- apply_fun List.length at e
- simp only [List.length_append, List.length_replicate] at e
+ apply_fun List.length at e
+ simp only [List.length_append, List.length_replicate] at e
rwa [← add_le_add_iff_left, e, add_le_add_iff_right]
#align turing.blank_extends.above_of_le Turing.BlankExtends.above_of_le
-/
@@ -236,7 +236,7 @@ precondition `blank_extends` instead of `blank_rel`. -/
@[elab_as_elim, reducible]
protected def ListBlank.liftOn {Γ} [Inhabited Γ] {α} (l : ListBlank Γ) (f : List Γ → α)
(H : ∀ a b, BlankExtends a b → f a = f b) : α :=
- l.liftOn' f <| by rintro a b (h | h) <;> [exact H _ _ h;exact (H _ _ h).symm]
+ l.liftOn' f <| by rintro a b (h | h) <;> [exact H _ _ h; exact (H _ _ h).symm]
#align turing.list_blank.lift_on Turing.ListBlank.liftOn
-/
@@ -280,7 +280,7 @@ def ListBlank.tail {Γ} [Inhabited Γ] (l : ListBlank Γ) : ListBlank Γ :=
(by
rintro _ _ ⟨i, rfl⟩
refine' Quotient.sound' (Or.inl _)
- cases a <;> [· cases i <;> [exact ⟨0, rfl⟩;exact ⟨i, rfl⟩];exact ⟨i, rfl⟩])
+ cases a <;> [· cases i <;> [exact ⟨0, rfl⟩; exact ⟨i, rfl⟩]; exact ⟨i, rfl⟩])
#align turing.list_blank.tail Turing.ListBlank.tail
-/
@@ -398,12 +398,12 @@ theorem ListBlank.ext {Γ} [Inhabited Γ] {L₁ L₂ : ListBlank Γ} :
ListBlank.induction_on L₂ fun l₂ H =>
by
wlog h : l₁.length ≤ l₂.length
- · cases le_total l₁.length l₂.length <;> [skip;symm] <;> apply_assumption <;> try assumption
- intro ; rw [H]
+ · cases le_total l₁.length l₂.length <;> [skip; symm] <;> apply_assumption <;> try assumption
+ intro; rw [H]
refine' Quotient.sound' (Or.inl ⟨l₂.length - l₁.length, _⟩)
refine' List.ext_nthLe _ fun i h h₂ => Eq.symm _
· simp only [add_tsub_cancel_of_le h, List.length_append, List.length_replicate]
- simp only [list_blank.nth_mk] at H
+ simp only [list_blank.nth_mk] at H
cases' lt_or_le i l₁.length with h' h'
·
simp only [List.nthLe_append _ h', List.nthLe_get? h, List.nthLe_get? h', ←
@@ -440,7 +440,7 @@ theorem ListBlank.nth_modifyNth {Γ} [Inhabited Γ] (f : Γ → Γ) (n i) (L : L
#print Turing.PointedMap /-
/-- A pointed map of `inhabited` types is a map that sends one default value to the other. -/
structure PointedMap.{u, v} (Γ : Type u) (Γ' : Type v) [Inhabited Γ] [Inhabited Γ'] :
- Type max u v where
+ Type max u v where
f : Γ → Γ'
map_pt' : f default = default
#align turing.pointed_map Turing.PointedMap
@@ -467,7 +467,7 @@ theorem PointedMap.map_pt {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMa
@[simp]
theorem PointedMap.headI_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : List Γ) : (l.map f).headI = f l.headI := by
- cases l <;> [exact (pointed_map.map_pt f).symm;rfl]
+ cases l <;> [exact (pointed_map.map_pt f).symm; rfl]
#align turing.pointed_map.head_map Turing.PointedMap.headI_map
#print Turing.ListBlank.map /-
@@ -809,8 +809,8 @@ theorem Tape.move_right_nth {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℤ) :
@[simp]
theorem Tape.move_right_n_head {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℕ) :
((Tape.move Dir.right^[i]) T).headI = T.get? i := by
- induction i generalizing T <;>
- [rfl;simp only [*, tape.move_right_nth, Int.ofNat_succ, iterate_succ]]
+ induction i generalizing T <;> [rfl;
+ simp only [*, tape.move_right_nth, Int.ofNat_succ, iterate_succ]]
#align turing.tape.move_right_n_head Turing.Tape.move_right_n_head
-/
@@ -1036,7 +1036,7 @@ theorem mem_eval {σ} {f : σ → Option σ} {a b} : b ∈ eval f a ↔ Reaches
· rw [Part.mem_unique h
(PFun.mem_fix_iff.2 <| Or.inl <| Part.mem_some_iff.2 <| by rw [e] <;> rfl)]
exact ⟨refl_trans_gen.refl, e⟩
- · rcases PFun.mem_fix_iff.1 h with (h | ⟨_, h, _⟩) <;> rw [e] at h <;>
+ · rcases PFun.mem_fix_iff.1 h with (h | ⟨_, h, _⟩) <;> rw [e] at h <;>
cases Part.mem_some_iff.1 h
cases' IH a' (by rwa [e]) with h₁ h₂
exact ⟨refl_trans_gen.head e h₁, h₂⟩, fun ⟨h₁, h₂⟩ =>
@@ -1102,10 +1102,10 @@ theorem tr_reaches₁ {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H
by
induction' ab with c₁ ac c₁ d₁ ac cd IH
· have := H aa
- rwa [show f₁ a₁ = _ from ac] at this
+ rwa [show f₁ a₁ = _ from ac] at this
· rcases IH with ⟨c₂, cc, ac₂⟩
have := H cc
- rw [show f₁ c₁ = _ from cd] at this
+ rw [show f₁ c₁ = _ from cd] at this
rcases this with ⟨d₂, dd, cd₂⟩
exact ⟨_, dd, ac₂.trans cd₂⟩
#align turing.tr_reaches₁ Turing.tr_reaches₁
@@ -1146,7 +1146,7 @@ theorem tr_eval {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Res
cases' mem_eval.1 ab with ab b0
rcases tr_reaches H aa ab with ⟨b₂, bb, ab⟩
refine' ⟨_, bb, mem_eval.2 ⟨ab, _⟩⟩
- have := H bb; rwa [b0] at this
+ have := H bb; rwa [b0] at this
#align turing.tr_eval Turing.tr_eval
theorem tr_eval_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ b₂ a₂}
@@ -1201,7 +1201,7 @@ theorem tr_eval' {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ →
fun h => by
rcases(Part.mem_map_iff _).1 h with ⟨b₁, ab, bb⟩
rcases tr_eval H rfl ab with ⟨_, rfl, h⟩
- rwa [bb] at h⟩
+ rwa [bb] at h ⟩
#align turing.tr_eval' Turing.tr_eval'
/-!
@@ -1551,15 +1551,15 @@ theorem stmts₁_self {q} : q ∈ stmts₁ q := by
theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ :=
by
intro h₁₂ q₀ h₀₁
- induction' q₂ with _ q IH _ q IH _ q IH <;> simp only [stmts₁] at h₁₂⊢ <;>
- simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂
+ induction' q₂ with _ q IH _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
+ simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂
iterate 3
rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁; exact h₀₁
+ · unfold stmts₁ at h₀₁ ; exact h₀₁
· exact Finset.mem_insert_of_mem (IH h₁₂)
case branch p q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
- · unfold stmts₁ at h₀₁; exact h₀₁
+ · unfold stmts₁ at h₀₁ ; exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ <| IH₁ h₁₂)
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ <| IH₂ h₁₂)
case goto l => subst h₁₂; exact h₀₁
@@ -1571,9 +1571,9 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
by
induction' q₂ with _ q IH _ q IH _ q IH <;>
simp only [stmts₁, supports_stmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at
- h hs
- iterate 3 rcases h with (rfl | h) <;> [exact hs;exact IH h hs]
- case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
+ h hs
+ iterate 3 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
+ case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
#align turing.TM1.stmts₁_supports_stmt_mono Turing.TM1.stmts₁_supportsStmt_mono
@@ -1612,7 +1612,7 @@ theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
by
replace h₂ := ss.2 _ (Finset.some_mem_insertNone.1 h₂)
- simp only [step, Option.mem_def] at h₁; subst c'
+ simp only [step, Option.mem_def] at h₁ ; subst c'
revert h₂; induction' M l₁ with _ q IH _ q IH _ q IH generalizing v T <;> intro hs
iterate 3 exact IH _ _ hs
case branch p q₁' q₂' IH₁ IH₂ =>
@@ -1777,9 +1777,9 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr
fun q a q' s h₁ h₂ => by
rcases q with ⟨_ | q, v⟩; · cases h₁
cases' q' with q' v';
- simp only [tr_stmts, Finset.mem_coe, Finset.mem_product, Finset.mem_univ, and_true_iff] at h₂⊢
+ simp only [tr_stmts, Finset.mem_coe, Finset.mem_product, Finset.mem_univ, and_true_iff] at h₂ ⊢
cases q'; · exact Multiset.mem_cons_self _ _
- simp only [tr, Option.mem_def] at h₁
+ simp only [tr, Option.mem_def] at h₁
have := TM1.stmts_supports_stmt ss h₂
revert this; induction q generalizing v <;> intro hs
case move d q =>
@@ -1794,9 +1794,9 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr
refine' IH (TM1.stmts_trans _ h₂) _ h₁ hs
unfold TM1.stmts₁
exact Finset.mem_insert_of_mem TM1.stmts₁_self
- case
- branch p q₁ q₂ IH₁ IH₂ =>
- change cond (p a v) _ _ = ((some q', v'), s) at h₁
+ case branch p q₁ q₂ IH₁
+ IH₂ =>
+ change cond (p a v) _ _ = ((some q', v'), s) at h₁
cases p a v
· refine' IH₂ (TM1.stmts_trans _ h₂) _ h₁ hs.2
unfold TM1.stmts₁
@@ -1847,7 +1847,7 @@ parameter {Γ : Type _}[Inhabited Γ]
#print Turing.TM1to1.exists_enc_dec /-
theorem exists_enc_dec [Fintype Γ] :
- ∃ (n : _)(enc : Γ → Vector Bool n)(dec : Vector Bool n → Γ),
+ ∃ (n : _) (enc : Γ → Vector Bool n) (dec : Vector Bool n → Γ),
enc default = Vector.replicate n false ∧ ∀ a, dec (enc a) = a :=
by
letI := Classical.decEq Γ
@@ -1931,7 +1931,7 @@ theorem stepAux_move (d q v T) : stepAux (move d q) v T = stepAux q v ((Tape.mov
by
suffices : ∀ i, step_aux ((stmt.move d^[i]) q) v T = step_aux q v ((tape.move d^[i]) T)
exact this n
- intro ; induction' i with i IH generalizing T; · rfl
+ intro; induction' i with i IH generalizing T; · rfl
rw [iterate_succ', step_aux, IH, iterate_succ]
#align turing.TM1to1.step_aux_move Turing.TM1to1.stepAux_move
@@ -2018,7 +2018,7 @@ theorem trTape'_move_left (L R) :
tape.mk' L' (list_blank.append (Vector.toList (enc a)) R')
by
simpa only [List.length_reverse, Vector.toList_length] using this (List.reverse_reverse _).symm
- intros ; induction' l₁ with b l₁ IH generalizing l₂
+ intros; induction' l₁ with b l₁ IH generalizing l₂
· cases e; rfl
simp only [List.length, List.cons_append, iterate_succ_apply]
convert IH e
@@ -2035,7 +2035,7 @@ theorem trTape'_move_right (L R) :
refine' (Eq.symm _).trans (this n _)
simp only [tr_tape'_move_left, list_blank.cons_head_tail, list_blank.head_cons,
list_blank.tail_cons]
- intros ; induction' i with i IH; · rfl
+ intros; induction' i with i IH; · rfl
rw [iterate_succ_apply, iterate_succ_apply', tape.move_left_right, IH]
#align turing.TM1to1.tr_tape'_move_right Turing.TM1to1.trTape'_move_right
-/
@@ -2082,7 +2082,7 @@ theorem stepAux_read (f v L R) :
step_aux (read_aux i f) v (tape.mk' (list_blank.append l₁ L') (list_blank.append l₂ R')) =
step_aux (f ⟨l₂, h⟩) v (tape.mk' (list_blank.append (l₂.reverseAux l₁) L') R')
by intro f; convert this n f _ _ _ _ (enc a).2 <;> simp
- clear f L a R; intros ; subst i
+ clear f L a R; intros; subst i
induction' l₂ with a l₂ IH generalizing l₁; · rfl
trans
step_aux (read_aux l₂.length fun v => f (a ::ᵥ v)) v
@@ -2109,8 +2109,8 @@ theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ =
tape.move_left_mk', list_blank.cons_head_tail, list_blank.tail_cons,
tr_tape'_move_left enc0, tr_tape'_move_right enc0] <;>
apply IH
- case
- write f q IH =>
+ case write f q
+ IH =>
simp only [tr_normal, step_aux_read dec enc0 encdec, step_aux]
refine' refl_trans_gen.head rfl _
obtain ⟨a, R, rfl⟩ := R.exists_cons
@@ -2120,12 +2120,12 @@ theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ =
case load a q IH =>
simp only [tr_normal, step_aux_read dec enc0 encdec]
apply IH
- case
- branch p q₁ q₂ IH₁ IH₂ =>
+ case branch p q₁ q₂ IH₁
+ IH₂ =>
simp only [tr_normal, step_aux_read dec enc0 encdec, step_aux]
- cases p R.head v <;> [apply IH₂;apply IH₁]
- case
- goto l =>
+ cases p R.head v <;> [apply IH₂; apply IH₁]
+ case goto
+ l =>
simp only [tr_normal, step_aux_read dec enc0 encdec, step_aux, tr_cfg, tr_tape_mk']
apply refl_trans_gen.refl
case
@@ -2171,28 +2171,28 @@ theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
have :=
this _ (ss.2 _ hl) fun q' hq => Finset.mem_biUnion.2 ⟨_, hl, Finset.mem_insert_of_mem hq⟩
rcases Finset.mem_insert.1 h with (rfl | h)
- exacts[this.1, this.2 _ h]
+ exacts [this.1, this.2 _ h]
intro q hs hw; induction q
case move d q IH =>
- unfold writes at hw⊢
+ unfold writes at hw ⊢
replace IH := IH hs hw; refine' ⟨_, IH.2⟩
cases d <;> simp only [tr_normal, iterate, supports_stmt_move, IH]
case write f q IH =>
- unfold writes at hw⊢
+ unfold writes at hw ⊢
simp only [Finset.mem_image, Finset.mem_union, Finset.mem_univ, exists_prop, true_and_iff] at
- hw⊢
+ hw ⊢
replace IH := IH hs fun q hq => hw q (Or.inr hq)
refine' ⟨supports_stmt_read _ fun a _ s => hw _ (Or.inl ⟨_, rfl⟩), fun q' hq => _⟩
rcases hq with (⟨a, q₂, rfl⟩ | hq)
· simp only [tr, supports_stmt_write, supports_stmt_move, IH.1]
· exact IH.2 _ hq
case load a q IH =>
- unfold writes at hw⊢
+ unfold writes at hw ⊢
replace IH := IH hs hw
refine' ⟨supports_stmt_read _ fun a => IH.1, IH.2⟩
case branch p q₁ q₂ IH₁ IH₂ =>
- unfold writes at hw⊢
- simp only [Finset.mem_union] at hw⊢
+ unfold writes at hw ⊢
+ simp only [Finset.mem_union] at hw ⊢
replace IH₁ := IH₁ hs.1 fun q hq => hw q (Or.inl hq)
replace IH₂ := IH₂ hs.2 fun q hq => hw q (Or.inr hq)
exact ⟨supports_stmt_read _ fun a => ⟨IH₁.1, IH₂.1⟩, fun q => Or.ndrec (IH₁.2 _) (IH₂.2 _)⟩
@@ -2446,15 +2446,15 @@ theorem stmts₁_self {q} : q ∈ stmts₁ q := by
theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ :=
by
intro h₁₂ q₀ h₀₁
- induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;> simp only [stmts₁] at h₁₂⊢ <;>
- simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂
+ induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
+ simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂
iterate 4
rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁; exact h₀₁
+ · unfold stmts₁ at h₀₁ ; exact h₀₁
· exact Finset.mem_insert_of_mem (IH h₁₂)
case branch f q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
- · unfold stmts₁ at h₀₁; exact h₀₁
+ · unfold stmts₁ at h₀₁ ; exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ (IH₁ h₁₂))
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ (IH₂ h₁₂))
case goto l => subst h₁₂; exact h₀₁
@@ -2466,9 +2466,9 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
by
induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;>
simp only [stmts₁, supports_stmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at
- h hs
- iterate 4 rcases h with (rfl | h) <;> [exact hs;exact IH h hs]
- case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
+ h hs
+ iterate 4 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
+ case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
#align turing.TM2.stmts₁_supports_stmt_mono Turing.TM2.stmts₁_supportsStmt_mono
@@ -2505,7 +2505,7 @@ theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
by
replace h₂ := ss.2 _ (Finset.some_mem_insertNone.1 h₂)
- simp only [step, Option.mem_def] at h₁; subst c'
+ simp only [step, Option.mem_def] at h₁ ; subst c'
revert h₂; induction' M l₁ with _ _ q IH _ _ q IH _ _ q IH _ q IH generalizing v T <;> intro hs
iterate 4 exact IH _ _ hs
case branch p q₁' q₂' IH₁ IH₂ =>
@@ -2640,7 +2640,7 @@ theorem addBottom_modifyNth (f : (∀ k, Option (Γ k)) → ∀ k, Option (Γ k)
by
cases n <;>
simp only [add_bottom, list_blank.head_cons, list_blank.modify_nth, list_blank.tail_cons]
- congr ; symm; apply list_blank.map_modify_nth; intro ; rfl
+ congr; symm; apply list_blank.map_modify_nth; intro; rfl
#align turing.TM2to1.add_bottom_modify_nth Turing.TM2to1.addBottom_modifyNth
theorem addBottom_nth_snd (L n) : ((add_bottom L).get? n).2 = L.get? n := by
@@ -2819,10 +2819,10 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
TM1.stepAux q v' ((Tape.move Dir.right^[(S' k).length]) (Tape.mk' ∅ (add_bottom L'))) :=
by
dsimp only; simp; cases o <;> simp only [st_write, st_var, tr_st_act, TM1.step_aux]
- case
- push f =>
+ case push
+ f =>
have := tape.write_move_right_n fun a : Γ' => (a.1, update a.2 k (some (f v)))
- dsimp only at this
+ dsimp only at this
refine'
⟨_, fun k' => _, by
rw [tape.move_right_n_head, List.length, tape.mk'_nth_nat, this,
@@ -2839,7 +2839,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
rw [← proj_map_nth, hL, list_blank.nth_mk]
cases' lt_or_gt_of_ne h with h h
· rw [List.getI_append]; simpa only [List.length_map, List.length_reverse] using h
- · rw [gt_iff_lt] at h
+ · rw [gt_iff_lt] at h
rw [List.getI_eq_default, List.getI_eq_default] <;>
simp only [Nat.add_one_le_iff, h, List.length, le_of_lt, List.length_reverse,
List.length_append, List.length_map]
@@ -2876,7 +2876,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
rw [← proj_map_nth, hL, list_blank.nth_mk, e, List.map, List.reverse_cons]
cases' lt_or_gt_of_ne h with h h
· rw [List.getI_append]; simpa only [List.length_map, List.length_reverse] using h
- · rw [gt_iff_lt] at h;
+ · rw [gt_iff_lt] at h ;
rw [List.getI_eq_default, List.getI_eq_default] <;>
simp only [Nat.add_one_le_iff, h, List.length, le_of_lt, List.length_reverse,
List.length_append, List.length_map]
@@ -2953,7 +2953,7 @@ theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
have := hgo.tail' rfl
rw [tr, TM1.step_aux, tape.move_right_n_head, tape.mk'_nth_nat, add_bottom_nth_snd,
stk_nth_val _ (hT k), List.get?_len_le (le_of_eq (List.length_reverse _)), Option.isNone, cond,
- hrun, TM1.step_aux] at this
+ hrun, TM1.step_aux] at this
obtain ⟨c, gc, rc⟩ := IH hT'
refine' ⟨c, gc, (this.to₀.trans hret c (trans_gen.head' rfl _)).to_reflTransGen⟩
rw [tr, TM1.step_aux, tape.mk'_head, add_bottom_head_fst]
@@ -2974,7 +2974,7 @@ theorem tr_respects : Respects (TM2.step M) (TM1.step tr) tr_cfg := fun c₁ c
· exact tr_respects_aux M hT s @IH
· exact IH _ hT
· unfold TM2.step_aux tr_normal TM1.step_aux
- cases p v <;> [exact IH₂ _ hT;exact IH₁ _ hT]
+ cases p v <;> [exact IH₂ _ hT; exact IH₁ _ hT]
· exact ⟨_, ⟨_, hT⟩, refl_trans_gen.refl⟩
· exact ⟨_, ⟨_, hT⟩, refl_trans_gen.refl⟩
#align turing.TM2to1.tr_respects Turing.TM2to1.tr_respects
@@ -3002,7 +3002,7 @@ theorem tr_eval_dom (k) (L : List (Γ k)) : (TM1.eval tr (tr_init k L)).Dom ↔
theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval tr (tr_init k L))
(H₂ : L₂ ∈ TM2.eval M k L) :
- ∃ (S : ∀ k, List (Γ k))(L' : ListBlank (∀ k, Option (Γ k))),
+ ∃ (S : ∀ k, List (Γ k)) (L' : ListBlank (∀ k, Option (Γ k))),
add_bottom L' = L₁ ∧
(∀ k, L'.map (proj k) = ListBlank.mk ((S k).map some).reverse) ∧ S k = L₂ :=
by
@@ -3029,20 +3029,20 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
rcases Finset.mem_biUnion.1 h with ⟨l, lS, h⟩
have :=
this _ (ss.2 l lS) fun x hx => Finset.mem_biUnion.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
- rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1;exact this.2 _ h]
+ rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1; exact this.2 _ h]
clear h l'; refine' stmt_st_rec _ _ _ _ _ <;> intros
· -- stack op
- rw [TM2to1.supports_run] at ss'
+ rw [TM2to1.supports_run] at ss'
simp only [TM2to1.tr_stmts₁_run, Finset.mem_union, Finset.mem_insert, Finset.mem_singleton] at
- sub
+ sub
have hgo := sub _ (Or.inl <| Or.inl rfl)
have hret := sub _ (Or.inl <| Or.inr rfl)
cases' IH ss' fun x hx => sub x <| Or.inr hx with IH₁ IH₂
refine'
⟨by simp only [tr_normal_run, TM1.supports_stmt] <;> intros <;> exact hgo, fun l h => _⟩
- rw [tr_stmts₁_run] at h
+ rw [tr_stmts₁_run] at h
simp only [TM2to1.tr_stmts₁_run, Finset.mem_union, Finset.mem_insert, Finset.mem_singleton] at
- h
+ h
rcases h with (⟨rfl | rfl⟩ | h)
· unfold TM1.supports_stmt TM2to1.tr
rcases s with (_ | _ | _)
@@ -3053,18 +3053,18 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
exact ⟨IH₁, fun _ _ => hret⟩
· exact IH₂ _ h
· -- load
- unfold TM2to1.tr_stmts₁ at ss' sub⊢
+ unfold TM2to1.tr_stmts₁ at ss' sub ⊢
exact IH ss' sub
· -- branch
- unfold TM2to1.tr_stmts₁ at sub
+ unfold TM2to1.tr_stmts₁ at sub
cases' IH₁ ss'.1 fun x hx => sub x <| Finset.mem_union_left _ hx with IH₁₁ IH₁₂
cases' IH₂ ss'.2 fun x hx => sub x <| Finset.mem_union_right _ hx with IH₂₁ IH₂₂
refine' ⟨⟨IH₁₁, IH₂₁⟩, fun l h => _⟩
- rw [tr_stmts₁] at h
- rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h;exact IH₂₂ _ h]
+ rw [tr_stmts₁] at h
+ rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h; exact IH₂₂ _ h]
· -- goto
rw [tr_stmts₁]; unfold TM2to1.tr_normal TM1.supports_stmt
- unfold TM2.supports_stmt at ss'
+ unfold TM2.supports_stmt at ss'
exact
⟨fun _ v => Finset.mem_biUnion.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩, fun _ =>
False.elim⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -1533,7 +1533,7 @@ def SupportsStmt (S : Finset Λ) : stmt → Prop
| halt => True
#align turing.TM1.supports_stmt Turing.TM1.SupportsStmt
-open Classical
+open scoped Classical
/-- The subterm closure of a statement. -/
noncomputable def stmts₁ : stmt → Finset stmt
@@ -1766,7 +1766,7 @@ noncomputable def trStmts (S : Finset Λ) : Finset Λ' :=
TM1.stmts M S ×ˢ Finset.univ
#align turing.TM1to0.tr_stmts Turing.TM1to0.trStmts
-open Classical
+open scoped Classical
attribute [local simp] TM1.stmts₁_self
@@ -2137,7 +2137,7 @@ theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ =
omit enc0 encdec
-open Classical
+open scoped Classical
parameter [Fintype Γ]
@@ -2426,7 +2426,7 @@ def SupportsStmt (S : Finset Λ) : stmt → Prop
| halt => True
#align turing.TM2.supports_stmt Turing.TM2.SupportsStmt
-open Classical
+open scoped Classical
/-- The set of subtree statements in a statement. -/
noncomputable def stmts₁ : stmt → Finset stmt
@@ -2791,7 +2791,7 @@ theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s
rcases s with (_ | _ | _) <;> rfl
#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_run
-open Classical
+open scoped Classical
/-- The set of machine states accessible from an initial TM2 statement. -/
noncomputable def trStmts₁ : stmt₂ → Finset Λ'
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -423,12 +423,6 @@ def ListBlank.modifyNth {Γ} [Inhabited Γ] (f : Γ → Γ) : ℕ → ListBlank
#align turing.list_blank.modify_nth Turing.ListBlank.modifyNth
-/
-/- warning: turing.list_blank.nth_modify_nth -> Turing.ListBlank.nth_modifyNth is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] (f : Γ -> Γ) (n : Nat) (i : Nat) (L : Turing.ListBlank.{u1} Γ _inst_1), Eq.{succ u1} Γ (Turing.ListBlank.nth.{u1} Γ _inst_1 (Turing.ListBlank.modifyNth.{u1} Γ _inst_1 f n L) i) (ite.{succ u1} Γ (Eq.{1} Nat i n) (Nat.decidableEq i n) (f (Turing.ListBlank.nth.{u1} Γ _inst_1 L i)) (Turing.ListBlank.nth.{u1} Γ _inst_1 L i))
-but is expected to have type
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] (f : Γ -> Γ) (n : Nat) (i : Nat) (L : Turing.ListBlank.{u1} Γ _inst_1), Eq.{succ u1} Γ (Turing.ListBlank.nth.{u1} Γ _inst_1 (Turing.ListBlank.modifyNth.{u1} Γ _inst_1 f n L) i) (ite.{succ u1} Γ (Eq.{1} Nat i n) (instDecidableEqNat i n) (f (Turing.ListBlank.nth.{u1} Γ _inst_1 L i)) (Turing.ListBlank.nth.{u1} Γ _inst_1 L i))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.nth_modify_nth Turing.ListBlank.nth_modifyNthₓ'. -/
theorem ListBlank.nth_modifyNth {Γ} [Inhabited Γ] (f : Γ → Γ) (n i) (L : ListBlank Γ) :
(L.modifyNth f n).get? i = if i = n then f (L.get? i) else L.get? i :=
by
@@ -458,36 +452,18 @@ instance {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] : Inhabited (PointedMap Γ Γ')
instance {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] : CoeFun (PointedMap Γ Γ') fun _ => Γ → Γ' :=
⟨PointedMap.f⟩
-/- warning: turing.pointed_map.mk_val -> Turing.PointedMap.mk_val is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Γ -> Γ') (pt : Eq.{succ u2} Γ' (f (Inhabited.default.{succ u1} Γ _inst_1)) (Inhabited.default.{succ u2} Γ' _inst_2)), Eq.{max (succ u1) (succ u2)} ((fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.mk.{u1, u2} Γ Γ' _inst_1 _inst_2 f pt)) (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) (Turing.PointedMap.mk.{u1, u2} Γ Γ' _inst_1 _inst_2 f pt)) f
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Γ -> Γ') (pt : Eq.{succ u1} Γ' (f (Inhabited.default.{succ u2} Γ _inst_1)) (Inhabited.default.{succ u1} Γ' _inst_2)), Eq.{max (succ u1) (succ u2)} (Γ -> Γ') (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 (Turing.PointedMap.mk.{u2, u1} Γ Γ' _inst_1 _inst_2 f pt)) f
-Case conversion may be inaccurate. Consider using '#align turing.pointed_map.mk_val Turing.PointedMap.mk_valₓ'. -/
@[simp]
theorem PointedMap.mk_val {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : Γ → Γ') (pt) :
(PointedMap.mk f pt : Γ → Γ') = f :=
rfl
#align turing.pointed_map.mk_val Turing.PointedMap.mk_val
-/- warning: turing.pointed_map.map_pt -> Turing.PointedMap.map_pt is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2), Eq.{succ u2} Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f (Inhabited.default.{succ u1} Γ _inst_1)) (Inhabited.default.{succ u2} Γ' _inst_2)
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2), Eq.{succ u1} Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Inhabited.default.{succ u2} Γ _inst_1)) (Inhabited.default.{succ u1} Γ' _inst_2)
-Case conversion may be inaccurate. Consider using '#align turing.pointed_map.map_pt Turing.PointedMap.map_ptₓ'. -/
@[simp]
theorem PointedMap.map_pt {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') :
f default = default :=
PointedMap.map_pt' _
#align turing.pointed_map.map_pt Turing.PointedMap.map_pt
-/- warning: turing.pointed_map.head_map -> Turing.PointedMap.headI_map is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (l : List.{u1} Γ), Eq.{succ u2} Γ' (List.headI.{u2} Γ' _inst_2 (List.map.{u1, u2} Γ Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f) l)) (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f (List.headI.{u1} Γ _inst_1 l))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (l : List.{u2} Γ), Eq.{succ u1} Γ' (List.headI.{u1} Γ' _inst_2 (List.map.{u2, u1} Γ Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f) l)) (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f (List.headI.{u2} Γ _inst_1 l))
-Case conversion may be inaccurate. Consider using '#align turing.pointed_map.head_map Turing.PointedMap.headI_mapₓ'. -/
@[simp]
theorem PointedMap.headI_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : List Γ) : (l.map f).headI = f l.headI := by
@@ -506,24 +482,12 @@ def ListBlank.map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ'
#align turing.list_blank.map Turing.ListBlank.map
-/
-/- warning: turing.list_blank.map_mk -> Turing.ListBlank.map_mk is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (l : List.{u1} Γ), Eq.{succ u2} (Turing.ListBlank.{u2} Γ' _inst_2) (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.mk.{u1} Γ _inst_1 l)) (Turing.ListBlank.mk.{u2} Γ' _inst_2 (List.map.{u1, u2} Γ Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f) l))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (l : List.{u2} Γ), Eq.{succ u1} (Turing.ListBlank.{u1} Γ' _inst_2) (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.mk.{u2} Γ _inst_1 l)) (Turing.ListBlank.mk.{u1} Γ' _inst_2 (List.map.{u2, u1} Γ Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f) l))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.map_mk Turing.ListBlank.map_mkₓ'. -/
@[simp]
theorem ListBlank.map_mk {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (l : List Γ) :
(ListBlank.mk l).map f = ListBlank.mk (l.map f) :=
rfl
#align turing.list_blank.map_mk Turing.ListBlank.map_mk
-/- warning: turing.list_blank.head_map -> Turing.ListBlank.head_map is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u1} Γ _inst_1), Eq.{succ u2} Γ' (Turing.ListBlank.head.{u2} Γ' _inst_2 (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f l)) (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f (Turing.ListBlank.head.{u1} Γ _inst_1 l))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u2} Γ _inst_1), Eq.{succ u1} Γ' (Turing.ListBlank.head.{u1} Γ' _inst_2 (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f l)) (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.head.{u2} Γ _inst_1 l))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.head_map Turing.ListBlank.head_mapₓ'. -/
@[simp]
theorem ListBlank.head_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) : (l.map f).headI = f l.headI :=
@@ -534,12 +498,6 @@ theorem ListBlank.head_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedM
exact Quotient.inductionOn' l fun a => rfl
#align turing.list_blank.head_map Turing.ListBlank.head_map
-/- warning: turing.list_blank.tail_map -> Turing.ListBlank.tail_map is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u1} Γ _inst_1), Eq.{succ u2} (Turing.ListBlank.{u2} Γ' _inst_2) (Turing.ListBlank.tail.{u2} Γ' _inst_2 (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f l)) (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.tail.{u1} Γ _inst_1 l))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u2} Γ _inst_1), Eq.{succ u1} (Turing.ListBlank.{u1} Γ' _inst_2) (Turing.ListBlank.tail.{u1} Γ' _inst_2 (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f l)) (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.tail.{u2} Γ _inst_1 l))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.tail_map Turing.ListBlank.tail_mapₓ'. -/
@[simp]
theorem ListBlank.tail_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) : (l.map f).tail = l.tail.map f :=
@@ -550,12 +508,6 @@ theorem ListBlank.tail_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedM
exact Quotient.inductionOn' l fun a => rfl
#align turing.list_blank.tail_map Turing.ListBlank.tail_map
-/- warning: turing.list_blank.map_cons -> Turing.ListBlank.map_cons is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u1} Γ _inst_1) (a : Γ), Eq.{succ u2} (Turing.ListBlank.{u2} Γ' _inst_2) (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.cons.{u1} Γ _inst_1 a l)) (Turing.ListBlank.cons.{u2} Γ' _inst_2 (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f a) (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f l))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u2} Γ _inst_1) (a : Γ), Eq.{succ u1} (Turing.ListBlank.{u1} Γ' _inst_2) (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.cons.{u2} Γ _inst_1 a l)) (Turing.ListBlank.cons.{u1} Γ' _inst_2 (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f a) (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f l))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.map_cons Turing.ListBlank.map_consₓ'. -/
@[simp]
theorem ListBlank.map_cons {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) (a : Γ) : (l.cons a).map f = (l.map f).cons (f a) :=
@@ -564,12 +516,6 @@ theorem ListBlank.map_cons {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedM
simp only [list_blank.head_map, list_blank.head_cons, list_blank.tail_map, list_blank.tail_cons]
#align turing.list_blank.map_cons Turing.ListBlank.map_cons
-/- warning: turing.list_blank.nth_map -> Turing.ListBlank.nth_map is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u1} Γ _inst_1) (n : Nat), Eq.{succ u2} Γ' (Turing.ListBlank.nth.{u2} Γ' _inst_2 (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f l) n) (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f (Turing.ListBlank.nth.{u1} Γ _inst_1 l n))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (l : Turing.ListBlank.{u2} Γ _inst_1) (n : Nat), Eq.{succ u1} Γ' (Turing.ListBlank.nth.{u1} Γ' _inst_2 (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f l) n) (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.ListBlank.nth.{u2} Γ _inst_1 l n))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.nth_map Turing.ListBlank.nth_mapₓ'. -/
@[simp]
theorem ListBlank.nth_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : ListBlank Γ) (n : ℕ) : (l.map f).get? n = f (l.get? n) :=
@@ -588,22 +534,10 @@ def proj {ι : Type _} {Γ : ι → Type _} [∀ i, Inhabited (Γ i)] (i : ι) :
#align turing.proj Turing.proj
-/
-/- warning: turing.proj_map_nth -> Turing.proj_map_nth is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {Γ : ι -> Type.{u2}} [_inst_1 : forall (i : ι), Inhabited.{succ u2} (Γ i)] (i : ι) (L : Turing.ListBlank.{max u1 u2} (forall (i : ι), Γ i) (Pi.inhabited.{succ u1, succ u2} ι (fun (i : ι) => Γ i) (fun (x : ι) => (fun (i : ι) => _inst_1 i) x))) (n : Nat), Eq.{succ u2} (Γ i) (Turing.ListBlank.nth.{u2} (Γ i) ((fun (i : ι) => _inst_1 i) i) (Turing.ListBlank.map.{max u1 u2, u2} (forall (i : ι), Γ i) (Γ i) (Pi.inhabited.{succ u1, succ u2} ι (fun (i : ι) => Γ i) (fun (x : ι) => (fun (i : ι) => _inst_1 i) x)) ((fun (i : ι) => _inst_1 i) i) (Turing.proj.{u1, u2} ι Γ (fun (i : ι) => _inst_1 i) i) L) n) (Turing.ListBlank.nth.{max u1 u2} (forall (i : ι), Γ i) (Pi.inhabited.{succ u1, succ u2} ι (fun (i : ι) => Γ i) (fun (x : ι) => (fun (i : ι) => _inst_1 i) x)) L n i)
-but is expected to have type
- forall {ι : Type.{u2}} {Γ : ι -> Type.{u1}} [_inst_1 : forall (i : ι), Inhabited.{succ u1} (Γ i)] (i : ι) (L : Turing.ListBlank.{max u2 u1} (forall (i : ι), Γ i) (instInhabitedForAll_1.{succ u2, succ u1} ι (fun (i : ι) => Γ i) (fun (x : ι) => _inst_1 x))) (n : Nat), Eq.{succ u1} (Γ i) (Turing.ListBlank.nth.{u1} (Γ i) (_inst_1 i) (Turing.ListBlank.map.{max u2 u1, u1} (forall (i : ι), Γ i) (Γ i) (instInhabitedForAll_1.{succ u2, succ u1} ι (fun (i : ι) => Γ i) (fun (x : ι) => _inst_1 x)) (_inst_1 i) (Turing.proj.{u2, u1} ι Γ (fun (i : ι) => _inst_1 i) i) L) n) (Turing.ListBlank.nth.{max u2 u1} (forall (i : ι), Γ i) (instInhabitedForAll_1.{succ u2, succ u1} ι (fun (i : ι) => Γ i) (fun (x : ι) => _inst_1 x)) L n i)
-Case conversion may be inaccurate. Consider using '#align turing.proj_map_nth Turing.proj_map_nthₓ'. -/
theorem proj_map_nth {ι : Type _} {Γ : ι → Type _} [∀ i, Inhabited (Γ i)] (i : ι) (L n) :
(ListBlank.map (@proj ι Γ _ i) L).get? n = L.get? n i := by rw [list_blank.nth_map] <;> rfl
#align turing.proj_map_nth Turing.proj_map_nth
-/- warning: turing.list_blank.map_modify_nth -> Turing.ListBlank.map_modifyNth is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (F : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (f : Γ -> Γ) (f' : Γ' -> Γ'), (forall (x : Γ), Eq.{succ u2} Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) F (f x)) (f' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) F x))) -> (forall (n : Nat) (L : Turing.ListBlank.{u1} Γ _inst_1), Eq.{succ u2} (Turing.ListBlank.{u2} Γ' _inst_2) (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 F (Turing.ListBlank.modifyNth.{u1} Γ _inst_1 f n L)) (Turing.ListBlank.modifyNth.{u2} Γ' _inst_2 f' n (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 F L)))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (F : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (f : Γ -> Γ) (f' : Γ' -> Γ'), (forall (x : Γ), Eq.{succ u1} Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 F (f x)) (f' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 F x))) -> (forall (n : Nat) (L : Turing.ListBlank.{u2} Γ _inst_1), Eq.{succ u1} (Turing.ListBlank.{u1} Γ' _inst_2) (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 F (Turing.ListBlank.modifyNth.{u2} Γ _inst_1 f n L)) (Turing.ListBlank.modifyNth.{u1} Γ' _inst_2 f' n (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 F L)))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.map_modify_nth Turing.ListBlank.map_modifyNthₓ'. -/
theorem ListBlank.map_modifyNth {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (F : PointedMap Γ Γ')
(f : Γ → Γ) (f' : Γ' → Γ') (H : ∀ x, F (f x) = f' (F x)) (n) (L : ListBlank Γ) :
(L.modifyNth f n).map F = (L.map F).modifyNth f' n := by
@@ -652,24 +586,12 @@ def ListBlank.bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (l : ListBlank Γ) (f
#align turing.list_blank.bind Turing.ListBlank.bind
-/
-/- warning: turing.list_blank.bind_mk -> Turing.ListBlank.bind_mk is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (l : List.{u1} Γ) (f : Γ -> (List.{u2} Γ')) (hf : Exists.{1} Nat (fun (n : Nat) => Eq.{succ u2} (List.{u2} Γ') (f (Inhabited.default.{succ u1} Γ _inst_1)) (List.replicate.{u2} Γ' n (Inhabited.default.{succ u2} Γ' _inst_2)))), Eq.{succ u2} (Turing.ListBlank.{u2} Γ' _inst_2) (Turing.ListBlank.bind.{u1, u2} Γ Γ' _inst_1 _inst_2 (Turing.ListBlank.mk.{u1} Γ _inst_1 l) f hf) (Turing.ListBlank.mk.{u2} Γ' _inst_2 (List.bind.{u1, u2} Γ Γ' l f))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (l : List.{u2} Γ) (f : Γ -> (List.{u1} Γ')) (hf : Exists.{1} Nat (fun (n : Nat) => Eq.{succ u1} (List.{u1} Γ') (f (Inhabited.default.{succ u2} Γ _inst_1)) (List.replicate.{u1} Γ' n (Inhabited.default.{succ u1} Γ' _inst_2)))), Eq.{succ u1} (Turing.ListBlank.{u1} Γ' _inst_2) (Turing.ListBlank.bind.{u2, u1} Γ Γ' _inst_1 _inst_2 (Turing.ListBlank.mk.{u2} Γ _inst_1 l) f hf) (Turing.ListBlank.mk.{u1} Γ' _inst_2 (List.bind.{u2, u1} Γ Γ' l f))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.bind_mk Turing.ListBlank.bind_mkₓ'. -/
@[simp]
theorem ListBlank.bind_mk {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (l : List Γ) (f : Γ → List Γ') (hf) :
(ListBlank.mk l).bind f hf = ListBlank.mk (l.bind f) :=
rfl
#align turing.list_blank.bind_mk Turing.ListBlank.bind_mk
-/- warning: turing.list_blank.cons_bind -> Turing.ListBlank.cons_bind is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (a : Γ) (l : Turing.ListBlank.{u1} Γ _inst_1) (f : Γ -> (List.{u2} Γ')) (hf : Exists.{1} Nat (fun (n : Nat) => Eq.{succ u2} (List.{u2} Γ') (f (Inhabited.default.{succ u1} Γ _inst_1)) (List.replicate.{u2} Γ' n (Inhabited.default.{succ u2} Γ' _inst_2)))), Eq.{succ u2} (Turing.ListBlank.{u2} Γ' _inst_2) (Turing.ListBlank.bind.{u1, u2} Γ Γ' _inst_1 _inst_2 (Turing.ListBlank.cons.{u1} Γ _inst_1 a l) f hf) (Turing.ListBlank.append.{u2} Γ' _inst_2 (f a) (Turing.ListBlank.bind.{u1, u2} Γ Γ' _inst_1 _inst_2 l f hf))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (a : Γ) (l : Turing.ListBlank.{u2} Γ _inst_1) (f : Γ -> (List.{u1} Γ')) (hf : Exists.{1} Nat (fun (n : Nat) => Eq.{succ u1} (List.{u1} Γ') (f (Inhabited.default.{succ u2} Γ _inst_1)) (List.replicate.{u1} Γ' n (Inhabited.default.{succ u1} Γ' _inst_2)))), Eq.{succ u1} (Turing.ListBlank.{u1} Γ' _inst_2) (Turing.ListBlank.bind.{u2, u1} Γ Γ' _inst_1 _inst_2 (Turing.ListBlank.cons.{u2} Γ _inst_1 a l) f hf) (Turing.ListBlank.append.{u1} Γ' _inst_2 (f a) (Turing.ListBlank.bind.{u2, u1} Γ Γ' _inst_1 _inst_2 l f hf))
-Case conversion may be inaccurate. Consider using '#align turing.list_blank.cons_bind Turing.ListBlank.cons_bindₓ'. -/
@[simp]
theorem ListBlank.cons_bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (a : Γ) (l : ListBlank Γ)
(f : Γ → List Γ') (hf) : (l.cons a).bind f hf = (l.bind f hf).append (f a) :=
@@ -905,12 +827,6 @@ theorem Tape.write_self {Γ} [Inhabited Γ] : ∀ T : Tape Γ, T.write T.1 = T :
#align turing.tape.write_self Turing.Tape.write_self
-/
-/- warning: turing.tape.write_nth -> Turing.Tape.write_nth is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] (b : Γ) (T : Turing.Tape.{u1} Γ _inst_1) {i : Int}, Eq.{succ u1} Γ (Turing.Tape.nth.{u1} Γ _inst_1 (Turing.Tape.write.{u1} Γ _inst_1 b T) i) (ite.{succ u1} Γ (Eq.{1} Int i (OfNat.ofNat.{0} Int 0 (OfNat.mk.{0} Int 0 (Zero.zero.{0} Int Int.hasZero)))) (Int.decidableEq i (OfNat.ofNat.{0} Int 0 (OfNat.mk.{0} Int 0 (Zero.zero.{0} Int Int.hasZero)))) b (Turing.Tape.nth.{u1} Γ _inst_1 T i))
-but is expected to have type
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] (b : Γ) (T : Turing.Tape.{u1} Γ _inst_1) {i : Int}, Eq.{succ u1} Γ (Turing.Tape.nth.{u1} Γ _inst_1 (Turing.Tape.write.{u1} Γ _inst_1 b T) i) (ite.{succ u1} Γ (Eq.{1} Int i (OfNat.ofNat.{0} Int 0 (instOfNatInt 0))) (Int.instDecidableEqInt i (OfNat.ofNat.{0} Int 0 (instOfNatInt 0))) b (Turing.Tape.nth.{u1} Γ _inst_1 T i))
-Case conversion may be inaccurate. Consider using '#align turing.tape.write_nth Turing.Tape.write_nthₓ'. -/
@[simp]
theorem Tape.write_nth {Γ} [Inhabited Γ] (b : Γ) :
∀ (T : Tape Γ) {i : ℤ}, (T.write b).get? i = if i = 0 then b else T.get? i
@@ -935,23 +851,11 @@ def Tape.map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (T
#align turing.tape.map Turing.Tape.map
-/
-/- warning: turing.tape.map_fst -> Turing.Tape.map_fst is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (T : Turing.Tape.{u1} Γ _inst_1), Eq.{succ u2} Γ' (Turing.Tape.head.{u2} Γ' _inst_2 (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f T)) (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f (Turing.Tape.head.{u1} Γ _inst_1 T))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (T : Turing.Tape.{u2} Γ _inst_1), Eq.{succ u1} Γ' (Turing.Tape.head.{u1} Γ' _inst_2 (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f T)) (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.head.{u2} Γ _inst_1 T))
-Case conversion may be inaccurate. Consider using '#align turing.tape.map_fst Turing.Tape.map_fstₓ'. -/
@[simp]
theorem Tape.map_fst {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') :
∀ T : Tape Γ, (T.map f).1 = f T.1 := by rintro ⟨⟩ <;> rfl
#align turing.tape.map_fst Turing.Tape.map_fst
-/- warning: turing.tape.map_write -> Turing.Tape.map_write is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (b : Γ) (T : Turing.Tape.{u1} Γ _inst_1), Eq.{succ u2} (Turing.Tape.{u2} Γ' _inst_2) (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.write.{u1} Γ _inst_1 b T)) (Turing.Tape.write.{u2} Γ' _inst_2 (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f b) (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f T))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (b : Γ) (T : Turing.Tape.{u2} Γ _inst_1), Eq.{succ u1} (Turing.Tape.{u1} Γ' _inst_2) (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.write.{u2} Γ _inst_1 b T)) (Turing.Tape.write.{u1} Γ' _inst_2 (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f b) (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f T))
-Case conversion may be inaccurate. Consider using '#align turing.tape.map_write Turing.Tape.map_writeₓ'. -/
@[simp]
theorem Tape.map_write {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (b : Γ) :
∀ T : Tape Γ, (T.write b).map f = (T.map f).write (f b) := by rintro ⟨⟩ <;> rfl
@@ -971,12 +875,6 @@ theorem Tape.write_move_right_n {Γ} [Inhabited Γ] (f : Γ → Γ) (L R : ListB
#align turing.tape.write_move_right_n Turing.Tape.write_move_right_n
-/
-/- warning: turing.tape.map_move -> Turing.Tape.map_move is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (T : Turing.Tape.{u1} Γ _inst_1) (d : Turing.Dir), Eq.{succ u2} (Turing.Tape.{u2} Γ' _inst_2) (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.move.{u1} Γ _inst_1 d T)) (Turing.Tape.move.{u2} Γ' _inst_2 d (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f T))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (T : Turing.Tape.{u2} Γ _inst_1) (d : Turing.Dir), Eq.{succ u1} (Turing.Tape.{u1} Γ' _inst_2) (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.move.{u2} Γ _inst_1 d T)) (Turing.Tape.move.{u1} Γ' _inst_2 d (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f T))
-Case conversion may be inaccurate. Consider using '#align turing.tape.map_move Turing.Tape.map_moveₓ'. -/
theorem Tape.map_move {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (T : Tape Γ) (d) :
(T.move d).map f = (T.map f).move d := by
cases T <;> cases d <;>
@@ -984,35 +882,17 @@ theorem Tape.map_move {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ
and_self_iff, list_blank.tail_map]
#align turing.tape.map_move Turing.Tape.map_move
-/- warning: turing.tape.map_mk' -> Turing.Tape.map_mk' is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (L : Turing.ListBlank.{u1} Γ _inst_1) (R : Turing.ListBlank.{u1} Γ _inst_1), Eq.{succ u2} (Turing.Tape.{u2} Γ' _inst_2) (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.mk'.{u1} Γ _inst_1 L R)) (Turing.Tape.mk'.{u2} Γ' _inst_2 (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f L) (Turing.ListBlank.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f R))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (L : Turing.ListBlank.{u2} Γ _inst_1) (R : Turing.ListBlank.{u2} Γ _inst_1), Eq.{succ u1} (Turing.Tape.{u1} Γ' _inst_2) (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.mk'.{u2} Γ _inst_1 L R)) (Turing.Tape.mk'.{u1} Γ' _inst_2 (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f L) (Turing.ListBlank.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f R))
-Case conversion may be inaccurate. Consider using '#align turing.tape.map_mk' Turing.Tape.map_mk'ₓ'. -/
theorem Tape.map_mk' {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (L R : ListBlank Γ) :
(Tape.mk' L R).map f = Tape.mk' (L.map f) (R.map f) := by
simp only [tape.mk', tape.map, list_blank.head_map, eq_self_iff_true, and_self_iff,
list_blank.tail_map]
#align turing.tape.map_mk' Turing.Tape.map_mk'
-/- warning: turing.tape.map_mk₂ -> Turing.Tape.map_mk₂ is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (L : List.{u1} Γ) (R : List.{u1} Γ), Eq.{succ u2} (Turing.Tape.{u2} Γ' _inst_2) (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.mk₂.{u1} Γ _inst_1 L R)) (Turing.Tape.mk₂.{u2} Γ' _inst_2 (List.map.{u1, u2} Γ Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f) L) (List.map.{u1, u2} Γ Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f) R))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (L : List.{u2} Γ) (R : List.{u2} Γ), Eq.{succ u1} (Turing.Tape.{u1} Γ' _inst_2) (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.mk₂.{u2} Γ _inst_1 L R)) (Turing.Tape.mk₂.{u1} Γ' _inst_2 (List.map.{u2, u1} Γ Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f) L) (List.map.{u2, u1} Γ Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f) R))
-Case conversion may be inaccurate. Consider using '#align turing.tape.map_mk₂ Turing.Tape.map_mk₂ₓ'. -/
theorem Tape.map_mk₂ {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (L R : List Γ) :
(Tape.mk₂ L R).map f = Tape.mk₂ (L.map f) (R.map f) := by
simp only [tape.mk₂, tape.map_mk', list_blank.map_mk]
#align turing.tape.map_mk₂ Turing.Tape.map_mk₂
-/- warning: turing.tape.map_mk₁ -> Turing.Tape.map_mk₁ is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} {Γ' : Type.{u2}} [_inst_1 : Inhabited.{succ u1} Γ] [_inst_2 : Inhabited.{succ u2} Γ'] (f : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (l : List.{u1} Γ), Eq.{succ u2} (Turing.Tape.{u2} Γ' _inst_2) (Turing.Tape.map.{u1, u2} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.mk₁.{u1} Γ _inst_1 l)) (Turing.Tape.mk₁.{u2} Γ' _inst_2 (List.map.{u1, u2} Γ Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f) l))
-but is expected to have type
- forall {Γ : Type.{u2}} {Γ' : Type.{u1}} [_inst_1 : Inhabited.{succ u2} Γ] [_inst_2 : Inhabited.{succ u1} Γ'] (f : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (l : List.{u2} Γ), Eq.{succ u1} (Turing.Tape.{u1} Γ' _inst_2) (Turing.Tape.map.{u2, u1} Γ Γ' _inst_1 _inst_2 f (Turing.Tape.mk₁.{u2} Γ _inst_1 l)) (Turing.Tape.mk₁.{u1} Γ' _inst_2 (List.map.{u2, u1} Γ Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f) l))
-Case conversion may be inaccurate. Consider using '#align turing.tape.map_mk₁ Turing.Tape.map_mk₁ₓ'. -/
theorem Tape.map_mk₁ {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ') (l : List Γ) :
(Tape.mk₁ l).map f = Tape.mk₁ (l.map f) :=
Tape.map_mk₂ _ _ _
@@ -1217,12 +1097,6 @@ def Respects {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ → Opt
#align turing.respects Turing.Respects
-/
-/- warning: turing.tr_reaches₁ -> Turing.tr_reaches₁ is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₁ : σ₁ -> (Option.{u1} σ₁)} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u1, u2} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (forall {b₁ : σ₁}, (Turing.Reaches₁.{u1} σ₁ f₁ a₁ b₁) -> (Exists.{succ u2} σ₂ (fun (b₂ : σ₂) => And (tr b₁ b₂) (Turing.Reaches₁.{u2} σ₂ f₂ a₂ b₂)))))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₁ : σ₁ -> (Option.{u2} σ₁)} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u2, u1} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (forall {b₁ : σ₁}, (Turing.Reaches₁.{u2} σ₁ f₁ a₁ b₁) -> (Exists.{succ u1} σ₂ (fun (b₂ : σ₂) => And (tr b₁ b₂) (Turing.Reaches₁.{u1} σ₂ f₂ a₂ b₂)))))
-Case conversion may be inaccurate. Consider using '#align turing.tr_reaches₁ Turing.tr_reaches₁ₓ'. -/
theorem tr_reaches₁ {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) {b₁} (ab : Reaches₁ f₁ a₁ b₁) : ∃ b₂, tr b₁ b₂ ∧ Reaches₁ f₂ a₂ b₂ :=
by
@@ -1236,12 +1110,6 @@ theorem tr_reaches₁ {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H
exact ⟨_, dd, ac₂.trans cd₂⟩
#align turing.tr_reaches₁ Turing.tr_reaches₁
-/- warning: turing.tr_reaches -> Turing.tr_reaches is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₁ : σ₁ -> (Option.{u1} σ₁)} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u1, u2} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (forall {b₁ : σ₁}, (Turing.Reaches.{u1} σ₁ f₁ a₁ b₁) -> (Exists.{succ u2} σ₂ (fun (b₂ : σ₂) => And (tr b₁ b₂) (Turing.Reaches.{u2} σ₂ f₂ a₂ b₂)))))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₁ : σ₁ -> (Option.{u2} σ₁)} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u2, u1} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (forall {b₁ : σ₁}, (Turing.Reaches.{u2} σ₁ f₁ a₁ b₁) -> (Exists.{succ u1} σ₂ (fun (b₂ : σ₂) => And (tr b₁ b₂) (Turing.Reaches.{u1} σ₂ f₂ a₂ b₂)))))
-Case conversion may be inaccurate. Consider using '#align turing.tr_reaches Turing.tr_reachesₓ'. -/
theorem tr_reaches {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) {b₁} (ab : Reaches f₁ a₁ b₁) : ∃ b₂, tr b₁ b₂ ∧ Reaches f₂ a₂ b₂ :=
by
@@ -1253,12 +1121,6 @@ theorem tr_reaches {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H :
⟨b₂, bb, h.to_reflTransGen⟩
#align turing.tr_reaches Turing.tr_reaches
-/- warning: turing.tr_reaches_rev -> Turing.tr_reaches_rev is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₁ : σ₁ -> (Option.{u1} σ₁)} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u1, u2} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (forall {b₂ : σ₂}, (Turing.Reaches.{u2} σ₂ f₂ a₂ b₂) -> (Exists.{succ u1} σ₁ (fun (c₁ : σ₁) => Exists.{succ u2} σ₂ (fun (c₂ : σ₂) => And (Turing.Reaches.{u2} σ₂ f₂ b₂ c₂) (And (tr c₁ c₂) (Turing.Reaches.{u1} σ₁ f₁ a₁ c₁)))))))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₁ : σ₁ -> (Option.{u2} σ₁)} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u2, u1} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (forall {b₂ : σ₂}, (Turing.Reaches.{u1} σ₂ f₂ a₂ b₂) -> (Exists.{succ u2} σ₁ (fun (c₁ : σ₁) => Exists.{succ u1} σ₂ (fun (c₂ : σ₂) => And (Turing.Reaches.{u1} σ₂ f₂ b₂ c₂) (And (tr c₁ c₂) (Turing.Reaches.{u2} σ₁ f₁ a₁ c₁)))))))
-Case conversion may be inaccurate. Consider using '#align turing.tr_reaches_rev Turing.tr_reaches_revₓ'. -/
theorem tr_reaches_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) {b₂} (ab : Reaches f₂ a₂ b₂) :
∃ c₁ c₂, Reaches f₂ b₂ c₂ ∧ tr c₁ c₂ ∧ Reaches f₁ a₁ c₁ :=
@@ -1278,12 +1140,6 @@ theorem tr_reaches_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (
exact ⟨_, _, de, ee, ae⟩
#align turing.tr_reaches_rev Turing.tr_reaches_rev
-/- warning: turing.tr_eval -> Turing.tr_eval is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₁ : σ₁ -> (Option.{u1} σ₁)} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u1, u2} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {b₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (Membership.Mem.{u1, u1} σ₁ (Part.{u1} σ₁) (Part.hasMem.{u1} σ₁) b₁ (Turing.eval.{u1} σ₁ f₁ a₁)) -> (Exists.{succ u2} σ₂ (fun (b₂ : σ₂) => And (tr b₁ b₂) (Membership.Mem.{u2, u2} σ₂ (Part.{u2} σ₂) (Part.hasMem.{u2} σ₂) b₂ (Turing.eval.{u2} σ₂ f₂ a₂)))))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₁ : σ₁ -> (Option.{u2} σ₁)} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u2, u1} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {b₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (Membership.mem.{u2, u2} σ₁ (Part.{u2} σ₁) (Part.instMembershipPart.{u2} σ₁) b₁ (Turing.eval.{u2} σ₁ f₁ a₁)) -> (Exists.{succ u1} σ₂ (fun (b₂ : σ₂) => And (tr b₁ b₂) (Membership.mem.{u1, u1} σ₂ (Part.{u1} σ₂) (Part.instMembershipPart.{u1} σ₂) b₂ (Turing.eval.{u1} σ₂ f₂ a₂)))))
-Case conversion may be inaccurate. Consider using '#align turing.tr_eval Turing.tr_evalₓ'. -/
theorem tr_eval {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ b₁ a₂}
(aa : tr a₁ a₂) (ab : b₁ ∈ eval f₁ a₁) : ∃ b₂, tr b₁ b₂ ∧ b₂ ∈ eval f₂ a₂ :=
by
@@ -1293,12 +1149,6 @@ theorem tr_eval {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Res
have := H bb; rwa [b0] at this
#align turing.tr_eval Turing.tr_eval
-/- warning: turing.tr_eval_rev -> Turing.tr_eval_rev is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₁ : σ₁ -> (Option.{u1} σ₁)} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u1, u2} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {b₂ : σ₂} {a₂ : σ₂}, (tr a₁ a₂) -> (Membership.Mem.{u2, u2} σ₂ (Part.{u2} σ₂) (Part.hasMem.{u2} σ₂) b₂ (Turing.eval.{u2} σ₂ f₂ a₂)) -> (Exists.{succ u1} σ₁ (fun (b₁ : σ₁) => And (tr b₁ b₂) (Membership.Mem.{u1, u1} σ₁ (Part.{u1} σ₁) (Part.hasMem.{u1} σ₁) b₁ (Turing.eval.{u1} σ₁ f₁ a₁)))))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₁ : σ₁ -> (Option.{u2} σ₁)} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u2, u1} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {b₂ : σ₂} {a₂ : σ₂}, (tr a₁ a₂) -> (Membership.mem.{u1, u1} σ₂ (Part.{u1} σ₂) (Part.instMembershipPart.{u1} σ₂) b₂ (Turing.eval.{u1} σ₂ f₂ a₂)) -> (Exists.{succ u2} σ₁ (fun (b₁ : σ₁) => And (tr b₁ b₂) (Membership.mem.{u2, u2} σ₁ (Part.{u2} σ₁) (Part.instMembershipPart.{u2} σ₁) b₁ (Turing.eval.{u2} σ₁ f₁ a₁)))))
-Case conversion may be inaccurate. Consider using '#align turing.tr_eval_rev Turing.tr_eval_revₓ'. -/
theorem tr_eval_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ b₂ a₂}
(aa : tr a₁ a₂) (ab : b₂ ∈ eval f₂ a₂) : ∃ b₁, tr b₁ b₂ ∧ b₁ ∈ eval f₁ a₁ :=
by
@@ -1312,12 +1162,6 @@ theorem tr_eval_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H :
cases b0.symm.trans h
#align turing.tr_eval_rev Turing.tr_eval_rev
-/- warning: turing.tr_eval_dom -> Turing.tr_eval_dom is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₁ : σ₁ -> (Option.{u1} σ₁)} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u1, u2} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (Iff (Part.Dom.{u2} σ₂ (Turing.eval.{u2} σ₂ f₂ a₂)) (Part.Dom.{u1} σ₁ (Turing.eval.{u1} σ₁ f₁ a₁))))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₁ : σ₁ -> (Option.{u2} σ₁)} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂ -> Prop}, (Turing.Respects.{u2, u1} σ₁ σ₂ f₁ f₂ tr) -> (forall {a₁ : σ₁} {a₂ : σ₂}, (tr a₁ a₂) -> (Iff (Part.Dom.{u1} σ₂ (Turing.eval.{u1} σ₂ f₂ a₂)) (Part.Dom.{u2} σ₁ (Turing.eval.{u2} σ₁ f₁ a₁))))
-Case conversion may be inaccurate. Consider using '#align turing.tr_eval_dom Turing.tr_eval_domₓ'. -/
theorem tr_eval_dom {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (H : Respects f₁ f₂ tr) {a₁ a₂}
(aa : tr a₁ a₂) : (eval f₂ a₂).Dom ↔ (eval f₁ a₁).Dom :=
⟨fun h =>
@@ -1336,36 +1180,18 @@ def FRespects {σ₁ σ₂} (f₂ : σ₂ → Option σ₂) (tr : σ₁ → σ
#align turing.frespects Turing.FRespects
-/
-/- warning: turing.frespects_eq -> Turing.frespects_eq is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂} {a₂ : σ₂} {b₂ : σ₂}, (Eq.{succ u2} (Option.{u2} σ₂) (f₂ a₂) (f₂ b₂)) -> (forall {b₁ : Option.{u1} σ₁}, Iff (Turing.FRespects.{u1, u2} σ₁ σ₂ f₂ tr a₂ b₁) (Turing.FRespects.{u1, u2} σ₁ σ₂ f₂ tr b₂ b₁))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂} {a₂ : σ₂} {b₂ : σ₂}, (Eq.{succ u1} (Option.{u1} σ₂) (f₂ a₂) (f₂ b₂)) -> (forall {b₁ : Option.{u2} σ₁}, Iff (Turing.FRespects.{u2, u1} σ₁ σ₂ f₂ tr a₂ b₁) (Turing.FRespects.{u2, u1} σ₁ σ₂ f₂ tr b₂ b₁))
-Case conversion may be inaccurate. Consider using '#align turing.frespects_eq Turing.frespects_eqₓ'. -/
theorem frespects_eq {σ₁ σ₂} {f₂ : σ₂ → Option σ₂} {tr : σ₁ → σ₂} {a₂ b₂} (h : f₂ a₂ = f₂ b₂) :
∀ {b₁}, FRespects f₂ tr a₂ b₁ ↔ FRespects f₂ tr b₂ b₁
| some b₁ => reaches₁_eq h
| none => by unfold frespects <;> rw [h]
#align turing.frespects_eq Turing.frespects_eq
-/- warning: turing.fun_respects -> Turing.fun_respects is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u2}} {f₁ : σ₁ -> (Option.{u1} σ₁)} {f₂ : σ₂ -> (Option.{u2} σ₂)} {tr : σ₁ -> σ₂}, Iff (Turing.Respects.{u1, u2} σ₁ σ₂ f₁ f₂ (fun (a : σ₁) (b : σ₂) => Eq.{succ u2} σ₂ (tr a) b)) (forall {{a₁ : σ₁}}, Turing.FRespects.{u1, u2} σ₁ σ₂ f₂ tr (tr a₁) (f₁ a₁))
-but is expected to have type
- forall {σ₁ : Type.{u2}} {σ₂ : Type.{u1}} {f₁ : σ₁ -> (Option.{u2} σ₁)} {f₂ : σ₂ -> (Option.{u1} σ₂)} {tr : σ₁ -> σ₂}, Iff (Turing.Respects.{u2, u1} σ₁ σ₂ f₁ f₂ (fun (a : σ₁) (b : σ₂) => Eq.{succ u1} σ₂ (tr a) b)) (forall {{a₁ : σ₁}}, Turing.FRespects.{u2, u1} σ₁ σ₂ f₂ tr (tr a₁) (f₁ a₁))
-Case conversion may be inaccurate. Consider using '#align turing.fun_respects Turing.fun_respectsₓ'. -/
theorem fun_respects {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂} :
(Respects f₁ f₂ fun a b => tr a = b) ↔ ∀ ⦃a₁⦄, FRespects f₂ tr (tr a₁) (f₁ a₁) :=
forall_congr' fun a₁ => by
cases f₁ a₁ <;> simp only [frespects, respects, exists_eq_left', forall_eq']
#align turing.fun_respects Turing.fun_respects
-/- warning: turing.tr_eval' -> Turing.tr_eval' is a dubious translation:
-lean 3 declaration is
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u1}} (f₁ : σ₁ -> (Option.{u1} σ₁)) (f₂ : σ₂ -> (Option.{u1} σ₂)) (tr : σ₁ -> σ₂), (Turing.Respects.{u1, u1} σ₁ σ₂ f₁ f₂ (fun (a : σ₁) (b : σ₂) => Eq.{succ u1} σ₂ (tr a) b)) -> (forall (a₁ : σ₁), Eq.{succ u1} (Part.{u1} σ₂) (Turing.eval.{u1} σ₂ f₂ (tr a₁)) (Functor.map.{u1, u1} Part.{u1} (Applicative.toFunctor.{u1, u1} Part.{u1} (Monad.toApplicative.{u1, u1} Part.{u1} Part.monad.{u1})) σ₁ σ₂ tr (Turing.eval.{u1} σ₁ f₁ a₁)))
-but is expected to have type
- forall {σ₁ : Type.{u1}} {σ₂ : Type.{u1}} (f₁ : σ₁ -> (Option.{u1} σ₁)) (f₂ : σ₂ -> (Option.{u1} σ₂)) (tr : σ₁ -> σ₂), (Turing.Respects.{u1, u1} σ₁ σ₂ f₁ f₂ (fun (a : σ₁) (b : σ₂) => Eq.{succ u1} σ₂ (tr a) b)) -> (forall (a₁ : σ₁), Eq.{succ u1} (Part.{u1} σ₂) (Turing.eval.{u1} σ₂ f₂ (tr a₁)) (Functor.map.{u1, u1} Part.{u1} (Applicative.toFunctor.{u1, u1} Part.{u1} (Monad.toApplicative.{u1, u1} Part.{u1} Part.instMonadPart.{u1})) σ₁ σ₂ tr (Turing.eval.{u1} σ₁ f₁ a₁)))
-Case conversion may be inaccurate. Consider using '#align turing.tr_eval' Turing.tr_eval'ₓ'. -/
theorem tr_eval' {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ → Option σ₂) (tr : σ₁ → σ₂)
(H : Respects f₁ f₂ fun a b => tr a = b) (a₁) : eval f₂ (tr a₁) = tr <$> eval f₁ a₁ :=
Part.ext fun b₂ =>
@@ -1412,12 +1238,6 @@ parameter (Γ : Type _)[Inhabited Γ]
-- type of tape symbols
parameter (Λ : Type _)[Inhabited Λ]
-/- warning: turing.TM0.stmt -> Turing.TM0.Stmt is a dubious translation:
-lean 3 declaration is
- forall (Γ : Type.{u1}) [_inst_1 : Inhabited.{succ u1} Γ], Type.{u1}
-but is expected to have type
- Type.{u1} -> Type.{u1}
-Case conversion may be inaccurate. Consider using '#align turing.TM0.stmt Turing.TM0.Stmtₓ'. -/
-- type of "labels" or TM states
/-- A Turing machine "statement" is just a command to either move
left or right, or write a symbol on the tape. -/
@@ -1432,12 +1252,6 @@ instance Stmt.inhabited : Inhabited stmt :=
#align turing.TM0.stmt.inhabited Turing.TM0.Stmt.inhabited
-/
-/- warning: turing.TM0.machine -> Turing.TM0.Machine is a dubious translation:
-lean 3 declaration is
- forall (Γ : Type.{u1}) [_inst_1 : Inhabited.{succ u1} Γ] (Λ : Type.{u2}) [_inst_2 : Inhabited.{succ u2} Λ], Sort.{max (succ u2) (succ u1) (succ (max u2 u1))}
-but is expected to have type
- Type.{u1} -> (forall (_inst_1 : Type.{u2}) [Λ : Inhabited.{succ u2} _inst_1], Sort.{max (max (succ u1) (succ u2)) (succ (max u1 u2))})
-Case conversion may be inaccurate. Consider using '#align turing.TM0.machine Turing.TM0.Machineₓ'. -/
-- [inhabited Λ]: this is a deliberate addition, see comment
/-- A Post-Turing machine with symbol type `Γ` and label type `Λ`
is a function which, given the current state `q : Λ` and
@@ -1453,21 +1267,9 @@ def Machine :=
Λ → Γ → Option (Λ × stmt)
#align turing.TM0.machine Turing.TM0.Machine
-/- warning: turing.TM0.machine.inhabited -> Turing.TM0.Machine.inhabited is a dubious translation:
-lean 3 declaration is
- forall (Γ : Type.{u1}) [_inst_1 : Inhabited.{succ u1} Γ] (Λ : Type.{u2}) [_inst_2 : Inhabited.{succ u2} Λ], Inhabited.{max (succ u2) (succ u1) (succ (max u2 u1))} (Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ _inst_2)
-but is expected to have type
- forall (Γ : Type.{u1}) (_inst_1 : Type.{u2}) [Λ : Inhabited.{succ u2} _inst_1], Inhabited.{max (succ u2) (succ u1)} (Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM0.machine.inhabited Turing.TM0.Machine.inhabitedₓ'. -/
instance Machine.inhabited : Inhabited machine := by unfold machine <;> infer_instance
#align turing.TM0.machine.inhabited Turing.TM0.Machine.inhabited
-/- warning: turing.TM0.cfg -> Turing.TM0.Cfg is a dubious translation:
-lean 3 declaration is
- forall (Γ : Type.{u1}) [_inst_1 : Inhabited.{succ u1} Γ] (Λ : Type.{u2}) [_inst_2 : Inhabited.{succ u2} Λ], Sort.{max (succ u1) (succ u2)}
-but is expected to have type
- forall (Γ : Type.{u1}) [_inst_1 : Inhabited.{succ u1} Γ], Type.{u2} -> Sort.{max (succ u1) (succ u2)}
-Case conversion may be inaccurate. Consider using '#align turing.TM0.cfg Turing.TM0.Cfgₓ'. -/
/-- The configuration state of a Turing machine during operation
consists of a label (machine state), and a tape, represented in
the form `(a, L, R)` meaning the tape looks like `L.rev ++ [a] ++ R`
@@ -1521,12 +1323,6 @@ def eval (M : machine) (l : List Γ) : Part (ListBlank Γ) :=
#align turing.TM0.eval Turing.TM0.eval
-/
-/- warning: turing.TM0.supports -> Turing.TM0.Supports is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ], (Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ _inst_2) -> (Set.{u2} Λ) -> Prop
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} [Λ : Inhabited.{succ u2} _inst_1], (Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ) -> (Set.{u2} _inst_1) -> Prop
-Case conversion may be inaccurate. Consider using '#align turing.TM0.supports Turing.TM0.Supportsₓ'. -/
/-- The raw definition of a Turing machine does not require that
`Γ` and `Λ` are finite, and in practice we will be interested
in the infinite `Λ` case. We recover instead a notion of
@@ -1538,12 +1334,6 @@ def Supports (M : machine) (S : Set Λ) :=
default ∈ S ∧ ∀ {q a q' s}, (q', s) ∈ M q a → q ∈ S → q' ∈ S
#align turing.TM0.supports Turing.TM0.Supports
-/- warning: turing.TM0.step_supports -> Turing.TM0.step_supports is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ _inst_2) {S : Set.{u2} Λ}, (Turing.TM0.Supports.{u1, u2} Γ _inst_1 Λ _inst_2 M S) -> (forall {c : Turing.TM0.Cfg.{u1, u2} Γ _inst_1 Λ _inst_2} {c' : Turing.TM0.Cfg.{u1, u2} Γ _inst_1 Λ _inst_2}, (Membership.Mem.{max u1 u2, max u1 u2} (Turing.TM0.Cfg.{u1, u2} Γ _inst_1 Λ _inst_2) (Option.{max u1 u2} (Turing.TM0.Cfg.{u1, u2} Γ _inst_1 Λ _inst_2)) (Option.hasMem.{max u1 u2} (Turing.TM0.Cfg.{u1, u2} Γ _inst_1 Λ _inst_2)) c' (Turing.TM0.step.{u1, u2} Γ _inst_1 Λ _inst_2 M c)) -> (Membership.Mem.{u2, u2} Λ (Set.{u2} Λ) (Set.hasMem.{u2} Λ) (Turing.TM0.Cfg.q.{u1, u2} Γ _inst_1 Λ _inst_2 c) S) -> (Membership.Mem.{u2, u2} Λ (Set.{u2} Λ) (Set.hasMem.{u2} Λ) (Turing.TM0.Cfg.q.{u1, u2} Γ _inst_1 Λ _inst_2 c') S))
-but is expected to have type
- forall {Γ : Type.{u2}} [_inst_1 : Inhabited.{succ u2} Γ] {Λ : Type.{u1}} [_inst_2 : Inhabited.{succ u1} Λ] (M : Turing.TM0.Machine.{u2, u1} Γ Λ _inst_2) {S : Set.{u1} Λ}, (Turing.TM0.Supports.{u2, u1} Γ Λ _inst_2 M S) -> (forall {c : Turing.TM0.Cfg.{u2, u1} Γ _inst_1 Λ} {c' : Turing.TM0.Cfg.{u2, u1} Γ _inst_1 Λ}, (Membership.mem.{max u2 u1, max u1 u2} (Turing.TM0.Cfg.{u2, u1} Γ _inst_1 Λ) (Option.{max u1 u2} (Turing.TM0.Cfg.{u2, u1} Γ _inst_1 Λ)) (Option.instMembershipOption.{max u2 u1} (Turing.TM0.Cfg.{u2, u1} Γ _inst_1 Λ)) c' (Turing.TM0.step.{u2, u1} Γ _inst_1 Λ _inst_2 M c)) -> (Membership.mem.{u1, u1} Λ (Set.{u1} Λ) (Set.instMembershipSet.{u1} Λ) (Turing.TM0.Cfg.q.{u2, u1} Γ _inst_1 Λ c) S) -> (Membership.mem.{u1, u1} Λ (Set.{u1} Λ) (Set.instMembershipSet.{u1} Λ) (Turing.TM0.Cfg.q.{u2, u1} Γ _inst_1 Λ c') S))
-Case conversion may be inaccurate. Consider using '#align turing.TM0.step_supports Turing.TM0.step_supportsₓ'. -/
theorem step_supports (M : machine) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.q ∈ S → c'.q ∈ S
| ⟨q, T⟩, c', h₁, h₂ =>
@@ -1552,12 +1342,6 @@ theorem step_supports (M : machine) {S} (ss : supports M S) :
exact ss.2 h h₂
#align turing.TM0.step_supports Turing.TM0.step_supports
-/- warning: turing.TM0.univ_supports -> Turing.TM0.univ_supports is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ _inst_2), Turing.TM0.Supports.{u1, u2} Γ _inst_1 Λ _inst_2 M (Set.univ.{u2} Λ)
-but is expected to have type
- forall {Γ : Type.{u2}} {_inst_1 : Type.{u1}} [Λ : Inhabited.{succ u1} _inst_1] (_inst_2 : Turing.TM0.Machine.{u2, u1} Γ _inst_1 Λ), Turing.TM0.Supports.{u2, u1} Γ _inst_1 Λ _inst_2 (Set.univ.{u1} _inst_1)
-Case conversion may be inaccurate. Consider using '#align turing.TM0.univ_supports Turing.TM0.univ_supportsₓ'. -/
theorem univ_supports (M : machine) : supports M Set.univ :=
⟨trivial, fun q a q' s h₁ h₂ => trivial⟩
#align turing.TM0.univ_supports Turing.TM0.univ_supports
@@ -1583,12 +1367,6 @@ def Stmt.map (f : PointedMap Γ Γ') : Stmt Γ → Stmt Γ'
#align turing.TM0.stmt.map Turing.TM0.Stmt.map
-/
-/- warning: turing.TM0.cfg.map -> Turing.TM0.Cfg.map is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Γ' : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Γ'] {Λ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} Λ] {Λ' : Type.{u4}} [_inst_4 : Inhabited.{succ u4} Λ'], (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) -> (Λ -> Λ') -> (Turing.TM0.Cfg.{u1, u3} Γ _inst_1 Λ _inst_3) -> (Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 Λ' _inst_4)
-but is expected to have type
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Γ' : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Γ'] {Λ : Type.{u3}} {_inst_3 : Type.{u4}}, (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) -> (Λ -> _inst_3) -> (Turing.TM0.Cfg.{u1, u3} Γ _inst_1 Λ) -> (Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 _inst_3)
-Case conversion may be inaccurate. Consider using '#align turing.TM0.cfg.map Turing.TM0.Cfg.mapₓ'. -/
/-- Map a configuration across a function, given `f : Γ → Γ'` a map of the alphabets and
`g : Λ → Λ'` a map of the machine states. -/
def Cfg.map (f : PointedMap Γ Γ') (g : Λ → Λ') : Cfg Γ Λ → Cfg Γ' Λ'
@@ -1606,9 +1384,6 @@ def Machine.map : Machine Γ' Λ'
#align turing.TM0.machine.map Turing.TM0.Machine.map
-/
-/- warning: turing.TM0.machine.map_step -> Turing.TM0.Machine.map_step is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM0.machine.map_step Turing.TM0.Machine.map_stepₓ'. -/
theorem Machine.map_step {S : Set Λ} (f₂₁ : Function.RightInverse f₁ f₂)
(g₂₁ : ∀ q ∈ S, g₂ (g₁ q) = q) :
∀ c : Cfg Γ Λ,
@@ -1621,19 +1396,10 @@ theorem Machine.map_step {S : Set Λ} (f₂₁ : Function.RightInverse f₁ f₂
· simp only [step, cfg.map, Option.map_some', tape.map_write]; rfl
#align turing.TM0.machine.map_step Turing.TM0.Machine.map_step
-/- warning: turing.TM0.map_init -> Turing.TM0.map_init is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Γ' : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Γ'] {Λ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} Λ] {Λ' : Type.{u4}} [_inst_4 : Inhabited.{succ u4} Λ'] (f₁ : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (g₁ : Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) (l : List.{u1} Γ), Eq.{max (succ u2) (succ u4)} (Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 Λ' _inst_4) (Turing.TM0.Cfg.map.{u1, u2, u3, u4} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 f₁ (coeFn.{succ (max u3 u4), max (succ u3) (succ u4)} (Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) (fun (_x : Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) => Λ -> Λ') (Turing.PointedMap.hasCoeToFun.{u3, u4} Λ Λ' _inst_3 _inst_4) g₁) (Turing.TM0.init.{u1, u3} Γ _inst_1 Λ _inst_3 l)) (Turing.TM0.init.{u2, u4} Γ' _inst_2 Λ' _inst_4 (List.map.{u1, u2} Γ Γ' (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f₁) l))
-but is expected to have type
- forall {Γ : Type.{u2}} [_inst_1 : Inhabited.{succ u2} Γ] {Γ' : Type.{u1}} [_inst_2 : Inhabited.{succ u1} Γ'] {Λ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} Λ] {Λ' : Type.{u3}} [_inst_4 : Inhabited.{succ u3} Λ'] (f₁ : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (g₁ : Turing.PointedMap.{u4, u3} Λ Λ' _inst_3 _inst_4) (l : List.{u2} Γ), Eq.{max (succ u1) (succ u3)} (Turing.TM0.Cfg.{u1, u3} Γ' _inst_2 Λ') (Turing.TM0.Cfg.map.{u2, u1, u4, u3} Γ _inst_1 Γ' _inst_2 Λ Λ' f₁ (Turing.PointedMap.f.{u4, u3} Λ Λ' _inst_3 _inst_4 g₁) (Turing.TM0.init.{u2, u4} Γ _inst_1 Λ _inst_3 l)) (Turing.TM0.init.{u1, u3} Γ' _inst_2 Λ' _inst_4 (List.map.{u2, u1} Γ Γ' (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f₁) l))
-Case conversion may be inaccurate. Consider using '#align turing.TM0.map_init Turing.TM0.map_initₓ'. -/
theorem map_init (g₁ : PointedMap Λ Λ') (l : List Γ) : (init l).map f₁ g₁ = init (l.map f₁) :=
congr (congr_arg Cfg.mk g₁.map_pt) (Tape.map_mk₁ _ _)
#align turing.TM0.map_init Turing.TM0.map_init
-/- warning: turing.TM0.machine.map_respects -> Turing.TM0.Machine.map_respects is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM0.machine.map_respects Turing.TM0.Machine.map_respectsₓ'. -/
theorem Machine.map_respects (g₁ : PointedMap Λ Λ') (g₂ : Λ' → Λ) {S} (ss : Supports M S)
(f₂₁ : Function.RightInverse f₁ f₂) (g₂₁ : ∀ q ∈ S, g₂ (g₁ q) = q) :
Respects (step M) (step (M.map f₁ f₂ g₁ g₂)) fun a b => a.q ∈ S ∧ Cfg.map f₁ g₁ a = b
@@ -1690,12 +1456,6 @@ parameter (Λ : Type _)
-- Type of function labels
parameter (σ : Type _)
-/- warning: turing.TM1.stmt -> Turing.TM1.Stmt is a dubious translation:
-lean 3 declaration is
- forall (Γ : Type.{u1}) [_inst_1 : Inhabited.{succ u1} Γ], Type.{u2} -> Type.{u3} -> Sort.{max (succ u1) (succ u2) (succ u3)}
-but is expected to have type
- Type.{u1} -> Type.{u2} -> Type.{u3} -> Sort.{max (max (succ u1) (succ u2)) (succ u3)}
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmt Turing.TM1.Stmtₓ'. -/
-- Type of variable settings
/-- The TM1 model is a simplification and extension of TM0
(Post-Turing model) in the direction of Wang B-machines. The machine's
@@ -1720,12 +1480,6 @@ inductive Stmt
open Stmt
-/- warning: turing.TM1.stmt.inhabited -> Turing.TM1.Stmt.inhabited is a dubious translation:
-lean 3 declaration is
- forall (Γ : Type.{u1}) [_inst_1 : Inhabited.{succ u1} Γ] (Λ : Type.{u2}) (σ : Type.{u3}), Inhabited.{max (succ u1) (succ u2) (succ u3)} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)
-but is expected to have type
- forall (Γ : Type.{u1}) (_inst_1 : Type.{u2}) (Λ : Type.{u3}), Inhabited.{max (max (succ u3) (succ u2)) (succ u1)} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmt.inhabited Turing.TM1.Stmt.inhabitedₓ'. -/
instance Stmt.inhabited : Inhabited stmt :=
⟨halt⟩
#align turing.TM1.stmt.inhabited Turing.TM1.Stmt.inhabited
@@ -1768,12 +1522,6 @@ def step (M : Λ → stmt) : cfg → Option cfg
#align turing.TM1.step Turing.TM1.step
-/
-/- warning: turing.TM1.supports_stmt -> Turing.TM1.SupportsStmt is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}}, (Finset.{u2} Λ) -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) -> Prop
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}}, (Finset.{u2} _inst_1) -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ) -> Prop
-Case conversion may be inaccurate. Consider using '#align turing.TM1.supports_stmt Turing.TM1.SupportsStmtₓ'. -/
/-- A set `S` of labels supports the statement `q` if all the `goto`
statements in `q` refer only to other functions in `S`. -/
def SupportsStmt (S : Finset Λ) : stmt → Prop
@@ -1787,12 +1535,6 @@ def SupportsStmt (S : Finset Λ) : stmt → Prop
open Classical
-/- warning: turing.TM1.stmts₁ -> Turing.TM1.stmts₁ is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}}, (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) -> (Finset.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}}, (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ) -> (Finset.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ))
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts₁ Turing.TM1.stmts₁ₓ'. -/
/-- The subterm closure of a statement. -/
noncomputable def stmts₁ : stmt → Finset stmt
| Q@(move d q) => insert Q (stmts₁ q)
@@ -1802,22 +1544,10 @@ noncomputable def stmts₁ : stmt → Finset stmt
| Q => {Q}
#align turing.TM1.stmts₁ Turing.TM1.stmts₁
-/- warning: turing.TM1.stmts₁_self -> Turing.TM1.stmts₁_self is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} {q : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ}, Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) (Finset.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.hasMem.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) q (Turing.TM1.stmts₁.{u1, u2, u3} Γ _inst_1 Λ σ q)
-but is expected to have type
- forall {Γ : Type.{u3}} {_inst_1 : Type.{u2}} {Λ : Type.{u1}} {σ : Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ}, Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ) (Finset.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Finset.instMembershipFinset.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) σ (Turing.TM1.stmts₁.{u3, u2, u1} Γ _inst_1 Λ σ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts₁_self Turing.TM1.stmts₁_selfₓ'. -/
theorem stmts₁_self {q} : q ∈ stmts₁ q := by
cases q <;> apply_rules [Finset.mem_insert_self, Finset.mem_singleton_self]
#align turing.TM1.stmts₁_self Turing.TM1.stmts₁_self
-/- warning: turing.TM1.stmts₁_trans -> Turing.TM1.stmts₁_trans is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} {q₁ : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ} {q₂ : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) (Finset.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.hasMem.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) q₁ (Turing.TM1.stmts₁.{u1, u2, u3} Γ _inst_1 Λ σ q₂)) -> (HasSubset.Subset.{max u1 u2 u3} (Finset.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.hasSubset.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Turing.TM1.stmts₁.{u1, u2, u3} Γ _inst_1 Λ σ q₁) (Turing.TM1.stmts₁.{u1, u2, u3} Γ _inst_1 Λ σ q₂))
-but is expected to have type
- forall {Γ : Type.{u3}} {_inst_1 : Type.{u2}} {Λ : Type.{u1}} {σ : Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ} {q₁ : Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ) (Finset.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Finset.instMembershipFinset.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) σ (Turing.TM1.stmts₁.{u3, u2, u1} Γ _inst_1 Λ q₁)) -> (HasSubset.Subset.{max (max u1 u2) u3} (Finset.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Finset.instHasSubsetFinset.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Turing.TM1.stmts₁.{u3, u2, u1} Γ _inst_1 Λ σ) (Turing.TM1.stmts₁.{u3, u2, u1} Γ _inst_1 Λ q₁))
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts₁_trans Turing.TM1.stmts₁_transₓ'. -/
theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ :=
by
intro h₁₂ q₀ h₀₁
@@ -1836,12 +1566,6 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
case halt => subst h₁₂; exact h₀₁
#align turing.TM1.stmts₁_trans Turing.TM1.stmts₁_trans
-/- warning: turing.TM1.stmts₁_supports_stmt_mono -> Turing.TM1.stmts₁_supportsStmt_mono is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} {S : Finset.{u2} Λ} {q₁ : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ} {q₂ : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) (Finset.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.hasMem.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) q₁ (Turing.TM1.stmts₁.{u1, u2, u3} Γ _inst_1 Λ σ q₂)) -> (Turing.TM1.SupportsStmt.{u1, u2, u3} Γ _inst_1 Λ σ S q₂) -> (Turing.TM1.SupportsStmt.{u1, u2, u3} Γ _inst_1 Λ σ S q₁)
-but is expected to have type
- forall {Γ : Type.{u2}} {_inst_1 : Type.{u3}} {Λ : Type.{u1}} {σ : Finset.{u3} _inst_1} {S : Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 Λ} {q₁ : Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 Λ}, (Membership.mem.{max (max u2 u3) u1, max (max u1 u3) u2} (Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 Λ) (Finset.{max (max u1 u3) u2} (Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 Λ)) (Finset.instMembershipFinset.{max (max u2 u3) u1} (Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 Λ)) S (Turing.TM1.stmts₁.{u2, u3, u1} Γ _inst_1 Λ q₁)) -> (Turing.TM1.SupportsStmt.{u2, u3, u1} Γ _inst_1 Λ σ q₁) -> (Turing.TM1.SupportsStmt.{u2, u3, u1} Γ _inst_1 Λ σ S)
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts₁_supports_stmt_mono Turing.TM1.stmts₁_supportsStmt_monoₓ'. -/
theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (hs : supports_stmt S q₂) :
supports_stmt S q₁ :=
by
@@ -1854,24 +1578,12 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
case halt => subst h; trivial
#align turing.TM1.stmts₁_supports_stmt_mono Turing.TM1.stmts₁_supportsStmt_mono
-/- warning: turing.TM1.stmts -> Turing.TM1.stmts is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}}, (Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) -> (Finset.{u2} Λ) -> (Finset.{max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}}, (_inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)) -> (Finset.{u2} _inst_1) -> (Finset.{max (max u3 u2) u1} (Option.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)))
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts Turing.TM1.stmtsₓ'. -/
/-- The set of all statements in a turing machine, plus one extra value `none` representing the
halt state. This is used in the TM1 to TM0 reduction. -/
noncomputable def stmts (M : Λ → stmt) (S : Finset Λ) : Finset (Option stmt) :=
(S.biUnion fun q => stmts₁ (M q)).insertNone
#align turing.TM1.stmts Turing.TM1.stmts
-/- warning: turing.TM1.stmts_trans -> Turing.TM1.stmts_trans is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} {M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)} {S : Finset.{u2} Λ} {q₁ : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ} {q₂ : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) (Finset.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.hasMem.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) q₁ (Turing.TM1.stmts₁.{u1, u2, u3} Γ _inst_1 Λ σ q₂)) -> (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.{max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ))) (Finset.hasMem.{max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ))) (Option.some.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) q₂) (Turing.TM1.stmts.{u1, u2, u3} Γ _inst_1 Λ σ M S)) -> (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.{max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ))) (Finset.hasMem.{max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ))) (Option.some.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) q₁) (Turing.TM1.stmts.{u1, u2, u3} Γ _inst_1 Λ σ M S))
-but is expected to have type
- forall {Γ : Type.{u3}} {_inst_1 : Type.{u2}} {Λ : Type.{u1}} {σ : _inst_1 -> (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)} {M : Finset.{u2} _inst_1} {S : Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ} {q₁ : Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ) (Finset.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Finset.instMembershipFinset.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) S (Turing.TM1.stmts₁.{u3, u2, u1} Γ _inst_1 Λ q₁)) -> (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Option.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Finset.{max (max u1 u2) u3} (Option.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ))) (Finset.instMembershipFinset.{max (max u3 u2) u1} (Option.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ))) (Option.some.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ) q₁) (Turing.TM1.stmts.{u3, u2, u1} Γ _inst_1 Λ σ M)) -> (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Option.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Finset.{max (max u1 u2) u3} (Option.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ))) (Finset.instMembershipFinset.{max (max u3 u2) u1} (Option.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ))) (Option.some.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ) S) (Turing.TM1.stmts.{u3, u2, u1} Γ _inst_1 Λ σ M))
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts_trans Turing.TM1.stmts_transₓ'. -/
theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
@@ -1881,12 +1593,6 @@ theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q
variable [Inhabited Λ]
-/- warning: turing.TM1.supports -> Turing.TM1.Supports is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} [_inst_2 : Inhabited.{succ u2} Λ], (Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) -> (Finset.{u2} Λ) -> Prop
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} [σ : Inhabited.{succ u2} _inst_1], (_inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)) -> (Finset.{u2} _inst_1) -> Prop
-Case conversion may be inaccurate. Consider using '#align turing.TM1.supports Turing.TM1.Supportsₓ'. -/
/-- A set `S` of labels supports machine `M` if all the `goto`
statements in the functions in `S` refer only to other functions
in `S`. -/
@@ -1894,12 +1600,6 @@ def Supports (M : Λ → stmt) (S : Finset Λ) :=
default ∈ S ∧ ∀ q ∈ S, supports_stmt S (M q)
#align turing.TM1.supports Turing.TM1.Supports
-/- warning: turing.TM1.stmts_supports_stmt -> Turing.TM1.stmts_supportsStmt is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} [_inst_2 : Inhabited.{succ u2} Λ] {M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)} {S : Finset.{u2} Λ} {q : Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (Finset.{max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ))) (Finset.hasMem.{max u1 u2 u3} (Option.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ))) (Option.some.{max u1 u2 u3} (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) q) (Turing.TM1.stmts.{u1, u2, u3} Γ _inst_1 Λ σ M S)) -> (Turing.TM1.SupportsStmt.{u1, u2, u3} Γ _inst_1 Λ σ S q)
-but is expected to have type
- forall {Γ : Type.{u3}} {_inst_1 : Type.{u2}} {Λ : Type.{u1}} [σ : Inhabited.{succ u2} _inst_1] {_inst_2 : _inst_1 -> (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)} {M : Finset.{u2} _inst_1} {S : Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ}, (Turing.TM1.Supports.{u3, u2, u1} Γ _inst_1 Λ σ _inst_2 M) -> (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Option.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ)) (Finset.{max (max u1 u2) u3} (Option.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ))) (Finset.instMembershipFinset.{max (max u3 u2) u1} (Option.{max (max u1 u2) u3} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ))) (Option.some.{max (max u3 u2) u1} (Turing.TM1.Stmt.{u3, u2, u1} Γ _inst_1 Λ) S) (Turing.TM1.stmts.{u3, u2, u1} Γ _inst_1 Λ _inst_2 M)) -> (Turing.TM1.SupportsStmt.{u3, u2, u1} Γ _inst_1 Λ M S)
-Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts_supports_stmt Turing.TM1.stmts_supportsStmtₓ'. -/
theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
some q ∈ stmts M S → supports_stmt S q := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
@@ -1907,9 +1607,6 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
exact fun l ls h => stmts₁_supports_stmt_mono h (ss.2 _ ls)
#align turing.TM1.stmts_supports_stmt Turing.TM1.stmts_supportsStmt
-/- warning: turing.TM1.step_supports -> Turing.TM1.step_supports is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM1.step_supports Turing.TM1.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
@@ -1990,12 +1687,6 @@ parameter (M : Λ → stmt₁)
include M
-/- warning: turing.TM1to0.Λ' -> Turing.TM1to0.Λ' is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ], (Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) -> Sort.{max (succ (max u1 u2 u3)) (succ u3)}
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}}, (_inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)) -> Sort.{max (succ (max (max u3 u2) u1)) (succ u3)}
-Case conversion may be inaccurate. Consider using '#align turing.TM1to0.Λ' Turing.TM1to0.Λ'ₓ'. -/
-- [inhabited Λ] [inhabited σ] (M : Λ → stmt₁): We need the M assumption
-- because of the inhabited instance, but we could avoid the inhabited instances on Λ and σ here.
-- But they are parameters so we cannot easily skip them for just this definition.
@@ -2014,12 +1705,6 @@ instance : Inhabited Λ' :=
open TM0.Stmt
-/- warning: turing.TM1to0.tr_aux -> Turing.TM1to0.trAux is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)), Γ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) -> σ -> (Prod.{max (max u1 u2 u3) u3, u1} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) (Turing.TM0.Stmt.{u1} Γ _inst_1))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} (_inst_2 : _inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)), Γ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ) -> Λ -> (Prod.{max (max u3 u2) u1, u1} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2) (Turing.TM0.Stmt.{u1} Γ))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to0.tr_aux Turing.TM1to0.trAuxₓ'. -/
/-- The core TM1 → TM0 translation function. Here `s` is the current value on the tape, and the
`stmt₁` is the TM1 statement to translate, with local state `v : σ`. We evaluate all regular
instructions recursively until we reach either a `move` or `write` command, or a `goto`; in the
@@ -2036,24 +1721,12 @@ def trAux (s : Γ) : stmt₁ → σ → Λ' × stmt₀
-- mathport name: exprcfg₀
local notation "cfg₀" => TM0.Cfg Γ Λ'
-/- warning: turing.TM1to0.tr -> Turing.TM1to0.tr is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)), Turing.TM0.Machine.{u1, max (max u1 u2 u3) u3} Γ _inst_1 (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) (Turing.TM1to0.Λ'.inhabited.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} [Λ : Inhabited.{succ u2} _inst_1] {_inst_2 : Type.{u3}} [σ : Inhabited.{succ u3} _inst_2] (_inst_3 : _inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 _inst_2)), Turing.TM0.Machine.{u1, max (max u3 u2) u1} Γ (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 _inst_2 _inst_3) (Turing.TM1to0.instInhabitedΛ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to0.tr Turing.TM1to0.trₓ'. -/
/-- The translated TM0 machine (given the TM1 machine input). -/
def tr : TM0.Machine Γ Λ'
| (none, v), s => none
| (some q, v), s => some (tr_aux s q v)
#align turing.TM1to0.tr Turing.TM1to0.tr
-/- warning: turing.TM1to0.tr_cfg -> Turing.TM1to0.trCfg is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)), (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) -> (Turing.TM0.Cfg.{u1, max (max u1 u2 u3) u3} Γ _inst_1 (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) (Turing.TM1to0.Λ'.inhabited.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M))
-but is expected to have type
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {_inst_2 : Type.{u3}} (σ : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ Λ _inst_2)), (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ _inst_2) -> (Turing.TM0.Cfg.{u1, max (max u3 u2) u1} Γ _inst_1 (Turing.TM1to0.Λ'.{u1, u2, u3} Γ Λ _inst_2 σ))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to0.tr_cfg Turing.TM1to0.trCfgₓ'. -/
/-- Translate configurations from TM1 to TM0. -/
def trCfg : cfg₁ → cfg₀
| ⟨l, v, T⟩ => ⟨(l.map M, v), T⟩
@@ -2077,12 +1750,6 @@ theorem tr_respects : Respects (TM1.step M) (TM0.step tr) fun c₁ c₂ => tr_cf
#align turing.TM1to0.tr_respects Turing.TM1to0.tr_respects
-/
-/- warning: turing.TM1to0.tr_eval -> Turing.TM1to0.tr_eval is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) (l : List.{u1} Γ), Eq.{succ u1} (Part.{u1} (Turing.ListBlank.{u1} Γ _inst_1)) (Turing.TM0.eval.{u1, max (max u1 u2 u3) u3} Γ _inst_1 (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) (Turing.TM1to0.Λ'.inhabited.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) (Turing.TM1to0.tr.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) l) (Turing.TM1.eval.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 _inst_3 M l)
-but is expected to have type
- forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u1}} [_inst_3 : Inhabited.{succ u1} σ] (M : Λ -> (Turing.TM1.Stmt.{u3, u2, u1} Γ Λ σ)) (l : List.{u3} Γ), Eq.{succ u3} (Part.{u3} (Turing.ListBlank.{u3} Γ _inst_1)) (Turing.TM0.eval.{u3, max (max u3 u2) u1} Γ _inst_1 (Turing.TM1to0.Λ'.{u3, u2, u1} Γ Λ σ M) (Turing.TM1to0.instInhabitedΛ'.{u3, u2, u1} Γ Λ _inst_2 σ _inst_3 M) (Turing.TM1to0.tr.{u3, u2, u1} Γ Λ _inst_2 σ _inst_3 M) l) (Turing.TM1.eval.{u3, u2, u1} Γ _inst_1 Λ σ _inst_2 _inst_3 M l)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to0.tr_eval Turing.TM1to0.tr_evalₓ'. -/
theorem tr_eval (l : List Γ) : TM0.eval tr l = TM1.eval M l :=
(congr_arg _ (tr_eval' _ _ _ tr_respects ⟨some _, _, _⟩)).trans
(by
@@ -2092,12 +1759,6 @@ theorem tr_eval (l : List Γ) : TM0.eval tr l = TM1.eval M l :=
variable [Fintype σ]
-/- warning: turing.TM1to0.tr_stmts -> Turing.TM1to0.trStmts is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) [_inst_4 : Fintype.{u3} σ], (Finset.{u2} Λ) -> (Finset.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} (_inst_2 : _inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)) [σ : Fintype.{u3} Λ], (Finset.{u2} _inst_1) -> (Finset.{max (max u3 u2) u1} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to0.tr_stmts Turing.TM1to0.trStmtsₓ'. -/
/- ./././Mathport/Syntax/Translate/Expr.lean:177:8: unsupported: ambiguous notation -/
/-- Given a finite set of accessible `Λ` machine states, there is a finite set of accessible
machine states in the target (even though the type `Λ'` is infinite). -/
@@ -2109,12 +1770,6 @@ open Classical
attribute [local simp] TM1.stmts₁_self
-/- warning: turing.TM1to0.tr_supports -> Turing.TM1to0.tr_supports is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) [_inst_4 : Fintype.{u3} σ] {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (Turing.TM0.Supports.{u1, max (max u1 u2 u3) u3} Γ _inst_1 (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) (Turing.TM1to0.Λ'.inhabited.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) (Turing.TM1to0.tr.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M) ((fun (a : Type.{max (max u1 u2 u3) u3}) (b : Type.{max (max u1 u2 u3) u3}) [self : HasLiftT.{succ (max (max u1 u2 u3) u3), succ (max (max u1 u2 u3) u3)} a b] => self.0) (Finset.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)) (Set.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)) (HasLiftT.mk.{succ (max (max u1 u2 u3) u3), succ (max (max u1 u2 u3) u3)} (Finset.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)) (Set.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)) (CoeTCₓ.coe.{succ (max (max u1 u2 u3) u3), succ (max (max u1 u2 u3) u3)} (Finset.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)) (Set.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)) (Finset.Set.hasCoeT.{max (max u1 u2 u3) u3} (Turing.TM1to0.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M)))) (Turing.TM1to0.trStmts.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M _inst_4 S)))
-but is expected to have type
- forall {Γ : Type.{u2}} {_inst_1 : Type.{u3}} [Λ : Inhabited.{succ u3} _inst_1] {_inst_2 : Type.{u1}} [σ : Inhabited.{succ u1} _inst_2] (_inst_3 : _inst_1 -> (Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 _inst_2)) [M : Fintype.{u1} _inst_2] {_inst_4 : Finset.{u3} _inst_1}, (Turing.TM1.Supports.{u2, u3, u1} Γ _inst_1 _inst_2 Λ _inst_3 _inst_4) -> (Turing.TM0.Supports.{u2, max (max u2 u3) u1} Γ (Turing.TM1to0.Λ'.{u2, u3, u1} Γ _inst_1 _inst_2 _inst_3) (Turing.TM1to0.instInhabitedΛ'.{u2, u3, u1} Γ _inst_1 Λ _inst_2 σ _inst_3) (Turing.TM1to0.tr.{u2, u3, u1} Γ _inst_1 Λ _inst_2 σ _inst_3) (Finset.toSet.{max (max u2 u3) u1} (Turing.TM1to0.Λ'.{u2, u3, u1} Γ _inst_1 _inst_2 _inst_3) (Turing.TM1to0.trStmts.{u2, u3, u1} Γ _inst_1 _inst_2 _inst_3 M _inst_4)))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to0.tr_supports Turing.TM1to0.tr_supportsₓ'. -/
theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr ↑(tr_stmts S) :=
⟨Finset.mem_product.2
⟨Finset.some_mem_insertNone.2 (Finset.mem_biUnion.2 ⟨_, ss.1, TM1.stmts₁_self⟩),
@@ -2218,12 +1873,6 @@ local notation "stmt₁" => Stmt Γ Λ σ
-- mathport name: exprcfg₁
local notation "cfg₁" => Cfg Γ Λ σ
-/- warning: turing.TM1to1.Λ' -> Turing.TM1to1.Λ' is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ], Type.{max u1 u2 u3}
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}}, Sort.{max (max (succ u1) (succ u2)) (succ u3)}
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.Λ' Turing.TM1to1.Λ'ₓ'. -/
/-- The configuration state of the TM. -/
inductive Λ' : Type max u_1 u_2 u_3
| normal : Λ → Λ'
@@ -2239,12 +1888,6 @@ local notation "stmt'" => Stmt Bool Λ' σ
-- mathport name: exprcfg'
local notation "cfg'" => Cfg Bool Λ' σ
-/- warning: turing.TM1to1.read_aux -> Turing.TM1to1.readAux is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] (n : Nat), ((Vector.{0} Bool n) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} (_inst_2 : Nat), ((Vector.{0} Bool _inst_2) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.read_aux Turing.TM1to1.readAuxₓ'. -/
/-- Read a vector of length `n` from the tape. -/
def readAux : ∀ n, (Vector Bool n → stmt') → stmt'
| 0, f => f Vector.nil
@@ -2255,47 +1898,23 @@ def readAux : ∀ n, (Vector Bool n → stmt') → stmt'
parameter {n : ℕ}(enc : Γ → Vector Bool n)(dec : Vector Bool n → Γ)
-/- warning: turing.TM1to1.move -> Turing.TM1to1.move is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat}, Turing.Dir -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Nat}, Turing.Dir -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.move Turing.TM1to1.moveₓ'. -/
/-- A move left or right corresponds to `n` moves across the super-cell. -/
def move (d : Dir) (q : stmt') : stmt' :=
(Stmt.move d^[n]) q
#align turing.TM1to1.move Turing.TM1to1.move
-/- warning: turing.TM1to1.read -> Turing.TM1to1.read is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat}, ((Vector.{0} Bool n) -> Γ) -> (Γ -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Nat}, ((Vector.{0} Bool _inst_2) -> Γ) -> (Γ -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.read Turing.TM1to1.readₓ'. -/
/-- To read a symbol from the tape, we use `read_aux` to traverse the symbol,
then return to the original position with `n` moves to the left. -/
def read (f : Γ → stmt') : stmt' :=
read_aux n fun v => move Dir.left <| f (dec v)
#align turing.TM1to1.read Turing.TM1to1.read
-/- warning: turing.TM1to1.write -> Turing.TM1to1.write is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ], (List.{0} Bool) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}}, (List.{0} Bool) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.write Turing.TM1to1.writeₓ'. -/
/-- Write a list of bools on the tape. -/
def write : List Bool → stmt' → stmt'
| [], q => q
| a :: l, q => (Stmt.write fun _ _ => a) <| Stmt.move Dir.right <| write l q
#align turing.TM1to1.write Turing.TM1to1.write
-/- warning: turing.TM1to1.tr_normal -> Turing.TM1to1.trNormal is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat}, ((Vector.{0} Bool n) -> Γ) -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Nat}, ((Vector.{0} Bool _inst_2) -> Γ) -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr_normal Turing.TM1to1.trNormalₓ'. -/
/-- Translate a normal instruction. For the `write` command, we use a `goto` indirection so that
we can access the current value of the tape. -/
def trNormal : stmt₁ → stmt'
@@ -2308,12 +1927,6 @@ def trNormal : stmt₁ → stmt'
| stmt.halt => Stmt.halt
#align turing.TM1to1.tr_normal Turing.TM1to1.trNormal
-/- warning: turing.TM1to1.step_aux_move -> Turing.TM1to1.stepAux_move is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} (d : Turing.Dir) (q : Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) (v : σ) (T : Turing.Tape.{0} Bool Bool.inhabited), Eq.{max 1 (succ (max u1 u2 u3)) (succ u3)} (Turing.TM1.Cfg.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) (Turing.TM1.stepAux.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ (Turing.TM1to1.move.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 n d q) v T) (Turing.TM1.stepAux.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ q v (Nat.iterate.{1} (Turing.Tape.{0} Bool Bool.inhabited) (Turing.Tape.move.{0} Bool Bool.inhabited d) n T))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Nat} (σ : Turing.Dir) (_inst_3 : Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ) (n : Λ) (d : Turing.Tape.{0} Bool instInhabitedBool), Eq.{max (max (succ u1) (succ u2)) (succ u3)} (Turing.TM1.Cfg.{0, max (max u1 u2) u3, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ) (Turing.TM1.stepAux.{0, max (max u1 u2) u3, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ (Turing.TM1to1.move.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) n d) (Turing.TM1.stepAux.{0, max (max u1 u2) u3, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ _inst_3 n (Nat.iterate.{1} (Turing.Tape.{0} Bool instInhabitedBool) (Turing.Tape.move.{0} Bool instInhabitedBool σ) _inst_2 d))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.step_aux_move Turing.TM1to1.stepAux_moveₓ'. -/
theorem stepAux_move (d q v T) : stepAux (move d q) v T = stepAux q v ((Tape.move d^[n]) T) :=
by
suffices : ∀ i, step_aux ((stmt.move d^[i]) q) v T = step_aux q v ((tape.move d^[i]) T)
@@ -2322,34 +1935,16 @@ theorem stepAux_move (d q v T) : stepAux (move d q) v T = stepAux q v ((Tape.mov
rw [iterate_succ', step_aux, IH, iterate_succ]
#align turing.TM1to1.step_aux_move Turing.TM1to1.stepAux_move
-/- warning: turing.TM1to1.supports_stmt_move -> Turing.TM1to1.supportsStmt_move is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} {S : Finset.{max u1 u2 u3} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3)} {d : Turing.Dir} {q : Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ}, Eq.{1} Prop (Turing.TM1.SupportsStmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ S (Turing.TM1to1.move.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 n d q)) (Turing.TM1.SupportsStmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ S q)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Nat} {σ : Finset.{max (max u3 u2) u1} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ)} {_inst_3 : Turing.Dir} {n : Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ}, Eq.{1} Prop (Turing.TM1.SupportsStmt.{0, max (max u1 u2) u3, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ σ (Turing.TM1to1.move.{u1, u2, u3} Γ _inst_1 Λ _inst_2 _inst_3 n)) (Turing.TM1.SupportsStmt.{0, max (max u1 u2) u3, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ σ n)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.supports_stmt_move Turing.TM1to1.supportsStmt_moveₓ'. -/
theorem supportsStmt_move {S d q} : SupportsStmt S (move d q) = SupportsStmt S q :=
by
suffices ∀ {i}, SupportsStmt S ((Stmt.move d^[i]) q) = _ from this
intro <;> induction i generalizing q <;> simp only [*, iterate] <;> rfl
#align turing.TM1to1.supports_stmt_move Turing.TM1to1.supportsStmt_move
-/- warning: turing.TM1to1.supports_stmt_write -> Turing.TM1to1.supportsStmt_write is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {S : Finset.{max u1 u2 u3} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3)} {l : List.{0} Bool} {q : Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ}, Eq.{1} Prop (Turing.TM1.SupportsStmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ S (Turing.TM1to1.write.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 l q)) (Turing.TM1.SupportsStmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ S q)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Finset.{max (max u3 u2) u1} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ)} {σ : List.{0} Bool} {_inst_3 : Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ}, Eq.{1} Prop (Turing.TM1.SupportsStmt.{0, max (max u1 u2) u3, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ _inst_2 (Turing.TM1to1.write.{u1, u2, u3} Γ _inst_1 Λ σ _inst_3)) (Turing.TM1.SupportsStmt.{0, max (max u1 u2) u3, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ _inst_2 _inst_3)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.supports_stmt_write Turing.TM1to1.supportsStmt_writeₓ'. -/
theorem supportsStmt_write {S l q} : SupportsStmt S (write l q) = SupportsStmt S q := by
induction' l with a l IH <;> simp only [write, supports_stmt, *]
#align turing.TM1to1.supports_stmt_write Turing.TM1to1.supportsStmt_write
-/- warning: turing.TM1to1.supports_stmt_read -> Turing.TM1to1.supportsStmt_read is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} (dec : (Vector.{0} Bool n) -> Γ) {S : Finset.{max u1 u2 u3} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3)} {f : Γ -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)}, (forall (a : Γ), Turing.TM1.SupportsStmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ S (f a)) -> (Turing.TM1.SupportsStmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ S (Turing.TM1to1.read.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 n dec f))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Nat} (σ : (Vector.{0} Bool _inst_2) -> Γ) {_inst_3 : Finset.{max (max u3 u2) u1} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ)} {n : Γ -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)}, (forall (ᾰ : Γ), Turing.TM1.SupportsStmt.{0, max (max u1 u2) u3, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ _inst_3 (n ᾰ)) -> (Turing.TM1.SupportsStmt.{0, max (max u1 u2) u3, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ _inst_3 (Turing.TM1to1.read.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ n))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.supports_stmt_read Turing.TM1to1.supportsStmt_readₓ'. -/
theorem supportsStmt_read {S} :
∀ {f : Γ → stmt'}, (∀ a, SupportsStmt S (f a)) → SupportsStmt S (read f) :=
suffices
@@ -2395,24 +1990,12 @@ end
parameter (M : Λ → stmt₁)
-/- warning: turing.TM1to1.tr -> Turing.TM1to1.tr is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat}, (Γ -> (Vector.{0} Bool n)) -> ((Vector.{0} Bool n) -> Γ) -> (Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) -> (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Nat}, (Γ -> (Vector.{0} Bool _inst_2)) -> ((Vector.{0} Bool _inst_2) -> Γ) -> (_inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)) -> (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ) Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr Turing.TM1to1.trₓ'. -/
/-- The top level program. -/
def tr : Λ' → stmt'
| Λ'.normal l => tr_normal (M l)
| Λ'.write a q => write (enc a).toList <| move Dir.left <| tr_normal q
#align turing.TM1to1.tr Turing.TM1to1.tr
-/- warning: turing.TM1to1.tr_cfg -> Turing.TM1to1.trCfg is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} {enc : Γ -> (Vector.{0} Bool n)}, (Eq.{1} (Vector.{0} Bool n) (enc (Inhabited.default.{succ u1} Γ _inst_1)) (Vector.replicate.{0} Bool n Bool.false)) -> (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) -> (Turing.TM1.Cfg.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {_inst_2 : Type.{u3}} {σ : Nat} (_inst_3 : Γ -> (Vector.{0} Bool σ)), (Eq.{1} (Vector.{0} Bool σ) (_inst_3 (Inhabited.default.{succ u1} Γ _inst_1)) (Vector.replicate.{0} Bool σ Bool.false)) -> (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ _inst_2) -> (Turing.TM1.Cfg.{0, max (max u3 u2) u1, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2)
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr_cfg Turing.TM1to1.trCfgₓ'. -/
/-- The machine configuration translation. -/
def trCfg : cfg₁ → cfg'
| ⟨l, v, T⟩ => ⟨l.map Λ'.normal, v, tr_tape T⟩
@@ -2457,12 +2040,6 @@ theorem trTape'_move_right (L R) :
#align turing.TM1to1.tr_tape'_move_right Turing.TM1to1.trTape'_move_right
-/
-/- warning: turing.TM1to1.step_aux_write -> Turing.TM1to1.stepAux_write is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} {enc : Γ -> (Vector.{0} Bool n)} (enc0 : Eq.{1} (Vector.{0} Bool n) (enc (Inhabited.default.{succ u1} Γ _inst_1)) (Vector.replicate.{0} Bool n Bool.false)) (q : Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) (v : σ) (a : Γ) (b : Γ) (L : Turing.ListBlank.{u1} Γ _inst_1) (R : Turing.ListBlank.{u1} Γ _inst_1), Eq.{max 1 (succ (max u1 u2 u3)) (succ u3)} (Turing.TM1.Cfg.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) (Turing.TM1.stepAux.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ (Turing.TM1to1.write.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 (Vector.toList.{0} Bool n (enc a)) q) v (Turing.TM1to1.trTape'.{u1} Γ _inst_1 n enc enc0 L (Turing.ListBlank.cons.{u1} Γ _inst_1 b R))) (Turing.TM1.stepAux.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ q v (Turing.TM1to1.trTape'.{u1} Γ _inst_1 n enc enc0 (Turing.ListBlank.cons.{u1} Γ _inst_1 a L) R))
-but is expected to have type
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {_inst_2 : Type.{u3}} {σ : Nat} {_inst_3 : Γ -> (Vector.{0} Bool σ)} (n : Eq.{1} (Vector.{0} Bool σ) (_inst_3 (Inhabited.default.{succ u1} Γ _inst_1)) (Vector.replicate.{0} Bool σ Bool.false)) (enc : Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2) (enc0 : _inst_2) (q : Γ) (v : Γ) (a : Turing.ListBlank.{u1} Γ _inst_1) (b : Turing.ListBlank.{u1} Γ _inst_1), Eq.{max (max (succ u1) (succ u2)) (succ u3)} (Turing.TM1.Cfg.{0, max (max u3 u2) u1, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2) (Turing.TM1.stepAux.{0, max (max u3 u2) u1, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2 (Turing.TM1to1.write.{u1, u2, u3} Γ Λ _inst_2 (Vector.toList.{0} Bool σ (_inst_3 q)) enc) enc0 (Turing.TM1to1.trTape'.{u1} Γ _inst_1 σ _inst_3 n a (Turing.ListBlank.cons.{u1} Γ _inst_1 v b))) (Turing.TM1.stepAux.{0, max (max u1 u2) u3, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2 enc enc0 (Turing.TM1to1.trTape'.{u1} Γ _inst_1 σ _inst_3 n (Turing.ListBlank.cons.{u1} Γ _inst_1 q a) b))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.step_aux_write Turing.TM1to1.stepAux_writeₓ'. -/
theorem stepAux_write (q v a b L R) :
stepAux (write (enc a).toList q) v (tr_tape' L (ListBlank.cons b R)) =
stepAux q v (tr_tape' (ListBlank.cons a L) R) :=
@@ -2487,12 +2064,6 @@ parameter (encdec : ∀ a, dec (enc a) = a)
include encdec
-/- warning: turing.TM1to1.step_aux_read -> Turing.TM1to1.stepAux_read is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} {enc : Γ -> (Vector.{0} Bool n)} (dec : (Vector.{0} Bool n) -> Γ) (enc0 : Eq.{1} (Vector.{0} Bool n) (enc (Inhabited.default.{succ u1} Γ _inst_1)) (Vector.replicate.{0} Bool n Bool.false)), (forall (a : Γ), Eq.{succ u1} Γ (dec (enc a)) a) -> (forall (f : Γ -> (Turing.TM1.Stmt.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ)) (v : σ) (L : Turing.ListBlank.{u1} Γ _inst_1) (R : Turing.ListBlank.{u1} Γ _inst_1), Eq.{max 1 (succ (max u1 u2 u3)) (succ u3)} (Turing.TM1.Cfg.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) (Turing.TM1.stepAux.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ (Turing.TM1to1.read.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 n dec f) v (Turing.TM1to1.trTape'.{u1} Γ _inst_1 n enc enc0 L R)) (Turing.TM1.stepAux.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ (f (Turing.ListBlank.head.{u1} Γ _inst_1 R)) v (Turing.TM1to1.trTape'.{u1} Γ _inst_1 n enc enc0 L R)))
-but is expected to have type
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {_inst_2 : Type.{u3}} {σ : Nat} {_inst_3 : Γ -> (Vector.{0} Bool σ)} (n : (Vector.{0} Bool σ) -> Γ) (enc : Eq.{1} (Vector.{0} Bool σ) (_inst_3 (Inhabited.default.{succ u1} Γ _inst_1)) (Vector.replicate.{0} Bool σ Bool.false)), (forall (ᾰ : Γ), Eq.{succ u1} Γ (n (_inst_3 ᾰ)) ᾰ) -> (forall (enc0 : Γ -> (Turing.TM1.Stmt.{0, max (max u3 u2) u1, u3} Bool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2)) (encdec : _inst_2) (f : Turing.ListBlank.{u1} Γ _inst_1) (v : Turing.ListBlank.{u1} Γ _inst_1), Eq.{max (max (succ u1) (succ u2)) (succ u3)} (Turing.TM1.Cfg.{0, max (max u3 u2) u1, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2) (Turing.TM1.stepAux.{0, max (max u3 u2) u1, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2 (Turing.TM1to1.read.{u1, u2, u3} Γ Λ _inst_2 σ n enc0) encdec (Turing.TM1to1.trTape'.{u1} Γ _inst_1 σ _inst_3 enc f v)) (Turing.TM1.stepAux.{0, max (max u1 u2) u3, u3} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u1, u2, u3} Γ Λ _inst_2) _inst_2 (enc0 (Turing.ListBlank.head.{u1} Γ _inst_1 v)) encdec (Turing.TM1to1.trTape'.{u1} Γ _inst_1 σ _inst_3 enc f v)))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.step_aux_read Turing.TM1to1.stepAux_readₓ'. -/
theorem stepAux_read (f v L R) :
stepAux (read f) v (tr_tape' L R) = stepAux (f R.headI) v (tr_tape' L R) :=
by
@@ -2520,12 +2091,6 @@ theorem stepAux_read (f v L R) :
rw [← list_blank.append, IH]; rfl
#align turing.TM1to1.step_aux_read Turing.TM1to1.stepAux_read
-/- warning: turing.TM1to1.tr_respects -> Turing.TM1to1.tr_respects is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} {enc : Γ -> (Vector.{0} Bool n)} (dec : (Vector.{0} Bool n) -> Γ) (enc0 : Eq.{1} (Vector.{0} Bool n) (enc (Inhabited.default.{succ u1} Γ _inst_1)) (Vector.replicate.{0} Bool n Bool.false)) (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)), (forall (a : Γ), Eq.{succ u1} Γ (dec (enc a)) a) -> (Turing.Respects.{max u1 u2 u3, max (max u1 u2 u3) u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) (Turing.TM1.Cfg.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) (Turing.TM1.step.{u1, u2, u3} Γ _inst_1 Λ σ M) (Turing.TM1.step.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ (Turing.TM1to1.tr.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 n enc dec M)) (fun (c₁ : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) (c₂ : Turing.TM1.Cfg.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) => Eq.{max 1 (succ (max u1 u2 u3)) (succ u3)} (Turing.TM1.Cfg.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ) (Turing.TM1to1.trCfg.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 n enc enc0 c₁) c₂))
-but is expected to have type
- forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u1}} {_inst_2 : Type.{u2}} {σ : Nat} {_inst_3 : Γ -> (Vector.{0} Bool σ)} (n : (Vector.{0} Bool σ) -> Γ), (Eq.{1} (Vector.{0} Bool σ) (_inst_3 (Inhabited.default.{succ u3} Γ _inst_1)) (Vector.replicate.{0} Bool σ Bool.false)) -> (forall (dec : Λ -> (Turing.TM1.Stmt.{u3, u1, u2} Γ Λ _inst_2)), (forall (a : Γ), Eq.{succ u3} Γ (n (_inst_3 a)) a) -> (forall {M : Eq.{1} (Vector.{0} Bool σ) (_inst_3 (Inhabited.default.{succ u3} Γ _inst_1)) (Vector.replicate.{0} Bool σ Bool.false)}, Turing.Respects.{max (max u2 u1) u3, max u2 (max u2 u1) u3} (Turing.TM1.Cfg.{u3, u1, u2} Γ _inst_1 Λ _inst_2) (Turing.TM1.Cfg.{0, max (max u2 u1) u3, u2} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u3, u1, u2} Γ Λ _inst_2) _inst_2) (Turing.TM1.step.{u3, u1, u2} Γ _inst_1 Λ _inst_2 dec) (Turing.TM1.step.{0, max (max u2 u1) u3, u2} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u3, u1, u2} Γ Λ _inst_2) _inst_2 (Turing.TM1to1.tr.{u3, u1, u2} Γ Λ _inst_2 σ _inst_3 n dec)) (fun (c₁ : Turing.TM1.Cfg.{u3, u1, u2} Γ _inst_1 Λ _inst_2) (c₂ : Turing.TM1.Cfg.{0, max (max u2 u1) u3, u2} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u3, u1, u2} Γ Λ _inst_2) _inst_2) => Eq.{max (max (succ u3) (succ u1)) (succ u2)} (Turing.TM1.Cfg.{0, max (max u2 u1) u3, u2} Bool instInhabitedBool (Turing.TM1to1.Λ'.{u3, u1, u2} Γ Λ _inst_2) _inst_2) (Turing.TM1to1.trCfg.{u3, u1, u2} Γ _inst_1 Λ _inst_2 σ _inst_3 M c₁) c₂)))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr_respects Turing.TM1to1.tr_respectsₓ'. -/
theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ = c₂ :=
fun_respects.2 fun ⟨l₁, v, T⟩ =>
by
@@ -2576,12 +2141,6 @@ open Classical
parameter [Fintype Γ]
-/- warning: turing.TM1to1.writes -> Turing.TM1to1.writes is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] [_inst_4 : Fintype.{u1} Γ], (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ) -> (Finset.{max u1 u2 u3} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Fintype.{u1} Γ], (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ) -> (Finset.{max (max u3 u2) u1} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.writes Turing.TM1to1.writesₓ'. -/
/-- The set of accessible `Λ'.write` machine states. -/
noncomputable def writes : stmt₁ → Finset Λ'
| stmt.move d q => writes q
@@ -2592,24 +2151,12 @@ noncomputable def writes : stmt₁ → Finset Λ'
| stmt.halt => ∅
#align turing.TM1to1.writes Turing.TM1to1.writes
-/- warning: turing.TM1to1.tr_supp -> Turing.TM1to1.trSupp is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ], (Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) -> (forall [_inst_4 : Fintype.{u1} Γ], (Finset.{u2} Λ) -> (Finset.{max u1 u2 u3} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3)))
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} {Λ : Type.{u3}}, (_inst_1 -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ)) -> (forall [σ : Fintype.{u1} Γ], (Finset.{u2} _inst_1) -> (Finset.{max (max u3 u2) u1} (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ)))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr_supp Turing.TM1to1.trSuppₓ'. -/
/-- The set of accessible machine states, assuming that the input machine is supported on `S`,
are the normal states embedded from `S`, plus all write states accessible from these states. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ' :=
S.biUnion fun l => insert (Λ'.normal l) (writes (M l))
#align turing.TM1to1.tr_supp Turing.TM1to1.trSupp
-/- warning: turing.TM1to1.tr_supports -> Turing.TM1to1.tr_supports is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {n : Nat} {enc : Γ -> (Vector.{0} Bool n)} (dec : (Vector.{0} Bool n) -> Γ) (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) [_inst_4 : Fintype.{u1} Γ] {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (Turing.TM1.Supports.{0, max u1 u2 u3, u3} Bool Bool.inhabited (Turing.TM1to1.Λ'.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) σ (Turing.TM1to1.Λ'.inhabited.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3) (Turing.TM1to1.tr.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 n enc dec M) (Turing.TM1to1.trSupp.{u1, u2, u3} Γ _inst_1 Λ _inst_2 σ _inst_3 M _inst_4 S))
-but is expected to have type
- forall {Γ : Type.{u2}} {_inst_1 : Type.{u3}} [Λ : Inhabited.{succ u3} _inst_1] {_inst_2 : Type.{u1}} {σ : Nat} {_inst_3 : Γ -> (Vector.{0} Bool σ)} (n : (Vector.{0} Bool σ) -> Γ) (enc : _inst_1 -> (Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 _inst_2)) [dec : Fintype.{u2} Γ] {M : Finset.{u3} _inst_1}, (Turing.TM1.Supports.{u2, u3, u1} Γ _inst_1 _inst_2 Λ enc M) -> (Turing.TM1.Supports.{0, max (max u1 u3) u2, u1} Bool (Turing.TM1to1.Λ'.{u2, u3, u1} Γ _inst_1 _inst_2) _inst_2 (Turing.TM1to1.instInhabitedΛ'.{u2, u3, u1} Γ _inst_1 Λ _inst_2) (Turing.TM1to1.tr.{u2, u3, u1} Γ _inst_1 _inst_2 σ _inst_3 n enc) (Turing.TM1to1.trSupp.{u2, u3, u1} Γ _inst_1 _inst_2 enc dec M))
-Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr_supports Turing.TM1to1.tr_supportsₓ'. -/
theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert_self _ _⟩, fun q h =>
by
@@ -2685,12 +2232,6 @@ parameter {Γ : Type _}[Inhabited Γ]
parameter {Λ : Type _}[Inhabited Λ]
-/- warning: turing.TM0to1.Λ' -> Turing.TM0to1.Λ' is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ], Sort.{max (succ u1) (succ u2)}
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}}, Sort.{max (succ u1) (succ u2)}
-Case conversion may be inaccurate. Consider using '#align turing.TM0to1.Λ' Turing.TM0to1.Λ'ₓ'. -/
/-- The machine states for a TM1 emulating a TM0 machine. States of the TM0 machine are embedded
as `normal q` states, but the actual operation is split into two parts, a jump to `act s q`
followed by the action and a jump to the next `normal` state. -/
@@ -2715,12 +2256,6 @@ parameter (M : TM0.Machine Γ Λ)
open TM1.Stmt
-/- warning: turing.TM0to1.tr -> Turing.TM0to1.tr is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ], (Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ _inst_2) -> (Turing.TM0to1.Λ'.{u1, u2} Γ _inst_1 Λ _inst_2) -> (Turing.TM1.Stmt.{u1, max u1 u2, 0} Γ _inst_1 (Turing.TM0to1.Λ'.{u1, u2} Γ _inst_1 Λ _inst_2) Unit)
-but is expected to have type
- forall {Γ : Type.{u1}} {_inst_1 : Type.{u2}} [Λ : Inhabited.{succ u2} _inst_1], (Turing.TM0.Machine.{u1, u2} Γ _inst_1 Λ) -> (Turing.TM0to1.Λ'.{u1, u2} Γ _inst_1) -> (Turing.TM1.Stmt.{u1, max u2 u1, 0} Γ (Turing.TM0to1.Λ'.{u1, u2} Γ _inst_1) Unit)
-Case conversion may be inaccurate. Consider using '#align turing.TM0to1.tr Turing.TM0to1.trₓ'. -/
/-- The program. -/
def tr : Λ' → stmt₁
| Λ'.normal q =>
@@ -2812,12 +2347,6 @@ parameter (Λ : Type _)
-- Type of function labels
parameter (σ : Type _)
-/- warning: turing.TM2.stmt -> Turing.TM2.Stmt is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K], (K -> Type.{u2}) -> Type.{u3} -> Type.{u4} -> Sort.{max (succ u1) (succ u2) (succ u3) (succ u4)}
-but is expected to have type
- forall {K : Type.{u1}}, (K -> Type.{u2}) -> Type.{u3} -> Type.{u4} -> Sort.{max (max (max (succ u1) (succ u2)) (succ u3)) (succ u4)}
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmt Turing.TM2.Stmtₓ'. -/
-- Type of variable settings
/-- The TM2 model removes the tape entirely from the TM1 model,
replacing it with an arbitrary (finite) collection of stacks.
@@ -2837,22 +2366,10 @@ inductive Stmt
open Stmt
-/- warning: turing.TM2.stmt.inhabited -> Turing.TM2.Stmt.inhabited is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] (Γ : K -> Type.{u2}) (Λ : Type.{u3}) (σ : Type.{u4}), Inhabited.{max (succ u1) (succ u2) (succ u3) (succ u4)} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)
-but is expected to have type
- forall {K : Type.{u1}} (_inst_1 : K -> Type.{u2}) (Γ : Type.{u3}) (Λ : Type.{u4}), Inhabited.{max (max (max (succ u4) (succ u3)) (succ u2)) (succ u1)} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmt.inhabited Turing.TM2.Stmt.inhabitedₓ'. -/
instance Stmt.inhabited : Inhabited stmt :=
⟨halt⟩
#align turing.TM2.stmt.inhabited Turing.TM2.Stmt.inhabited
-/- warning: turing.TM2.cfg -> Turing.TM2.Cfg is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K], (K -> Type.{u2}) -> Type.{u3} -> Type.{u4} -> Sort.{max (succ u1) (succ u2) (succ u3) (succ u4)}
-but is expected to have type
- forall {K : Type.{u1}}, (K -> Type.{u2}) -> Type.{u3} -> Type.{u4} -> Sort.{max (max (max (succ u1) (succ u2)) (succ u3)) (succ u4)}
-Case conversion may be inaccurate. Consider using '#align turing.TM2.cfg Turing.TM2.Cfgₓ'. -/
/-- A configuration in the TM2 model is a label (or `none` for the halt state), the state of
local variables, and the stacks. (Note that the stacks are not `list_blank`s, they have a definite
size.) -/
@@ -2862,12 +2379,6 @@ structure Cfg where
stk : ∀ k, List (Γ k)
#align turing.TM2.cfg Turing.TM2.Cfg
-/- warning: turing.TM2.cfg.inhabited -> Turing.TM2.Cfg.inhabited is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] (Γ : K -> Type.{u2}) (Λ : Type.{u3}) (σ : Type.{u4}) [_inst_2 : Inhabited.{succ u4} σ], Inhabited.{max (succ u1) (succ u2) (succ u3) (succ u4)} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)
-but is expected to have type
- forall {K : Type.{u1}} (_inst_1 : K -> Type.{u2}) (Γ : Type.{u3}) (Λ : Type.{u4}) [σ : Inhabited.{succ u4} Λ], Inhabited.{max (max (max (succ u4) (succ u3)) (succ u2)) (succ u1)} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM2.cfg.inhabited Turing.TM2.Cfg.inhabitedₓ'. -/
instance Cfg.inhabited [Inhabited σ] : Inhabited cfg :=
⟨⟨default, default, default⟩⟩
#align turing.TM2.cfg.inhabited Turing.TM2.Cfg.inhabited
@@ -2904,12 +2415,6 @@ def Reaches (M : Λ → stmt) : cfg → cfg → Prop :=
#align turing.TM2.reaches Turing.TM2.Reaches
-/
-/- warning: turing.TM2.supports_stmt -> Turing.TM2.SupportsStmt is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}}, (Finset.{u3} Λ) -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) -> Prop
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, (Finset.{u3} Γ) -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ) -> Prop
-Case conversion may be inaccurate. Consider using '#align turing.TM2.supports_stmt Turing.TM2.SupportsStmtₓ'. -/
/-- Given a set `S` of states, `support_stmt S q` means that `q` only jumps to states in `S`. -/
def SupportsStmt (S : Finset Λ) : stmt → Prop
| push k f q => supports_stmt q
@@ -2923,12 +2428,6 @@ def SupportsStmt (S : Finset Λ) : stmt → Prop
open Classical
-/- warning: turing.TM2.stmts₁ -> Turing.TM2.stmts₁ is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}}, (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) -> (Finset.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ))
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ) -> (Finset.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ))
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts₁ Turing.TM2.stmts₁ₓ'. -/
/-- The set of subtree statements in a statement. -/
noncomputable def stmts₁ : stmt → Finset stmt
| Q@(push k f q) => insert Q (stmts₁ q)
@@ -2940,22 +2439,10 @@ noncomputable def stmts₁ : stmt → Finset stmt
| Q@halt => {Q}
#align turing.TM2.stmts₁ Turing.TM2.stmts₁
-/- warning: turing.TM2.stmts₁_self -> Turing.TM2.stmts₁_self is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} {q : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Finset.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) q (Turing.TM2.stmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ σ q)
-but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u2}} {Λ : Type.{u1}} {σ : Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ}, Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ) (Finset.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Finset.instMembershipFinset.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) σ (Turing.TM2.stmts₁.{u4, u3, u2, u1} K _inst_1 Γ Λ σ)
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts₁_self Turing.TM2.stmts₁_selfₓ'. -/
theorem stmts₁_self {q} : q ∈ stmts₁ q := by
cases q <;> apply_rules [Finset.mem_insert_self, Finset.mem_singleton_self]
#align turing.TM2.stmts₁_self Turing.TM2.stmts₁_self
-/- warning: turing.TM2.stmts₁_trans -> Turing.TM2.stmts₁_trans is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} {q₁ : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {q₂ : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Finset.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) q₁ (Turing.TM2.stmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ σ q₂)) -> (HasSubset.Subset.{max u1 u2 u3 u4} (Finset.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.hasSubset.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Turing.TM2.stmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ σ q₁) (Turing.TM2.stmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ σ q₂))
-but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u2}} {Λ : Type.{u1}} {σ : Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ} {q₁ : Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ) (Finset.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Finset.instMembershipFinset.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) σ (Turing.TM2.stmts₁.{u4, u3, u2, u1} K _inst_1 Γ Λ q₁)) -> (HasSubset.Subset.{max (max (max u1 u2) u3) u4} (Finset.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Finset.instHasSubsetFinset.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Turing.TM2.stmts₁.{u4, u3, u2, u1} K _inst_1 Γ Λ σ) (Turing.TM2.stmts₁.{u4, u3, u2, u1} K _inst_1 Γ Λ q₁))
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts₁_trans Turing.TM2.stmts₁_transₓ'. -/
theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ :=
by
intro h₁₂ q₀ h₀₁
@@ -2974,12 +2461,6 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
case halt => subst h₁₂; exact h₀₁
#align turing.TM2.stmts₁_trans Turing.TM2.stmts₁_trans
-/- warning: turing.TM2.stmts₁_supports_stmt_mono -> Turing.TM2.stmts₁_supportsStmt_mono is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} {S : Finset.{u3} Λ} {q₁ : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {q₂ : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Finset.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) q₁ (Turing.TM2.stmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ σ q₂)) -> (Turing.TM2.SupportsStmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ S q₂) -> (Turing.TM2.SupportsStmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ S q₁)
-but is expected to have type
- forall {K : Type.{u3}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u4}} {Λ : Type.{u1}} {σ : Finset.{u4} Γ} {S : Turing.TM2.Stmt.{u3, u2, u4, u1} K _inst_1 Γ Λ} {q₁ : Turing.TM2.Stmt.{u3, u2, u4, u1} K _inst_1 Γ Λ}, (Membership.mem.{max (max (max u3 u2) u4) u1, max (max (max u1 u4) u2) u3} (Turing.TM2.Stmt.{u3, u2, u4, u1} K _inst_1 Γ Λ) (Finset.{max (max (max u1 u4) u2) u3} (Turing.TM2.Stmt.{u3, u2, u4, u1} K _inst_1 Γ Λ)) (Finset.instMembershipFinset.{max (max (max u3 u2) u4) u1} (Turing.TM2.Stmt.{u3, u2, u4, u1} K _inst_1 Γ Λ)) S (Turing.TM2.stmts₁.{u3, u2, u4, u1} K _inst_1 Γ Λ q₁)) -> (Turing.TM2.SupportsStmt.{u3, u2, u4, u1} K _inst_1 Γ Λ σ q₁) -> (Turing.TM2.SupportsStmt.{u3, u2, u4, u1} K _inst_1 Γ Λ σ S)
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts₁_supports_stmt_mono Turing.TM2.stmts₁_supportsStmt_monoₓ'. -/
theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (hs : supports_stmt S q₂) :
supports_stmt S q₁ :=
by
@@ -2992,23 +2473,11 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
case halt => subst h; trivial
#align turing.TM2.stmts₁_supports_stmt_mono Turing.TM2.stmts₁_supportsStmt_mono
-/- warning: turing.TM2.stmts -> Turing.TM2.stmts is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}}, (Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) -> (Finset.{u3} Λ) -> (Finset.{max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)))
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, (Γ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ)) -> (Finset.{u3} Γ) -> (Finset.{max (max (max u4 u3) u2) u1} (Option.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ)))
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts Turing.TM2.stmtsₓ'. -/
/-- The set of statements accessible from initial set `S` of labels. -/
noncomputable def stmts (M : Λ → stmt) (S : Finset Λ) : Finset (Option stmt) :=
(S.biUnion fun q => stmts₁ (M q)).insertNone
#align turing.TM2.stmts Turing.TM2.stmts
-/- warning: turing.TM2.stmts_trans -> Turing.TM2.stmts_trans is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} {M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)} {S : Finset.{u3} Λ} {q₁ : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {q₂ : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Finset.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) q₁ (Turing.TM2.stmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ σ q₂)) -> (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.{max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ))) (Finset.hasMem.{max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ))) (Option.some.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) q₂) (Turing.TM2.stmts.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M S)) -> (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.{max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ))) (Finset.hasMem.{max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ))) (Option.some.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) q₁) (Turing.TM2.stmts.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M S))
-but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u2}} {Λ : Type.{u1}} {σ : Γ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)} {M : Finset.{u2} Γ} {S : Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ} {q₁ : Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ) (Finset.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Finset.instMembershipFinset.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) S (Turing.TM2.stmts₁.{u4, u3, u2, u1} K _inst_1 Γ Λ q₁)) -> (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Option.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Finset.{max (max (max u1 u2) u3) u4} (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ))) (Finset.instMembershipFinset.{max (max (max u4 u3) u2) u1} (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ))) (Option.some.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ) q₁) (Turing.TM2.stmts.{u4, u3, u2, u1} K _inst_1 Γ Λ σ M)) -> (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Option.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Finset.{max (max (max u1 u2) u3) u4} (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ))) (Finset.instMembershipFinset.{max (max (max u4 u3) u2) u1} (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ))) (Option.some.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ) S) (Turing.TM2.stmts.{u4, u3, u2, u1} K _inst_1 Γ Λ σ M))
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts_trans Turing.TM2.stmts_transₓ'. -/
theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
@@ -3018,24 +2487,12 @@ theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q
variable [Inhabited Λ]
-/- warning: turing.TM2.supports -> Turing.TM2.Supports is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} [_inst_2 : Inhabited.{succ u3} Λ], (Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) -> (Finset.{u3} Λ) -> Prop
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}} [σ : Inhabited.{succ u3} Γ], (Γ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ)) -> (Finset.{u3} Γ) -> Prop
-Case conversion may be inaccurate. Consider using '#align turing.TM2.supports Turing.TM2.Supportsₓ'. -/
/-- Given a TM2 machine `M` and a set `S` of states, `supports M S` means that all states in
`S` jump only to other states in `S`. -/
def Supports (M : Λ → stmt) (S : Finset Λ) :=
default ∈ S ∧ ∀ q ∈ S, supports_stmt S (M q)
#align turing.TM2.supports Turing.TM2.Supports
-/- warning: turing.TM2.stmts_supports_stmt -> Turing.TM2.stmts_supportsStmt is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} [_inst_2 : Inhabited.{succ u3} Λ] {M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)} {S : Finset.{u3} Λ} {q : Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Turing.TM2.Supports.{u1, u2, u3, u4} K _inst_1 Γ Λ σ _inst_2 M S) -> (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Finset.{max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ))) (Finset.hasMem.{max u1 u2 u3 u4} (Option.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ))) (Option.some.{max u1 u2 u3 u4} (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) q) (Turing.TM2.stmts.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M S)) -> (Turing.TM2.SupportsStmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ S q)
-but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u2}} {Λ : Type.{u1}} [σ : Inhabited.{succ u2} Γ] {_inst_2 : Γ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)} {M : Finset.{u2} Γ} {S : Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ}, (Turing.TM2.Supports.{u4, u3, u2, u1} K _inst_1 Γ Λ σ _inst_2 M) -> (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Option.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ)) (Finset.{max (max (max u1 u2) u3) u4} (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ))) (Finset.instMembershipFinset.{max (max (max u4 u3) u2) u1} (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ))) (Option.some.{max (max (max u4 u3) u2) u1} (Turing.TM2.Stmt.{u4, u3, u2, u1} K _inst_1 Γ Λ) S) (Turing.TM2.stmts.{u4, u3, u2, u1} K _inst_1 Γ Λ _inst_2 M)) -> (Turing.TM2.SupportsStmt.{u4, u3, u2, u1} K _inst_1 Γ Λ M S)
-Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts_supports_stmt Turing.TM2.stmts_supportsStmtₓ'. -/
theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
some q ∈ stmts M S → supports_stmt S q := by
simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
@@ -3043,9 +2500,6 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
exact fun l ls h => stmts₁_supports_stmt_mono h (ss.2 _ ls)
#align turing.TM2.stmts_supports_stmt Turing.TM2.stmts_supportsStmt
-/- warning: turing.TM2.step_supports -> Turing.TM2.step_supports is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM2.step_supports Turing.TM2.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
| ⟨some l₁, v, T⟩, c', h₁, h₂ =>
@@ -3123,12 +2577,6 @@ steps to run when emulated in TM1, where `m` is the length of the input.
namespace TM2to1
-/- warning: turing.TM2to1.stk_nth_val -> Turing.TM2to1.stk_nth_val is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} {Γ : K -> Type.{u2}} {L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))} {k : K} {S : List.{u2} (Γ k)} (n : Nat), (Eq.{succ u2} (Turing.ListBlank.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u2} (forall (i : K), Option.{u2} (Γ i)) (Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (i : K) => Option.{u2} (Γ i)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Option.inhabited.{u2} (Γ k)) (Turing.proj.{u1, u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)) k) L) (Turing.ListBlank.mk.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k)) (List.reverse.{u2} (Option.{u2} (Γ k)) (List.map.{u2, u2} (Γ k) (Option.{u2} (Γ k)) (Option.some.{u2} (Γ k)) S)))) -> (Eq.{succ u2} (Option.{u2} (Γ k)) (Turing.ListBlank.nth.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) L n k) (List.get?.{u2} (Γ k) (List.reverse.{u2} (Γ k) S) n))
-but is expected to have type
- forall {K : Type.{u2}} {Γ : K -> Type.{u1}} {L : Turing.ListBlank.{max u2 u1} (forall (k : K), Option.{u1} (Γ k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} (Γ k)) (fun (x : K) => instInhabitedOption.{u1} (Γ x)))} {k : K} {S : List.{u1} (Γ k)} (n : Nat), (Eq.{succ u1} (Turing.ListBlank.{u1} (Option.{u1} (Γ k)) (instInhabitedOption.{u1} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u1} (forall (i : K), Option.{u1} (Γ i)) (Option.{u1} (Γ k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (i : K) => Option.{u1} (Γ i)) (fun (x : K) => instInhabitedOption.{u1} (Γ x))) (instInhabitedOption.{u1} (Γ k)) (Turing.proj.{u2, u1} K (fun (k : K) => Option.{u1} (Γ k)) (fun (x : K) => instInhabitedOption.{u1} (Γ x)) k) L) (Turing.ListBlank.mk.{u1} (Option.{u1} (Γ k)) (instInhabitedOption.{u1} (Γ k)) (List.reverse.{u1} (Option.{u1} (Γ k)) (List.map.{u1, u1} (Γ k) (Option.{u1} (Γ k)) (Option.some.{u1} (Γ k)) S)))) -> (Eq.{succ u1} (Option.{u1} (Γ k)) (Turing.ListBlank.nth.{max u2 u1} (forall (k : K), Option.{u1} (Γ k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} (Γ k)) (fun (x : K) => instInhabitedOption.{u1} (Γ x))) L n k) (List.get?.{u1} (Γ k) (List.reverse.{u1} (Γ k) S) n))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.stk_nth_val Turing.TM2to1.stk_nth_valₓ'. -/
-- A displaced lemma proved in unnecessary generality
theorem stk_nth_val {K : Type _} {Γ : K → Type _} {L : ListBlank (∀ k, Option (Γ k))} {k S} (n)
(hL : ListBlank.map (proj k) L = ListBlank.mk (List.map some S).reverse) :
@@ -3155,12 +2603,6 @@ local notation "stmt₂" => TM2.Stmt Γ Λ σ
-- mathport name: exprcfg₂
local notation "cfg₂" => TM2.Cfg Γ Λ σ
-/- warning: turing.TM2to1.Γ' -> Turing.TM2to1.Γ' is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}}, Type.{max u1 u2}
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}}, Type.{max u1 u2}
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.Γ' Turing.TM2to1.Γ'ₓ'. -/
-- [decidable_eq K]: Because K is a parameter, we cannot easily skip
-- the decidable_eq assumption, and this is a local definition anyway so it's not important.
/-- The alphabet of the TM2 simulator on TM1 is a marker for the stack bottom,
@@ -3170,12 +2612,6 @@ def Γ' :=
Bool × ∀ k, Option (Γ k)
#align turing.TM2to1.Γ' Turing.TM2to1.Γ'
-/- warning: turing.TM2to1.Γ'.inhabited -> Turing.TM2to1.Γ'.inhabited is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}}, Inhabited.{succ (max u1 u2)} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ)
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}}, Inhabited.{max (succ u2) (succ u1)} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.Γ'.inhabited Turing.TM2to1.Γ'.inhabitedₓ'. -/
instance Γ'.inhabited : Inhabited Γ' :=
⟨⟨false, fun _ => none⟩⟩
#align turing.TM2to1.Γ'.inhabited Turing.TM2to1.Γ'.inhabited
@@ -3186,24 +2622,12 @@ instance Γ'.fintype [Fintype K] [∀ k, Fintype (Γ k)] : Fintype Γ' :=
#align turing.TM2to1.Γ'.fintype Turing.TM2to1.Γ'.fintype
-/
-/- warning: turing.TM2to1.add_bottom -> Turing.TM2to1.addBottom is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}}, (Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) -> (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}}, (Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (_inst_1 k)) (instInhabitedForAll_1.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u2} (_inst_1 a)))) -> (Turing.ListBlank.{max u2 u1} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.add_bottom Turing.TM2to1.addBottomₓ'. -/
/-- The bottom marker is fixed throughout the calculation, so we use the `add_bottom` function
to express the program state in terms of a tape with only the stacks themselves. -/
def addBottom (L : ListBlank (∀ k, Option (Γ k))) : ListBlank Γ' :=
ListBlank.cons (true, L.headI) (L.tail.map ⟨Prod.mk false, rfl⟩)
#align turing.TM2to1.add_bottom Turing.TM2to1.addBottom
-/- warning: turing.TM2to1.add_bottom_map -> Turing.TM2to1.addBottom_map is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} (L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))), Eq.{succ (max u1 u2)} (Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) (Turing.ListBlank.map.{max u1 u2, max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (forall (k : K), Option.{u2} (Γ k)) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Turing.PointedMap.mk.{max u1 u2, max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (forall (k : K), Option.{u2} (Γ k)) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Prod.snd.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k))) (rfl.{succ (max u1 u2)} (forall (k : K), Option.{u2} (Γ k)) (Prod.snd.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k)) (Inhabited.default.{succ (max u1 u2)} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L)) L
-but is expected to have type
- forall {K : Type.{u2}} {_inst_1 : K -> Type.{u1}} (Γ : Turing.ListBlank.{max u2 u1} (forall (k : K), Option.{u1} (_inst_1 k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u1} (_inst_1 a)))), Eq.{max (succ u2) (succ u1)} (Turing.ListBlank.{max u2 u1} (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} ((fun (k : K) => _inst_1 k) k)) (fun (a : K) => instInhabitedOption.{u1} ((fun (k : K) => _inst_1 k) a)))) (Turing.ListBlank.map.{max u2 u1, max u2 u1} (Prod.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k))) (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Turing.TM2to1.Γ'.inhabited.{u2, u1} K (fun (k : K) => _inst_1 k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} ((fun (k : K) => _inst_1 k) k)) (fun (a : K) => instInhabitedOption.{u1} ((fun (k : K) => _inst_1 k) a))) (Turing.PointedMap.mk.{max u2 u1, max u2 u1} (Prod.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k))) (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Turing.TM2to1.Γ'.inhabited.{u2, u1} K (fun (k : K) => _inst_1 k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} ((fun (k : K) => _inst_1 k) k)) (fun (a : K) => instInhabitedOption.{u1} ((fun (k : K) => _inst_1 k) a))) (Prod.snd.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k))) (Eq.refl.{succ (max u2 u1)} (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Prod.snd.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Inhabited.default.{succ (max u2 u1)} (Prod.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k))) (Turing.TM2to1.Γ'.inhabited.{u2, u1} K (fun (k : K) => _inst_1 k)))))) (Turing.TM2to1.addBottom.{u2, u1} K (fun (k : K) => _inst_1 k) Γ)) Γ
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.add_bottom_map Turing.TM2to1.addBottom_mapₓ'. -/
theorem addBottom_map (L) : (add_bottom L).map ⟨Prod.snd, rfl⟩ = L :=
by
simp only [add_bottom, list_blank.map_cons] <;> convert list_blank.cons_head_tail _
@@ -3211,12 +2635,6 @@ theorem addBottom_map (L) : (add_bottom L).map ⟨Prod.snd, rfl⟩ = L :=
refine' L'.induction_on fun l => _; simp
#align turing.TM2to1.add_bottom_map Turing.TM2to1.addBottom_map
-/- warning: turing.TM2to1.add_bottom_modify_nth -> Turing.TM2to1.addBottom_modifyNth is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} (f : (forall (k : K), Option.{u2} (Γ k)) -> (forall (k : K), Option.{u2} (Γ k))) (L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) (n : Nat), Eq.{succ (max u1 u2)} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.modifyNth.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (fun (a : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) => Prod.mk.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k)) (Prod.fst.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k)) a) (f (Prod.snd.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k)) a))) n (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L)) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ (Turing.ListBlank.modifyNth.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) f n L))
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} (Γ : (forall (k : K), Option.{u2} (_inst_1 k)) -> (forall (k : K), Option.{u2} (_inst_1 k))) (f : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (_inst_1 k)) (instInhabitedForAll_1.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u2} (_inst_1 a)))) (L : Nat), Eq.{max (succ u1) (succ u2)} (Turing.ListBlank.{max u1 u2} (Prod.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (_inst_1 k))) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K (fun (k : K) => _inst_1 k))) (Turing.ListBlank.modifyNth.{max u1 u2} (Prod.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (_inst_1 k))) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K (fun (k : K) => _inst_1 k)) (fun (a : Prod.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (_inst_1 k))) => Prod.mk.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (_inst_1 k)) (Prod.fst.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (_inst_1 k)) a) (Γ (Prod.snd.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (_inst_1 k)) a))) L (Turing.TM2to1.addBottom.{u1, u2} K (fun (k : K) => _inst_1 k) f)) (Turing.TM2to1.addBottom.{u1, u2} K (fun (k : K) => _inst_1 k) (Turing.ListBlank.modifyNth.{max u2 u1} (forall (k : K), Option.{u2} (_inst_1 k)) (instInhabitedForAll_1.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u2} (_inst_1 a))) Γ L f))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.add_bottom_modify_nth Turing.TM2to1.addBottom_modifyNthₓ'. -/
theorem addBottom_modifyNth (f : (∀ k, Option (Γ k)) → ∀ k, Option (Γ k)) (L n) :
(add_bottom L).modifyNth (fun a => (a.1, f a.2)) n = add_bottom (L.modifyNth f n) :=
by
@@ -3225,12 +2643,6 @@ theorem addBottom_modifyNth (f : (∀ k, Option (Γ k)) → ∀ k, Option (Γ k)
congr ; symm; apply list_blank.map_modify_nth; intro ; rfl
#align turing.TM2to1.add_bottom_modify_nth Turing.TM2to1.addBottom_modifyNth
-/- warning: turing.TM2to1.add_bottom_nth_snd -> Turing.TM2to1.addBottom_nth_snd is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} (L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) (n : Nat), Eq.{max (succ u1) (succ u2)} (forall (k : K), Option.{u2} (Γ k)) (Prod.snd.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k)) (Turing.ListBlank.nth.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L) n)) (Turing.ListBlank.nth.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) L n)
-but is expected to have type
- forall {K : Type.{u2}} {_inst_1 : K -> Type.{u1}} (Γ : Turing.ListBlank.{max u2 u1} (forall (k : K), Option.{u1} (_inst_1 k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u1} (_inst_1 a)))) (L : Nat), Eq.{max (succ u2) (succ u1)} (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Prod.snd.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Turing.ListBlank.nth.{max u2 u1} (Turing.TM2to1.Γ'.{u2, u1} K (fun (k : K) => _inst_1 k)) (Turing.TM2to1.Γ'.inhabited.{u2, u1} K (fun (k : K) => _inst_1 k)) (Turing.TM2to1.addBottom.{u2, u1} K (fun (k : K) => _inst_1 k) Γ) L)) (Turing.ListBlank.nth.{max u2 u1} (forall (k : K), Option.{u1} (_inst_1 k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u1} (_inst_1 a))) Γ L)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.add_bottom_nth_snd Turing.TM2to1.addBottom_nth_sndₓ'. -/
theorem addBottom_nth_snd (L n) : ((add_bottom L).get? n).2 = L.get? n := by
conv =>
rhs
@@ -3238,32 +2650,14 @@ theorem addBottom_nth_snd (L n) : ((add_bottom L).get? n).2 = L.get? n := by
rfl
#align turing.TM2to1.add_bottom_nth_snd Turing.TM2to1.addBottom_nth_snd
-/- warning: turing.TM2to1.add_bottom_nth_succ_fst -> Turing.TM2to1.addBottom_nth_succ_fst is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} (L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) (n : Nat), Eq.{1} Bool (Prod.fst.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k)) (Turing.ListBlank.nth.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) n (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne)))))) Bool.false
-but is expected to have type
- forall {K : Type.{u2}} {_inst_1 : K -> Type.{u1}} (Γ : Turing.ListBlank.{max u2 u1} (forall (k : K), Option.{u1} (_inst_1 k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u1} (_inst_1 a)))) (L : Nat), Eq.{1} Bool (Prod.fst.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Turing.ListBlank.nth.{max u2 u1} (Turing.TM2to1.Γ'.{u2, u1} K (fun (k : K) => _inst_1 k)) (Turing.TM2to1.Γ'.inhabited.{u2, u1} K (fun (k : K) => _inst_1 k)) (Turing.TM2to1.addBottom.{u2, u1} K (fun (k : K) => _inst_1 k) Γ) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) L (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1))))) Bool.false
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.add_bottom_nth_succ_fst Turing.TM2to1.addBottom_nth_succ_fstₓ'. -/
theorem addBottom_nth_succ_fst (L n) : ((add_bottom L).get? (n + 1)).1 = false := by
rw [list_blank.nth_succ, add_bottom, list_blank.tail_cons, list_blank.nth_map] <;> rfl
#align turing.TM2to1.add_bottom_nth_succ_fst Turing.TM2to1.addBottom_nth_succ_fst
-/- warning: turing.TM2to1.add_bottom_head_fst -> Turing.TM2to1.addBottom_head_fst is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} (L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))), Eq.{1} Bool (Prod.fst.{0, max u1 u2} Bool (forall (k : K), Option.{u2} (Γ k)) (Turing.ListBlank.head.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L))) Bool.true
-but is expected to have type
- forall {K : Type.{u2}} {_inst_1 : K -> Type.{u1}} (Γ : Turing.ListBlank.{max u2 u1} (forall (k : K), Option.{u1} (_inst_1 k)) (instInhabitedForAll_1.{succ u2, succ u1} K (fun (k : K) => Option.{u1} (_inst_1 k)) (fun (a : K) => instInhabitedOption.{u1} (_inst_1 a)))), Eq.{1} Bool (Prod.fst.{0, max u2 u1} Bool (forall (k : K), Option.{u1} ((fun (k : K) => _inst_1 k) k)) (Turing.ListBlank.head.{max u2 u1} (Turing.TM2to1.Γ'.{u2, u1} K (fun (k : K) => _inst_1 k)) (Turing.TM2to1.Γ'.inhabited.{u2, u1} K (fun (k : K) => _inst_1 k)) (Turing.TM2to1.addBottom.{u2, u1} K (fun (k : K) => _inst_1 k) Γ))) Bool.true
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.add_bottom_head_fst Turing.TM2to1.addBottom_head_fstₓ'. -/
theorem addBottom_head_fst (L) : (add_bottom L).headI.1 = true := by
rw [add_bottom, list_blank.head_cons] <;> rfl
#align turing.TM2to1.add_bottom_head_fst Turing.TM2to1.addBottom_head_fst
-/- warning: turing.TM2to1.st_act -> Turing.TM2to1.StAct is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ], K -> Sort.{max (succ u2) (succ u3)}
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}}, K -> Sort.{max (succ u2) (succ u3)}
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.st_act Turing.TM2to1.StActₓ'. -/
/-- A stack action is a command that interacts with the top of a stack. Our default position
is at the bottom of all the stacks, so we have to hold on to this action while going to the end
to modify the stack. -/
@@ -3273,12 +2667,6 @@ inductive StAct (k : K)
| pop : (σ → Option (Γ k) → σ) → st_act
#align turing.TM2to1.st_act Turing.TM2to1.StAct
-/- warning: turing.TM2to1.st_act.inhabited -> Turing.TM2to1.StAct.inhabited is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {k : K}, Inhabited.{max (succ u2) (succ u3)} (Turing.TM2to1.StAct.{u1, u2, u3} K _inst_1 Γ σ _inst_3 k)
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {σ : K}, Inhabited.{max (succ u2) (succ u3)} (Turing.TM2to1.StAct.{u1, u2, u3} K _inst_1 Γ σ)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.st_act.inhabited Turing.TM2to1.StAct.inhabitedₓ'. -/
instance StAct.inhabited {k} : Inhabited (st_act k) :=
⟨st_act.peek fun s _ => s⟩
#align turing.TM2to1.st_act.inhabited Turing.TM2to1.StAct.inhabited
@@ -3287,12 +2675,6 @@ section
open StAct
-/- warning: turing.TM2to1.st_run -> Turing.TM2to1.stRun is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K}, (Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}} {_inst_2 : K}, (Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Λ _inst_2) -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ) -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.st_run Turing.TM2to1.stRunₓ'. -/
-- [inhabited Λ]: as this is a local definition it is more trouble than
-- it is worth to omit the typeclass assumption without breaking the parameters
/-- The TM2 statement corresponding to a stack action. -/
@@ -3303,12 +2685,6 @@ def stRun {k : K} : st_act k → stmt₂ → stmt₂
| pop f => TM2.Stmt.pop k f
#align turing.TM2to1.st_run Turing.TM2to1.stRun
-/- warning: turing.TM2to1.st_var -> Turing.TM2to1.stVar is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {k : K}, σ -> (List.{u2} (Γ k)) -> (Turing.TM2to1.StAct.{u1, u2, u3} K _inst_1 Γ σ _inst_3 k) -> σ
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {σ : K}, Γ -> (List.{u2} (_inst_1 σ)) -> (Turing.TM2to1.StAct.{u1, u2, u3} K _inst_1 Γ σ) -> Γ
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.st_var Turing.TM2to1.stVarₓ'. -/
/-- The effect of a stack action on the local variables, given the value of the stack. -/
def stVar {k : K} (v : σ) (l : List (Γ k)) : st_act k → σ
| push f => v
@@ -3316,12 +2692,6 @@ def stVar {k : K} (v : σ) (l : List (Γ k)) : st_act k → σ
| pop f => f v l.head?
#align turing.TM2to1.st_var Turing.TM2to1.stVar
-/- warning: turing.TM2to1.st_write -> Turing.TM2to1.stWrite is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {σ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} σ] {k : K}, σ -> (List.{u2} (Γ k)) -> (Turing.TM2to1.StAct.{u1, u2, u3} K _inst_1 Γ σ _inst_3 k) -> (List.{u2} (Γ k))
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {σ : K}, Γ -> (List.{u2} (_inst_1 σ)) -> (Turing.TM2to1.StAct.{u1, u2, u3} K _inst_1 Γ σ) -> (List.{u2} (_inst_1 σ))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.st_write Turing.TM2to1.stWriteₓ'. -/
/-- The effect of a stack action on the stack. -/
def stWrite {k : K} (v : σ) (l : List (Γ k)) : st_act k → List (Γ k)
| push f => f v :: l
@@ -3329,12 +2699,6 @@ def stWrite {k : K} (v : σ) (l : List (Γ k)) : st_act k → List (Γ k)
| pop f => l.tail
#align turing.TM2to1.st_write Turing.TM2to1.stWrite
-/- warning: turing.TM2to1.stmt_st_rec -> Turing.TM2to1.stmtStRec is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {C : (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) -> Sort.{u5}}, (forall (k : K) (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), (C q) -> (C (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))) -> (forall (a : σ -> σ) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), (C q) -> (C (Turing.TM2.Stmt.load.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ a q))) -> (forall (p : σ -> Bool) (q₁ : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) (q₂ : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), (C q₁) -> (C q₂) -> (C (Turing.TM2.Stmt.branch.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ p q₁ q₂))) -> (forall (l : σ -> Λ), C (Turing.TM2.Stmt.goto.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ l)) -> (C (Turing.TM2.Stmt.halt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) -> (forall (n : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), C n)
-but is expected to have type
- forall {K : Type.{u2}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u4}} {Λ : Type.{u5}} {_inst_2 : (Turing.TM2.Stmt.{u2, u3, u4, u5} K _inst_1 Γ Λ) -> Sort.{u1}}, (forall (k : K) (s : Turing.TM2to1.StAct.{u2, u3, u5} K _inst_1 Λ k) (q : Turing.TM2.Stmt.{u2, u3, u4, u5} K _inst_1 Γ Λ), (_inst_2 q) -> (_inst_2 (Turing.TM2to1.stRun.{u2, u3, u4, u5} K _inst_1 Γ Λ k s q))) -> (forall (a : Λ -> Λ) (q : Turing.TM2.Stmt.{u2, u3, u4, u5} K _inst_1 Γ Λ), (_inst_2 q) -> (_inst_2 (Turing.TM2.Stmt.load.{u2, u3, u4, u5} K _inst_1 Γ Λ a q))) -> (forall (ᾰ : Λ -> Bool) (q₁ : Turing.TM2.Stmt.{u2, u3, u4, u5} K _inst_1 Γ Λ) (q₂ : Turing.TM2.Stmt.{u2, u3, u4, u5} K _inst_1 Γ Λ), (_inst_2 q₁) -> (_inst_2 q₂) -> (_inst_2 (Turing.TM2.Stmt.branch.{u2, u3, u4, u5} K _inst_1 Γ Λ ᾰ q₁ q₂))) -> (forall (k : Λ -> Γ), _inst_2 (Turing.TM2.Stmt.goto.{u2, u3, u4, u5} K _inst_1 Γ Λ k)) -> (_inst_2 (Turing.TM2.Stmt.halt.{u2, u3, u4, u5} K _inst_1 Γ Λ)) -> (forall (H₃ : Turing.TM2.Stmt.{u2, u3, u4, u5} K _inst_1 Γ Λ), _inst_2 H₃)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.stmt_st_rec Turing.TM2to1.stmtStRecₓ'. -/
/-- We have partitioned the TM2 statements into "stack actions", which require going to the end
of the stack, and all other actions, which do not. This is a modified recursor which lumps the
stack actions into one. -/
@@ -3352,24 +2716,12 @@ def stmtStRec.{l} {C : stmt₂ → Sort l} (H₁ : ∀ (k) (s : st_act k) (q) (I
| TM2.stmt.halt => H₅
#align turing.TM2to1.stmt_st_rec Turing.TM2to1.stmtStRec
-/- warning: turing.TM2to1.supports_run -> Turing.TM2to1.supports_run is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (S : Finset.{u3} Λ) {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Iff (Turing.TM2.SupportsStmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ S (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM2.SupportsStmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ S q)
-but is expected to have type
- forall {K : Type.{u3}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u4}} {Λ : Type.{u1}} (_inst_2 : Finset.{u4} Γ) {σ : K} (_inst_3 : Turing.TM2to1.StAct.{u3, u2, u1} K _inst_1 Λ σ) (S : Turing.TM2.Stmt.{u3, u2, u4, u1} K _inst_1 Γ Λ), Iff (Turing.TM2.SupportsStmt.{u3, u2, u4, u1} K _inst_1 Γ Λ _inst_2 (Turing.TM2to1.stRun.{u3, u2, u4, u1} K _inst_1 Γ Λ σ _inst_3 S)) (Turing.TM2.SupportsStmt.{u3, u2, u4, u1} K _inst_1 Γ Λ _inst_2 S)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.supports_run Turing.TM2to1.supports_runₓ'. -/
theorem supports_run (S : Finset Λ) {k} (s : st_act k) (q) :
TM2.SupportsStmt S (st_run s q) ↔ TM2.SupportsStmt S q := by rcases s with (_ | _ | _) <;> rfl
#align turing.TM2to1.supports_run Turing.TM2to1.supports_run
end
-/- warning: turing.TM2to1.Λ' -> Turing.TM2to1.Λ' is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ], Type.{max u1 u2 u3 u4}
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, Sort.{max (max (max (succ u1) (succ u2)) (succ u3)) (succ u4)}
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.Λ' Turing.TM2to1.Λ'ₓ'. -/
/-- The machine states of the TM2 emulator. We can either be in a normal state when waiting for the
next TM2 action, or we can be in the "go" and "return" states to go to the top of the stack and
return to the bottom, respectively. -/
@@ -3381,12 +2733,6 @@ inductive Λ' : Type max u_1 u_2 u_3 u_4
open Λ'
-/- warning: turing.TM2to1.Λ'.inhabited -> Turing.TM2to1.Λ'.inhabited is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ], Inhabited.{succ (max u1 u2 u3 u4)} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3)
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} [Λ : Inhabited.{succ u3} Γ] {_inst_2 : Type.{u4}}, Inhabited.{max (max (max (succ u4) (succ u3)) (succ u2)) (succ u1)} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ _inst_2)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.Λ'.inhabited Turing.TM2to1.Λ'.inhabitedₓ'. -/
instance Λ'.inhabited : Inhabited Λ' :=
⟨normal default⟩
#align turing.TM2to1.Λ'.inhabited Turing.TM2to1.Λ'.inhabited
@@ -3399,12 +2745,6 @@ local notation "cfg₁" => TM1.Cfg Γ' Λ' σ
open TM1.Stmt
-/- warning: turing.TM2to1.tr_st_act -> Turing.TM2to1.trStAct is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K}, (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) -> (Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) -> (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Type.{u4}} {σ : K}, (Turing.TM1.Stmt.{max u2 u1, max (max (max u4 u3) u2) u1, u4} (Turing.TM2to1.Γ'.{u1, u2} K Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K Γ Λ _inst_2) _inst_2) -> (Turing.TM2to1.StAct.{u1, u2, u4} K Γ _inst_2 σ) -> (Turing.TM1.Stmt.{max u2 u1, max (max (max u4 u3) u2) u1, u4} (Turing.TM2to1.Γ'.{u1, u2} K Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K Γ Λ _inst_2) _inst_2)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_st_act Turing.TM2to1.trStActₓ'. -/
/-- The program corresponding to state transitions at the end of a stack. Here we start out just
after the top of the stack, and should end just after the new top of the stack. -/
def trStAct {k} (q : stmt₁) : st_act k → stmt₁
@@ -3425,12 +2765,6 @@ def trInit (k) (L : List (Γ k)) : List Γ' :=
#align turing.TM2to1.tr_init Turing.TM2to1.trInit
-/
-/- warning: turing.TM2to1.step_run -> Turing.TM2to1.step_run is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) (v : σ) (S : forall (k : K), List.{u2} (Γ k)) (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k), Eq.{max (succ u1) (succ u2) (succ u3) (succ u4)} (Turing.TM2.Cfg.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) (Turing.TM2.stepAux.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q) v S) (Turing.TM2.stepAux.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ q (Turing.TM2to1.stVar.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k v (S k) s) (Function.update.{succ u1, succ u2} K (fun (k : K) => List.{u2} (Γ k)) (fun (a : K) (b : K) => _inst_1 a b) S k (Turing.TM2to1.stWrite.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k v (S k) s)))
-but is expected to have type
- forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {_inst_2 : Type.{u1}} {σ : K} (_inst_3 : Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ _inst_2) (k : _inst_2) (q : forall (k : K), List.{u3} (Γ k)) (v : Turing.TM2to1.StAct.{u4, u3, u1} K Γ _inst_2 σ), Eq.{max (max (max (succ u4) (succ u3)) (succ u2)) (succ u1)} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ _inst_2) (Turing.TM2.stepAux.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 (Turing.TM2to1.stRun.{u4, u3, u2, u1} K Γ Λ _inst_2 σ v _inst_3) k q) (Turing.TM2.stepAux.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 _inst_3 (Turing.TM2to1.stVar.{u4, u3, u1} K Γ _inst_2 σ k (q σ) v) (Function.update.{succ u4, succ u3} K (fun (k : K) => List.{u3} (Γ k)) (fun (a : K) (b : K) => _inst_1 a b) q σ (Turing.TM2to1.stWrite.{u4, u3, u1} K Γ _inst_2 σ k (q σ) v)))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.step_run Turing.TM2to1.step_runₓ'. -/
theorem step_run {k : K} (q v S) :
∀ s : st_act k,
TM2.stepAux (st_run s q) v S =
@@ -3440,12 +2774,6 @@ theorem step_run {k : K} (q v S) :
| st_act.pop f => rfl
#align turing.TM2to1.step_run Turing.TM2to1.step_run
-/- warning: turing.TM2to1.tr_normal -> Turing.TM2to1.trNormal is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ], (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) -> (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ) -> (Turing.TM1.Stmt.{max u2 u1, max (max (max u4 u3) u2) u1, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ) Λ)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal Turing.TM2to1.trNormalₓ'. -/
/-- The translation of TM2 statements to TM1 statements. regular actions have direct equivalents,
but stack actions are deferred by going to the corresponding `go` state, so that we can find the
appropriate stack top. -/
@@ -3459,24 +2787,12 @@ def trNormal : stmt₂ → stmt₁
| TM2.stmt.halt => halt
#align turing.TM2to1.tr_normal Turing.TM2to1.trNormal
-/- warning: turing.TM2to1.tr_normal_run -> Turing.TM2to1.trNormal_run is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM1.Stmt.goto.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (fun (_x : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (_x : σ) => Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))
-but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57719 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57721 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_runₓ'. -/
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_run
open Classical
-/- warning: turing.TM2to1.tr_stmts₁ -> Turing.TM2to1.trStmts₁ is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ], (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) -> (Finset.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3))
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ) -> (Finset.{max (max (max u4 u3) u2) u1} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_stmts₁ Turing.TM2to1.trStmts₁ₓ'. -/
/-- The set of machine states accessible from an initial TM2 statement. -/
noncomputable def trStmts₁ : stmt₂ → Finset Λ'
| TM2.stmt.push k f q => {go k (st_act.push f) q, ret q} ∪ tr_stmts₁ q
@@ -3487,19 +2803,10 @@ noncomputable def trStmts₁ : stmt₂ → Finset Λ'
| _ => ∅
#align turing.TM2to1.tr_stmts₁ Turing.TM2to1.trStmts₁
-/- warning: turing.TM2to1.tr_stmts₁_run -> Turing.TM2to1.trStmts₁_run is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} {s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k} {q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ}, Eq.{succ (max u1 u2 u3 u4)} (Finset.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM2to1.trStmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Union.union.{max u1 u2 u3 u4} (Finset.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Finset.hasUnion.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (fun (a : Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (b : Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) => Classical.propDecidable (Eq.{succ (max u1 u2 u3 u4)} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) a b))) (Insert.insert.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Finset.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Finset.hasInsert.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (fun (a : Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (b : Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) => Classical.propDecidable (Eq.{succ (max u1 u2 u3 u4)} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) a b))) (Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q) (Singleton.singleton.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Finset.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Finset.hasSingleton.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM2to1.Λ'.ret.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 q))) (Turing.TM2to1.trStmts₁.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 q))
-but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} {σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2} {_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ}, Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Finset.{max (max (max u2 u1) u3) u4} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ)) (Turing.TM2to1.trStmts₁.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Union.union.{max (max (max u2 u1) u3) u4} (Finset.{max (max (max u2 u1) u3) u4} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ)) (Finset.instUnionFinset.{max (max (max u4 u3) u1) u2} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) (fun (a : Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) (b : Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) => Classical.propDecidable (Eq.{succ (max (max (max u4 u3) u1) u2)} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) a b))) (Insert.insert.{max (max (max u2 u1) u3) u4, max (max (max u2 u1) u3) u4} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) (Finset.{max (max (max u2 u1) u3) u4} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ)) (Finset.instInsertFinset.{max (max (max u4 u3) u1) u2} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) (fun (a : Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) (b : Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) => Classical.propDecidable (Eq.{succ (max (max (max u4 u3) u1) u2)} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) a b))) (Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Singleton.singleton.{max (max (max u2 u1) u3) u4, max (max (max u2 u1) u3) u4} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) (Finset.{max (max (max u2 u1) u3) u4} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ)) (Finset.instSingletonFinset.{max (max (max u4 u3) u1) u2} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ)) (Turing.TM2to1.Λ'.ret.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_3))) (Turing.TM2to1.trStmts₁.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_3))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_stmts₁_run Turing.TM2to1.trStmts₁_runₓ'. -/
theorem trStmts₁_run {k s q} : tr_stmts₁ (st_run s q) = {go k s q, ret q} ∪ tr_stmts₁ q := by
rcases s with (_ | _ | _) <;> unfold tr_stmts₁ st_run
#align turing.TM2to1.tr_stmts₁_run Turing.TM2to1.trStmts₁_run
-/- warning: turing.TM2to1.tr_respects_aux₂ -> Turing.TM2to1.tr_respects_aux₂ is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux₂ Turing.TM2to1.tr_respects_aux₂ₓ'. -/
theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : ∀ k, L.map (proj k) = ListBlank.mk ((S k).map some).reverse) (o) :
let v' := st_var v (S k) o
@@ -3581,12 +2888,6 @@ parameter (M : Λ → stmt₂)
include M
-/- warning: turing.TM2to1.tr -> Turing.TM2to1.tr is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ], (Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) -> (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) -> (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ)
-but is expected to have type
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Type.{u4}}, (Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K Γ Λ _inst_2)) -> (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K Γ Λ _inst_2) -> (Turing.TM1.Stmt.{max u2 u1, max (max (max u4 u3) u2) u1, u4} (Turing.TM2to1.Γ'.{u1, u2} K Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K Γ Λ _inst_2) _inst_2)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr Turing.TM2to1.trₓ'. -/
/-- The TM2 emulator machine states written as a TM1 program.
This handles the `go` and `ret` states, which shuttle to and from a stack top. -/
def tr : Λ' → stmt₁
@@ -3599,12 +2900,6 @@ def tr : Λ' → stmt₁
attribute [local pp_using_anonymous_constructor] Turing.TM1.Cfg
-/- warning: turing.TM2to1.tr_cfg -> Turing.TM2to1.TrCfg is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ], (Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) -> (Turing.TM2.Cfg.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) -> (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) -> Prop
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ) -> (Turing.TM1.Cfg.{max u2 u1, max (max (max u4 u3) u2) u1, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ) Λ) -> Prop
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfgₓ'. -/
/-- The relation between TM2 configurations and TM1 configurations of the TM2 emulator. -/
inductive TrCfg : cfg₂ → cfg₁ → Prop
|
@@ -3613,9 +2908,6 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
tr_cfg ⟨q, v, S⟩ ⟨q.map normal, v, Tape.mk' ∅ (add_bottom L)⟩
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
-/- warning: turing.TM2to1.tr_respects_aux₁ -> Turing.TM2to1.tr_respects_aux₁ is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux₁ Turing.TM2to1.tr_respects_aux₁ₓ'. -/
/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (_ : n ≤ S.length) :
@@ -3630,12 +2922,6 @@ theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k,
rw [stk_nth_val _ hL, List.nthLe_get?]; rfl; rwa [List.length_reverse]
#align turing.TM2to1.tr_respects_aux₁ Turing.TM2to1.tr_respects_aux₁
-/- warning: turing.TM2to1.tr_respects_aux₃ -> Turing.TM2to1.tr_respects_aux₃ is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) {q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ} {v : σ} {L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))} (n : Nat), Turing.Reaches₀.{max (max u1 u2) (max u1 u2 u3 u4) u4} (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM1.step.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M)) (Turing.TM1.Cfg.mk.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Option.some.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Turing.TM2to1.Λ'.ret.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 q)) v (Nat.iterate.{succ (max u1 u2)} (Turing.Tape.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.Tape.move.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) Turing.Dir.right) n (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L)))) (Turing.TM1.Cfg.mk.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Option.some.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Turing.TM2to1.Λ'.ret.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 q)) v (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L)))
-but is expected to have type
- forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {_inst_2 : Type.{u1}} (σ : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ _inst_2)) {_inst_3 : Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ _inst_2} {M : _inst_2} {q : Turing.ListBlank.{max u4 u3} (forall (k : K), Option.{u3} (Γ k)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (k : K) => Option.{u3} (Γ k)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)))} (v : Nat), Turing.Reaches₀.{max (max u1 (max (max u1 u2) u3) u4) u3 u4} (Turing.TM1.Cfg.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2) (Turing.TM1.step.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.tr.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ)) (Turing.TM1.Cfg.mk.{max u4 u3, max (max (max u4 u3) u2) u1, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2 (Option.some.{max (max (max u4 u3) u2) u1} (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) (Turing.TM2to1.Λ'.ret.{u4, u3, u2, u1} K Γ Λ _inst_2 _inst_3)) M (Nat.iterate.{succ (max u4 u3)} (Turing.Tape.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.Tape.move.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) Turing.Dir.right) v (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ q)))) (Turing.TM1.Cfg.mk.{max u4 u3, max (max (max u4 u3) u2) u1, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2 (Option.some.{max (max (max u4 u3) u2) u1} (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) (Turing.TM2to1.Λ'.ret.{u4, u3, u2, u1} K Γ Λ _inst_2 _inst_3)) M (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ q)))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux₃ Turing.TM2to1.tr_respects_aux₃ₓ'. -/
theorem tr_respects_aux₃ {q v} {L : ListBlank (∀ k, Option (Γ k))} (n) :
Reaches₀ (TM1.step tr) ⟨some (ret q), v, (Tape.move Dir.right^[n]) (Tape.mk' ∅ (add_bottom L))⟩
⟨some (ret q), v, Tape.mk' ∅ (add_bottom L)⟩ :=
@@ -3647,9 +2933,6 @@ theorem tr_respects_aux₃ {q v} {L : ListBlank (∀ k, Option (Γ k))} (n) :
rfl
#align turing.TM2to1.tr_respects_aux₃ Turing.TM2to1.tr_respects_aux₃
-/- warning: turing.TM2to1.tr_respects_aux -> Turing.TM2to1.tr_respects_aux is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux Turing.TM2to1.tr_respects_auxₓ'. -/
theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
(hT : ∀ k, ListBlank.map (proj k) T = ListBlank.mk ((S k).map some).reverse) (o : st_act k)
(IH :
@@ -3679,12 +2962,6 @@ theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
attribute [local simp] respects TM2.step TM2.step_aux tr_normal
-/- warning: turing.TM2to1.tr_respects -> Turing.TM2to1.tr_respects is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)), Turing.Respects.{max u1 u2 u3 u4, max (max u1 u2) (max u1 u2 u3 u4) u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2.step.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M) (Turing.TM1.step.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M)) (Turing.TM2to1.TrCfg.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M)
-but is expected to have type
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {_inst_2 : Type.{u4}} (σ : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K Γ Λ _inst_2)), Turing.Respects.{max (max (max u4 u3) u2) u1, max (max u4 (max (max u4 u3) u2) u1) u2 u1} (Turing.TM2.Cfg.{u1, u2, u3, u4} K Γ Λ _inst_2) (Turing.TM1.Cfg.{max u2 u1, max (max (max u4 u3) u2) u1, u4} (Turing.TM2to1.Γ'.{u1, u2} K Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K Γ Λ _inst_2) _inst_2) (Turing.TM2.step.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ) (Turing.TM1.step.{max u2 u1, max (max (max u4 u3) u2) u1, u4} (Turing.TM2to1.Γ'.{u1, u2} K Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.tr.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ)) (Turing.TM2to1.TrCfg.{u1, u2, u3, u4} K Γ Λ _inst_2)
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects Turing.TM2to1.tr_respectsₓ'. -/
theorem tr_respects : Respects (TM2.step M) (TM1.step tr) tr_cfg := fun c₁ c₂ h =>
by
cases' h with l v S L hT; clear h
@@ -3702,12 +2979,6 @@ theorem tr_respects : Respects (TM2.step M) (TM1.step tr) tr_cfg := fun c₁ c
· exact ⟨_, ⟨_, hT⟩, refl_trans_gen.refl⟩
#align turing.TM2to1.tr_respects Turing.TM2to1.tr_respects
-/- warning: turing.TM2to1.tr_cfg_init -> Turing.TM2to1.trCfg_init is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) (k : K) (L : List.{u2} (Γ k)), Turing.TM2to1.TrCfg.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M (Turing.TM2.init.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_2 _inst_3 k L) (Turing.TM1.init.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.Λ'.inhabited.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) _inst_3 (Turing.TM2to1.trInit.{u1, u2} K _inst_1 Γ k L))
-but is expected to have type
- forall {K : Type.{u3}} [_inst_1 : DecidableEq.{succ u3} K] {Γ : K -> Type.{u4}} {Λ : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Λ] {σ : Type.{u1}} [_inst_3 : Inhabited.{succ u1} σ] (M : K) (k : List.{u4} (Γ M)), Turing.TM2to1.TrCfg.{u3, u4, u2, u1} K Γ Λ σ (Turing.TM2.init.{u3, u4, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_2 _inst_3 M k) (Turing.TM1.init.{max u3 u4, max (max (max u3 u4) u2) u1, u1} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (Turing.TM2to1.Λ'.{u3, u4, u2, u1} K Γ Λ σ) σ (Turing.TM2to1.Λ'.inhabited.{u3, u4, u2, u1} K Γ Λ _inst_2 σ) _inst_3 (Turing.TM2to1.trInit.{u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ M k))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_cfg_init Turing.TM2to1.trCfg_initₓ'. -/
theorem trCfg_init (k) (L : List (Γ k)) : tr_cfg (TM2.init k L) (TM1.init (tr_init k L)) :=
by
rw [(_ : TM1.init _ = _)]
@@ -3725,19 +2996,10 @@ theorem trCfg_init (k) (L : List (Γ k)) : tr_cfg (TM2.init k L) (TM1.init (tr_i
simp only [List.map_map, List.tail_cons, List.map]; rfl
#align turing.TM2to1.tr_cfg_init Turing.TM2to1.trCfg_init
-/- warning: turing.TM2to1.tr_eval_dom -> Turing.TM2to1.tr_eval_dom is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) (k : K) (L : List.{u2} (Γ k)), Iff (Part.Dom.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.TM1.eval.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.Λ'.inhabited.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) _inst_3 (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M) (Turing.TM2to1.trInit.{u1, u2} K _inst_1 Γ k L))) (Part.Dom.{u2} (List.{u2} (Γ k)) (Turing.TM2.eval.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_2 _inst_3 M k L))
-but is expected to have type
- forall {K : Type.{u3}} [_inst_1 : DecidableEq.{succ u3} K] {Γ : K -> Type.{u4}} {Λ : Type.{u1}} [_inst_2 : Inhabited.{succ u1} Λ] {σ : Type.{u2}} [_inst_3 : Inhabited.{succ u2} σ] (M : Λ -> (Turing.TM2.Stmt.{u3, u4, u1, u2} K Γ Λ σ)) (k : K) (L : List.{u4} (Γ k)), Iff (Part.Dom.{max u3 u4} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ)) (Turing.TM1.eval.{max u4 u3, max (max (max u2 u1) u4) u3, u2} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (Turing.TM2to1.Λ'.{u3, u4, u1, u2} K Γ Λ σ) σ (Turing.TM2to1.Λ'.inhabited.{u3, u4, u1, u2} K Γ Λ _inst_2 σ) _inst_3 (Turing.TM2to1.tr.{u3, u4, u1, u2} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M) (Turing.TM2to1.trInit.{u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ k L))) (Part.Dom.{u4} (List.{u4} (Γ k)) (Turing.TM2.eval.{u3, u4, u1, u2} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_2 _inst_3 M k L))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_eval_dom Turing.TM2to1.tr_eval_domₓ'. -/
theorem tr_eval_dom (k) (L : List (Γ k)) : (TM1.eval tr (tr_init k L)).Dom ↔ (TM2.eval M k L).Dom :=
tr_eval_dom tr_respects (tr_cfg_init _ _)
#align turing.TM2to1.tr_eval_dom Turing.TM2to1.tr_eval_dom
-/- warning: turing.TM2to1.tr_eval -> Turing.TM2to1.tr_eval is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_eval Turing.TM2to1.tr_evalₓ'. -/
theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval tr (tr_init k L))
(H₂ : L₂ ∈ TM2.eval M k L) :
∃ (S : ∀ k, List (Γ k))(L' : ListBlank (∀ k, Option (Γ k))),
@@ -3751,23 +3013,11 @@ theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval tr (
exact ⟨_, L', by simp only [tape.mk'_right₀], hT, rfl⟩
#align turing.TM2to1.tr_eval Turing.TM2to1.tr_eval
-/- warning: turing.TM2to1.tr_supp -> Turing.TM2to1.trSupp is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ], (Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) -> (Finset.{u3} Λ) -> (Finset.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3))
-but is expected to have type
- forall {K : Type.{u1}} {_inst_1 : K -> Type.{u2}} {Γ : Type.{u3}} {Λ : Type.{u4}}, (Γ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ)) -> (Finset.{u3} Γ) -> (Finset.{max (max (max u4 u3) u2) u1} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_supp Turing.TM2to1.trSuppₓ'. -/
/-- The support of a set of TM2 states in the TM2 emulator. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ' :=
S.biUnion fun l => insert (normal l) (tr_stmts₁ (M l))
#align turing.TM2to1.tr_supp Turing.TM2to1.trSupp
-/- warning: turing.TM2to1.tr_supports -> Turing.TM2to1.tr_supports is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) {S : Finset.{u3} Λ}, (Turing.TM2.Supports.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_2 M S) -> (Turing.TM1.Supports.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.Λ'.inhabited.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M) (Turing.TM2to1.trSupp.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M S))
-but is expected to have type
- forall {K : Type.{u3}} [_inst_1 : DecidableEq.{succ u3} K] {Γ : K -> Type.{u2}} {Λ : Type.{u4}} [_inst_2 : Inhabited.{succ u4} Λ] {σ : Type.{u1}} (_inst_3 : Λ -> (Turing.TM2.Stmt.{u3, u2, u4, u1} K Γ Λ σ)) {M : Finset.{u4} Λ}, (Turing.TM2.Supports.{u3, u2, u4, u1} K Γ Λ σ _inst_2 _inst_3 M) -> (Turing.TM1.Supports.{max u2 u3, max (max (max u1 u4) u2) u3, u1} (Turing.TM2to1.Γ'.{u3, u2} K Γ) (Turing.TM2to1.Λ'.{u3, u2, u4, u1} K Γ Λ σ) σ (Turing.TM2to1.Λ'.inhabited.{u3, u2, u4, u1} K Γ Λ _inst_2 σ) (Turing.TM2to1.tr.{u3, u2, u4, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_3) (Turing.TM2to1.trSupp.{u3, u2, u4, u1} K Γ Λ σ _inst_3 M))
-Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_supports Turing.TM2to1.tr_supportsₓ'. -/
theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert.2 <| Or.inl rfl⟩, fun l' h =>
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -93,9 +93,7 @@ theorem BlankExtends.refl {Γ} [Inhabited Γ] (l : List Γ) : BlankExtends l l :
#print Turing.BlankExtends.trans /-
@[trans]
theorem BlankExtends.trans {Γ} [Inhabited Γ] {l₁ l₂ l₃ : List Γ} :
- BlankExtends l₁ l₂ → BlankExtends l₂ l₃ → BlankExtends l₁ l₃ :=
- by
- rintro ⟨i, rfl⟩ ⟨j, rfl⟩
+ BlankExtends l₁ l₂ → BlankExtends l₂ l₃ → BlankExtends l₁ l₃ := by rintro ⟨i, rfl⟩ ⟨j, rfl⟩;
exact ⟨i + j, by simp [List.replicate_add]⟩
#align turing.blank_extends.trans Turing.BlankExtends.trans
-/
@@ -401,8 +399,7 @@ theorem ListBlank.ext {Γ} [Inhabited Γ] {L₁ L₂ : ListBlank Γ} :
by
wlog h : l₁.length ≤ l₂.length
· cases le_total l₁.length l₂.length <;> [skip;symm] <;> apply_assumption <;> try assumption
- intro
- rw [H]
+ intro ; rw [H]
refine' Quotient.sound' (Or.inl ⟨l₂.length - l₁.length, _⟩)
refine' List.ext_nthLe _ fun i h h₂ => Eq.symm _
· simp only [add_tsub_cancel_of_le h, List.length_append, List.length_replicate]
@@ -1166,8 +1163,7 @@ theorem mem_eval {σ} {f : σ → Option σ} {a b} : b ∈ eval f a ↔ Reaches
by
refine' refl_trans_gen.head_induction_on h₁ _ fun a a' h _ IH => _
· refine' PFun.mem_fix_iff.2 (Or.inl _)
- rw [h₂]
- apply Part.mem_some
+ rw [h₂]; apply Part.mem_some
· refine' PFun.mem_fix_iff.2 (Or.inr ⟨_, _, IH⟩)
rw [show f a = _ from h]
apply Part.mem_some⟩
@@ -1271,11 +1267,9 @@ theorem tr_reaches_rev {σ₁ σ₂ f₁ f₂} {tr : σ₁ → σ₂ → Prop} (
· exact ⟨_, _, refl_trans_gen.refl, aa, refl_trans_gen.refl⟩
· rcases IH with ⟨e₁, e₂, ce, ee, ae⟩
rcases refl_trans_gen.cases_head ce with (rfl | ⟨d', cd', de⟩)
- · have := H ee
- revert this
+ · have := H ee; revert this
cases' eg : f₁ e₁ with g₁ <;> simp only [respects, and_imp, exists_imp]
- · intro c0
- cases cd.symm.trans c0
+ · intro c0; cases cd.symm.trans c0
· intro g₂ gg cg
rcases trans_gen.head'_iff.1 cg with ⟨d', cd', dg⟩
cases Option.mem_unique cd cd'
@@ -1623,10 +1617,8 @@ theorem Machine.map_step {S : Set Λ} (f₂₁ : Function.RightInverse f₁ f₂
unfold step machine.map cfg.map
simp only [Turing.Tape.map_fst, g₂₁ q h, f₂₁ _]
rcases M q T.1 with (_ | ⟨q', d | a⟩); · rfl
- · simp only [step, cfg.map, Option.map_some', tape.map_move f₁]
- rfl
- · simp only [step, cfg.map, Option.map_some', tape.map_write]
- rfl
+ · simp only [step, cfg.map, Option.map_some', tape.map_move f₁]; rfl
+ · simp only [step, cfg.map, Option.map_some', tape.map_write]; rfl
#align turing.TM0.machine.map_step Turing.TM0.Machine.map_step
/- warning: turing.TM0.map_init -> Turing.TM0.map_init is a dubious translation:
@@ -1647,11 +1639,9 @@ theorem Machine.map_respects (g₁ : PointedMap Λ Λ') (g₂ : Λ' → Λ) {S}
Respects (step M) (step (M.map f₁ f₂ g₁ g₂)) fun a b => a.q ∈ S ∧ Cfg.map f₁ g₁ a = b
| c, _, ⟨cs, rfl⟩ => by
cases' e : step M c with c' <;> unfold respects
- · rw [← M.map_step f₁ f₂ g₁ g₂ f₂₁ g₂₁ _ cs, e]
- rfl
+ · rw [← M.map_step f₁ f₂ g₁ g₂ f₂₁ g₂₁ _ cs, e]; rfl
· refine' ⟨_, ⟨step_supports M ss e cs, rfl⟩, trans_gen.single _⟩
- rw [← M.map_step f₁ f₂ g₁ g₂ f₂₁ g₂₁ _ cs, e]
- exact rfl
+ rw [← M.map_step f₁ f₂ g₁ g₂ f₂₁ g₂₁ _ cs, e]; exact rfl
#align turing.TM0.machine.map_respects Turing.TM0.Machine.map_respects
end
@@ -1835,13 +1825,11 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂
iterate 3
rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁
- exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (IH h₁₂)
case branch p q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
- · unfold stmts₁ at h₀₁
- exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ <| IH₁ h₁₂)
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ <| IH₂ h₁₂)
case goto l => subst h₁₂; exact h₀₁
@@ -2447,10 +2435,8 @@ theorem trTape'_move_left (L R) :
tape.mk' L' (list_blank.append (Vector.toList (enc a)) R')
by
simpa only [List.length_reverse, Vector.toList_length] using this (List.reverse_reverse _).symm
- intros
- induction' l₁ with b l₁ IH generalizing l₂
- · cases e
- rfl
+ intros ; induction' l₁ with b l₁ IH generalizing l₂
+ · cases e; rfl
simp only [List.length, List.cons_append, iterate_succ_apply]
convert IH e
simp only [list_blank.tail_cons, list_blank.append, tape.move_left_mk', list_blank.head_cons]
@@ -2466,9 +2452,7 @@ theorem trTape'_move_right (L R) :
refine' (Eq.symm _).trans (this n _)
simp only [tr_tape'_move_left, list_blank.cons_head_tail, list_blank.head_cons,
list_blank.tail_cons]
- intros
- induction' i with i IH
- · rfl
+ intros ; induction' i with i IH; · rfl
rw [iterate_succ_apply, iterate_succ_apply', tape.move_left_right, IH]
#align turing.TM1to1.tr_tape'_move_right Turing.TM1to1.trTape'_move_right
-/
@@ -2489,11 +2473,9 @@ theorem stepAux_write (q v a b L R) :
step_aux (write l₂ q) v (tape.mk' (list_blank.append l₁ L') (list_blank.append l₂' R')) =
step_aux q v (tape.mk' (L'.append (List.reverseAux l₂ l₁)) R')
by convert this [] _ _ ((enc b).2.trans (enc a).2.symm) <;> rw [list_blank.cons_bind] <;> rfl
- clear a b L R
- intros
+ clear a b L R; intros
induction' l₂ with a l₂ IH generalizing l₁ l₂'
- · cases List.length_eq_zero.1 e
- rfl
+ · cases List.length_eq_zero.1 e; rfl
cases' l₂' with b l₂' <;> injection e with e
dsimp only [write, step_aux]
convert IH _ _ e using 1
@@ -2528,22 +2510,14 @@ theorem stepAux_read (f v L R) :
∀ i f L' R' l₁ l₂ h,
step_aux (read_aux i f) v (tape.mk' (list_blank.append l₁ L') (list_blank.append l₂ R')) =
step_aux (f ⟨l₂, h⟩) v (tape.mk' (list_blank.append (l₂.reverseAux l₁) L') R')
- by
- intro f
- convert this n f _ _ _ _ (enc a).2 <;> simp
- clear f L a R
- intros
- subst i
- induction' l₂ with a l₂ IH generalizing l₁
- · rfl
+ by intro f; convert this n f _ _ _ _ (enc a).2 <;> simp
+ clear f L a R; intros ; subst i
+ induction' l₂ with a l₂ IH generalizing l₁; · rfl
trans
step_aux (read_aux l₂.length fun v => f (a ::ᵥ v)) v
(tape.mk' ((L'.append l₁).cons a) (R'.append l₂))
- · dsimp [read_aux, step_aux]
- simp
- cases a <;> rfl
- rw [← list_blank.append, IH]
- rfl
+ · dsimp [read_aux, step_aux]; simp; cases a <;> rfl
+ rw [← list_blank.append, IH]; rfl
#align turing.TM1to1.step_aux_read Turing.TM1to1.stepAux_read
/- warning: turing.TM1to1.tr_respects -> Turing.TM1to1.tr_respects is a dubious translation:
@@ -2556,18 +2530,13 @@ theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ =
fun_respects.2 fun ⟨l₁, v, T⟩ =>
by
obtain ⟨L, R, rfl⟩ := T.exists_mk'
- cases' l₁ with l₁
- · exact rfl
+ cases' l₁ with l₁; · exact rfl
suffices
∀ q R,
reaches (step (tr enc dec M)) (step_aux (tr_normal dec q) v (tr_tape' enc0 L R))
(tr_cfg enc0 (step_aux q v (tape.mk' L R)))
- by
- refine' trans_gen.head' rfl _
- rw [tr_tape_mk']
- exact this _ R
- clear R l₁
- intros
+ by refine' trans_gen.head' rfl _; rw [tr_tape_mk']; exact this _ R
+ clear R l₁; intros
induction' q with _ q IH _ q IH _ q IH generalizing v L R
case move d q IH =>
cases d <;>
@@ -2656,8 +2625,7 @@ theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
this _ (ss.2 _ hl) fun q' hq => Finset.mem_biUnion.2 ⟨_, hl, Finset.mem_insert_of_mem hq⟩
rcases Finset.mem_insert.1 h with (rfl | h)
exacts[this.1, this.2 _ h]
- intro q hs hw
- induction q
+ intro q hs hw; induction q
case move d q IH =>
unfold writes at hw⊢
replace IH := IH hs hw; refine' ⟨_, IH.2⟩
@@ -2788,13 +2756,11 @@ theorem tr_respects : Respects (TM0.step M) (TM1.step tr) fun a b => tr_cfg a =
by cases' s with d a <;> rfl
refine' trans_gen.head _ (trans_gen.head' this _)
· unfold TM1.step TM1.step_aux tr Membership.Mem
- rw [e]
- rfl
+ rw [e]; rfl
cases e' : M q' _
· apply refl_trans_gen.single
unfold TM1.step TM1.step_aux tr Membership.Mem
- rw [e']
- rfl
+ rw [e']; rfl
· rfl
#align turing.TM0to1.tr_respects Turing.TM0to1.tr_respects
-/
@@ -2997,13 +2963,11 @@ theorem stmts₁_trans {q₁ q₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁
simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂
iterate 4
rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁
- exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (IH h₁₂)
case branch f q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
- · unfold stmts₁ at h₀₁
- exact h₀₁
+ · unfold stmts₁ at h₀₁; exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ (IH₁ h₁₂))
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ (IH₂ h₁₂))
case goto l => subst h₁₂; exact h₀₁
@@ -3559,7 +3523,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
refine' list_blank.ext fun i => _
rw [list_blank.nth_map, list_blank.nth_modify_nth, proj, pointed_map.mk_val]
by_cases h' : k' = k
- · subst k'
+ · subst k';
split_ifs <;> simp only [List.reverse_cons, Function.update_same, list_blank.nth_mk, List.map]
·
rw [List.getI_eq_nthLe, List.nthLe_append_right] <;>
@@ -3567,8 +3531,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
List.length_append, lt_add_iff_pos_right, List.length]
rw [← proj_map_nth, hL, list_blank.nth_mk]
cases' lt_or_gt_of_ne h with h h
- · rw [List.getI_append]
- simpa only [List.length_map, List.length_reverse] using h
+ · rw [List.getI_append]; simpa only [List.length_map, List.length_reverse] using h
· rw [gt_iff_lt] at h
rw [List.getI_eq_default, List.getI_eq_default] <;>
simp only [Nat.add_one_le_iff, h, List.length, le_of_lt, List.length_reverse,
@@ -3587,8 +3550,7 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
cases e : S k
· simp only [tape.mk'_head, list_blank.head_cons, tape.move_left_mk', List.length,
tape.write_mk', List.head?, iterate_zero_apply, List.tail_nil]
- rw [← e, Function.update_eq_self]
- exact ⟨L, hL, by rw [add_bottom_head_fst, cond]⟩
+ rw [← e, Function.update_eq_self]; exact ⟨L, hL, by rw [add_bottom_head_fst, cond]⟩
· refine'
⟨_, fun k' => _, by
rw [List.length_cons, tape.move_right_n_head, tape.mk'_nth_nat, add_bottom_nth_succ_fst,
@@ -3602,16 +3564,12 @@ theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀
refine' list_blank.ext fun i => _
rw [list_blank.nth_map, list_blank.nth_modify_nth, proj, pointed_map.mk_val]
by_cases h' : k' = k
- · subst k'
- split_ifs <;> simp only [Function.update_same, list_blank.nth_mk, List.tail]
- · rw [List.getI_eq_default]
- · rfl
- rw [h, List.length_reverse, List.length_map]
+ · subst k'; split_ifs <;> simp only [Function.update_same, list_blank.nth_mk, List.tail]
+ · rw [List.getI_eq_default]; · rfl; rw [h, List.length_reverse, List.length_map]
rw [← proj_map_nth, hL, list_blank.nth_mk, e, List.map, List.reverse_cons]
cases' lt_or_gt_of_ne h with h h
- · rw [List.getI_append]
- simpa only [List.length_map, List.length_reverse] using h
- · rw [gt_iff_lt] at h
+ · rw [List.getI_append]; simpa only [List.length_map, List.length_reverse] using h
+ · rw [gt_iff_lt] at h;
rw [List.getI_eq_default, List.getI_eq_default] <;>
simp only [Nat.add_one_le_iff, h, List.length, le_of_lt, List.length_reverse,
List.length_append, List.length_map]
@@ -3758,17 +3716,13 @@ theorem trCfg_init (k) (L : List (Γ k)) : tr_cfg (TM2.init k L) (TM1.init (tr_i
rw [list_blank.map_mk, list_blank.nth_mk, List.getI_eq_iget_get?, List.map_map, (· ∘ ·),
List.get?_map, proj, pointed_map.mk_val]
by_cases k' = k
- · subst k'
- simp only [Function.update_same]
+ · subst k'; simp only [Function.update_same]
rw [list_blank.nth_mk, List.getI_eq_iget_get?, ← List.map_reverse, List.get?_map]
· simp only [Function.update_noteq h]
rw [list_blank.nth_mk, List.getI_eq_iget_get?, List.map, List.reverse_nil, List.get?]
cases L.reverse.nth i <;> rfl
- · rw [tr_init, TM1.init]
- dsimp only
- congr <;> cases L.reverse <;> try rfl
- simp only [List.map_map, List.tail_cons, List.map]
- rfl
+ · rw [tr_init, TM1.init]; dsimp only; congr <;> cases L.reverse <;> try rfl
+ simp only [List.map_map, List.tail_cons, List.map]; rfl
#align turing.TM2to1.tr_cfg_init Turing.TM2to1.trCfg_init
/- warning: turing.TM2to1.tr_eval_dom -> Turing.TM2to1.tr_eval_dom is a dubious translation:
@@ -3826,8 +3780,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
have :=
this _ (ss.2 l lS) fun x hx => Finset.mem_biUnion.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1;exact this.2 _ h]
- clear h l'
- refine' stmt_st_rec _ _ _ _ _ <;> intros
+ clear h l'; refine' stmt_st_rec _ _ _ _ _ <;> intros
· -- stack op
rw [TM2to1.supports_run] at ss'
simp only [TM2to1.tr_stmts₁_run, Finset.mem_union, Finset.mem_insert, Finset.mem_singleton] at
@@ -3860,8 +3813,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
rw [tr_stmts₁] at h
rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h;exact IH₂₂ _ h]
· -- goto
- rw [tr_stmts₁]
- unfold TM2to1.tr_normal TM1.supports_stmt
+ rw [tr_stmts₁]; unfold TM2to1.tr_normal TM1.supports_stmt
unfold TM2.supports_stmt at ss'
exact
⟨fun _ v => Finset.mem_biUnion.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩, fun _ =>
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -1613,10 +1613,7 @@ def Machine.map : Machine Γ' Λ'
-/
/- warning: turing.TM0.machine.map_step -> Turing.TM0.Machine.map_step is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Γ' : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Γ'] {Λ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} Λ] {Λ' : Type.{u4}} [_inst_4 : Inhabited.{succ u4} Λ'] (M : Turing.TM0.Machine.{u1, u3} Γ _inst_1 Λ _inst_3) (f₁ : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (f₂ : Turing.PointedMap.{u2, u1} Γ' Γ _inst_2 _inst_1) (g₁ : Λ -> Λ') (g₂ : Λ' -> Λ) {S : Set.{u3} Λ}, (Function.RightInverse.{succ u2, succ u1} Γ' Γ (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f₁) (coeFn.{succ (max u2 u1), max (succ u2) (succ u1)} (Turing.PointedMap.{u2, u1} Γ' Γ _inst_2 _inst_1) (fun (_x : Turing.PointedMap.{u2, u1} Γ' Γ _inst_2 _inst_1) => Γ' -> Γ) (Turing.PointedMap.hasCoeToFun.{u2, u1} Γ' Γ _inst_2 _inst_1) f₂)) -> (forall (q : Λ), (Membership.Mem.{u3, u3} Λ (Set.{u3} Λ) (Set.hasMem.{u3} Λ) q S) -> (Eq.{succ u3} Λ (g₂ (g₁ q)) q)) -> (forall (c : Turing.TM0.Cfg.{u1, u3} Γ _inst_1 Λ _inst_3), (Membership.Mem.{u3, u3} Λ (Set.{u3} Λ) (Set.hasMem.{u3} Λ) (Turing.TM0.Cfg.q.{u1, u3} Γ _inst_1 Λ _inst_3 c) S) -> (Eq.{succ (max u2 u4)} (Option.{max u2 u4} (Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 Λ' _inst_4)) (Option.map.{max u1 u3, max u2 u4} (Turing.TM0.Cfg.{u1, u3} Γ _inst_1 Λ _inst_3) (Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 Λ' _inst_4) (Turing.TM0.Cfg.map.{u1, u2, u3, u4} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 f₁ g₁) (Turing.TM0.step.{u1, u3} Γ _inst_1 Λ _inst_3 M c)) (Turing.TM0.step.{u2, u4} Γ' _inst_2 Λ' _inst_4 (Turing.TM0.Machine.map.{u1, u2, u3, u4} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 M f₁ f₂ g₁ g₂) (Turing.TM0.Cfg.map.{u1, u2, u3, u4} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 f₁ g₁ c))))
-but is expected to have type
- forall {Γ : Type.{u2}} [_inst_1 : Inhabited.{succ u2} Γ] {Γ' : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Γ'] {Λ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} Λ] {Λ' : Type.{u1}} [_inst_4 : Inhabited.{succ u1} Λ'] (M : Turing.TM0.Machine.{u2, u4} Γ Λ _inst_3) (f₁ : Turing.PointedMap.{u2, u3} Γ Γ' _inst_1 _inst_2) (f₂ : Turing.PointedMap.{u3, u2} Γ' Γ _inst_2 _inst_1) (g₁ : Λ -> Λ') (g₂ : Λ' -> Λ) {S : Set.{u4} Λ}, (Function.RightInverse.{succ u3, succ u2} Γ' Γ (Turing.PointedMap.f.{u2, u3} Γ Γ' _inst_1 _inst_2 f₁) (Turing.PointedMap.f.{u3, u2} Γ' Γ _inst_2 _inst_1 f₂)) -> (forall (q : Λ), (Membership.mem.{u4, u4} Λ (Set.{u4} Λ) (Set.instMembershipSet.{u4} Λ) q S) -> (Eq.{succ u4} Λ (g₂ (g₁ q)) q)) -> (forall (c : Turing.TM0.Cfg.{u2, u4} Γ _inst_1 Λ), (Membership.mem.{u4, u4} Λ (Set.{u4} Λ) (Set.instMembershipSet.{u4} Λ) (Turing.TM0.Cfg.q.{u2, u4} Γ _inst_1 Λ c) S) -> (Eq.{max (succ u3) (succ u1)} (Option.{max u1 u3} (Turing.TM0.Cfg.{u3, u1} Γ' _inst_2 Λ')) (Option.map.{max u4 u2, max u1 u3} (Turing.TM0.Cfg.{u2, u4} Γ _inst_1 Λ) (Turing.TM0.Cfg.{u3, u1} Γ' _inst_2 Λ') (Turing.TM0.Cfg.map.{u2, u3, u4, u1} Γ _inst_1 Γ' _inst_2 Λ Λ' f₁ g₁) (Turing.TM0.step.{u2, u4} Γ _inst_1 Λ _inst_3 M c)) (Turing.TM0.step.{u3, u1} Γ' _inst_2 Λ' _inst_4 (Turing.TM0.Machine.map.{u2, u3, u4, u1} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 M f₁ f₂ g₁ g₂) (Turing.TM0.Cfg.map.{u2, u3, u4, u1} Γ _inst_1 Γ' _inst_2 Λ Λ' f₁ g₁ c))))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM0.machine.map_step Turing.TM0.Machine.map_stepₓ'. -/
theorem Machine.map_step {S : Set Λ} (f₂₁ : Function.RightInverse f₁ f₂)
(g₂₁ : ∀ q ∈ S, g₂ (g₁ q) = q) :
@@ -1643,10 +1640,7 @@ theorem map_init (g₁ : PointedMap Λ Λ') (l : List Γ) : (init l).map f₁ g
#align turing.TM0.map_init Turing.TM0.map_init
/- warning: turing.TM0.machine.map_respects -> Turing.TM0.Machine.map_respects is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Γ' : Type.{u2}} [_inst_2 : Inhabited.{succ u2} Γ'] {Λ : Type.{u3}} [_inst_3 : Inhabited.{succ u3} Λ] {Λ' : Type.{u4}} [_inst_4 : Inhabited.{succ u4} Λ'] (M : Turing.TM0.Machine.{u1, u3} Γ _inst_1 Λ _inst_3) (f₁ : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (f₂ : Turing.PointedMap.{u2, u1} Γ' Γ _inst_2 _inst_1) (g₁ : Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) (g₂ : Λ' -> Λ) {S : Set.{u3} Λ}, (Turing.TM0.Supports.{u1, u3} Γ _inst_1 Λ _inst_3 M S) -> (Function.RightInverse.{succ u2, succ u1} Γ' Γ (coeFn.{succ (max u1 u2), max (succ u1) (succ u2)} (Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) (fun (_x : Turing.PointedMap.{u1, u2} Γ Γ' _inst_1 _inst_2) => Γ -> Γ') (Turing.PointedMap.hasCoeToFun.{u1, u2} Γ Γ' _inst_1 _inst_2) f₁) (coeFn.{succ (max u2 u1), max (succ u2) (succ u1)} (Turing.PointedMap.{u2, u1} Γ' Γ _inst_2 _inst_1) (fun (_x : Turing.PointedMap.{u2, u1} Γ' Γ _inst_2 _inst_1) => Γ' -> Γ) (Turing.PointedMap.hasCoeToFun.{u2, u1} Γ' Γ _inst_2 _inst_1) f₂)) -> (forall (q : Λ), (Membership.Mem.{u3, u3} Λ (Set.{u3} Λ) (Set.hasMem.{u3} Λ) q S) -> (Eq.{succ u3} Λ (g₂ (coeFn.{succ (max u3 u4), max (succ u3) (succ u4)} (Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) (fun (_x : Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) => Λ -> Λ') (Turing.PointedMap.hasCoeToFun.{u3, u4} Λ Λ' _inst_3 _inst_4) g₁ q)) q)) -> (Turing.Respects.{max u1 u3, max u2 u4} (Turing.TM0.Cfg.{u1, u3} Γ _inst_1 Λ _inst_3) (Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 Λ' _inst_4) (Turing.TM0.step.{u1, u3} Γ _inst_1 Λ _inst_3 M) (Turing.TM0.step.{u2, u4} Γ' _inst_2 Λ' _inst_4 (Turing.TM0.Machine.map.{u1, u2, u3, u4} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 M f₁ f₂ (coeFn.{succ (max u3 u4), max (succ u3) (succ u4)} (Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) (fun (_x : Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) => Λ -> Λ') (Turing.PointedMap.hasCoeToFun.{u3, u4} Λ Λ' _inst_3 _inst_4) g₁) g₂)) (fun (a : Turing.TM0.Cfg.{u1, u3} Γ _inst_1 Λ _inst_3) (b : Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 Λ' _inst_4) => And (Membership.Mem.{u3, u3} Λ (Set.{u3} Λ) (Set.hasMem.{u3} Λ) (Turing.TM0.Cfg.q.{u1, u3} Γ _inst_1 Λ _inst_3 a) S) (Eq.{max (succ u2) (succ u4)} (Turing.TM0.Cfg.{u2, u4} Γ' _inst_2 Λ' _inst_4) (Turing.TM0.Cfg.map.{u1, u2, u3, u4} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 f₁ (coeFn.{succ (max u3 u4), max (succ u3) (succ u4)} (Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) (fun (_x : Turing.PointedMap.{u3, u4} Λ Λ' _inst_3 _inst_4) => Λ -> Λ') (Turing.PointedMap.hasCoeToFun.{u3, u4} Λ Λ' _inst_3 _inst_4) g₁) a) b)))
-but is expected to have type
- forall {Γ : Type.{u2}} [_inst_1 : Inhabited.{succ u2} Γ] {Γ' : Type.{u1}} [_inst_2 : Inhabited.{succ u1} Γ'] {Λ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} Λ] {Λ' : Type.{u3}} [_inst_4 : Inhabited.{succ u3} Λ'] (M : Turing.TM0.Machine.{u2, u4} Γ Λ _inst_3) (f₁ : Turing.PointedMap.{u2, u1} Γ Γ' _inst_1 _inst_2) (f₂ : Turing.PointedMap.{u1, u2} Γ' Γ _inst_2 _inst_1) (g₁ : Turing.PointedMap.{u4, u3} Λ Λ' _inst_3 _inst_4) (g₂ : Λ' -> Λ) {S : Set.{u4} Λ}, (Turing.TM0.Supports.{u2, u4} Γ Λ _inst_3 M S) -> (Function.RightInverse.{succ u1, succ u2} Γ' Γ (Turing.PointedMap.f.{u2, u1} Γ Γ' _inst_1 _inst_2 f₁) (Turing.PointedMap.f.{u1, u2} Γ' Γ _inst_2 _inst_1 f₂)) -> (forall (q : Λ), (Membership.mem.{u4, u4} Λ (Set.{u4} Λ) (Set.instMembershipSet.{u4} Λ) q S) -> (Eq.{succ u4} Λ (g₂ (Turing.PointedMap.f.{u4, u3} Λ Λ' _inst_3 _inst_4 g₁ q)) q)) -> (Turing.Respects.{max u4 u2, max u3 u1} (Turing.TM0.Cfg.{u2, u4} Γ _inst_1 Λ) (Turing.TM0.Cfg.{u1, u3} Γ' _inst_2 Λ') (Turing.TM0.step.{u2, u4} Γ _inst_1 Λ _inst_3 M) (Turing.TM0.step.{u1, u3} Γ' _inst_2 Λ' _inst_4 (Turing.TM0.Machine.map.{u2, u1, u4, u3} Γ _inst_1 Γ' _inst_2 Λ _inst_3 Λ' _inst_4 M f₁ f₂ (Turing.PointedMap.f.{u4, u3} Λ Λ' _inst_3 _inst_4 g₁) g₂)) (fun (a : Turing.TM0.Cfg.{u2, u4} Γ _inst_1 Λ) (b : Turing.TM0.Cfg.{u1, u3} Γ' _inst_2 Λ') => And (Membership.mem.{u4, u4} Λ (Set.{u4} Λ) (Set.instMembershipSet.{u4} Λ) (Turing.TM0.Cfg.q.{u2, u4} Γ _inst_1 Λ a) S) (Eq.{max (succ u1) (succ u3)} (Turing.TM0.Cfg.{u1, u3} Γ' _inst_2 Λ') (Turing.TM0.Cfg.map.{u2, u1, u4, u3} Γ _inst_1 Γ' _inst_2 Λ Λ' f₁ (Turing.PointedMap.f.{u4, u3} Λ Λ' _inst_3 _inst_4 g₁) a) b)))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM0.machine.map_respects Turing.TM0.Machine.map_respectsₓ'. -/
theorem Machine.map_respects (g₁ : PointedMap Λ Λ') (g₂ : Λ' → Λ) {S} (ss : Supports M S)
(f₂₁ : Function.RightInverse f₁ f₂) (g₂₁ : ∀ q ∈ S, g₂ (g₁ q) = q) :
@@ -1926,10 +1920,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
#align turing.TM1.stmts_supports_stmt Turing.TM1.stmts_supportsStmt
/- warning: turing.TM1.step_supports -> Turing.TM1.step_supports is a dubious translation:
-lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) (Option.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) (Option.hasMem.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u1, u2, u3} Γ _inst_1 Λ σ M c)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c) (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c') (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)))
-but is expected to have type
- forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u3, u2, u1} Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u3, u2, u1} Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ) (Option.{max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) (Option.instMembershipOption.{max (max u3 u2) u1} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u3, u2, u1} Γ _inst_1 Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM1.step_supports Turing.TM1.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
@@ -3089,10 +3080,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
#align turing.TM2.stmts_supports_stmt Turing.TM2.stmts_supportsStmt
/- warning: turing.TM2.step_supports -> Turing.TM2.step_supports is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} [_inst_2 : Inhabited.{succ u3} Λ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) {S : Finset.{u3} Λ}, (Turing.TM2.Supports.{u1, u2, u3, u4} K _inst_1 Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {c' : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Option.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Option.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) c' (Turing.TM2.step.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M c)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c) (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c') (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)))
-but is expected to have type
- forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM2.Supports.{u4, u3, u2, u1} K Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ} {c' : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ) (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) (Option.instMembershipOption.{max (max (max u4 u3) u2) u1} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) c' (Turing.TM2.step.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM2.step_supports Turing.TM2.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
@@ -3546,10 +3534,7 @@ theorem trStmts₁_run {k s q} : tr_stmts₁ (st_run s q) = {go k s q, ret q}
#align turing.TM2to1.tr_stmts₁_run Turing.TM2to1.trStmts₁_run
/- warning: turing.TM2to1.tr_respects_aux₂ -> Turing.TM2to1.tr_respects_aux₂ is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} {q : Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ} {v : σ} {S : forall (k : K), List.{u2} (Γ k)} {L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))}, (forall (k : K), Eq.{succ u2} (Turing.ListBlank.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u2} (forall (k : K), Option.{u2} (Γ k)) (Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Option.inhabited.{u2} (Γ k)) (Turing.proj.{u1, u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)) k) L) (Turing.ListBlank.mk.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k)) (List.reverse.{u2} (Option.{u2} (Γ k)) (List.map.{u2, u2} (Γ k) (Option.{u2} (Γ k)) (Option.some.{u2} (Γ k)) (S k))))) -> (forall (o : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k), let v' : σ := Turing.TM2to1.stVar.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k v (S k) o; let Sk' : List.{u2} (Γ k) := Turing.TM2to1.stWrite.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k v (S k) o; let S' : forall (a : K), List.{u2} (Γ a) := Function.update.{succ u1, succ u2} K (fun (k : K) => List.{u2} (Γ k)) (fun (a : K) (b : K) => _inst_1 a b) S k Sk'; Exists.{succ (max u1 u2)} (Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) (fun (L' : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) => And (forall (k : K), Eq.{succ u2} (Turing.ListBlank.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u2} (forall (k : K), Option.{u2} (Γ k)) (Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Option.inhabited.{u2} (Γ k)) (Turing.proj.{u1, u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)) k) L') (Turing.ListBlank.mk.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k)) (List.reverse.{u2} (Option.{u2} (Γ k)) (List.map.{u2, u2} (Γ k) (Option.{u2} (Γ k)) (Option.some.{u2} (Γ k)) (S' k))))) (Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM1.stepAux.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.trStAct.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k q o) v (Nat.iterate.{succ (max u1 u2)} (Turing.Tape.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.Tape.move.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) Turing.Dir.right) (List.length.{u2} (Γ k) (S k)) (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L)))) (Turing.TM1.stepAux.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ q v' (Nat.iterate.{succ (max u1 u2)} (Turing.Tape.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.Tape.move.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) Turing.Dir.right) (List.length.{u2} (Γ k) (S' k)) (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L')))))))
-but is expected to have type
- forall {K : Type.{u3}} [_inst_1 : DecidableEq.{succ u3} K] {Γ : K -> Type.{u4}} {Λ : Type.{u1}} {_inst_2 : Type.{u2}} {σ : K} {_inst_3 : Turing.TM1.Stmt.{max u4 u3, max (max (max u2 u1) u4) u3, u2} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Λ'.{u3, u4, u1, u2} K Γ Λ _inst_2) _inst_2} {k : _inst_2} {q : forall (k : K), List.{u4} (Γ k)} {v : Turing.ListBlank.{max u3 u4} (forall (k : K), Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (a : K) => instInhabitedOption.{u4} (Γ a)))}, (forall (k : K), Eq.{succ u4} (Turing.ListBlank.{u4} (Option.{u4} (Γ k)) (instInhabitedOption.{u4} (Γ k))) (Turing.ListBlank.map.{max u4 u3, u4} (forall (i : K), Option.{u4} (Γ i)) (Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (i : K) => Option.{u4} (Γ i)) (fun (a : K) => instInhabitedOption.{u4} (Γ a))) (instInhabitedOption.{u4} (Γ k)) (Turing.proj.{u3, u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (a : K) => instInhabitedOption.{u4} (Γ a)) k) v) (Turing.ListBlank.mk.{u4} (Option.{u4} (Γ k)) (instInhabitedOption.{u4} (Γ k)) (List.reverse.{u4} (Option.{u4} (Γ k)) (List.map.{u4, u4} (Γ k) (Option.{u4} (Γ k)) (Option.some.{u4} (Γ k)) (q k))))) -> (forall (L : Turing.TM2to1.StAct.{u3, u4, u2} K Γ _inst_2 σ), let v' : _inst_2 := Turing.TM2to1.stVar.{u3, u4, u2} K Γ _inst_2 σ k (q σ) L; let Sk' : List.{u4} (Γ σ) := Turing.TM2to1.stWrite.{u3, u4, u2} K Γ _inst_2 σ k (q σ) L; let S' : forall (a : K), List.{u4} (Γ a) := Function.update.{succ u3, succ u4} K (fun (a : K) => List.{u4} (Γ a)) (fun (a : K) (b : K) => _inst_1 a b) q σ Sk'; Exists.{max (succ u3) (succ u4)} (Turing.ListBlank.{max u3 u4} (forall (k : K), Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (a : K) => instInhabitedOption.{u4} (Γ a)))) (fun (L' : Turing.ListBlank.{max u3 u4} (forall (k : K), Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (a : K) => instInhabitedOption.{u4} (Γ a)))) => And (forall (k : K), Eq.{succ u4} (Turing.ListBlank.{u4} (Option.{u4} (Γ k)) (instInhabitedOption.{u4} (Γ k))) (Turing.ListBlank.map.{max u4 u3, u4} (forall (i : K), Option.{u4} (Γ i)) (Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (i : K) => Option.{u4} (Γ i)) (fun (a : K) => instInhabitedOption.{u4} (Γ a))) (instInhabitedOption.{u4} (Γ k)) (Turing.proj.{u3, u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (a : K) => instInhabitedOption.{u4} (Γ a)) k) L') (Turing.ListBlank.mk.{u4} (Option.{u4} (Γ k)) (instInhabitedOption.{u4} (Γ k)) (List.reverse.{u4} (Option.{u4} (Γ k)) (List.map.{u4, u4} (Γ k) (Option.{u4} (Γ k)) (Option.some.{u4} (Γ k)) (S' k))))) (Eq.{max (max (max (succ u3) (succ u4)) (succ u1)) (succ u2)} (Turing.TM1.Cfg.{max u4 u3, max (max (max u2 u1) u4) u3, u2} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (Turing.TM2to1.Λ'.{u3, u4, u1, u2} K Γ Λ _inst_2) _inst_2) (Turing.TM1.stepAux.{max u4 u3, max (max (max u2 u1) u4) u3, u2} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (Turing.TM2to1.Λ'.{u3, u4, u1, u2} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.trStAct.{u3, u4, u1, u2} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ _inst_3 L) k (Nat.iterate.{succ (max u3 u4)} (Turing.Tape.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ)) (Turing.Tape.move.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) Turing.Dir.right) (List.length.{u4} (Γ σ) (q σ)) (Turing.Tape.mk'.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (EmptyCollection.emptyCollection.{max u3 u4} (Turing.ListBlank.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ)) (Turing.ListBlank.hasEmptyc.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ))) (Turing.TM2to1.addBottom.{u3, u4} K Γ v)))) (Turing.TM1.stepAux.{max u3 u4, max (max (max u3 u4) u1) u2, u2} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (Turing.TM2to1.Λ'.{u3, u4, u1, u2} K Γ Λ _inst_2) _inst_2 _inst_3 v' (Nat.iterate.{succ (max u3 u4)} (Turing.Tape.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ)) (Turing.Tape.move.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) Turing.Dir.right) (List.length.{u4} (Γ σ) (S' σ)) (Turing.Tape.mk'.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (EmptyCollection.emptyCollection.{max u3 u4} (Turing.ListBlank.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ)) (Turing.ListBlank.hasEmptyc.{max u3 u4} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ))) (Turing.TM2to1.addBottom.{u3, u4} K Γ L')))))))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux₂ Turing.TM2to1.tr_respects_aux₂ₓ'. -/
theorem tr_respects_aux₂ {k q v} {S : ∀ k, List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : ∀ k, L.map (proj k) = ListBlank.mk ((S k).map some).reverse) (o) :
@@ -3671,10 +3656,7 @@ inductive TrCfg : cfg₂ → cfg₁ → Prop
#align turing.TM2to1.tr_cfg Turing.TM2to1.TrCfg
/- warning: turing.TM2to1.tr_respects_aux₁ -> Turing.TM2to1.tr_respects_aux₁ is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) {k : K} (o : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ) (v : σ) {S : List.{u2} (Γ k)} {L : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))}, (Eq.{succ u2} (Turing.ListBlank.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u2} (forall (k : K), Option.{u2} (Γ k)) (Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Option.inhabited.{u2} (Γ k)) (Turing.proj.{u1, u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)) k) L) (Turing.ListBlank.mk.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k)) (List.reverse.{u2} (Option.{u2} (Γ k)) (List.map.{u2, u2} (Γ k) (Option.{u2} (Γ k)) (Option.some.{u2} (Γ k)) S)))) -> (forall (n : Nat), (LE.le.{0} Nat Nat.hasLe n (List.length.{u2} (Γ k) S)) -> (Turing.Reaches₀.{max (max u1 u2) (max u1 u2 u3 u4) u4} (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM1.step.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M)) (Turing.TM1.Cfg.mk.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Option.some.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k o q)) v (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L))) (Turing.TM1.Cfg.mk.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Option.some.{max u1 u2 u3 u4} (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) (Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k o q)) v (Nat.iterate.{succ (max u1 u2)} (Turing.Tape.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.Tape.move.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) Turing.Dir.right) n (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L))))))
-but is expected to have type
- forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u1}} {_inst_2 : Type.{u2}} (σ : Λ -> (Turing.TM2.Stmt.{u4, u3, u1, u2} K Γ Λ _inst_2)) {_inst_3 : K} (M : Turing.TM2to1.StAct.{u4, u3, u2} K Γ _inst_2 _inst_3) (k : Turing.TM2.Stmt.{u4, u3, u1, u2} K Γ Λ _inst_2) (o : _inst_2) {q : List.{u3} (Γ _inst_3)} {v : Turing.ListBlank.{max u4 u3} (forall (k : K), Option.{u3} (Γ k)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (k : K) => Option.{u3} (Γ k)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)))}, (Eq.{succ u3} (Turing.ListBlank.{u3} (Option.{u3} (Γ _inst_3)) (instInhabitedOption.{u3} (Γ _inst_3))) (Turing.ListBlank.map.{max u4 u3, u3} (forall (i : K), Option.{u3} (Γ i)) (Option.{u3} (Γ _inst_3)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (i : K) => Option.{u3} (Γ i)) (fun (a : K) => instInhabitedOption.{u3} (Γ a))) (instInhabitedOption.{u3} (Γ _inst_3)) (Turing.proj.{u4, u3} K (fun (k : K) => Option.{u3} (Γ k)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)) _inst_3) v) (Turing.ListBlank.mk.{u3} (Option.{u3} (Γ _inst_3)) (instInhabitedOption.{u3} (Γ _inst_3)) (List.reverse.{u3} (Option.{u3} (Γ _inst_3)) (List.map.{u3, u3} (Γ _inst_3) (Option.{u3} (Γ _inst_3)) (Option.some.{u3} (Γ _inst_3)) q)))) -> (forall (L : Nat), (LE.le.{0} Nat instLENat L (List.length.{u3} (Γ _inst_3) q)) -> (Turing.Reaches₀.{max (max u2 (max (max u2 u1) u3) u4) u3 u4} (Turing.TM1.Cfg.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2) (Turing.TM1.step.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.tr.{u4, u3, u1, u2} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ)) (Turing.TM1.Cfg.mk.{max u4 u3, max (max (max u4 u3) u1) u2, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2 (Option.some.{max (max (max u4 u3) u1) u2} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) (Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K Γ Λ _inst_2 _inst_3 M k)) o (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ v))) (Turing.TM1.Cfg.mk.{max u4 u3, max (max (max u4 u3) u1) u2, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2 (Option.some.{max (max (max u4 u3) u1) u2} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) (Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K Γ Λ _inst_2 _inst_3 M k)) o (Nat.iterate.{succ (max u4 u3)} (Turing.Tape.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.Tape.move.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) Turing.Dir.right) L (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ v))))))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux₁ Turing.TM2to1.tr_respects_aux₁ₓ'. -/
/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
@@ -3708,10 +3690,7 @@ theorem tr_respects_aux₃ {q v} {L : ListBlank (∀ k, Option (Γ k))} (n) :
#align turing.TM2to1.tr_respects_aux₃ Turing.TM2to1.tr_respects_aux₃
/- warning: turing.TM2to1.tr_respects_aux -> Turing.TM2to1.tr_respects_aux is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) {q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ} {v : σ} {T : Turing.ListBlank.{max u1 u2} (forall (i : K), Option.{u2} (Γ i)) (Pi.inhabited.{succ u1, succ u2} K (fun (i : K) => Option.{u2} (Γ i)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))} {k : K} {S : forall (k : K), List.{u2} (Γ k)}, (forall (k : K), Eq.{succ u2} (Turing.ListBlank.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u2} (forall (i : K), Option.{u2} (Γ i)) (Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (i : K) => Option.{u2} (Γ i)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Option.inhabited.{u2} (Γ k)) (Turing.proj.{u1, u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (k : K) => Option.inhabited.{u2} (Γ k)) k) T) (Turing.ListBlank.mk.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k)) (List.reverse.{u2} (Option.{u2} (Γ k)) (List.map.{u2, u2} (Γ k) (Option.{u2} (Γ k)) (Option.some.{u2} (Γ k)) (S k))))) -> (forall (o : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k), (forall {v : σ} {S : forall (k : K), List.{u2} (Γ k)} {T : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (i : K) => Option.inhabited.{u2} (Γ i)))}, (forall (k : K), Eq.{succ u2} (Turing.ListBlank.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u2} (forall (i : K), Option.{u2} (Γ i)) (Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (i : K) => Option.{u2} (Γ i)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Option.inhabited.{u2} (Γ k)) (Turing.proj.{u1, u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (i : K) => Option.inhabited.{u2} (Γ i)) k) T) (Turing.ListBlank.mk.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k)) (List.reverse.{u2} (Option.{u2} (Γ k)) (List.map.{u2, u2} (Γ k) (Option.{u2} (Γ k)) (Option.some.{u2} (Γ k)) (S k))))) -> (Exists.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (fun (b : Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) => And (Turing.TM2to1.TrCfg.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M (Turing.TM2.stepAux.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ q v S) b) (Turing.Reaches.{max (max u1 u2) (max u1 u2 u3 u4) u4} (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM1.step.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M)) (Turing.TM1.stepAux.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 q) v (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ T))) b)))) -> (Exists.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (fun (b : Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) => And (Turing.TM2to1.TrCfg.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M (Turing.TM2.stepAux.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k o q) v S) b) (Turing.Reaches.{max (max u1 u2) (max u1 u2 u3 u4) u4} (Turing.TM1.Cfg.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM1.step.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M)) (Turing.TM1.stepAux.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k o q)) v (Turing.Tape.mk'.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (EmptyCollection.emptyCollection.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.ListBlank.hasEmptyc.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ T))) b))))
-but is expected to have type
- forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {_inst_2 : Type.{u1}} (σ : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ _inst_2)) {_inst_3 : Turing.TM2.Stmt.{u4, u3, u2, u1} K (fun (k : K) => Γ k) Λ _inst_2} {M : _inst_2} {q : Turing.ListBlank.{max u3 u4} (forall (i : K), Option.{u3} (Γ i)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (i : K) => Option.{u3} (Γ i)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)))} {v : K} {T : forall (k : K), List.{u3} (Γ k)}, (forall (k : K), Eq.{succ u3} (Turing.ListBlank.{u3} (Option.{u3} (Γ k)) (instInhabitedOption.{u3} (Γ k))) (Turing.ListBlank.map.{max u3 u4, u3} (forall (i : K), Option.{u3} (Γ i)) (Option.{u3} (Γ k)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (i : K) => Option.{u3} (Γ i)) (fun (a : K) => instInhabitedOption.{u3} (Γ a))) (instInhabitedOption.{u3} (Γ k)) (Turing.proj.{u4, u3} K (fun (k : K) => Option.{u3} (Γ k)) (fun (i : K) => instInhabitedOption.{u3} (Γ i)) k) q) (Turing.ListBlank.mk.{u3} (Option.{u3} (Γ k)) (instInhabitedOption.{u3} (Γ k)) (List.reverse.{u3} (Option.{u3} (Γ k)) (List.map.{u3, u3} (Γ k) (Option.{u3} (Γ k)) (Option.some.{u3} (Γ k)) (T k))))) -> (forall (S : Turing.TM2to1.StAct.{u4, u3, u1} K Γ _inst_2 v), (forall {k : _inst_2} {S : forall (k : K), List.{u3} (Γ k)} {T : Turing.ListBlank.{max u4 u3} (forall (k : K), Option.{u3} (Γ k)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (k : K) => Option.{u3} (Γ k)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)))}, (forall (k : K), Eq.{succ u3} (Turing.ListBlank.{u3} (Option.{u3} (Γ k)) (instInhabitedOption.{u3} (Γ k))) (Turing.ListBlank.map.{max u3 u4, u3} (forall (i : K), Option.{u3} (Γ i)) (Option.{u3} (Γ k)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (i : K) => Option.{u3} (Γ i)) (fun (a : K) => instInhabitedOption.{u3} (Γ a))) (instInhabitedOption.{u3} (Γ k)) (Turing.proj.{u4, u3} K (fun (i : K) => Option.{u3} (Γ i)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)) k) T) (Turing.ListBlank.mk.{u3} (Option.{u3} (Γ k)) (instInhabitedOption.{u3} (Γ k)) (List.reverse.{u3} (Option.{u3} (Γ k)) (List.map.{u3, u3} (Γ k) (Option.{u3} (Γ k)) (Option.some.{u3} (Γ k)) (S k))))) -> (Exists.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Cfg.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K (fun (k : K) => Γ k)) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K (fun (k : K) => Γ k)) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K (fun (k : K) => Γ k) Λ _inst_2) _inst_2) (fun (b : Turing.TM1.Cfg.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K (fun (k : K) => Γ k)) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K (fun (k : K) => Γ k)) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K (fun (k : K) => Γ k) Λ _inst_2) _inst_2) => And (Turing.TM2to1.TrCfg.{u4, u3, u2, u1} K (fun (k : K) => Γ k) Λ _inst_2 (Turing.TM2.stepAux.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) (fun (k : K) => Γ k) Λ _inst_2 _inst_3 k S) b) (Turing.Reaches.{max (max u1 (max (max u1 u2) u3) u4) u3 u4} (Turing.TM1.Cfg.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2) (Turing.TM1.step.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.tr.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ)) (Turing.TM1.stepAux.{max u4 u3, max (max (max u4 u3) u2) u1, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.trNormal.{u4, u3, u2, u1} K Γ Λ _inst_2 _inst_3) k (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ T))) b)))) -> (Exists.{max (max (max (succ u4) (succ u3)) (succ u2)) (succ u1)} (Turing.TM1.Cfg.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2) (fun (b : Turing.TM1.Cfg.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2) => And (Turing.TM2to1.TrCfg.{u4, u3, u2, u1} K Γ Λ _inst_2 (Turing.TM2.stepAux.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 (Turing.TM2to1.stRun.{u4, u3, u2, u1} K Γ Λ _inst_2 v S _inst_3) M T) b) (Turing.Reaches.{max (max u1 (max (max u1 u2) u3) u4) u3 u4} (Turing.TM1.Cfg.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2) (Turing.TM1.step.{max u3 u4, max (max (max u1 u2) u3) u4, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.tr.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ)) (Turing.TM1.stepAux.{max u4 u3, max (max (max u4 u3) u2) u1, u1} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u2, u1} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.trNormal.{u4, u3, u2, u1} K Γ Λ _inst_2 (Turing.TM2to1.stRun.{u4, u3, u2, u1} K Γ Λ _inst_2 v S _inst_3)) M (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ q))) b))))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux Turing.TM2to1.tr_respects_auxₓ'. -/
theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
(hT : ∀ k, ListBlank.map (proj k) T = ListBlank.mk ((S k).map some).reverse) (o : st_act k)
@@ -3803,10 +3782,7 @@ theorem tr_eval_dom (k) (L : List (Γ k)) : (TM1.eval tr (tr_init k L)).Dom ↔
#align turing.TM2to1.tr_eval_dom Turing.TM2to1.tr_eval_dom
/- warning: turing.TM2to1.tr_eval -> Turing.TM2to1.tr_eval is a dubious translation:
-lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ)) (k : K) (L : List.{u2} (Γ k)) {L₁ : Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)} {L₂ : List.{u2} (Γ k)}, (Membership.Mem.{max u1 u2, max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Part.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) (Part.hasMem.{max u1 u2} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ))) L₁ (Turing.TM1.eval.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (Turing.TM2to1.Λ'.inhabited.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) _inst_3 (Turing.TM2to1.tr.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 M) (Turing.TM2to1.trInit.{u1, u2} K _inst_1 Γ k L))) -> (Membership.Mem.{u2, u2} (List.{u2} (Γ k)) (Part.{u2} (List.{u2} (Γ k))) (Part.hasMem.{u2} (List.{u2} (Γ k))) L₂ (Turing.TM2.eval.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_2 _inst_3 M k L)) -> (Exists.{max (succ u1) (succ u2)} (forall (k : K), List.{u2} (Γ k)) (fun (S : forall (k : K), List.{u2} (Γ k)) => Exists.{succ (max u1 u2)} (Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) (fun (L' : Turing.ListBlank.{max u1 u2} (forall (k : K), Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)))) => And (Eq.{succ (max u1 u2)} (Turing.ListBlank.{max u1 u2} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ)) (Turing.TM2to1.addBottom.{u1, u2} K _inst_1 Γ L') L₁) (And (forall (k : K), Eq.{succ u2} (Turing.ListBlank.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k))) (Turing.ListBlank.map.{max u1 u2, u2} (forall (k : K), Option.{u2} (Γ k)) (Option.{u2} (Γ k)) (Pi.inhabited.{succ u1, succ u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x))) (Option.inhabited.{u2} (Γ k)) (Turing.proj.{u1, u2} K (fun (k : K) => Option.{u2} (Γ k)) (fun (x : K) => Option.inhabited.{u2} (Γ x)) k) L') (Turing.ListBlank.mk.{u2} (Option.{u2} (Γ k)) (Option.inhabited.{u2} (Γ k)) (List.reverse.{u2} (Option.{u2} (Γ k)) (List.map.{u2, u2} (Γ k) (Option.{u2} (Γ k)) (Option.some.{u2} (Γ k)) (S k))))) (Eq.{succ u2} (List.{u2} (Γ k)) (S k) L₂)))))
-but is expected to have type
- forall {K : Type.{u3}} [_inst_1 : DecidableEq.{succ u3} K] {Γ : K -> Type.{u4}} {Λ : Type.{u1}} [_inst_2 : Inhabited.{succ u1} Λ] {σ : Type.{u2}} [_inst_3 : Inhabited.{succ u2} σ] (M : Λ -> (Turing.TM2.Stmt.{u3, u4, u1, u2} K Γ Λ σ)) (k : K) (L : List.{u4} (Γ k)) {L₁ : Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ)} {L₂ : List.{u4} (Γ k)}, (Membership.mem.{max u3 u4, max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ)) (Part.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ))) (Part.instMembershipPart.{max u3 u4} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ))) L₁ (Turing.TM1.eval.{max u4 u3, max (max (max u2 u1) u4) u3, u2} (Turing.TM2to1.Γ'.{u3, u4} K Γ) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K Γ) (Turing.TM2to1.Λ'.{u3, u4, u1, u2} K Γ Λ σ) σ (Turing.TM2to1.Λ'.inhabited.{u3, u4, u1, u2} K Γ Λ _inst_2 σ) _inst_3 (Turing.TM2to1.tr.{u3, u4, u1, u2} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M) (Turing.TM2to1.trInit.{u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ k L))) -> (Membership.mem.{u4, u4} (List.{u4} (Γ k)) (Part.{u4} (List.{u4} (Γ k))) (Part.instMembershipPart.{u4} (List.{u4} (Γ k))) L₂ (Turing.TM2.eval.{u3, u4, u1, u2} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_2 _inst_3 M k L)) -> (Exists.{max (succ u3) (succ u4)} (forall (k : K), List.{u4} (Γ k)) (fun (S : forall (k : K), List.{u4} (Γ k)) => Exists.{max (succ u3) (succ u4)} (Turing.ListBlank.{max u3 u4} (forall (k : K), Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (x : K) => instInhabitedOption.{u4} (Γ x)))) (fun (L' : Turing.ListBlank.{max u3 u4} (forall (k : K), Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (x : K) => instInhabitedOption.{u4} (Γ x)))) => And (Eq.{max (succ u3) (succ u4)} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u3, u4} K (fun (k : K) => Γ k)) (Turing.TM2to1.Γ'.inhabited.{u3, u4} K (fun (k : K) => Γ k))) (Turing.TM2to1.addBottom.{u3, u4} K (fun (k : K) => Γ k) L') L₁) (And (forall (k : K), Eq.{succ u4} (Turing.ListBlank.{u4} (Option.{u4} (Γ k)) (instInhabitedOption.{u4} (Γ k))) (Turing.ListBlank.map.{max u4 u3, u4} (forall (k : K), Option.{u4} (Γ k)) (Option.{u4} (Γ k)) (instInhabitedForAll_1.{succ u3, succ u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (x : K) => instInhabitedOption.{u4} (Γ x))) (instInhabitedOption.{u4} (Γ k)) (Turing.proj.{u3, u4} K (fun (k : K) => Option.{u4} (Γ k)) (fun (x : K) => instInhabitedOption.{u4} (Γ x)) k) L') (Turing.ListBlank.mk.{u4} (Option.{u4} (Γ k)) (instInhabitedOption.{u4} (Γ k)) (List.reverse.{u4} (Option.{u4} (Γ k)) (List.map.{u4, u4} (Γ k) (Option.{u4} (Γ k)) (Option.some.{u4} (Γ k)) (S k))))) (Eq.{succ u4} (List.{u4} (Γ k)) (S k) L₂)))))
+<too large>
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_eval Turing.TM2to1.tr_evalₓ'. -/
theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval tr (tr_init k L))
(H₂ : L₂ ∈ TM2.eval M k L) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/8d33f09cd7089ecf074b4791907588245aec5d1b
@@ -238,7 +238,7 @@ precondition `blank_extends` instead of `blank_rel`. -/
@[elab_as_elim, reducible]
protected def ListBlank.liftOn {Γ} [Inhabited Γ] {α} (l : ListBlank Γ) (f : List Γ → α)
(H : ∀ a b, BlankExtends a b → f a = f b) : α :=
- l.liftOn' f <| by rintro a b (h | h) <;> [exact H _ _ h, exact (H _ _ h).symm]
+ l.liftOn' f <| by rintro a b (h | h) <;> [exact H _ _ h;exact (H _ _ h).symm]
#align turing.list_blank.lift_on Turing.ListBlank.liftOn
-/
@@ -282,7 +282,7 @@ def ListBlank.tail {Γ} [Inhabited Γ] (l : ListBlank Γ) : ListBlank Γ :=
(by
rintro _ _ ⟨i, rfl⟩
refine' Quotient.sound' (Or.inl _)
- cases a <;> [· cases i <;> [exact ⟨0, rfl⟩, exact ⟨i, rfl⟩], exact ⟨i, rfl⟩])
+ cases a <;> [· cases i <;> [exact ⟨0, rfl⟩;exact ⟨i, rfl⟩];exact ⟨i, rfl⟩])
#align turing.list_blank.tail Turing.ListBlank.tail
-/
@@ -400,7 +400,7 @@ theorem ListBlank.ext {Γ} [Inhabited Γ] {L₁ L₂ : ListBlank Γ} :
ListBlank.induction_on L₂ fun l₂ H =>
by
wlog h : l₁.length ≤ l₂.length
- · cases le_total l₁.length l₂.length <;> [skip, symm] <;> apply_assumption <;> try assumption
+ · cases le_total l₁.length l₂.length <;> [skip;symm] <;> apply_assumption <;> try assumption
intro
rw [H]
refine' Quotient.sound' (Or.inl ⟨l₂.length - l₁.length, _⟩)
@@ -494,7 +494,7 @@ Case conversion may be inaccurate. Consider using '#align turing.pointed_map.hea
@[simp]
theorem PointedMap.headI_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : List Γ) : (l.map f).headI = f l.headI := by
- cases l <;> [exact (pointed_map.map_pt f).symm, rfl]
+ cases l <;> [exact (pointed_map.map_pt f).symm;rfl]
#align turing.pointed_map.head_map Turing.PointedMap.headI_map
#print Turing.ListBlank.map /-
@@ -890,8 +890,8 @@ theorem Tape.move_right_nth {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℤ) :
@[simp]
theorem Tape.move_right_n_head {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℕ) :
((Tape.move Dir.right^[i]) T).headI = T.get? i := by
- induction i generalizing T <;> [rfl,
- simp only [*, tape.move_right_nth, Int.ofNat_succ, iterate_succ]]
+ induction i generalizing T <;>
+ [rfl;simp only [*, tape.move_right_nth, Int.ofNat_succ, iterate_succ]]
#align turing.tape.move_right_n_head Turing.Tape.move_right_n_head
-/
@@ -1866,7 +1866,7 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
induction' q₂ with _ q IH _ q IH _ q IH <;>
simp only [stmts₁, supports_stmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at
h hs
- iterate 3 rcases h with (rfl | h) <;> [exact hs, exact IH h hs]
+ iterate 3 rcases h with (rfl | h) <;> [exact hs;exact IH h hs]
case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
@@ -2598,7 +2598,7 @@ theorem tr_respects : Respects (step M) (step tr) fun c₁ c₂ => tr_cfg c₁ =
case
branch p q₁ q₂ IH₁ IH₂ =>
simp only [tr_normal, step_aux_read dec enc0 encdec, step_aux]
- cases p R.head v <;> [apply IH₂, apply IH₁]
+ cases p R.head v <;> [apply IH₂;apply IH₁]
case
goto l =>
simp only [tr_normal, step_aux_read dec enc0 encdec, step_aux, tr_cfg, tr_tape_mk']
@@ -3031,7 +3031,7 @@ theorem stmts₁_supportsStmt_mono {S q₁ q₂} (h : q₁ ∈ stmts₁ q₂) (h
induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;>
simp only [stmts₁, supports_stmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at
h hs
- iterate 4 rcases h with (rfl | h) <;> [exact hs, exact IH h hs]
+ iterate 4 rcases h with (rfl | h) <;> [exact hs;exact IH h hs]
case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
@@ -3760,7 +3760,7 @@ theorem tr_respects : Respects (TM2.step M) (TM1.step tr) tr_cfg := fun c₁ c
· exact tr_respects_aux M hT s @IH
· exact IH _ hT
· unfold TM2.step_aux tr_normal TM1.step_aux
- cases p v <;> [exact IH₂ _ hT, exact IH₁ _ hT]
+ cases p v <;> [exact IH₂ _ hT;exact IH₁ _ hT]
· exact ⟨_, ⟨_, hT⟩, refl_trans_gen.refl⟩
· exact ⟨_, ⟨_, hT⟩, refl_trans_gen.refl⟩
#align turing.TM2to1.tr_respects Turing.TM2to1.tr_respects
@@ -3849,7 +3849,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
rcases Finset.mem_biUnion.1 h with ⟨l, lS, h⟩
have :=
this _ (ss.2 l lS) fun x hx => Finset.mem_biUnion.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
- rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1, exact this.2 _ h]
+ rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1;exact this.2 _ h]
clear h l'
refine' stmt_st_rec _ _ _ _ _ <;> intros
· -- stack op
@@ -3882,7 +3882,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
cases' IH₂ ss'.2 fun x hx => sub x <| Finset.mem_union_right _ hx with IH₂₁ IH₂₂
refine' ⟨⟨IH₁₁, IH₂₁⟩, fun l h => _⟩
rw [tr_stmts₁] at h
- rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h, exact IH₂₂ _ h]
+ rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h;exact IH₂₂ _ h]
· -- goto
rw [tr_stmts₁]
unfold TM2to1.tr_normal TM1.supports_stmt
mathlib commit https://github.com/leanprover-community/mathlib/commit/95a87616d63b3cb49d3fe678d416fbe9c4217bf4
@@ -1929,7 +1929,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
lean 3 declaration is
forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) (Option.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) (Option.hasMem.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u1, u2, u3} Γ _inst_1 Λ σ M c)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c) (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c') (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)))
but is expected to have type
- forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u3, u2, u1} Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u3, u2, u1} Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ) (Option.{max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) (Option.instMembershipOption.{max (max u3 u2) u1} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u3, u2, u1} Γ _inst_1 Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)))
+ forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u3, u2, u1} Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u3, u2, u1} Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ) (Option.{max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) (Option.instMembershipOption.{max (max u3 u2) u1} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u3, u2, u1} Γ _inst_1 Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)))
Case conversion may be inaccurate. Consider using '#align turing.TM1.step_supports Turing.TM1.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
@@ -3092,7 +3092,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} [_inst_2 : Inhabited.{succ u3} Λ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) {S : Finset.{u3} Λ}, (Turing.TM2.Supports.{u1, u2, u3, u4} K _inst_1 Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {c' : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Option.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Option.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) c' (Turing.TM2.step.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M c)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c) (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c') (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)))
but is expected to have type
- forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM2.Supports.{u4, u3, u2, u1} K Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ} {c' : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ) (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) (Option.instMembershipOption.{max (max (max u4 u3) u2) u1} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) c' (Turing.TM2.step.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)))
+ forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM2.Supports.{u4, u3, u2, u1} K Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ} {c' : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ) (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) (Option.instMembershipOption.{max (max (max u4 u3) u2) u1} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) c' (Turing.TM2.step.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.869 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.684 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.682 x._@.Mathlib.Order.Hom.Basic._hyg.684) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.699 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.697 x._@.Mathlib.Order.Hom.Basic._hyg.699))) (Finset.insertNone.{u2} Λ) S)))
Case conversion may be inaccurate. Consider using '#align turing.TM2.step_supports Turing.TM2.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -1927,7 +1927,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
/- warning: turing.TM1.step_supports -> Turing.TM1.step_supports is a dubious translation:
lean 3 declaration is
- forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) (Option.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) (Option.hasMem.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u1, u2, u3} Γ _inst_1 Λ σ M c)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c) (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c') (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)))
+ forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) (Option.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) (Option.hasMem.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u1, u2, u3} Γ _inst_1 Λ σ M c)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c) (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c') (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toHasLe.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toHasLe.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)))
but is expected to have type
forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u3, u2, u1} Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u3, u2, u1} Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ) (Option.{max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) (Option.instMembershipOption.{max (max u3 u2) u1} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u3, u2, u1} Γ _inst_1 Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)))
Case conversion may be inaccurate. Consider using '#align turing.TM1.step_supports Turing.TM1.step_supportsₓ'. -/
@@ -3090,7 +3090,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
/- warning: turing.TM2.step_supports -> Turing.TM2.step_supports is a dubious translation:
lean 3 declaration is
- forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} [_inst_2 : Inhabited.{succ u3} Λ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) {S : Finset.{u3} Λ}, (Turing.TM2.Supports.{u1, u2, u3, u4} K _inst_1 Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {c' : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Option.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Option.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) c' (Turing.TM2.step.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M c)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c) (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c') (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)))
+ forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} [_inst_2 : Inhabited.{succ u3} Λ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) {S : Finset.{u3} Λ}, (Turing.TM2.Supports.{u1, u2, u3, u4} K _inst_1 Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {c' : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Option.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Option.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) c' (Turing.TM2.step.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M c)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c) (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c') (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toHasLe.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toHasLe.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)))
but is expected to have type
forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM2.Supports.{u4, u3, u2, u1} K Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ} {c' : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ) (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) (Option.instMembershipOption.{max (max (max u4 u3) u2) u1} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) c' (Turing.TM2.step.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)))
Case conversion may be inaccurate. Consider using '#align turing.TM2.step_supports Turing.TM2.step_supportsₓ'. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -3511,7 +3511,7 @@ def trNormal : stmt₂ → stmt₁
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM1.Stmt.goto.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (fun (_x : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (_x : σ) => Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))
but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57723 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57725 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
+ forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57719 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57721 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_runₓ'. -/
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -1881,7 +1881,7 @@ Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts Turin
/-- The set of all statements in a turing machine, plus one extra value `none` representing the
halt state. This is used in the TM1 to TM0 reduction. -/
noncomputable def stmts (M : Λ → stmt) (S : Finset Λ) : Finset (Option stmt) :=
- (S.bunionᵢ fun q => stmts₁ (M q)).insertNone
+ (S.biUnion fun q => stmts₁ (M q)).insertNone
#align turing.TM1.stmts Turing.TM1.stmts
/- warning: turing.TM1.stmts_trans -> Turing.TM1.stmts_trans is a dubious translation:
@@ -1892,7 +1892,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts_trans Turing.TM1.stmts_transₓ'. -/
theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, forall_eq',
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h₂ => ⟨_, ls, stmts₁_trans h₂ h₁⟩
#align turing.TM1.stmts_trans Turing.TM1.stmts_trans
@@ -1920,7 +1920,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align turing.TM1.stmts_supports_stmt Turing.TM1.stmts_supportsStmtₓ'. -/
theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
some q ∈ stmts M S → supports_stmt S q := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, forall_eq',
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h => stmts₁_supports_stmt_mono h (ss.2 _ ls)
#align turing.TM1.stmts_supports_stmt Turing.TM1.stmts_supportsStmt
@@ -2138,7 +2138,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align turing.TM1to0.tr_supports Turing.TM1to0.tr_supportsₓ'. -/
theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr ↑(tr_stmts S) :=
⟨Finset.mem_product.2
- ⟨Finset.some_mem_insertNone.2 (Finset.mem_bunionᵢ.2 ⟨_, ss.1, TM1.stmts₁_self⟩),
+ ⟨Finset.some_mem_insertNone.2 (Finset.mem_biUnion.2 ⟨_, ss.1, TM1.stmts₁_self⟩),
Finset.mem_univ _⟩,
fun q a q' s h₁ h₂ => by
rcases q with ⟨_ | q, v⟩; · cases h₁
@@ -2171,7 +2171,7 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) : TM0.Supports tr
unfold TM1.stmts₁
exact Finset.mem_insert_of_mem (Finset.mem_union_left _ TM1.stmts₁_self)
case goto l => cases h₁;
- exact Finset.some_mem_insertNone.2 (Finset.mem_bunionᵢ.2 ⟨_, hs _ _, TM1.stmts₁_self⟩)
+ exact Finset.some_mem_insertNone.2 (Finset.mem_biUnion.2 ⟨_, hs _ _, TM1.stmts₁_self⟩)
case halt => cases h₁⟩
#align turing.TM1to0.tr_supports Turing.TM1to0.tr_supports
@@ -2641,7 +2641,7 @@ Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr_supp
/-- The set of accessible machine states, assuming that the input machine is supported on `S`,
are the normal states embedded from `S`, plus all write states accessible from these states. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ' :=
- S.bunionᵢ fun l => insert (Λ'.normal l) (writes (M l))
+ S.biUnion fun l => insert (Λ'.normal l) (writes (M l))
#align turing.TM1to1.tr_supp Turing.TM1to1.trSupp
/- warning: turing.TM1to1.tr_supports -> Turing.TM1to1.tr_supports is a dubious translation:
@@ -2651,7 +2651,7 @@ but is expected to have type
forall {Γ : Type.{u2}} {_inst_1 : Type.{u3}} [Λ : Inhabited.{succ u3} _inst_1] {_inst_2 : Type.{u1}} {σ : Nat} {_inst_3 : Γ -> (Vector.{0} Bool σ)} (n : (Vector.{0} Bool σ) -> Γ) (enc : _inst_1 -> (Turing.TM1.Stmt.{u2, u3, u1} Γ _inst_1 _inst_2)) [dec : Fintype.{u2} Γ] {M : Finset.{u3} _inst_1}, (Turing.TM1.Supports.{u2, u3, u1} Γ _inst_1 _inst_2 Λ enc M) -> (Turing.TM1.Supports.{0, max (max u1 u3) u2, u1} Bool (Turing.TM1to1.Λ'.{u2, u3, u1} Γ _inst_1 _inst_2) _inst_2 (Turing.TM1to1.instInhabitedΛ'.{u2, u3, u1} Γ _inst_1 Λ _inst_2) (Turing.TM1to1.tr.{u2, u3, u1} Γ _inst_1 _inst_2 σ _inst_3 n enc) (Turing.TM1to1.trSupp.{u2, u3, u1} Γ _inst_1 _inst_2 enc dec M))
Case conversion may be inaccurate. Consider using '#align turing.TM1to1.tr_supports Turing.TM1to1.tr_supportsₓ'. -/
theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
- ⟨Finset.mem_bunionᵢ.2 ⟨_, ss.1, Finset.mem_insert_self _ _⟩, fun q h =>
+ ⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert_self _ _⟩, fun q h =>
by
suffices
∀ q,
@@ -2660,9 +2660,9 @@ theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
supports_stmt (tr_supp M S) (tr_normal dec q) ∧
∀ q' ∈ writes q, supports_stmt (tr_supp M S) (tr enc dec M q')
by
- rcases Finset.mem_bunionᵢ.1 h with ⟨l, hl, h⟩
+ rcases Finset.mem_biUnion.1 h with ⟨l, hl, h⟩
have :=
- this _ (ss.2 _ hl) fun q' hq => Finset.mem_bunionᵢ.2 ⟨_, hl, Finset.mem_insert_of_mem hq⟩
+ this _ (ss.2 _ hl) fun q' hq => Finset.mem_biUnion.2 ⟨_, hl, Finset.mem_insert_of_mem hq⟩
rcases Finset.mem_insert.1 h with (rfl | h)
exacts[this.1, this.2 _ h]
intro q hs hw
@@ -2693,7 +2693,7 @@ theorem tr_supports {S} (ss : Supports M S) : Supports tr (tr_supp S) :=
case goto l =>
refine' ⟨_, fun _ => False.elim⟩
refine' supports_stmt_read _ fun a _ s => _
- exact Finset.mem_bunionᵢ.2 ⟨_, hs _ _, Finset.mem_insert_self _ _⟩
+ exact Finset.mem_biUnion.2 ⟨_, hs _ _, Finset.mem_insert_self _ _⟩
case halt =>
refine' ⟨_, fun _ => False.elim⟩
simp only [supports_stmt, supports_stmt_move, tr_normal]⟩
@@ -3045,7 +3045,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts Turing.TM2.stmtsₓ'. -/
/-- The set of statements accessible from initial set `S` of labels. -/
noncomputable def stmts (M : Λ → stmt) (S : Finset Λ) : Finset (Option stmt) :=
- (S.bunionᵢ fun q => stmts₁ (M q)).insertNone
+ (S.biUnion fun q => stmts₁ (M q)).insertNone
#align turing.TM2.stmts Turing.TM2.stmts
/- warning: turing.TM2.stmts_trans -> Turing.TM2.stmts_trans is a dubious translation:
@@ -3056,7 +3056,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts_trans Turing.TM2.stmts_transₓ'. -/
theorem stmts_trans {M : Λ → stmt} {S q₁ q₂} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, forall_eq',
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h₂ => ⟨_, ls, stmts₁_trans h₂ h₁⟩
#align turing.TM2.stmts_trans Turing.TM2.stmts_trans
@@ -3083,7 +3083,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align turing.TM2.stmts_supports_stmt Turing.TM2.stmts_supportsStmtₓ'. -/
theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
some q ∈ stmts M S → supports_stmt S q := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, forall_eq',
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, forall_eq',
exists_imp] <;>
exact fun l ls h => stmts₁_supports_stmt_mono h (ss.2 _ ls)
#align turing.TM2.stmts_supports_stmt Turing.TM2.stmts_supportsStmt
@@ -3829,7 +3829,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_supp Turing.TM2to1.trSuppₓ'. -/
/-- The support of a set of TM2 states in the TM2 emulator. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ' :=
- S.bunionᵢ fun l => insert (normal l) (tr_stmts₁ (M l))
+ S.biUnion fun l => insert (normal l) (tr_stmts₁ (M l))
#align turing.TM2to1.tr_supp Turing.TM2to1.trSupp
/- warning: turing.TM2to1.tr_supports -> Turing.TM2to1.tr_supports is a dubious translation:
@@ -3839,16 +3839,16 @@ but is expected to have type
forall {K : Type.{u3}} [_inst_1 : DecidableEq.{succ u3} K] {Γ : K -> Type.{u2}} {Λ : Type.{u4}} [_inst_2 : Inhabited.{succ u4} Λ] {σ : Type.{u1}} (_inst_3 : Λ -> (Turing.TM2.Stmt.{u3, u2, u4, u1} K Γ Λ σ)) {M : Finset.{u4} Λ}, (Turing.TM2.Supports.{u3, u2, u4, u1} K Γ Λ σ _inst_2 _inst_3 M) -> (Turing.TM1.Supports.{max u2 u3, max (max (max u1 u4) u2) u3, u1} (Turing.TM2to1.Γ'.{u3, u2} K Γ) (Turing.TM2to1.Λ'.{u3, u2, u4, u1} K Γ Λ σ) σ (Turing.TM2to1.Λ'.inhabited.{u3, u2, u4, u1} K Γ Λ _inst_2 σ) (Turing.TM2to1.tr.{u3, u2, u4, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ _inst_3) (Turing.TM2to1.trSupp.{u3, u2, u4, u1} K Γ Λ σ _inst_3 M))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_supports Turing.TM2to1.tr_supportsₓ'. -/
theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
- ⟨Finset.mem_bunionᵢ.2 ⟨_, ss.1, Finset.mem_insert.2 <| Or.inl rfl⟩, fun l' h =>
+ ⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert.2 <| Or.inl rfl⟩, fun l' h =>
by
suffices
∀ (q) (ss' : TM2.supports_stmt S q) (sub : ∀ x ∈ tr_stmts₁ q, x ∈ tr_supp M S),
TM1.supports_stmt (tr_supp M S) (tr_normal q) ∧
∀ l' ∈ tr_stmts₁ q, TM1.supports_stmt (tr_supp M S) (tr M l')
by
- rcases Finset.mem_bunionᵢ.1 h with ⟨l, lS, h⟩
+ rcases Finset.mem_biUnion.1 h with ⟨l, lS, h⟩
have :=
- this _ (ss.2 l lS) fun x hx => Finset.mem_bunionᵢ.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
+ this _ (ss.2 l lS) fun x hx => Finset.mem_biUnion.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1, exact this.2 _ h]
clear h l'
refine' stmt_st_rec _ _ _ _ _ <;> intros
@@ -3888,7 +3888,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports tr (tr_supp S) :=
unfold TM2to1.tr_normal TM1.supports_stmt
unfold TM2.supports_stmt at ss'
exact
- ⟨fun _ v => Finset.mem_bunionᵢ.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩, fun _ =>
+ ⟨fun _ v => Finset.mem_biUnion.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩, fun _ =>
False.elim⟩
· exact ⟨trivial, fun _ => False.elim⟩⟩
#align turing.TM2to1.tr_supports Turing.TM2to1.tr_supports
mathlib commit https://github.com/leanprover-community/mathlib/commit/39478763114722f0ec7613cb2f3f7701f9b86c8d
@@ -3511,7 +3511,7 @@ def trNormal : stmt₂ → stmt₁
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM1.Stmt.goto.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (fun (_x : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (_x : σ) => Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))
but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57672 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57674 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
+ forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57723 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57725 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_runₓ'. -/
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/730c6d4cab72b9d84fcfb9e95e8796e9cd8f40ba
@@ -1929,7 +1929,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
lean 3 declaration is
forall {Γ : Type.{u1}} [_inst_1 : Inhabited.{succ u1} Γ] {Λ : Type.{u2}} {σ : Type.{u3}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u1, u2, u3} Γ _inst_1 Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u1, u2, u3} Γ _inst_1 Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ}, (Membership.Mem.{max u1 u2 u3, max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ) (Option.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) (Option.hasMem.{max u1 u2 u3} (Turing.TM1.Cfg.{u1, u2, u3} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u1, u2, u3} Γ _inst_1 Λ σ M c)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c) (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.Mem.{u2, u2} (Option.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Finset.hasMem.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u1, u2, u3} Γ _inst_1 Λ σ c') (coeFn.{succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (fun (_x : RelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) => (Finset.{u2} Λ) -> (Finset.{u2} (Option.{u2} Λ))) (RelEmbedding.hasCoeToFun.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ)))) (LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))))) (Finset.insertNone.{u2} Λ) S)))
but is expected to have type
- forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u3, u2, u1} Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u3, u2, u1} Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ) (Option.{max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) (Option.instMembershipOption.{max (max u3 u2) u1} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u3, u2, u1} Γ _inst_1 Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (EmbeddingLike.toFunLike.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Function.instEmbeddingLikeEmbedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)))) (RelEmbedding.toEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (Finset.insertNone.{u2} Λ)) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (EmbeddingLike.toFunLike.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Function.instEmbeddingLikeEmbedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)))) (RelEmbedding.toEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (Finset.insertNone.{u2} Λ)) S)))
+ forall {Γ : Type.{u3}} [_inst_1 : Inhabited.{succ u3} Γ] {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM1.Stmt.{u3, u2, u1} Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM1.Supports.{u3, u2, u1} Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ} {c' : Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ}, (Membership.mem.{max (max u3 u2) u1, max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ) (Option.{max (max u1 u2) u3} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) (Option.instMembershipOption.{max (max u3 u2) u1} (Turing.TM1.Cfg.{u3, u2, u1} Γ _inst_1 Λ σ)) c' (Turing.TM1.step.{u3, u2, u1} Γ _inst_1 Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM1.Cfg.l.{u3, u2, u1} Γ _inst_1 Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)))
Case conversion may be inaccurate. Consider using '#align turing.TM1.step_supports Turing.TM1.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
@@ -3092,7 +3092,7 @@ theorem stmts_supportsStmt {M : Λ → stmt} {S q} (ss : supports M S) :
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} {σ : Type.{u4}} [_inst_2 : Inhabited.{succ u3} Λ] (M : Λ -> (Turing.TM2.Stmt.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) {S : Finset.{u3} Λ}, (Turing.TM2.Supports.{u1, u2, u3, u4} K _inst_1 Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ} {c' : Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ}, (Membership.Mem.{max u1 u2 u3 u4, max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ) (Option.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) (Option.hasMem.{max u1 u2 u3 u4} (Turing.TM2.Cfg.{u1, u2, u3, u4} K _inst_1 Γ Λ σ)) c' (Turing.TM2.step.{u1, u2, u3, u4} K _inst_1 Γ Λ σ M c)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c) (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)) -> (Membership.Mem.{u3, u3} (Option.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Finset.hasMem.{u3} (Option.{u3} Λ)) (Turing.TM2.Cfg.l.{u1, u2, u3, u4} K _inst_1 Γ Λ σ c') (coeFn.{succ u3, succ u3} (OrderEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ))) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ))))) (fun (_x : RelEmbedding.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) => (Finset.{u3} Λ) -> (Finset.{u3} (Option.{u3} Λ))) (RelEmbedding.hasCoeToFun.{u3, u3} (Finset.{u3} Λ) (Finset.{u3} (Option.{u3} Λ)) (LE.le.{u3} (Finset.{u3} Λ) (Preorder.toLE.{u3} (Finset.{u3} Λ) (PartialOrder.toPreorder.{u3} (Finset.{u3} Λ) (Finset.partialOrder.{u3} Λ)))) (LE.le.{u3} (Finset.{u3} (Option.{u3} Λ)) (Preorder.toLE.{u3} (Finset.{u3} (Option.{u3} Λ)) (PartialOrder.toPreorder.{u3} (Finset.{u3} (Option.{u3} Λ)) (Finset.partialOrder.{u3} (Option.{u3} Λ)))))) (Finset.insertNone.{u3} Λ) S)))
but is expected to have type
- forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM2.Supports.{u4, u3, u2, u1} K Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ} {c' : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ) (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) (Option.instMembershipOption.{max (max (max u4 u3) u2) u1} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) c' (Turing.TM2.step.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (EmbeddingLike.toFunLike.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Function.instEmbeddingLikeEmbedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)))) (RelEmbedding.toEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (Finset.insertNone.{u2} Λ)) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Data.FunLike.Embedding._hyg.19 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (EmbeddingLike.toFunLike.{succ u2, succ u2, succ u2} (Function.Embedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Function.instEmbeddingLikeEmbedding.{succ u2, succ u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)))) (RelEmbedding.toEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (Finset.insertNone.{u2} Λ)) S)))
+ forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u2}} {σ : Type.{u1}} [_inst_2 : Inhabited.{succ u2} Λ] (M : Λ -> (Turing.TM2.Stmt.{u4, u3, u2, u1} K Γ Λ σ)) {S : Finset.{u2} Λ}, (Turing.TM2.Supports.{u4, u3, u2, u1} K Γ Λ σ _inst_2 M S) -> (forall {c : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ} {c' : Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ}, (Membership.mem.{max (max (max u4 u3) u2) u1, max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ) (Option.{max (max (max u1 u2) u3) u4} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) (Option.instMembershipOption.{max (max (max u4 u3) u2) u1} (Turing.TM2.Cfg.{u4, u3, u2, u1} K Γ Λ σ)) c' (Turing.TM2.step.{u4, u3, u2, u1} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ M c)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c) (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)) -> (Membership.mem.{u2, u2} (Option.{u2} Λ) ((fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) S) (Finset.instMembershipFinset.{u2} (Option.{u2} Λ)) (Turing.TM2.Cfg.l.{u4, u3, u2, u1} K Γ Λ σ c') (FunLike.coe.{succ u2, succ u2, succ u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (fun (_x : Finset.{u2} Λ) => (fun (x._@.Mathlib.Order.RelIso.Basic._hyg.867 : Finset.{u2} Λ) => Finset.{u2} (Option.{u2} Λ)) _x) (RelHomClass.toFunLike.{u2, u2, u2} (OrderEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ))))) (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697) (RelEmbedding.instRelHomClassRelEmbedding.{u2, u2} (Finset.{u2} Λ) (Finset.{u2} (Option.{u2} Λ)) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.680 : Finset.{u2} Λ) (x._@.Mathlib.Order.Hom.Basic._hyg.682 : Finset.{u2} Λ) => LE.le.{u2} (Finset.{u2} Λ) (Preorder.toLE.{u2} (Finset.{u2} Λ) (PartialOrder.toPreorder.{u2} (Finset.{u2} Λ) (Finset.partialOrder.{u2} Λ))) x._@.Mathlib.Order.Hom.Basic._hyg.680 x._@.Mathlib.Order.Hom.Basic._hyg.682) (fun (x._@.Mathlib.Order.Hom.Basic._hyg.695 : Finset.{u2} (Option.{u2} Λ)) (x._@.Mathlib.Order.Hom.Basic._hyg.697 : Finset.{u2} (Option.{u2} Λ)) => LE.le.{u2} (Finset.{u2} (Option.{u2} Λ)) (Preorder.toLE.{u2} (Finset.{u2} (Option.{u2} Λ)) (PartialOrder.toPreorder.{u2} (Finset.{u2} (Option.{u2} Λ)) (Finset.partialOrder.{u2} (Option.{u2} Λ)))) x._@.Mathlib.Order.Hom.Basic._hyg.695 x._@.Mathlib.Order.Hom.Basic._hyg.697))) (Finset.insertNone.{u2} Λ) S)))
Case conversion may be inaccurate. Consider using '#align turing.TM2.step_supports Turing.TM2.step_supportsₓ'. -/
theorem step_supports (M : Λ → stmt) {S} (ss : supports M S) :
∀ {c c' : cfg}, c' ∈ step M c → c.l ∈ S.insertNone → c'.l ∈ S.insertNone
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce86f4e05e9a9b8da5e316b22c76ce76440c56a1
@@ -3511,7 +3511,7 @@ def trNormal : stmt₂ → stmt₁
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM1.Stmt.goto.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (fun (_x : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (_x : σ) => Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))
but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57664 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57666 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
+ forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57672 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57674 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_runₓ'. -/
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -3511,7 +3511,7 @@ def trNormal : stmt₂ → stmt₁
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM1.Stmt.goto.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (fun (_x : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (_x : σ) => Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))
but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57505 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57507 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
+ forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57664 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57666 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_runₓ'. -/
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -3511,7 +3511,7 @@ def trNormal : stmt₂ → stmt₁
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM1.Stmt.goto.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (fun (_x : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (_x : σ) => Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))
but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57504 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57506 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
+ forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57505 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57507 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_runₓ'. -/
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -3511,7 +3511,7 @@ def trNormal : stmt₂ → stmt₁
lean 3 declaration is
forall {K : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} K] {Γ : K -> Type.{u2}} {Λ : Type.{u3}} [_inst_2 : Inhabited.{succ u3} Λ] {σ : Type.{u4}} [_inst_3 : Inhabited.{succ u4} σ] {k : K} (s : Turing.TM2to1.StAct.{u1, u2, u4} K _inst_1 Γ σ _inst_3 k) (q : Turing.TM2.Stmt.{u1, u2, u3, u4} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ σ), Eq.{max (succ (max u1 u2)) (succ (max u1 u2 u3 u4)) (succ u4)} (Turing.TM1.Stmt.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ) (Turing.TM2to1.trNormal.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 (Turing.TM2to1.stRun.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q)) (Turing.TM1.Stmt.goto.{max u1 u2, max u1 u2 u3 u4, u4} (Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Γ'.inhabited.{u1, u2} K _inst_1 Γ) (Turing.TM2to1.Λ'.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3) σ (fun (_x : Turing.TM2to1.Γ'.{u1, u2} K _inst_1 Γ) (_x : σ) => Turing.TM2to1.Λ'.go.{u1, u2, u3, u4} K _inst_1 Γ Λ _inst_2 σ _inst_3 k s q))
but is expected to have type
- forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57464 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57466 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
+ forall {K : Type.{u4}} {_inst_1 : K -> Type.{u3}} {Γ : Type.{u1}} {Λ : Type.{u2}} {_inst_2 : K} (σ : Turing.TM2to1.StAct.{u4, u3, u2} K _inst_1 Λ _inst_2) (_inst_3 : Turing.TM2.Stmt.{u4, u3, u1, u2} K _inst_1 Γ Λ), Eq.{max (max (max (succ u4) (succ u3)) (succ u1)) (succ u2)} (Turing.TM1.Stmt.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ) (Turing.TM2to1.trNormal.{u4, u3, u1, u2} K _inst_1 Γ Λ (Turing.TM2to1.stRun.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3)) (Turing.TM1.Stmt.goto.{max u4 u3, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K _inst_1 Γ Λ) Λ (fun (x._@.Mathlib.Computability.TuringMachine._hyg.57504 : Turing.TM2to1.Γ'.{u4, u3} K _inst_1) (x._@.Mathlib.Computability.TuringMachine._hyg.57506 : Λ) => Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K _inst_1 Γ Λ _inst_2 σ _inst_3))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_runₓ'. -/
theorem trNormal_run {k} (s q) : tr_normal (st_run s q) = goto fun _ _ => go k s q := by
rcases s with (_ | _ | _) <;> rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -3676,7 +3676,7 @@ lean 3 declaration is
but is expected to have type
forall {K : Type.{u4}} [_inst_1 : DecidableEq.{succ u4} K] {Γ : K -> Type.{u3}} {Λ : Type.{u1}} {_inst_2 : Type.{u2}} (σ : Λ -> (Turing.TM2.Stmt.{u4, u3, u1, u2} K Γ Λ _inst_2)) {_inst_3 : K} (M : Turing.TM2to1.StAct.{u4, u3, u2} K Γ _inst_2 _inst_3) (k : Turing.TM2.Stmt.{u4, u3, u1, u2} K Γ Λ _inst_2) (o : _inst_2) {q : List.{u3} (Γ _inst_3)} {v : Turing.ListBlank.{max u4 u3} (forall (k : K), Option.{u3} (Γ k)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (k : K) => Option.{u3} (Γ k)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)))}, (Eq.{succ u3} (Turing.ListBlank.{u3} (Option.{u3} (Γ _inst_3)) (instInhabitedOption.{u3} (Γ _inst_3))) (Turing.ListBlank.map.{max u4 u3, u3} (forall (i : K), Option.{u3} (Γ i)) (Option.{u3} (Γ _inst_3)) (instInhabitedForAll_1.{succ u4, succ u3} K (fun (i : K) => Option.{u3} (Γ i)) (fun (a : K) => instInhabitedOption.{u3} (Γ a))) (instInhabitedOption.{u3} (Γ _inst_3)) (Turing.proj.{u4, u3} K (fun (k : K) => Option.{u3} (Γ k)) (fun (a : K) => instInhabitedOption.{u3} (Γ a)) _inst_3) v) (Turing.ListBlank.mk.{u3} (Option.{u3} (Γ _inst_3)) (instInhabitedOption.{u3} (Γ _inst_3)) (List.reverse.{u3} (Option.{u3} (Γ _inst_3)) (List.map.{u3, u3} (Γ _inst_3) (Option.{u3} (Γ _inst_3)) (Option.some.{u3} (Γ _inst_3)) q)))) -> (forall (L : Nat), (LE.le.{0} Nat instLENat L (List.length.{u3} (Γ _inst_3) q)) -> (Turing.Reaches₀.{max (max u2 (max (max u2 u1) u3) u4) u3 u4} (Turing.TM1.Cfg.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2) (Turing.TM1.step.{max u3 u4, max (max (max u2 u1) u3) u4, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2 (Turing.TM2to1.tr.{u4, u3, u1, u2} K (fun (a : K) (b : K) => _inst_1 a b) Γ Λ _inst_2 σ)) (Turing.TM1.Cfg.mk.{max u4 u3, max (max (max u4 u3) u1) u2, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2 (Option.some.{max (max (max u4 u3) u1) u2} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) (Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K Γ Λ _inst_2 _inst_3 M k)) o (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ v))) (Turing.TM1.Cfg.mk.{max u4 u3, max (max (max u4 u3) u1) u2, u2} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) _inst_2 (Option.some.{max (max (max u4 u3) u1) u2} (Turing.TM2to1.Λ'.{u4, u3, u1, u2} K Γ Λ _inst_2) (Turing.TM2to1.Λ'.go.{u4, u3, u1, u2} K Γ Λ _inst_2 _inst_3 M k)) o (Nat.iterate.{succ (max u4 u3)} (Turing.Tape.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.Tape.move.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) Turing.Dir.right) L (Turing.Tape.mk'.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ) (EmptyCollection.emptyCollection.{max u4 u3} (Turing.ListBlank.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ)) (Turing.ListBlank.hasEmptyc.{max u4 u3} (Turing.TM2to1.Γ'.{u4, u3} K Γ) (Turing.TM2to1.Γ'.inhabited.{u4, u3} K Γ))) (Turing.TM2to1.addBottom.{u4, u3} K Γ v))))))
Case conversion may be inaccurate. Consider using '#align turing.TM2to1.tr_respects_aux₁ Turing.TM2to1.tr_respects_aux₁ₓ'. -/
-/- ./././Mathport/Syntax/Translate/Basic.lean:628:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (n «expr ≤ » S.length) -/
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (_ : n ≤ S.length) :
Reaches₀ (TM1.step tr) ⟨some (go k o q), v, Tape.mk' ∅ (add_bottom L)⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -148,8 +148,8 @@ def BlankRel.above {Γ} [Inhabited Γ] {l₁ l₂ : List Γ} (h : BlankRel l₁
refine'
if hl : l₁.length ≤ l₂.length then ⟨l₂, Or.elim h id fun h' ↦ _, BlankExtends.refl _⟩
else ⟨l₁, BlankExtends.refl _, Or.elim h (fun h' ↦ _) id⟩
- exact (BlankExtends.refl _).above_of_le h' hl
- exact (BlankExtends.refl _).above_of_le h' (le_of_not_ge hl)
+ · exact (BlankExtends.refl _).above_of_le h' hl
+ · exact (BlankExtends.refl _).above_of_le h' (le_of_not_ge hl)
#align turing.blank_rel.above Turing.BlankRel.above
/-- Given two `BlankRel` lists, there exists (constructively) a common meet. -/
@@ -158,8 +158,8 @@ def BlankRel.below {Γ} [Inhabited Γ] {l₁ l₂ : List Γ} (h : BlankRel l₁
refine'
if hl : l₁.length ≤ l₂.length then ⟨l₁, BlankExtends.refl _, Or.elim h id fun h' ↦ _⟩
else ⟨l₂, Or.elim h (fun h' ↦ _) id, BlankExtends.refl _⟩
- exact (BlankExtends.refl _).above_of_le h' hl
- exact (BlankExtends.refl _).above_of_le h' (le_of_not_ge hl)
+ · exact (BlankExtends.refl _).above_of_le h' hl
+ · exact (BlankExtends.refl _).above_of_le h' (le_of_not_ge hl)
#align turing.blank_rel.below Turing.BlankRel.below
theorem BlankRel.equivalence (Γ) [Inhabited Γ] : Equivalence (@BlankRel Γ _) :=
@@ -471,7 +471,8 @@ def ListBlank.bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (l : ListBlank Γ) (f
apply l.liftOn (fun l ↦ ListBlank.mk (List.bind l f))
rintro l _ ⟨i, rfl⟩; cases' hf with n e; refine' Quotient.sound' (Or.inl ⟨i * n, _⟩)
rw [List.append_bind, mul_comm]; congr
- induction' i with i IH; rfl
+ induction' i with i IH
+ · rfl
simp only [IH, e, List.replicate_add, Nat.mul_succ, add_comm, List.replicate_succ, List.cons_bind]
#align turing.list_blank.bind Turing.ListBlank.bind
@@ -2650,7 +2651,9 @@ theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k,
rw [iterate_succ_apply'];
simp only [TM1.step, TM1.stepAux, tr, Tape.mk'_nth_nat, Tape.move_right_n_head,
addBottom_nth_snd, Option.mem_def]
- rw [stk_nth_val _ hL, List.get?_eq_get]; rfl; rwa [List.length_reverse]
+ rw [stk_nth_val _ hL, List.get?_eq_get]
+ · rfl
+ · rwa [List.length_reverse]
#align turing.TM2to1.tr_respects_aux₁ Turing.TM2to1.tr_respects_aux₁
theorem tr_respects_aux₃ {q v} {L : ListBlank (∀ k, Option (Γ k))} (n) : Reaches₀ (TM1.step (tr M))
@@ -2688,11 +2688,10 @@ theorem tr_respects_aux {q v T k} {S : ∀ k, List (Γ k)}
attribute [local simp] Respects TM2.step TM2.stepAux trNormal
theorem tr_respects : Respects (TM2.step M) (TM1.step (tr M)) TrCfg := by
- -- Porting note: `simp only`s are required for beta reductions.
+ -- Porting note(#12129): additional beta reduction needed
intro c₁ c₂ h
cases' h with l v S L hT
cases' l with l; · constructor
- simp only [TM2.step, Respects, Option.map_some']
rsuffices ⟨b, c, r⟩ : ∃ b, _ ∧ Reaches (TM1.step (tr M)) _ _
· exact ⟨b, c, TransGen.head' rfl r⟩
simp only [tr]
@@ -2703,7 +2702,7 @@ theorem tr_respects : Respects (TM2.step M) (TM1.step (tr M)) TrCfg := by
| H₂ a _ IH => exact IH _ hT
| H₃ p q₁ q₂ IH₁ IH₂ =>
unfold TM2.stepAux trNormal TM1.stepAux
- simp only []
+ beta_reduce
cases p v <;> [exact IH₂ _ hT; exact IH₁ _ hT]
| H₄ => exact ⟨_, ⟨_, hT⟩, ReflTransGen.refl⟩
| H₅ => exact ⟨_, ⟨_, hT⟩, ReflTransGen.refl⟩
mul
-div
cancellation lemmas (#11530)
Lemma names around cancellation of multiplication and division are a mess.
This PR renames a handful of them according to the following table (each big row contains the multiplicative statement, then the three rows contain the GroupWithZero
lemma name, the Group
lemma, the AddGroup
lemma name).
| Statement | New name | Old name | |
@@ -633,7 +633,7 @@ theorem Tape.move_left_nth {Γ} [Inhabited Γ] :
| ⟨_, L, _⟩, 0 => (ListBlank.nth_zero _).symm
| ⟨a, L, R⟩, 1 => (ListBlank.nth_zero _).trans (ListBlank.head_cons _ _)
| ⟨a, L, R⟩, (n + 1 : ℕ) + 1 => by
- rw [add_sub_cancel]
+ rw [add_sub_cancel_right]
change (R.cons a).nth (n + 1) = R.nth n
rw [ListBlank.nth_succ, ListBlank.tail_cons]
#align turing.tape.move_left_nth Turing.Tape.move_left_nth
@@ -642,7 +642,7 @@ theorem Tape.move_left_nth {Γ} [Inhabited Γ] :
theorem Tape.move_right_nth {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℤ) :
(T.move Dir.right).nth i = T.nth (i + 1) := by
conv => rhs; rw [← T.move_right_left]
- rw [Tape.move_left_nth, add_sub_cancel]
+ rw [Tape.move_left_nth, add_sub_cancel_right]
#align turing.tape.move_right_nth Turing.Tape.move_right_nth
@[simp]
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -1123,11 +1123,8 @@ end
section
variable {Γ : Type*} [Inhabited Γ]
-
variable {Γ' : Type*} [Inhabited Γ']
-
variable {Λ : Type*} [Inhabited Λ]
-
variable {Λ' : Type*} [Inhabited Λ']
/-- Map a TM statement across a function. This does nothing to move statements and maps the write
@@ -1438,9 +1435,7 @@ set_option linter.uppercaseLean3 false
section
variable {Γ : Type*} [Inhabited Γ]
-
variable {Λ : Type*} [Inhabited Λ]
-
variable {σ : Type*} [Inhabited σ]
local notation "Stmt₁" => TM1.Stmt Γ Λ σ
@@ -1629,7 +1624,6 @@ theorem exists_enc_dec [Finite Γ] : ∃ (n : ℕ) (enc : Γ → Vector Bool n)
#align turing.TM1to1.exists_enc_dec Turing.TM1to1.exists_enc_dec
variable {Λ : Type*} [Inhabited Λ]
-
variable {σ : Type*} [Inhabited σ]
local notation "Stmt₁" => Stmt Γ Λ σ
@@ -1977,7 +1971,6 @@ set_option linter.uppercaseLean3 false
section
variable {Γ : Type*} [Inhabited Γ]
-
variable {Λ : Type*} [Inhabited Λ]
/-- The machine states for a TM1 emulating a TM0 machine. States of the TM0 machine are embedded
@@ -2332,11 +2325,8 @@ theorem stk_nth_val {K : Type*} {Γ : K → Type*} {L : ListBlank (∀ k, Option
section
variable {K : Type*} [DecidableEq K]
-
variable {Γ : K → Type*}
-
variable {Λ : Type*} [Inhabited Λ]
-
variable {σ : Type*} [Inhabited σ]
local notation "Stmt₂" => TM2.Stmt Γ Λ σ
@@ -1616,18 +1616,16 @@ section
variable {Γ : Type*} [Inhabited Γ]
-theorem exists_enc_dec [Fintype Γ] : ∃ (n : ℕ) (enc : Γ → Vector Bool n) (dec : Vector Bool n → Γ),
+theorem exists_enc_dec [Finite Γ] : ∃ (n : ℕ) (enc : Γ → Vector Bool n) (dec : Vector Bool n → Γ),
enc default = Vector.replicate n false ∧ ∀ a, dec (enc a) = a := by
- letI := Classical.decEq Γ
- let n := Fintype.card Γ
- obtain ⟨F⟩ := Fintype.truncEquivFin Γ
+ rcases Finite.exists_equiv_fin Γ with ⟨n, ⟨e⟩⟩
+ letI : DecidableEq Γ := e.decidableEq
let G : Fin n ↪ Fin n → Bool :=
⟨fun a b ↦ a = b, fun a b h ↦
Bool.of_decide_true <| (congr_fun h b).trans <| Bool.decide_true rfl⟩
- let H := (F.toEmbedding.trans G).trans (Equiv.vectorEquivFin _ _).symm.toEmbedding
- classical
- let enc := H.setValue default (Vector.replicate n false)
- exact ⟨_, enc, Function.invFun enc, H.setValue_eq _ _, Function.leftInverse_invFun enc.2⟩
+ let H := (e.toEmbedding.trans G).trans (Equiv.vectorEquivFin _ _).symm.toEmbedding
+ let enc := H.setValue default (Vector.replicate n false)
+ exact ⟨_, enc, Function.invFun enc, H.setValue_eq _ _, Function.leftInverse_invFun enc.2⟩
#align turing.TM1to1.exists_enc_dec Turing.TM1to1.exists_enc_dec
variable {Λ : Type*} [Inhabited Λ]
open Classical
(#11199)
We remove all but one open Classical
s, instead preferring to use open scoped Classical
. The only real side-effect this led to is moving a couple declarations to use Exists.choose
instead of Classical.choose
.
The first few commits are explicitly labelled regex replaces for ease of review.
@@ -1304,7 +1304,7 @@ def SupportsStmt (S : Finset Λ) : Stmt₁ → Prop
| halt => True
#align turing.TM1.supports_stmt Turing.TM1.SupportsStmt
-open Classical
+open scoped Classical
/-- The subterm closure of a statement. -/
noncomputable def stmts₁ : Stmt₁ → Finset Stmt₁
@@ -1528,7 +1528,7 @@ noncomputable def trStmts (S : Finset Λ) : Finset Λ'₁₀ :=
(TM1.stmts M S) ×ˢ Finset.univ
#align turing.TM1to0.tr_stmts Turing.TM1to0.trStmts
-open Classical
+open scoped Classical
attribute [local simp] TM1.stmts₁_self
@@ -1888,7 +1888,7 @@ theorem tr_respects {enc₀} :
apply ReflTransGen.refl
#align turing.TM1to1.tr_respects Turing.TM1to1.tr_respects
-open Classical
+open scoped Classical
variable [Fintype Γ]
@@ -2172,7 +2172,7 @@ def SupportsStmt (S : Finset Λ) : Stmt₂ → Prop
| halt => True
#align turing.TM2.supports_stmt Turing.TM2.SupportsStmt
-open Classical
+open scoped Classical
/-- The set of subtree statements in a statement. -/
noncomputable def stmts₁ : Stmt₂ → Finset Stmt₂
@@ -2529,7 +2529,7 @@ theorem trNormal_run {k : K} (s : StAct₂ k) (q : Stmt₂) :
cases s <;> rfl
#align turing.TM2to1.tr_normal_run Turing.TM2to1.trNormal_run
-open Classical
+open scoped Classical
/-- The set of machine states accessible from an initial TM2 statement. -/
noncomputable def trStmts₁ : Stmt₂ → Finset Λ'₂₁
This is a very large PR, but it has been reviewed piecemeal already in PRs to the bump/v4.7.0
branch as we update to intermediate nightlies.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: damiano <adomani@gmail.com>
@@ -1877,7 +1877,7 @@ theorem tr_respects {enc₀} :
simp only [trNormal, stepAux_read dec enc0 encdec]
apply IH
| branch p q₁ q₂ IH₁ IH₂ =>
- simp only [trNormal, stepAux_read dec enc0 encdec, stepAux]
+ simp only [trNormal, stepAux_read dec enc0 encdec, stepAux, Tape.mk'_head]
cases p R.head v <;> [apply IH₂; apply IH₁]
| goto l =>
simp only [trNormal, stepAux_read dec enc0 encdec, stepAux, trCfg, trTape_mk']
refine
s (#10762)
I replaced a few "terminal" refine/refine'
s with exact
.
The strategy was very simple-minded: essentially any refine
whose following line had smaller indentation got replaced by exact
and then I cleaned up the mess.
This PR certainly leaves some further terminal refine
s, but maybe the current change is beneficial.
@@ -1801,7 +1801,7 @@ theorem stepAux_write (q : Stmt'₁) (v : σ) (a b : Γ) (L R : ListBlank Γ) :
suffices ∀ {L' R'} (l₁ l₂ l₂' : List Bool) (_ : l₂'.length = l₂.length),
stepAux (write l₂ q) v (Tape.mk' (ListBlank.append l₁ L') (ListBlank.append l₂' R')) =
stepAux q v (Tape.mk' (L'.append (List.reverseAux l₂ l₁)) R') by
- refine' this [] _ _ ((enc b).2.trans (enc a).2.symm)
+ exact this [] _ _ ((enc b).2.trans (enc a).2.symm)
clear a b L R
intro L' R' l₁ l₂ l₂' e
induction' l₂ with a l₂ IH generalizing l₁ l₂'
@@ -1936,7 +1936,7 @@ theorem tr_supports {S : Finset Λ} (ss : Supports M S) : Supports (tr enc dec M
| load a q IH =>
unfold writes at hw ⊢
replace IH := IH hs hw
- refine' ⟨supportsStmt_read _ fun _ ↦ IH.1, IH.2⟩
+ exact ⟨supportsStmt_read _ fun _ ↦ IH.1, IH.2⟩
| branch p q₁ q₂ IH₁ IH₂ =>
unfold writes at hw ⊢
simp only [Finset.mem_union] at hw ⊢
@@ -358,7 +358,7 @@ instance {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] : Inhabited (PointedMap Γ Γ')
instance {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] : CoeFun (PointedMap Γ Γ') fun _ ↦ Γ → Γ' :=
⟨PointedMap.f⟩
--- @[simp] -- Porting note: dsimp can prove this
+-- @[simp] -- Porting note (#10685): dsimp can prove this
theorem PointedMap.mk_val {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : Γ → Γ') (pt) :
(PointedMap.mk f pt : Γ → Γ') = f :=
rfl
@@ -1028,7 +1028,7 @@ inductive Stmt
| write : Γ → Stmt
#align turing.TM0.stmt Turing.TM0.Stmt
-local notation "Stmt₀" => Stmt Γ -- Porting note: Added this to clean up types.
+local notation "Stmt₀" => Stmt Γ -- Porting note (#10750): added this to clean up types.
instance Stmt.inhabited : Inhabited Stmt₀ :=
⟨Stmt.write default⟩
@@ -1048,7 +1048,7 @@ def Machine [Inhabited Λ] :=
Λ → Γ → Option (Λ × Stmt₀)
#align turing.TM0.machine Turing.TM0.Machine
-local notation "Machine₀" => Machine Γ Λ -- Porting note: Added this to clean up types.
+local notation "Machine₀" => Machine Γ Λ -- Porting note (#10750): added this to clean up types.
instance Machine.inhabited : Inhabited Machine₀ := by
unfold Machine; infer_instance
@@ -1064,7 +1064,7 @@ structure Cfg where
Tape : Tape Γ
#align turing.TM0.cfg Turing.TM0.Cfg
-local notation "Cfg₀" => Cfg Γ Λ -- Porting note: Added this to clean up types.
+local notation "Cfg₀" => Cfg Γ Λ -- Porting note (#10750): added this to clean up types.
instance Cfg.inhabited : Inhabited Cfg₀ :=
⟨⟨default, default⟩⟩
@@ -1253,7 +1253,7 @@ inductive Stmt
| halt : Stmt
#align turing.TM1.stmt Turing.TM1.Stmt
-local notation "Stmt₁" => Stmt Γ Λ σ -- Porting note: Added this to clean up types.
+local notation "Stmt₁" => Stmt Γ Λ σ -- Porting note (#10750): added this to clean up types.
open Stmt
@@ -1269,7 +1269,7 @@ structure Cfg where
Tape : Tape Γ
#align turing.TM1.cfg Turing.TM1.Cfg
-local notation "Cfg₁" => Cfg Γ Λ σ -- Porting note: Added this to clean up types.
+local notation "Cfg₁" => Cfg Γ Λ σ -- Porting note (#10750): added this to clean up types.
instance Cfg.inhabited [Inhabited σ] : Inhabited Cfg₁ :=
⟨⟨default, default, default⟩⟩
@@ -1463,7 +1463,7 @@ def Λ' (M : Λ → TM1.Stmt Γ Λ σ) :=
Option Stmt₁ × σ
#align turing.TM1to0.Λ' Turing.TM1to0.Λ'
-local notation "Λ'₁₀" => Λ' M -- Porting note: Added this to clean up types.
+local notation "Λ'₁₀" => Λ' M -- Porting note (#10750): added this to clean up types.
instance : Inhabited Λ'₁₀ :=
⟨(some (M default), default)⟩
@@ -1644,7 +1644,7 @@ inductive Λ'
| write : Γ → Stmt₁ → Λ'
#align turing.TM1to1.Λ' Turing.TM1to1.Λ'
-local notation "Λ'₁" => @Λ' Γ Λ σ -- Porting note: Added this to clean up types.
+local notation "Λ'₁" => @Λ' Γ Λ σ -- Porting note (#10750): added this to clean up types.
instance : Inhabited Λ'₁ :=
⟨Λ'.normal default⟩
@@ -1668,7 +1668,7 @@ def move (d : Dir) (q : Stmt'₁) : Stmt'₁ :=
(Stmt.move d)^[n] q
#align turing.TM1to1.move Turing.TM1to1.move
-local notation "moveₙ" => @move Γ Λ σ n -- Porting note: Added this to clean up types.
+local notation "moveₙ" => @move Γ Λ σ n -- Porting note (#10750): added this to clean up types.
/-- To read a symbol from the tape, we use `readAux` to traverse the symbol,
then return to the original position with `n` moves to the left. -/
@@ -1990,7 +1990,7 @@ inductive Λ'
| act : TM0.Stmt Γ → Λ → Λ'
#align turing.TM0to1.Λ' Turing.TM0to1.Λ'
-local notation "Λ'₁" => @Λ' Γ Λ -- Porting note: Added this to clean up types.
+local notation "Λ'₁" => @Λ' Γ Λ -- Porting note (#10750): added this to clean up types.
instance : Inhabited Λ'₁ :=
⟨Λ'.normal default⟩
@@ -2112,7 +2112,7 @@ inductive Stmt
| halt : Stmt
#align turing.TM2.stmt Turing.TM2.Stmt
-local notation "Stmt₂" => Stmt Γ Λ σ -- Porting note: Added this to clean up types.
+local notation "Stmt₂" => Stmt Γ Λ σ -- Porting note (#10750): added this to clean up types.
open Stmt
@@ -2129,7 +2129,7 @@ structure Cfg where
stk : ∀ k, List (Γ k)
#align turing.TM2.cfg Turing.TM2.Cfg
-local notation "Cfg₂" => Cfg Γ Λ σ -- Porting note: Added this to clean up types.
+local notation "Cfg₂" => Cfg Γ Λ σ -- Porting note (#10750): added this to clean up types.
instance Cfg.inhabited [Inhabited σ] : Inhabited Cfg₂ :=
⟨⟨default, default, default⟩⟩
@@ -2352,7 +2352,7 @@ def Γ' :=
Bool × ∀ k, Option (Γ k)
#align turing.TM2to1.Γ' Turing.TM2to1.Γ'
-local notation "Γ'₂₁" => @Γ' K Γ -- Porting note: Added this to clean up types.
+local notation "Γ'₂₁" => @Γ' K Γ -- Porting note (#10750): added this to clean up types.
instance Γ'.inhabited : Inhabited Γ'₂₁ :=
⟨⟨false, fun _ ↦ none⟩⟩
@@ -2407,7 +2407,7 @@ inductive StAct (k : K)
| pop : (σ → Option (Γ k) → σ) → StAct k
#align turing.TM2to1.st_act Turing.TM2to1.StAct
-local notation "StAct₂" => @StAct K Γ σ -- Porting note: Added this to clean up types.
+local notation "StAct₂" => @StAct K Γ σ -- Porting note (#10750): added this to clean up types.
instance StAct.inhabited {k : K} : Inhabited (StAct₂ k) :=
⟨StAct.peek fun s _ ↦ s⟩
@@ -2472,7 +2472,7 @@ inductive Λ'
| ret : Stmt₂ → Λ'
#align turing.TM2to1.Λ' Turing.TM2to1.Λ'
-local notation "Λ'₂₁" => @Λ' K Γ Λ σ -- Porting note: Added this to clean up types.
+local notation "Λ'₂₁" => @Λ' K Γ Λ σ -- Porting note (#10750): added this to clean up types.
open Λ'
@@ -1015,10 +1015,10 @@ set_option linter.uppercaseLean3 false
section
--- type of "labels" or TM states
+-- type of tape symbols
variable (Γ : Type*) [Inhabited Γ]
--- type of tape symbols
+-- type of "labels" or TM states
variable (Λ : Type*) [Inhabited Λ]
/-- A Turing machine "statement" is just a command to either move
List.append
(#9376)
Replace duplicates in Mathlib with theorems in Lean core.
List.append_left_cancel
→ List.append_cancel_left
List.append_right_cancel
→ List.append_cancel_right
@@ -105,7 +105,7 @@ def BlankExtends.above {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} (h₁ : Blank
theorem BlankExtends.above_of_le {Γ} [Inhabited Γ] {l l₁ l₂ : List Γ} :
BlankExtends l₁ l → BlankExtends l₂ l → l₁.length ≤ l₂.length → BlankExtends l₁ l₂ := by
rintro ⟨i, rfl⟩ ⟨j, e⟩ h; use i - j
- refine' List.append_right_cancel (e.symm.trans _)
+ refine' List.append_cancel_right (e.symm.trans _)
rw [List.append_assoc, ← List.replicate_add, tsub_add_cancel_of_le]
apply_fun List.length at e
simp only [List.length_append, List.length_replicate] at e
cases x with | ...
instead of cases x; case => ...
(#9321)
This converts usages of the pattern
cases h
case inl h' => ...
case inr h' => ...
which derive from mathported code, to the "structured cases
" syntax:
cases h with
| inl h' => ...
| inr h' => ...
The case where the subgoals are handled with ·
instead of case
is more contentious (and much more numerous) so I left those alone. This pattern also appears with cases'
, induction
, induction'
, and rcases
. Furthermore, there is a similar transformation for by_cases
:
by_cases h : cond
case pos => ...
case neg => ...
is replaced by:
if h : cond then
...
else
...
Co-authored-by: Mario Carneiro <di.gama@gmail.com>
@@ -1321,32 +1321,32 @@ theorem stmts₁_self {q : Stmt₁} : q ∈ stmts₁ q := by
theorem stmts₁_trans {q₁ q₂ : Stmt₁} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ := by
intro h₁₂ q₀ h₀₁
- induction' q₂ with _ q IH _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
- simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂
- iterate 3
- rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁
- exact h₀₁
- · exact Finset.mem_insert_of_mem (IH h₁₂)
- case branch p q₁ q₂ IH₁ IH₂ =>
+ induction q₂ with (
+ simp only [stmts₁] at h₁₂ ⊢
+ simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂)
+ | branch p q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
· unfold stmts₁ at h₀₁
exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ <| IH₁ h₁₂)
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ <| IH₂ h₁₂)
- case goto l => subst h₁₂; exact h₀₁
- case halt => subst h₁₂; exact h₀₁
+ | goto l => subst h₁₂; exact h₀₁
+ | halt => subst h₁₂; exact h₀₁
+ | _ _ q IH =>
+ rcases h₁₂ with rfl | h₁₂
+ · exact h₀₁
+ · exact Finset.mem_insert_of_mem (IH h₁₂)
#align turing.TM1.stmts₁_trans Turing.TM1.stmts₁_trans
theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₁} (h : q₁ ∈ stmts₁ q₂)
(hs : SupportsStmt S q₂) : SupportsStmt S q₁ := by
- induction' q₂ with _ q IH _ q IH _ q IH <;>
+ induction q₂ with
simp only [stmts₁, SupportsStmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton]
at h hs
- iterate 3 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
- case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
- case goto l => subst h; exact hs
- case halt => subst h; trivial
+ | branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
+ | goto l => subst h; exact hs
+ | halt => subst h; trivial
+ | _ _ q IH => rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
#align turing.TM1.stmts₁_supports_stmt_mono Turing.TM1.stmts₁_supportsStmt_mono
/-- The set of all statements in a Turing machine, plus one extra value `none` representing the
@@ -1383,14 +1383,14 @@ theorem step_supports (M : Λ → Stmt₁) {S : Finset Λ} (ss : Supports M S) :
| ⟨some l₁, v, T⟩, c', h₁, h₂ => by
replace h₂ := ss.2 _ (Finset.some_mem_insertNone.1 h₂)
simp only [step, Option.mem_def, Option.some.injEq] at h₁; subst c'
- revert h₂; induction' M l₁ with _ q IH _ q IH _ q IH generalizing v T <;> intro hs
- iterate 3 exact IH _ _ hs
- case branch p q₁' q₂' IH₁ IH₂ =>
+ revert h₂; induction M l₁ generalizing v T with intro hs
+ | branch p q₁' q₂' IH₁ IH₂ =>
unfold stepAux; cases p T.1 v
· exact IH₂ _ _ hs.2
· exact IH₁ _ _ hs.1
- case goto => exact Finset.some_mem_insertNone.2 (hs _ _)
- case halt => apply Multiset.mem_cons_self
+ | goto => exact Finset.some_mem_insertNone.2 (hs _ _)
+ | halt => apply Multiset.mem_cons_self
+ | _ _ q IH => exact IH _ _ hs
#align turing.TM1.step_supports Turing.TM1.step_supports
variable [Inhabited σ]
@@ -1501,15 +1501,15 @@ theorem tr_respects :
fun_respects.2 fun ⟨l₁, v, T⟩ ↦ by
cases' l₁ with l₁; · exact rfl
simp only [trCfg, TM1.step, FRespects, Option.map]
- induction' M l₁ with _ _ IH _ _ IH _ _ IH generalizing v T
- case move _ _ IH => exact TransGen.head rfl (IH _ _)
- case write _ _ IH => exact TransGen.head rfl (IH _ _)
- case load _ _ IH => exact (reaches₁_eq (by rfl)).2 (IH _ _)
- case branch p _ _ IH₁ IH₂ =>
+ induction M l₁ generalizing v T with
+ | move _ _ IH => exact TransGen.head rfl (IH _ _)
+ | write _ _ IH => exact TransGen.head rfl (IH _ _)
+ | load _ _ IH => exact (reaches₁_eq (by rfl)).2 (IH _ _)
+ | branch p _ _ IH₁ IH₂ =>
unfold TM1.stepAux; cases e : p T.1 v
· exact (reaches₁_eq (by simp only [TM0.step, tr, trAux, e]; rfl)).2 (IH₂ _ _)
· exact (reaches₁_eq (by simp only [TM0.step, tr, trAux, e]; rfl)).2 (IH₁ _ _)
- iterate 2
+ | _ =>
exact TransGen.single (congr_arg some (congr (congr_arg TM0.Cfg.mk rfl) (Tape.write_self T)))
#align turing.TM1to0.tr_respects Turing.TM1to0.tr_respects
@@ -1550,20 +1550,20 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) :
cases q'; · exact Multiset.mem_cons_self _ _
simp only [tr, Option.mem_def] at h₁
have := TM1.stmts_supportsStmt ss h₂
- revert this; induction q generalizing v <;> intro hs
- case move d q =>
+ revert this; induction q generalizing v with intro hs
+ | move d q =>
cases h₁; refine' TM1.stmts_trans _ h₂
unfold TM1.stmts₁
exact Finset.mem_insert_of_mem TM1.stmts₁_self
- case write b q =>
+ | write b q =>
cases h₁; refine' TM1.stmts_trans _ h₂
unfold TM1.stmts₁
exact Finset.mem_insert_of_mem TM1.stmts₁_self
- case load b q IH =>
+ | load b q IH =>
refine' IH _ (TM1.stmts_trans _ h₂) h₁ hs
unfold TM1.stmts₁
exact Finset.mem_insert_of_mem TM1.stmts₁_self
- case branch p q₁ q₂ IH₁ IH₂ =>
+ | branch p q₁ q₂ IH₁ IH₂ =>
cases h : p a v <;> rw [trAux, h] at h₁
· refine' IH₂ _ (TM1.stmts_trans _ h₂) h₁ hs.2
unfold TM1.stmts₁
@@ -1571,10 +1571,10 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) :
· refine' IH₁ _ (TM1.stmts_trans _ h₂) h₁ hs.1
unfold TM1.stmts₁
exact Finset.mem_insert_of_mem (Finset.mem_union_left _ TM1.stmts₁_self)
- case goto l =>
+ | goto l =>
cases h₁
exact Finset.some_mem_insertNone.2 (Finset.mem_biUnion.2 ⟨_, hs _ _, TM1.stmts₁_self⟩)
- case halt => cases h₁
+ | halt => cases h₁
#align turing.TM1to0.tr_supports Turing.TM1to0.tr_supports
end
@@ -1859,30 +1859,30 @@ theorem tr_respects {enc₀} :
exact this _ R
clear R l₁
intro q R
- induction' q generalizing v L R
- case move d q IH =>
+ induction q generalizing v L R with
+ | move d q IH =>
cases d <;>
simp only [trNormal, iterate, stepAux_move, stepAux, ListBlank.head_cons,
Tape.move_left_mk', ListBlank.cons_head_tail, ListBlank.tail_cons,
trTape'_move_left enc0, trTape'_move_right enc0] <;>
apply IH
- case write f q IH =>
+ | write f q IH =>
simp only [trNormal, stepAux_read dec enc0 encdec, stepAux]
refine' ReflTransGen.head rfl _
obtain ⟨a, R, rfl⟩ := R.exists_cons
rw [tr, Tape.mk'_head, stepAux_write, ListBlank.head_cons, stepAux_move,
trTape'_move_left enc0, ListBlank.head_cons, ListBlank.tail_cons, Tape.write_mk']
apply IH
- case load a q IH =>
+ | load a q IH =>
simp only [trNormal, stepAux_read dec enc0 encdec]
apply IH
- case branch p q₁ q₂ IH₁ IH₂ =>
+ | branch p q₁ q₂ IH₁ IH₂ =>
simp only [trNormal, stepAux_read dec enc0 encdec, stepAux]
cases p R.head v <;> [apply IH₂; apply IH₁]
- case goto l =>
+ | goto l =>
simp only [trNormal, stepAux_read dec enc0 encdec, stepAux, trCfg, trTape_mk']
apply ReflTransGen.refl
- case halt =>
+ | halt =>
simp only [trNormal, stepAux, trCfg, stepAux_move, trTape'_move_left enc0,
trTape'_move_right enc0, trTape_mk']
apply ReflTransGen.refl
@@ -1919,12 +1919,12 @@ theorem tr_supports {S : Finset Λ} (ss : Supports M S) : Supports (tr enc dec M
rcases Finset.mem_insert.1 h with (rfl | h)
exacts [this.1, this.2 _ h]
intro q hs hw
- induction q
- case move d q IH =>
+ induction q with
+ | move d q IH =>
unfold writes at hw ⊢
replace IH := IH hs hw; refine' ⟨_, IH.2⟩
cases d <;> simp only [trNormal, iterate, supportsStmt_move, IH]
- case write f q IH =>
+ | write f q IH =>
unfold writes at hw ⊢
simp only [Finset.mem_image, Finset.mem_union, Finset.mem_univ, exists_prop, true_and_iff]
at hw ⊢
@@ -1933,21 +1933,21 @@ theorem tr_supports {S : Finset Λ} (ss : Supports M S) : Supports (tr enc dec M
rcases hq with (⟨a, q₂, rfl⟩ | hq)
· simp only [tr, supportsStmt_write, supportsStmt_move, IH.1]
· exact IH.2 _ hq
- case load a q IH =>
+ | load a q IH =>
unfold writes at hw ⊢
replace IH := IH hs hw
refine' ⟨supportsStmt_read _ fun _ ↦ IH.1, IH.2⟩
- case branch p q₁ q₂ IH₁ IH₂ =>
+ | branch p q₁ q₂ IH₁ IH₂ =>
unfold writes at hw ⊢
simp only [Finset.mem_union] at hw ⊢
replace IH₁ := IH₁ hs.1 fun q hq ↦ hw q (Or.inl hq)
replace IH₂ := IH₂ hs.2 fun q hq ↦ hw q (Or.inr hq)
exact ⟨supportsStmt_read _ fun _ ↦ ⟨IH₁.1, IH₂.1⟩, fun q ↦ Or.rec (IH₁.2 _) (IH₂.2 _)⟩
- case goto l =>
+ | goto l =>
simp only [writes, Finset.not_mem_empty]; refine' ⟨_, fun _ ↦ False.elim⟩
refine' supportsStmt_read _ fun a _ s ↦ _
exact Finset.mem_biUnion.2 ⟨_, hs _ _, Finset.mem_insert_self _ _⟩
- case halt =>
+ | halt =>
simp only [writes, Finset.not_mem_empty]; refine' ⟨_, fun _ ↦ False.elim⟩
simp only [SupportsStmt, supportsStmt_move, trNormal]⟩
#align turing.TM1to1.tr_supports Turing.TM1to1.tr_supports
@@ -2191,32 +2191,33 @@ theorem stmts₁_self {q : Stmt₂} : q ∈ stmts₁ q := by
theorem stmts₁_trans {q₁ q₂ : Stmt₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ := by
intro h₁₂ q₀ h₀₁
- induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
- simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂
- iterate 4
- rcases h₁₂ with (rfl | h₁₂)
- · unfold stmts₁ at h₀₁
- exact h₀₁
- · exact Finset.mem_insert_of_mem (IH h₁₂)
- case branch f q₁ q₂ IH₁ IH₂ =>
+ induction q₂ with (
+ simp only [stmts₁] at h₁₂ ⊢
+ simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂)
+ | branch f q₁ q₂ IH₁ IH₂ =>
rcases h₁₂ with (rfl | h₁₂ | h₁₂)
· unfold stmts₁ at h₀₁
exact h₀₁
· exact Finset.mem_insert_of_mem (Finset.mem_union_left _ (IH₁ h₁₂))
· exact Finset.mem_insert_of_mem (Finset.mem_union_right _ (IH₂ h₁₂))
- case goto l => subst h₁₂; exact h₀₁
- case halt => subst h₁₂; exact h₀₁
+ | goto l => subst h₁₂; exact h₀₁
+ | halt => subst h₁₂; exact h₀₁
+ | load _ q IH | _ _ _ q IH =>
+ rcases h₁₂ with (rfl | h₁₂)
+ · unfold stmts₁ at h₀₁
+ exact h₀₁
+ · exact Finset.mem_insert_of_mem (IH h₁₂)
#align turing.TM2.stmts₁_trans Turing.TM2.stmts₁_trans
theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₂} (h : q₁ ∈ stmts₁ q₂)
(hs : SupportsStmt S q₂) : SupportsStmt S q₁ := by
- induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;>
+ induction q₂ with
simp only [stmts₁, SupportsStmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton]
at h hs
- iterate 4 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
- case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
- case goto l => subst h; exact hs
- case halt => subst h; trivial
+ | branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
+ | goto l => subst h; exact hs
+ | halt => subst h; trivial
+ | load _ _ IH | _ _ _ _ IH => rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
#align turing.TM2.stmts₁_supports_stmt_mono Turing.TM2.stmts₁_supportsStmt_mono
/-- The set of statements accessible from initial set `S` of labels. -/
@@ -2251,14 +2252,14 @@ theorem step_supports (M : Λ → Stmt₂) {S : Finset Λ} (ss : Supports M S) :
| ⟨some l₁, v, T⟩, c', h₁, h₂ => by
replace h₂ := ss.2 _ (Finset.some_mem_insertNone.1 h₂)
simp only [step, Option.mem_def, Option.some.injEq] at h₁; subst c'
- revert h₂; induction' M l₁ with _ _ q IH _ _ q IH _ _ q IH _ q IH generalizing v T <;> intro hs
- iterate 4 exact IH _ _ hs
- case branch p q₁' q₂' IH₁ IH₂ =>
+ revert h₂; induction M l₁ generalizing v T with intro hs
+ | branch p q₁' q₂' IH₁ IH₂ =>
unfold stepAux; cases p v
· exact IH₂ _ _ hs.2
· exact IH₁ _ _ hs.1
- case goto => exact Finset.some_mem_insertNone.2 (hs _)
- case halt => apply Multiset.mem_cons_self
+ | goto => exact Finset.some_mem_insertNone.2 (hs _)
+ | halt => apply Multiset.mem_cons_self
+ | load _ _ IH | _ _ _ _ IH => exact IH _ _ hs
#align turing.TM2.step_supports Turing.TM2.step_supports
variable [Inhabited σ]
@@ -2556,8 +2557,8 @@ theorem tr_respects_aux₂ {k : K} {q : Stmt₂₁} {v : σ} {S : ∀ k, List (
TM1.stepAux (trStAct q o) v
((Tape.move Dir.right)^[(S k).length] (Tape.mk' ∅ (addBottom L))) =
TM1.stepAux q v' ((Tape.move Dir.right)^[(S' k).length] (Tape.mk' ∅ (addBottom L'))) := by
- dsimp only; simp; cases o <;> simp only [stWrite, stVar, trStAct, TM1.stepAux]
- case push f =>
+ dsimp only; simp; cases o with simp only [stWrite, stVar, trStAct, TM1.stepAux]
+ | push f =>
have := Tape.write_move_right_n fun a : Γ' ↦ (a.1, update a.2 k (some (f v)))
refine'
⟨_, fun k' ↦ _, by
@@ -2586,7 +2587,7 @@ theorem tr_respects_aux₂ {k : K} {q : Stmt₂₁} {v : σ} {S : ∀ k, List (
List.length_append, List.length_map]
· split_ifs <;> rw [Function.update_noteq h', ← proj_map_nth, hL]
rw [Function.update_noteq h']
- case peek f =>
+ | peek f =>
rw [Function.update_eq_self]
use L, hL; rw [Tape.move_left_right]; congr
cases e : S k; · rfl
@@ -2594,7 +2595,7 @@ theorem tr_respects_aux₂ {k : K} {q : Stmt₂₁} {v : σ} {S : ∀ k, List (
Tape.move_right_n_head, Tape.mk'_nth_nat, addBottom_nth_snd, stk_nth_val _ (hL k), e,
List.reverse_cons, ← List.length_reverse, List.get?_concat_length]
rfl
- case pop f =>
+ | pop f =>
cases' e : S k with hd tl
· simp only [Tape.mk'_head, ListBlank.head_cons, Tape.move_left_mk', List.length,
Tape.write_mk', List.head?, iterate_zero_apply, List.tail_nil]
@@ -1015,12 +1015,12 @@ set_option linter.uppercaseLean3 false
section
+-- type of "labels" or TM states
variable (Γ : Type*) [Inhabited Γ]
-- type of tape symbols
variable (Λ : Type*) [Inhabited Λ]
--- type of "labels" or TM states
/-- A Turing machine "statement" is just a command to either move
left or right, or write a symbol on the tape. -/
inductive Stmt
@@ -1207,8 +1207,8 @@ state, but the statements themselves have a fixed structure. The `Stmt`s can be
Note that here most statements do not have labels; `goto` commands can only go to a new function.
Only the `goto` and `halt` statements actually take a step; the rest is done by recursion on
-statements and so take 0 steps. (There is a uniform bound on many statements can be executed before
-the next `goto`, so this is an `O(1)` speedup with the constant depending on the machine.)
+statements and so take 0 steps. (There is a uniform bound on how many statements can be executed
+before the next `goto`, so this is an `O(1)` speedup with the constant depending on the machine.)
The `halt` command has a one step stutter before actually halting so that any changes made before
the halt have a chance to be "committed", since the `eval` relation uses the final configuration
cases'
(#9171)
I literally went through and regex'd some uses of cases'
, replacing them with rcases
; this is meant to be a low effort PR as I hope that tools can do this in the future.
rcases
is an easier replacement than cases
, though with better tools we could in future do a second pass converting simple rcases
added here (and existing ones) to cases
.
@@ -133,10 +133,10 @@ theorem BlankRel.trans {Γ} [Inhabited Γ] {l₁ l₂ l₃ : List Γ} :
BlankRel l₁ l₂ → BlankRel l₂ l₃ → BlankRel l₁ l₃ := by
rintro (h₁ | h₁) (h₂ | h₂)
· exact Or.inl (h₁.trans h₂)
- · cases' le_total l₁.length l₃.length with h h
+ · rcases le_total l₁.length l₃.length with h | h
· exact Or.inl (h₁.above_of_le h₂ h)
· exact Or.inr (h₂.above_of_le h₁ h)
- · cases' le_total l₁.length l₃.length with h h
+ · rcases le_total l₁.length l₃.length with h | h
· exact Or.inl (h₁.below_of_le h₂ h)
· exact Or.inr (h₂.below_of_le h₁ h)
· exact Or.inr (h₂.trans h₁)
@@ -284,7 +284,7 @@ def ListBlank.nth {Γ} [Inhabited Γ] (l : ListBlank Γ) (n : ℕ) : Γ := by
cases' lt_or_le n _ with h h
· rw [List.getI_append _ _ _ h]
rw [List.getI_eq_default _ h]
- cases' le_or_lt _ n with h₂ h₂
+ rcases le_or_lt _ n with h₂ | h₂
· rw [List.getI_eq_default _ h₂]
rw [List.getI_eq_get _ h₂, List.get_append_right' h, List.get_replicate]
#align turing.list_blank.nth Turing.ListBlank.nth
Mark these named theorems: Rice, Downward and Upward Skolem
@@ -504,7 +504,7 @@ instance Tape.inhabited {Γ} [Inhabited Γ] : Inhabited (Tape Γ) :=
⟨by constructor <;> apply default⟩
#align turing.tape.inhabited Turing.Tape.inhabited
-/-- A direction for the turing machine `move` command, either
+/-- A direction for the Turing machine `move` command, either
left or right. -/
inductive Dir
| left
@@ -986,7 +986,7 @@ theorem tr_eval' {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ →
/-!
## The TM0 model
-A TM0 turing machine is essentially a Post-Turing machine, adapted for type theory.
+A TM0 Turing machine is essentially a Post-Turing machine, adapted for type theory.
A Post-Turing machine with symbol type `Γ` and label type `Λ` is a function
`Λ → Γ → Option (Λ × Stmt)`, where a `Stmt` can be either `move left`, `move right` or `write a`
@@ -1349,7 +1349,7 @@ theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₁} (h : q
case halt => subst h; trivial
#align turing.TM1.stmts₁_supports_stmt_mono Turing.TM1.stmts₁_supportsStmt_mono
-/-- The set of all statements in a turing machine, plus one extra value `none` representing the
+/-- The set of all statements in a Turing machine, plus one extra value `none` representing the
halt state. This is used in the TM1 to TM0 reduction. -/
noncomputable def stmts (M : Λ → Stmt₁) (S : Finset Λ) : Finset (Option Stmt₁) :=
Finset.insertNone (S.biUnion fun q ↦ stmts₁ (M q))
Adding a test case for induction'
that failed and fixing it: induction' a
would accidentally leave a
and variables depending on a
in context.
@@ -1501,11 +1501,11 @@ theorem tr_respects :
fun_respects.2 fun ⟨l₁, v, T⟩ ↦ by
cases' l₁ with l₁; · exact rfl
simp only [trCfg, TM1.step, FRespects, Option.map]
- induction' M l₁ with _ q IH _ q IH _ q IH generalizing v T
- case move d q IH => exact TransGen.head rfl (IH _ _)
- case write a q IH => exact TransGen.head rfl (IH _ _)
- case load a q IH => exact (reaches₁_eq (by rfl)).2 (IH _ _)
- case branch p q₁ q₂ IH₁ IH₂ =>
+ induction' M l₁ with _ _ IH _ _ IH _ _ IH generalizing v T
+ case move _ _ IH => exact TransGen.head rfl (IH _ _)
+ case write _ _ IH => exact TransGen.head rfl (IH _ _)
+ case load _ _ IH => exact (reaches₁_eq (by rfl)).2 (IH _ _)
+ case branch p _ _ IH₁ IH₂ =>
unfold TM1.stepAux; cases e : p T.1 v
· exact (reaches₁_eq (by simp only [TM0.step, tr, trAux, e]; rfl)).2 (IH₂ _ _)
· exact (reaches₁_eq (by simp only [TM0.step, tr, trAux, e]; rfl)).2 (IH₁ _ _)
rcases
, convert
and congrm
(#7725)
Replace rcases(
with rcases (
. Same thing for convert(
and congrm(
. No other change.
@@ -978,7 +978,7 @@ theorem tr_eval' {σ₁ σ₂} (f₁ : σ₁ → Option σ₁) (f₂ : σ₂ →
let ⟨b₁, bb, hb⟩ := tr_eval_rev H rfl h
(Part.mem_map_iff _).2 ⟨b₁, hb, bb⟩,
fun h ↦ by
- rcases(Part.mem_map_iff _).1 h with ⟨b₁, ab, bb⟩
+ rcases (Part.mem_map_iff _).1 h with ⟨b₁, ab, bb⟩
rcases tr_eval H rfl ab with ⟨_, rfl, h⟩
rwa [bb] at h⟩
#align turing.tr_eval' Turing.tr_eval'
@@ -1840,7 +1840,7 @@ theorem stepAux_read (f : Γ → Stmt'₁) (v : σ) (L R : ListBlank Γ) :
stepAux (readAux l₂.length fun v ↦ f (a ::ᵥ v)) v
(Tape.mk' ((L'.append l₁).cons a) (R'.append l₂))
· dsimp [readAux, stepAux]
- simp
+ simp only [ListBlank.head_cons, Tape.move_right_mk', ListBlank.tail_cons]
cases a <;> rfl
rw [← ListBlank.append, IH]
rfl
Many proofs use the "stream of consciousness" style from Lean 3, rather than have ... :=
or suffices ... from/by
.
This PR updates a fraction of these to the preferred Lean 4 style.
I think a good goal would be to delete the "deferred" versions of have
, suffices
, and let
at the bottom of Mathlib.Tactic.Have
(Anyone who would like to contribute more cleanup is welcome to push directly to this branch.)
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -1696,8 +1696,7 @@ def trNormal : Stmt₁ → Stmt'₁
theorem stepAux_move (d : Dir) (q : Stmt'₁) (v : σ) (T : Tape Bool) :
stepAux (moveₙ d q) v T = stepAux q v ((Tape.move d)^[n] T) := by
- suffices : ∀ i, stepAux ((Stmt.move d)^[i] q) v T = stepAux q v ((Tape.move d)^[i] T)
- exact this n
+ suffices ∀ i, stepAux ((Stmt.move d)^[i] q) v T = stepAux q v ((Tape.move d)^[i] T) from this n
intro i; induction' i with i IH generalizing T; · rfl
rw [iterate_succ', iterate_succ]
simp only [stepAux, Function.comp_apply]
@@ -2560,7 +2560,6 @@ theorem tr_respects_aux₂ {k : K} {q : Stmt₂₁} {v : σ} {S : ∀ k, List (
dsimp only; simp; cases o <;> simp only [stWrite, stVar, trStAct, TM1.stepAux]
case push f =>
have := Tape.write_move_right_n fun a : Γ' ↦ (a.1, update a.2 k (some (f v)))
- dsimp only at this
refine'
⟨_, fun k' ↦ _, by
-- Porting note: `rw [...]` to `erw [...]; rfl`.
@@ -2725,7 +2724,6 @@ theorem tr_respects : Respects (TM2.step M) (TM1.step (tr M)) TrCfg := by
theorem trCfg_init (k) (L : List (Γ k)) : TrCfg (TM2.init k L) (TM1.init (trInit k L) : Cfg₂₁) := by
rw [(_ : TM1.init _ = _)]
· refine' ⟨ListBlank.mk (L.reverse.map fun a ↦ update default k (some a)), fun k' ↦ _⟩
- simp only [TM2.Cfg.stk, TM2.init]
refine' ListBlank.ext fun i ↦ _
rw [ListBlank.map_mk, ListBlank.nth_mk, List.getI_eq_iget_get?, List.map_map]
have : ((proj k').f ∘ fun a => update (β := fun k => Option (Γ k)) default k (some a))
@@ -470,7 +470,7 @@ def ListBlank.bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (l : ListBlank Γ) (f
(hf : ∃ n, f default = List.replicate n default) : ListBlank Γ' := by
apply l.liftOn (fun l ↦ ListBlank.mk (List.bind l f))
rintro l _ ⟨i, rfl⟩; cases' hf with n e; refine' Quotient.sound' (Or.inl ⟨i * n, _⟩)
- rw [List.bind_append, mul_comm]; congr
+ rw [List.append_bind, mul_comm]; congr
induction' i with i IH; rfl
simp only [IH, e, List.replicate_add, Nat.mul_succ, add_comm, List.replicate_succ, List.cons_bind]
#align turing.list_blank.bind Turing.ListBlank.bind
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -425,12 +425,12 @@ theorem ListBlank.nth_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMa
#align turing.list_blank.nth_map Turing.ListBlank.nth_map
/-- The `i`-th projection as a pointed map. -/
-def proj {ι : Type _} {Γ : ι → Type _} [∀ i, Inhabited (Γ i)] (i : ι) :
+def proj {ι : Type*} {Γ : ι → Type*} [∀ i, Inhabited (Γ i)] (i : ι) :
PointedMap (∀ i, Γ i) (Γ i) :=
⟨fun a ↦ a i, rfl⟩
#align turing.proj Turing.proj
-theorem proj_map_nth {ι : Type _} {Γ : ι → Type _} [∀ i, Inhabited (Γ i)] (i : ι) (L n) :
+theorem proj_map_nth {ι : Type*} {Γ : ι → Type*} [∀ i, Inhabited (Γ i)] (i : ι) (L n) :
(ListBlank.map (@proj ι Γ _ i) L).nth n = L.nth n i := by
rw [ListBlank.nth_map]; rfl
#align turing.proj_map_nth Turing.proj_map_nth
@@ -494,7 +494,7 @@ theorem ListBlank.cons_bind {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (a : Γ) (l
current position of the head), together with two `ListBlank`s denoting the portions of the tape
going off to the left and right. When the Turing machine moves right, an element is pulled from the
right side and becomes the new head, while the head element is consed onto the left side. -/
-structure Tape (Γ : Type _) [Inhabited Γ] where
+structure Tape (Γ : Type*) [Inhabited Γ] where
head : Γ
left : ListBlank Γ
right : ListBlank Γ
@@ -821,7 +821,7 @@ which is either terminal (meaning `a = b`) or where the next point also satisfie
holds of any point where `eval f a` evaluates to `b`. This formalizes the notion that if
`eval f a` evaluates to `b` then it reaches terminal state `b` in finitely many steps. -/
@[elab_as_elim]
-def evalInduction {σ} {f : σ → Option σ} {b : σ} {C : σ → Sort _} {a : σ}
+def evalInduction {σ} {f : σ → Option σ} {b : σ} {C : σ → Sort*} {a : σ}
(h : b ∈ eval f a) (H : ∀ a, b ∈ eval f a → (∀ a', f a = some a' → C a') → C a) : C a :=
PFun.fixInduction h fun a' ha' h' ↦
H _ ha' fun b' e ↦ h' _ <| Part.mem_some_iff.2 <| by rw [e]; rfl
@@ -1015,10 +1015,10 @@ set_option linter.uppercaseLean3 false
section
-variable (Γ : Type _) [Inhabited Γ]
+variable (Γ : Type*) [Inhabited Γ]
-- type of tape symbols
-variable (Λ : Type _) [Inhabited Λ]
+variable (Λ : Type*) [Inhabited Λ]
-- type of "labels" or TM states
/-- A Turing machine "statement" is just a command to either move
@@ -1122,13 +1122,13 @@ end
section
-variable {Γ : Type _} [Inhabited Γ]
+variable {Γ : Type*} [Inhabited Γ]
-variable {Γ' : Type _} [Inhabited Γ']
+variable {Γ' : Type*} [Inhabited Γ']
-variable {Λ : Type _} [Inhabited Λ]
+variable {Λ : Type*} [Inhabited Λ]
-variable {Λ' : Type _} [Inhabited Λ']
+variable {Λ' : Type*} [Inhabited Λ']
/-- Map a TM statement across a function. This does nothing to move statements and maps the write
values. -/
@@ -1223,13 +1223,13 @@ set_option linter.uppercaseLean3 false
section
-variable (Γ : Type _) [Inhabited Γ]
+variable (Γ : Type*) [Inhabited Γ]
-- Type of tape symbols
-variable (Λ : Type _)
+variable (Λ : Type*)
-- Type of function labels
-variable (σ : Type _)
+variable (σ : Type*)
-- Type of variable settings
/-- The TM1 model is a simplification and extension of TM0
@@ -1437,11 +1437,11 @@ set_option linter.uppercaseLean3 false
section
-variable {Γ : Type _} [Inhabited Γ]
+variable {Γ : Type*} [Inhabited Γ]
-variable {Λ : Type _} [Inhabited Λ]
+variable {Λ : Type*} [Inhabited Λ]
-variable {σ : Type _} [Inhabited σ]
+variable {σ : Type*} [Inhabited σ]
local notation "Stmt₁" => TM1.Stmt Γ Λ σ
@@ -1614,7 +1614,7 @@ open TM1
section
-variable {Γ : Type _} [Inhabited Γ]
+variable {Γ : Type*} [Inhabited Γ]
theorem exists_enc_dec [Fintype Γ] : ∃ (n : ℕ) (enc : Γ → Vector Bool n) (dec : Vector Bool n → Γ),
enc default = Vector.replicate n false ∧ ∀ a, dec (enc a) = a := by
@@ -1630,9 +1630,9 @@ theorem exists_enc_dec [Fintype Γ] : ∃ (n : ℕ) (enc : Γ → Vector Bool n)
exact ⟨_, enc, Function.invFun enc, H.setValue_eq _ _, Function.leftInverse_invFun enc.2⟩
#align turing.TM1to1.exists_enc_dec Turing.TM1to1.exists_enc_dec
-variable {Λ : Type _} [Inhabited Λ]
+variable {Λ : Type*} [Inhabited Λ]
-variable {σ : Type _} [Inhabited σ]
+variable {σ : Type*} [Inhabited σ]
local notation "Stmt₁" => Stmt Γ Λ σ
@@ -1979,9 +1979,9 @@ set_option linter.uppercaseLean3 false
section
-variable {Γ : Type _} [Inhabited Γ]
+variable {Γ : Type*} [Inhabited Γ]
-variable {Λ : Type _} [Inhabited Λ]
+variable {Λ : Type*} [Inhabited Λ]
/-- The machine states for a TM1 emulating a TM0 machine. States of the TM0 machine are embedded
as `normal q` states, but the actual operation is split into two parts, a jump to `act s q`
@@ -2085,16 +2085,16 @@ set_option linter.uppercaseLean3 false
section
-variable {K : Type _} [DecidableEq K]
+variable {K : Type*} [DecidableEq K]
-- Index type of stacks
-variable (Γ : K → Type _)
+variable (Γ : K → Type*)
-- Type of stack elements
-variable (Λ : Type _)
+variable (Λ : Type*)
-- Type of function labels
-variable (σ : Type _)
+variable (σ : Type*)
-- Type of variable settings
/-- The TM2 model removes the tape entirely from the TM1 model,
@@ -2323,7 +2323,7 @@ namespace TM2to1
set_option linter.uppercaseLean3 false
-- A displaced lemma proved in unnecessary generality
-theorem stk_nth_val {K : Type _} {Γ : K → Type _} {L : ListBlank (∀ k, Option (Γ k))} {k S} (n)
+theorem stk_nth_val {K : Type*} {Γ : K → Type*} {L : ListBlank (∀ k, Option (Γ k))} {k S} (n)
(hL : ListBlank.map (proj k) L = ListBlank.mk (List.map some S).reverse) :
L.nth n k = S.reverse.get? n := by
rw [← proj_map_nth, hL, ← List.map_reverse, ListBlank.nth_mk, List.getI_eq_iget_get?,
@@ -2333,13 +2333,13 @@ theorem stk_nth_val {K : Type _} {Γ : K → Type _} {L : ListBlank (∀ k, Opti
section
-variable {K : Type _} [DecidableEq K]
+variable {K : Type*} [DecidableEq K]
-variable {Γ : K → Type _}
+variable {Γ : K → Type*}
-variable {Λ : Type _} [Inhabited Λ]
+variable {Λ : Type*} [Inhabited Λ]
-variable {σ : Type _} [Inhabited σ]
+variable {σ : Type*} [Inhabited σ]
local notation "Stmt₂" => TM2.Stmt Γ Λ σ
@@ -2,11 +2,6 @@
Copyright (c) 2018 Mario Carneiro. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mario Carneiro
-
-! This file was ported from Lean 3 source module computability.turing_machine
-! leanprover-community/mathlib commit 4c19a16e4b705bf135cf9a80ac18fcc99c438514
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Data.Fintype.Option
import Mathlib.Data.Fintype.Prod
@@ -17,6 +12,8 @@ import Mathlib.Logic.Function.Iterate
import Mathlib.Order.Basic
import Mathlib.Tactic.ApplyFun
+#align_import computability.turing_machine from "leanprover-community/mathlib"@"4c19a16e4b705bf135cf9a80ac18fcc99c438514"
+
/-!
# Turing machines
This is the second half of the changes originally in #5699, removing all occurrences of ;
after a space and implementing a linter rule to enforce it.
In most cases this 2-character substring has a space after it, so the following command was run first:
find . -type f -name "*.lean" -exec sed -i -E 's/ ; /; /g' {} \;
The remaining cases were few enough in number that they were done manually.
@@ -2384,7 +2384,7 @@ theorem addBottom_modifyNth (f : (∀ k, Option (Γ k)) → ∀ k, Option (Γ k)
(addBottom L).modifyNth (fun a ↦ (a.1, f a.2)) n = addBottom (L.modifyNth f n) := by
cases n <;>
simp only [addBottom, ListBlank.head_cons, ListBlank.modifyNth, ListBlank.tail_cons]
- congr ; symm; apply ListBlank.map_modifyNth; intro ; rfl
+ congr; symm; apply ListBlank.map_modifyNth; intro; rfl
#align turing.TM2to1.add_bottom_modify_nth Turing.TM2to1.addBottom_modifyNth
theorem addBottom_nth_snd (L : ListBlank (∀ k, Option (Γ k))) (n : ℕ) :
@@ -650,7 +650,7 @@ theorem Tape.move_right_nth {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℤ) :
@[simp]
theorem Tape.move_right_n_head {Γ} [Inhabited Γ] (T : Tape Γ) (i : ℕ) :
- ((Tape.move Dir.right^[i]) T).head = T.nth i := by
+ ((Tape.move Dir.right)^[i] T).head = T.nth i := by
induction i generalizing T
· rfl
· simp only [*, Tape.move_right_nth, Int.ofNat_succ, iterate_succ, Function.comp_apply]
@@ -702,8 +702,8 @@ theorem Tape.map_write {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap
-- itself, but it does indeed.
@[simp, nolint simpNF]
theorem Tape.write_move_right_n {Γ} [Inhabited Γ] (f : Γ → Γ) (L R : ListBlank Γ) (n : ℕ) :
- ((Tape.move Dir.right^[n]) (Tape.mk' L R)).write (f (R.nth n)) =
- (Tape.move Dir.right^[n]) (Tape.mk' L (R.modifyNth f n)) := by
+ ((Tape.move Dir.right)^[n] (Tape.mk' L R)).write (f (R.nth n)) =
+ (Tape.move Dir.right)^[n] (Tape.mk' L (R.modifyNth f n)) := by
induction' n with n IH generalizing L R
· simp only [ListBlank.nth_zero, ListBlank.modifyNth, iterate_zero_apply, Nat.zero_eq]
rw [← Tape.write_mk', ListBlank.cons_head_tail]
@@ -1668,7 +1668,7 @@ variable {n : ℕ} (enc : Γ → Vector Bool n) (dec : Vector Bool n → Γ)
/-- A move left or right corresponds to `n` moves across the super-cell. -/
def move (d : Dir) (q : Stmt'₁) : Stmt'₁ :=
- (Stmt.move d^[n]) q
+ (Stmt.move d)^[n] q
#align turing.TM1to1.move Turing.TM1to1.move
local notation "moveₙ" => @move Γ Λ σ n -- Porting note: Added this to clean up types.
@@ -1698,8 +1698,8 @@ def trNormal : Stmt₁ → Stmt'₁
#align turing.TM1to1.tr_normal Turing.TM1to1.trNormal
theorem stepAux_move (d : Dir) (q : Stmt'₁) (v : σ) (T : Tape Bool) :
- stepAux (moveₙ d q) v T = stepAux q v ((Tape.move d^[n]) T) := by
- suffices : ∀ i, stepAux ((Stmt.move d^[i]) q) v T = stepAux q v ((Tape.move d^[i]) T)
+ stepAux (moveₙ d q) v T = stepAux q v ((Tape.move d)^[n] T) := by
+ suffices : ∀ i, stepAux ((Stmt.move d)^[i] q) v T = stepAux q v ((Tape.move d)^[i] T)
exact this n
intro i; induction' i with i IH generalizing T; · rfl
rw [iterate_succ', iterate_succ]
@@ -1709,7 +1709,7 @@ theorem stepAux_move (d : Dir) (q : Stmt'₁) (v : σ) (T : Tape Bool) :
theorem supportsStmt_move {S : Finset Λ'₁} {d : Dir} {q : Stmt'₁} :
SupportsStmt S (moveₙ d q) = SupportsStmt S q := by
- suffices ∀ {i}, SupportsStmt S ((Stmt.move d^[i]) q) = _ from this
+ suffices ∀ {i}, SupportsStmt S ((Stmt.move d)^[i] q) = _ from this
intro i; induction i generalizing q <;> simp only [*, iterate]; rfl
#align turing.TM1to1.supports_stmt_move Turing.TM1to1.supportsStmt_move
@@ -1769,11 +1769,11 @@ def trCfg : Cfg₁ → Cfg'₁
variable {enc}
theorem trTape'_move_left (L R : ListBlank Γ) :
- (Tape.move Dir.left^[n]) (trTape' enc0 L R) = trTape' enc0 L.tail (R.cons L.head) := by
+ (Tape.move Dir.left)^[n] (trTape' enc0 L R) = trTape' enc0 L.tail (R.cons L.head) := by
obtain ⟨a, L, rfl⟩ := L.exists_cons
simp only [trTape', ListBlank.cons_bind, ListBlank.head_cons, ListBlank.tail_cons]
suffices ∀ {L' R' l₁ l₂} (_ : Vector.toList (enc a) = List.reverseAux l₁ l₂),
- (Tape.move Dir.left^[l₁.length])
+ (Tape.move Dir.left)^[l₁.length]
(Tape.mk' (ListBlank.append l₁ L') (ListBlank.append l₂ R')) =
Tape.mk' L' (ListBlank.append (Vector.toList (enc a)) R') by
simpa only [List.length_reverse, Vector.toList_length] using this (List.reverse_reverse _).symm
@@ -1787,8 +1787,8 @@ theorem trTape'_move_left (L R : ListBlank Γ) :
#align turing.TM1to1.tr_tape'_move_left Turing.TM1to1.trTape'_move_left
theorem trTape'_move_right (L R : ListBlank Γ) :
- (Tape.move Dir.right^[n]) (trTape' enc0 L R) = trTape' enc0 (L.cons R.head) R.tail := by
- suffices ∀ i L, (Tape.move Dir.right^[i]) ((Tape.move Dir.left^[i]) L) = L by
+ (Tape.move Dir.right)^[n] (trTape' enc0 L R) = trTape' enc0 (L.cons R.head) R.tail := by
+ suffices ∀ i L, (Tape.move Dir.right)^[i] ((Tape.move Dir.left)^[i] L) = L by
refine' (Eq.symm _).trans (this n _)
simp only [trTape'_move_left, ListBlank.cons_head_tail, ListBlank.head_cons,
ListBlank.tail_cons]
@@ -2558,8 +2558,8 @@ theorem tr_respects_aux₂ {k : K} {q : Stmt₂₁} {v : σ} {S : ∀ k, List (
∃ L' : ListBlank (∀ k, Option (Γ k)),
(∀ k, L'.map (proj k) = ListBlank.mk ((S' k).map some).reverse) ∧
TM1.stepAux (trStAct q o) v
- ((Tape.move Dir.right^[(S k).length]) (Tape.mk' ∅ (addBottom L))) =
- TM1.stepAux q v' ((Tape.move Dir.right^[(S' k).length]) (Tape.mk' ∅ (addBottom L'))) := by
+ ((Tape.move Dir.right)^[(S k).length] (Tape.mk' ∅ (addBottom L))) =
+ TM1.stepAux q v' ((Tape.move Dir.right)^[(S' k).length] (Tape.mk' ∅ (addBottom L'))) := by
dsimp only; simp; cases o <;> simp only [stWrite, stVar, trStAct, TM1.stepAux]
case push f =>
have := Tape.write_move_right_n fun a : Γ' ↦ (a.1, update a.2 k (some (f v)))
@@ -2660,7 +2660,7 @@ inductive TrCfg : Cfg₂ → Cfg₂₁ → Prop
theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k, Option (Γ k))}
(hL : L.map (proj k) = ListBlank.mk (S.map some).reverse) (n) (H : n ≤ S.length) :
Reaches₀ (TM1.step (tr M)) ⟨some (go k o q), v, Tape.mk' ∅ (addBottom L)⟩
- ⟨some (go k o q), v, (Tape.move Dir.right^[n]) (Tape.mk' ∅ (addBottom L))⟩ := by
+ ⟨some (go k o q), v, (Tape.move Dir.right)^[n] (Tape.mk' ∅ (addBottom L))⟩ := by
induction' n with n IH; · rfl
apply (IH (le_of_lt H)).tail
rw [iterate_succ_apply'];
@@ -2670,7 +2670,7 @@ theorem tr_respects_aux₁ {k} (o q v) {S : List (Γ k)} {L : ListBlank (∀ k,
#align turing.TM2to1.tr_respects_aux₁ Turing.TM2to1.tr_respects_aux₁
theorem tr_respects_aux₃ {q v} {L : ListBlank (∀ k, Option (Γ k))} (n) : Reaches₀ (TM1.step (tr M))
- ⟨some (ret q), v, (Tape.move Dir.right^[n]) (Tape.mk' ∅ (addBottom L))⟩
+ ⟨some (ret q), v, (Tape.move Dir.right)^[n] (Tape.mk' ∅ (addBottom L))⟩
⟨some (ret q), v, Tape.mk' ∅ (addBottom L)⟩ := by
induction' n with n IH; · rfl
refine' Reaches₀.head _ IH
We disable the "relaxed" auto-implicit feature, so only single character identifiers become eligible as auto-implicits. See discussion on zulip and 2.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au>
@@ -1850,7 +1850,8 @@ theorem stepAux_read (f : Γ → Stmt'₁) (v : σ) (L R : ListBlank Γ) :
rfl
#align turing.TM1to1.step_aux_read Turing.TM1to1.stepAux_read
-theorem tr_respects : Respects (step M) (step (tr enc dec M)) fun c₁ c₂ ↦ trCfg enc enc₀ c₁ = c₂ :=
+theorem tr_respects {enc₀} :
+ Respects (step M) (step (tr enc dec M)) fun c₁ c₂ ↦ trCfg enc enc₀ c₁ = c₂ :=
fun_respects.2 fun ⟨l₁, v, T⟩ ↦ by
obtain ⟨L, R, rfl⟩ := T.exists_mk'
cases' l₁ with l₁
at
and goals (#5387)
Changes are of the form
some_tactic at h⊢
-> some_tactic at h ⊢
some_tactic at h
-> some_tactic at h
@@ -1324,7 +1324,7 @@ theorem stmts₁_self {q : Stmt₁} : q ∈ stmts₁ q := by
theorem stmts₁_trans {q₁ q₂ : Stmt₁} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ := by
intro h₁₂ q₀ h₀₁
- induction' q₂ with _ q IH _ q IH _ q IH <;> simp only [stmts₁] at h₁₂⊢ <;>
+ induction' q₂ with _ q IH _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
simp only [Finset.mem_insert, Finset.mem_union, Finset.mem_singleton] at h₁₂
iterate 3
rcases h₁₂ with (rfl | h₁₂)
@@ -1547,9 +1547,9 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) :
· intro q a q' s h₁ h₂
rcases q with ⟨_ | q, v⟩; · cases h₁
cases' q' with q' v'
- simp only [trStmts, Finset.mem_coe] at h₂⊢
- rw [Finset.mem_product] at h₂⊢
- simp only [Finset.mem_univ, and_true_iff] at h₂⊢
+ simp only [trStmts, Finset.mem_coe] at h₂ ⊢
+ rw [Finset.mem_product] at h₂ ⊢
+ simp only [Finset.mem_univ, and_true_iff] at h₂ ⊢
cases q'; · exact Multiset.mem_cons_self _ _
simp only [tr, Option.mem_def] at h₁
have := TM1.stmts_supportsStmt ss h₂
@@ -1924,25 +1924,25 @@ theorem tr_supports {S : Finset Λ} (ss : Supports M S) : Supports (tr enc dec M
intro q hs hw
induction q
case move d q IH =>
- unfold writes at hw⊢
+ unfold writes at hw ⊢
replace IH := IH hs hw; refine' ⟨_, IH.2⟩
cases d <;> simp only [trNormal, iterate, supportsStmt_move, IH]
case write f q IH =>
- unfold writes at hw⊢
+ unfold writes at hw ⊢
simp only [Finset.mem_image, Finset.mem_union, Finset.mem_univ, exists_prop, true_and_iff]
- at hw⊢
+ at hw ⊢
replace IH := IH hs fun q hq ↦ hw q (Or.inr hq)
refine' ⟨supportsStmt_read _ fun a _ s ↦ hw _ (Or.inl ⟨_, rfl⟩), fun q' hq ↦ _⟩
rcases hq with (⟨a, q₂, rfl⟩ | hq)
· simp only [tr, supportsStmt_write, supportsStmt_move, IH.1]
· exact IH.2 _ hq
case load a q IH =>
- unfold writes at hw⊢
+ unfold writes at hw ⊢
replace IH := IH hs hw
refine' ⟨supportsStmt_read _ fun _ ↦ IH.1, IH.2⟩
case branch p q₁ q₂ IH₁ IH₂ =>
- unfold writes at hw⊢
- simp only [Finset.mem_union] at hw⊢
+ unfold writes at hw ⊢
+ simp only [Finset.mem_union] at hw ⊢
replace IH₁ := IH₁ hs.1 fun q hq ↦ hw q (Or.inl hq)
replace IH₂ := IH₂ hs.2 fun q hq ↦ hw q (Or.inr hq)
exact ⟨supportsStmt_read _ fun _ ↦ ⟨IH₁.1, IH₂.1⟩, fun q ↦ Or.rec (IH₁.2 _) (IH₂.2 _)⟩
@@ -2194,7 +2194,7 @@ theorem stmts₁_self {q : Stmt₂} : q ∈ stmts₁ q := by
theorem stmts₁_trans {q₁ q₂ : Stmt₂} : q₁ ∈ stmts₁ q₂ → stmts₁ q₁ ⊆ stmts₁ q₂ := by
intro h₁₂ q₀ h₀₁
- induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;> simp only [stmts₁] at h₁₂⊢ <;>
+ induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;> simp only [stmts₁] at h₁₂ ⊢ <;>
simp only [Finset.mem_insert, Finset.mem_singleton, Finset.mem_union] at h₁₂
iterate 4
rcases h₁₂ with (rfl | h₁₂)
@@ -2801,7 +2801,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports (tr M) (trSupp M
exact ⟨IH₁, fun _ _ ↦ hret⟩
· exact IH₂ _ h
· intro _ _ IH ss' sub -- load
- unfold TM2to1.trStmts₁ at ss' sub⊢
+ unfold TM2to1.trStmts₁ at ss' sub ⊢
exact IH ss' sub
· intro _ _ _ IH₁ IH₂ ss' sub -- branch
unfold TM2to1.trStmts₁ at sub
@@ -2566,6 +2566,7 @@ theorem tr_respects_aux₂ {k : K} {q : Stmt₂₁} {v : σ} {S : ∀ k, List (
refine'
⟨_, fun k' ↦ _, by
-- Porting note: `rw [...]` to `erw [...]; rfl`.
+ -- https://github.com/leanprover-community/mathlib4/issues/5164
erw [Tape.move_right_n_head, List.length, Tape.mk'_nth_nat, this,
addBottom_modifyNth fun a ↦ update a k (some (f v)), Nat.add_one, iterate_succ']
rfl⟩
@@ -2754,7 +2754,7 @@ theorem tr_eval_dom (k) (L : List (Γ k)) :
theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval (tr M) (trInit k L))
(H₂ : L₂ ∈ TM2.eval M k L) :
- ∃ (S : ∀ k, List (Γ k))(L' : ListBlank (∀ k, Option (Γ k))),
+ ∃ (S : ∀ k, List (Γ k)) (L' : ListBlank (∀ k, Option (Γ k))),
addBottom L' = L₁ ∧
(∀ k, L'.map (proj k) = ListBlank.mk ((S k).map some).reverse) ∧ S k = L₂ := by
obtain ⟨c₁, h₁, rfl⟩ := (Part.mem_map_iff _).1 H₁
@@ -1347,7 +1347,7 @@ theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₁} (h : q
simp only [stmts₁, SupportsStmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton]
at h hs
iterate 3 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
- case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
+ case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
#align turing.TM1.stmts₁_supports_stmt_mono Turing.TM1.stmts₁_supportsStmt_mono
@@ -1920,7 +1920,7 @@ theorem tr_supports {S : Finset Λ} (ss : Supports M S) : Supports (tr enc dec M
have :=
this _ (ss.2 _ hl) fun q' hq ↦ Finset.mem_biUnion.2 ⟨_, hl, Finset.mem_insert_of_mem hq⟩
rcases Finset.mem_insert.1 h with (rfl | h)
- exacts[this.1, this.2 _ h]
+ exacts [this.1, this.2 _ h]
intro q hs hw
induction q
case move d q IH =>
@@ -2217,7 +2217,7 @@ theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₂} (h : q
simp only [stmts₁, SupportsStmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton]
at h hs
iterate 4 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
- case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
+ case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts [hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
#align turing.TM2.stmts₁_supports_stmt_mono Turing.TM2.stmts₁_supportsStmt_mono
I ran codespell Mathlib
and got tired halfway through the suggestions.
@@ -1965,7 +1965,7 @@ end TM1to1
To establish that TM0 and TM1 are equivalent computational models, we must also have a TM0 emulator
in TM1. The main complication here is that TM0 allows an action to depend on the value at the head
and local state, while TM1 doesn't (in order to have more programming language-like semantics).
-So we use a computed `goto` to go to a state that performes the desired action and then returns to
+So we use a computed `goto` to go to a state that performs the desired action and then returns to
normal execution.
One issue with this is that the `halt` instruction is supposed to halt immediately, not take a step
SProd
to implement overloaded notation · ×ˢ ·
(#4200)
Currently, the following notations are changed from · ×ˢ ·
because Lean 4 can't deal with ambiguous notations.
| Definition | Notation |
| :
Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: Chris Hughes <chrishughes24@gmail.com>
@@ -1527,9 +1527,8 @@ variable [Fintype σ]
/-- Given a finite set of accessible `Λ` machine states, there is a finite set of accessible
machine states in the target (even though the type `Λ'` is infinite). -/
--- Porting note: Unfolded `×ˢ` to `Finset.product`.
noncomputable def trStmts (S : Finset Λ) : Finset Λ'₁₀ :=
- Finset.product (TM1.stmts M S) Finset.univ
+ (TM1.stmts M S) ×ˢ Finset.univ
#align turing.TM1to0.tr_stmts Turing.TM1to0.trStmts
open Classical
The main breaking change is that tac <;> [t1, t2]
is now written tac <;> [t1; t2]
, to avoid clashing with tactics like cases
and use
that take comma-separated lists.
@@ -194,7 +194,7 @@ precondition `BlankExtends` instead of `BlankRel`. -/
@[reducible] -- Porting note: Removed `@[elab_as_elim]`
protected def ListBlank.liftOn {Γ} [Inhabited Γ] {α} (l : ListBlank Γ) (f : List Γ → α)
(H : ∀ a b, BlankExtends a b → f a = f b) : α :=
- l.liftOn' f <| by rintro a b (h | h) <;> [exact H _ _ h, exact (H _ _ h).symm]
+ l.liftOn' f <| by rintro a b (h | h) <;> [exact H _ _ h; exact (H _ _ h).symm]
#align turing.list_blank.lift_on Turing.ListBlank.liftOn
/-- The quotient map turning a `List` into a `ListBlank`. -/
@@ -229,7 +229,7 @@ def ListBlank.tail {Γ} [Inhabited Γ] (l : ListBlank Γ) : ListBlank Γ := by
rintro a _ ⟨i, rfl⟩
refine' Quotient.sound' (Or.inl _)
cases a
- · cases' i with i <;> [exact ⟨0, rfl⟩, exact ⟨i, rfl⟩]
+ · cases' i with i <;> [exact ⟨0, rfl⟩; exact ⟨i, rfl⟩]
exact ⟨i, rfl⟩
#align turing.list_blank.tail Turing.ListBlank.tail
@@ -316,7 +316,7 @@ theorem ListBlank.ext {Γ} [i : Inhabited Γ] {L₁ L₂ : ListBlank Γ} :
(∀ i, L₁.nth i = L₂.nth i) → L₁ = L₂ := by
refine' ListBlank.induction_on L₁ fun l₁ ↦ ListBlank.induction_on L₂ fun l₂ H ↦ _
wlog h : l₁.length ≤ l₂.length
- · cases le_total l₁.length l₂.length <;> [skip, symm] <;> apply this <;> try assumption
+ · cases le_total l₁.length l₂.length <;> [skip; symm] <;> apply this <;> try assumption
intro
rw [H]
refine' Quotient.sound' (Or.inl ⟨l₂.length - l₁.length, _⟩)
@@ -376,7 +376,7 @@ theorem PointedMap.map_pt {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMa
@[simp]
theorem PointedMap.headI_map {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap Γ Γ')
(l : List Γ) : (l.map f).headI = f l.headI := by
- cases l <;> [exact (PointedMap.map_pt f).symm, rfl]
+ cases l <;> [exact (PointedMap.map_pt f).symm; rfl]
#align turing.pointed_map.head_map Turing.PointedMap.headI_map
/-- The `map` function on lists is well defined on `ListBlank`s provided that the map is
@@ -1346,7 +1346,7 @@ theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₁} (h : q
induction' q₂ with _ q IH _ q IH _ q IH <;>
simp only [stmts₁, SupportsStmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton]
at h hs
- iterate 3 rcases h with (rfl | h) <;> [exact hs, exact IH h hs]
+ iterate 3 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
case branch p q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
@@ -1882,7 +1882,7 @@ theorem tr_respects : Respects (step M) (step (tr enc dec M)) fun c₁ c₂ ↦
apply IH
case branch p q₁ q₂ IH₁ IH₂ =>
simp only [trNormal, stepAux_read dec enc0 encdec, stepAux]
- cases p R.head v <;> [apply IH₂, apply IH₁]
+ cases p R.head v <;> [apply IH₂; apply IH₁]
case goto l =>
simp only [trNormal, stepAux_read dec enc0 encdec, stepAux, trCfg, trTape_mk']
apply ReflTransGen.refl
@@ -2217,7 +2217,7 @@ theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₂} (h : q
induction' q₂ with _ _ q IH _ _ q IH _ _ q IH _ q IH <;>
simp only [stmts₁, SupportsStmt, Finset.mem_insert, Finset.mem_union, Finset.mem_singleton]
at h hs
- iterate 4 rcases h with (rfl | h) <;> [exact hs, exact IH h hs]
+ iterate 4 rcases h with (rfl | h) <;> [exact hs; exact IH h hs]
case branch f q₁ q₂ IH₁ IH₂ => rcases h with (rfl | h | h); exacts[hs, IH₁ h hs.1, IH₂ h hs.2]
case goto l => subst h; exact hs
case halt => subst h; trivial
@@ -2719,7 +2719,7 @@ theorem tr_respects : Respects (TM2.step M) (TM1.step (tr M)) TrCfg := by
| H₃ p q₁ q₂ IH₁ IH₂ =>
unfold TM2.stepAux trNormal TM1.stepAux
simp only []
- cases p v <;> [exact IH₂ _ hT, exact IH₁ _ hT]
+ cases p v <;> [exact IH₂ _ hT; exact IH₁ _ hT]
| H₄ => exact ⟨_, ⟨_, hT⟩, ReflTransGen.refl⟩
| H₅ => exact ⟨_, ⟨_, hT⟩, ReflTransGen.refl⟩
#align turing.TM2to1.tr_respects Turing.TM2to1.tr_respects
@@ -2778,7 +2778,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports (tr M) (trSupp M
rcases Finset.mem_biUnion.1 h with ⟨l, lS, h⟩
have :=
this _ (ss.2 l lS) fun x hx ↦ Finset.mem_biUnion.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
- rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1, exact this.2 _ h]
+ rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1; exact this.2 _ h]
clear h l'
refine' stmtStRec _ _ _ _ _
· intro _ s _ IH ss' sub -- stack op
@@ -2809,7 +2809,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports (tr M) (trSupp M
cases' IH₂ ss'.2 fun x hx ↦ sub x <| Finset.mem_union_right _ hx with IH₂₁ IH₂₂
refine' ⟨⟨IH₁₁, IH₂₁⟩, fun l h ↦ _⟩
rw [trStmts₁] at h
- rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h, exact IH₂₂ _ h]
+ rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h; exact IH₂₂ _ h]
· intro _ ss' _ -- goto
simp only [trStmts₁, Finset.not_mem_empty]; refine' ⟨_, fun _ ↦ False.elim⟩
exact fun _ v ↦ Finset.mem_biUnion.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩
This makes a mathlib4 version of mathlib3's tactic.basic
, now called Mathlib.Tactic.Common
, which imports all tactics which do not have significant theory requirements, and then is imported all across the base of the hierarchy.
This ensures that all common tactics are available nearly everywhere in the library, rather than having to be imported one-by-one as you need them.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -16,8 +16,6 @@ import Mathlib.Data.PFun
import Mathlib.Logic.Function.Iterate
import Mathlib.Order.Basic
import Mathlib.Tactic.ApplyFun
-import Mathlib.Tactic.WLOG
-import Mathlib.Tactic.RSuffices
/-!
# Turing machines
sSup
/iSup
(#3938)
As discussed on Zulip
supₛ
→ sSup
infₛ
→ sInf
supᵢ
→ iSup
infᵢ
→ iInf
bsupₛ
→ bsSup
binfₛ
→ bsInf
bsupᵢ
→ biSup
binfᵢ
→ biInf
csupₛ
→ csSup
cinfₛ
→ csInf
csupᵢ
→ ciSup
cinfᵢ
→ ciInf
unionₛ
→ sUnion
interₛ
→ sInter
unionᵢ
→ iUnion
interᵢ
→ iInter
bunionₛ
→ bsUnion
binterₛ
→ bsInter
bunionᵢ
→ biUnion
binterᵢ
→ biInter
Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>
@@ -1357,12 +1357,12 @@ theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₁} (h : q
/-- The set of all statements in a turing machine, plus one extra value `none` representing the
halt state. This is used in the TM1 to TM0 reduction. -/
noncomputable def stmts (M : Λ → Stmt₁) (S : Finset Λ) : Finset (Option Stmt₁) :=
- Finset.insertNone (S.bunionᵢ fun q ↦ stmts₁ (M q))
+ Finset.insertNone (S.biUnion fun q ↦ stmts₁ (M q))
#align turing.TM1.stmts Turing.TM1.stmts
theorem stmts_trans {M : Λ → Stmt₁} {S : Finset Λ} {q₁ q₂ : Stmt₁} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, Option.some.injEq,
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, Option.some.injEq,
forall_eq', exists_imp, and_imp]
exact fun l ls h₂ ↦ ⟨_, ls, stmts₁_trans h₂ h₁⟩
#align turing.TM1.stmts_trans Turing.TM1.stmts_trans
@@ -1378,7 +1378,7 @@ def Supports (M : Λ → Stmt₁) (S : Finset Λ) :=
theorem stmts_supportsStmt {M : Λ → Stmt₁} {S : Finset Λ} {q : Stmt₁} (ss : Supports M S) :
some q ∈ stmts M S → SupportsStmt S q := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, Option.some.injEq,
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, Option.some.injEq,
forall_eq', exists_imp, and_imp]
exact fun l ls h ↦ stmts₁_supportsStmt_mono h (ss.2 _ ls)
#align turing.TM1.stmts_supports_stmt Turing.TM1.stmts_supportsStmt
@@ -1544,7 +1544,7 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) :
· apply Finset.mem_product.2
constructor
· simp only [default, TM1.stmts, Finset.mem_insertNone, Option.mem_def, Option.some_inj,
- forall_eq', Finset.mem_bunionᵢ]
+ forall_eq', Finset.mem_biUnion]
exact ⟨_, ss.1, TM1.stmts₁_self⟩
· apply Finset.mem_univ
· intro q a q' s h₁ h₂
@@ -1579,7 +1579,7 @@ theorem tr_supports {S : Finset Λ} (ss : TM1.Supports M S) :
exact Finset.mem_insert_of_mem (Finset.mem_union_left _ TM1.stmts₁_self)
case goto l =>
cases h₁
- exact Finset.some_mem_insertNone.2 (Finset.mem_bunionᵢ.2 ⟨_, hs _ _, TM1.stmts₁_self⟩)
+ exact Finset.some_mem_insertNone.2 (Finset.mem_biUnion.2 ⟨_, hs _ _, TM1.stmts₁_self⟩)
case halt => cases h₁
#align turing.TM1to0.tr_supports Turing.TM1to0.tr_supports
@@ -1911,17 +1911,17 @@ noncomputable def writes : Stmt₁ → Finset Λ'₁
/-- The set of accessible machine states, assuming that the input machine is supported on `S`,
are the normal states embedded from `S`, plus all write states accessible from these states. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ'₁ :=
- S.bunionᵢ fun l ↦ insert (Λ'.normal l) (writes (M l))
+ S.biUnion fun l ↦ insert (Λ'.normal l) (writes (M l))
#align turing.TM1to1.tr_supp Turing.TM1to1.trSupp
theorem tr_supports {S : Finset Λ} (ss : Supports M S) : Supports (tr enc dec M) (trSupp M S) :=
- ⟨Finset.mem_bunionᵢ.2 ⟨_, ss.1, Finset.mem_insert_self _ _⟩, fun q h ↦ by
+ ⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert_self _ _⟩, fun q h ↦ by
suffices ∀ q, SupportsStmt S q → (∀ q' ∈ writes q, q' ∈ trSupp M S) →
SupportsStmt (trSupp M S) (trNormal dec q) ∧
∀ q' ∈ writes q, SupportsStmt (trSupp M S) (tr enc dec M q') by
- rcases Finset.mem_bunionᵢ.1 h with ⟨l, hl, h⟩
+ rcases Finset.mem_biUnion.1 h with ⟨l, hl, h⟩
have :=
- this _ (ss.2 _ hl) fun q' hq ↦ Finset.mem_bunionᵢ.2 ⟨_, hl, Finset.mem_insert_of_mem hq⟩
+ this _ (ss.2 _ hl) fun q' hq ↦ Finset.mem_biUnion.2 ⟨_, hl, Finset.mem_insert_of_mem hq⟩
rcases Finset.mem_insert.1 h with (rfl | h)
exacts[this.1, this.2 _ h]
intro q hs hw
@@ -1952,7 +1952,7 @@ theorem tr_supports {S : Finset Λ} (ss : Supports M S) : Supports (tr enc dec M
case goto l =>
simp only [writes, Finset.not_mem_empty]; refine' ⟨_, fun _ ↦ False.elim⟩
refine' supportsStmt_read _ fun a _ s ↦ _
- exact Finset.mem_bunionᵢ.2 ⟨_, hs _ _, Finset.mem_insert_self _ _⟩
+ exact Finset.mem_biUnion.2 ⟨_, hs _ _, Finset.mem_insert_self _ _⟩
case halt =>
simp only [writes, Finset.not_mem_empty]; refine' ⟨_, fun _ ↦ False.elim⟩
simp only [SupportsStmt, supportsStmt_move, trNormal]⟩
@@ -2227,12 +2227,12 @@ theorem stmts₁_supportsStmt_mono {S : Finset Λ} {q₁ q₂ : Stmt₂} (h : q
/-- The set of statements accessible from initial set `S` of labels. -/
noncomputable def stmts (M : Λ → Stmt₂) (S : Finset Λ) : Finset (Option Stmt₂) :=
- Finset.insertNone (S.bunionᵢ fun q ↦ stmts₁ (M q))
+ Finset.insertNone (S.biUnion fun q ↦ stmts₁ (M q))
#align turing.TM2.stmts Turing.TM2.stmts
theorem stmts_trans {M : Λ → Stmt₂} {S : Finset Λ} {q₁ q₂ : Stmt₂} (h₁ : q₁ ∈ stmts₁ q₂) :
some q₂ ∈ stmts M S → some q₁ ∈ stmts M S := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, Option.some.injEq,
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, Option.some.injEq,
forall_eq', exists_imp, and_imp]
exact fun l ls h₂ ↦ ⟨_, ls, stmts₁_trans h₂ h₁⟩
#align turing.TM2.stmts_trans Turing.TM2.stmts_trans
@@ -2247,7 +2247,7 @@ def Supports (M : Λ → Stmt₂) (S : Finset Λ) :=
theorem stmts_supportsStmt {M : Λ → Stmt₂} {S : Finset Λ} {q : Stmt₂} (ss : Supports M S) :
some q ∈ stmts M S → SupportsStmt S q := by
- simp only [stmts, Finset.mem_insertNone, Finset.mem_bunionᵢ, Option.mem_def, Option.some.injEq,
+ simp only [stmts, Finset.mem_insertNone, Finset.mem_biUnion, Option.mem_def, Option.some.injEq,
forall_eq', exists_imp, and_imp]
exact fun l ls h ↦ stmts₁_supportsStmt_mono h (ss.2 _ ls)
#align turing.TM2.stmts_supports_stmt Turing.TM2.stmts_supportsStmt
@@ -2769,17 +2769,17 @@ theorem tr_eval (k) (L : List (Γ k)) {L₁ L₂} (H₁ : L₁ ∈ TM1.eval (tr
/-- The support of a set of TM2 states in the TM2 emulator. -/
noncomputable def trSupp (S : Finset Λ) : Finset Λ'₂₁ :=
- S.bunionᵢ fun l ↦ insert (normal l) (trStmts₁ (M l))
+ S.biUnion fun l ↦ insert (normal l) (trStmts₁ (M l))
#align turing.TM2to1.tr_supp Turing.TM2to1.trSupp
theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports (tr M) (trSupp M S) :=
- ⟨Finset.mem_bunionᵢ.2 ⟨_, ss.1, Finset.mem_insert.2 <| Or.inl rfl⟩, fun l' h ↦ by
+ ⟨Finset.mem_biUnion.2 ⟨_, ss.1, Finset.mem_insert.2 <| Or.inl rfl⟩, fun l' h ↦ by
suffices ∀ (q) (_ : TM2.SupportsStmt S q) (_ : ∀ x ∈ trStmts₁ q, x ∈ trSupp M S),
TM1.SupportsStmt (trSupp M S) (trNormal q) ∧
∀ l' ∈ trStmts₁ q, TM1.SupportsStmt (trSupp M S) (tr M l') by
- rcases Finset.mem_bunionᵢ.1 h with ⟨l, lS, h⟩
+ rcases Finset.mem_biUnion.1 h with ⟨l, lS, h⟩
have :=
- this _ (ss.2 l lS) fun x hx ↦ Finset.mem_bunionᵢ.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
+ this _ (ss.2 l lS) fun x hx ↦ Finset.mem_biUnion.2 ⟨_, lS, Finset.mem_insert_of_mem hx⟩
rcases Finset.mem_insert.1 h with (rfl | h) <;> [exact this.1, exact this.2 _ h]
clear h l'
refine' stmtStRec _ _ _ _ _
@@ -2814,7 +2814,7 @@ theorem tr_supports {S} (ss : TM2.Supports M S) : TM1.Supports (tr M) (trSupp M
rcases Finset.mem_union.1 h with (h | h) <;> [exact IH₁₂ _ h, exact IH₂₂ _ h]
· intro _ ss' _ -- goto
simp only [trStmts₁, Finset.not_mem_empty]; refine' ⟨_, fun _ ↦ False.elim⟩
- exact fun _ v ↦ Finset.mem_bunionᵢ.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩
+ exact fun _ v ↦ Finset.mem_biUnion.2 ⟨_, ss' v, Finset.mem_insert_self _ _⟩
· intro _ _ -- halt
simp only [trStmts₁, Finset.not_mem_empty]
exact ⟨trivial, fun _ ↦ False.elim⟩⟩
Acc.rec
and many related defs computable (#3535)
Lean 4 code generator has had no native supports for Acc.rec
.
This PR makes Acc.rec
computable.
This change makes many defs computable. Especially, computable PFun.fix
and Part.hasFix
enables us to reason about partial
functions.
This PR also renames some instances and gives PFun.lift
@[coe]
attr.
@@ -739,8 +739,7 @@ theorem Tape.map_mk₁ {Γ Γ'} [Inhabited Γ] [Inhabited Γ'] (f : PointedMap
/-- Run a state transition function `σ → Option σ` "to completion". The return value is the last
state returned before a `none` result. If the state transition function always returns `some`,
then the computation diverges, returning `Part.none`. -/
--- Porting note: Added noncomputable, because `PFun.fix` is noncomputable.
-noncomputable def eval {σ} (f : σ → Option σ) : σ → Part σ :=
+def eval {σ} (f : σ → Option σ) : σ → Part σ :=
PFun.fix fun s ↦ Part.some <| (f s).elim (Sum.inl s) Sum.inr
#align turing.eval Turing.eval
@@ -826,9 +825,8 @@ theorem Reaches₀.tail' {σ} {f : σ → Option σ} {a b c : σ} (h : Reaches
which is either terminal (meaning `a = b`) or where the next point also satisfies `C`, then it
holds of any point where `eval f a` evaluates to `b`. This formalizes the notion that if
`eval f a` evaluates to `b` then it reaches terminal state `b` in finitely many steps. -/
--- Porting note: Added noncomputable
@[elab_as_elim]
-noncomputable def evalInduction {σ} {f : σ → Option σ} {b : σ} {C : σ → Sort _} {a : σ}
+def evalInduction {σ} {f : σ → Option σ} {b : σ} {C : σ → Sort _} {a : σ}
(h : b ∈ eval f a) (H : ∀ a, b ∈ eval f a → (∀ a', f a = some a' → C a') → C a) : C a :=
PFun.fixInduction h fun a' ha' h' ↦
H _ ha' fun b' e ↦ h' _ <| Part.mem_some_iff.2 <| by rw [e]; rfl
@@ -1099,8 +1097,7 @@ def init (l : List Γ) : Cfg₀ :=
/-- Evaluate a Turing machine on initial input to a final state,
if it terminates. -/
--- Porting note: Added noncomputable
-noncomputable def eval (M : Machine₀) (l : List Γ) : Part (ListBlank Γ) :=
+def eval (M : Machine₀) (l : List Γ) : Part (ListBlank Γ) :=
(Turing.eval (step M) (init l)).map fun c ↦ c.Tape.right₀
#align turing.TM0.eval Turing.TM0.eval
@@ -1411,8 +1408,7 @@ def init (l : List Γ) : Cfg₁ :=
/-- Evaluate a TM to completion, resulting in an output list on the tape (with an indeterminate
number of blanks on the end). -/
--- Porting note: Added noncomputable
-noncomputable def eval (M : Λ → Stmt₁) (l : List Γ) : Part (ListBlank Γ) :=
+def eval (M : Λ → Stmt₁) (l : List Γ) : Part (ListBlank Γ) :=
(Turing.eval (step M) (init l)).map fun c ↦ c.Tape.right₀
#align turing.TM1.eval Turing.TM1.eval
@@ -2279,8 +2275,7 @@ def init (k : K) (L : List (Γ k)) : Cfg₂ :=
#align turing.TM2.init Turing.TM2.init
/-- Evaluates a TM2 program to completion, with the output on the same stack as the input. -/
--- Porting note: Added noncomputable
-noncomputable def eval (M : Λ → Stmt₂) (k : K) (L : List (Γ k)) : Part (List (Γ k)) :=
+def eval (M : Λ → Stmt₂) (k : K) (L : List (Γ k)) : Part (List (Γ k)) :=
(Turing.eval (step M) (init k L)).map fun c ↦ c.stk k
#align turing.TM2.eval Turing.TM2.eval
@@ -2741,7 +2741,7 @@ theorem trCfg_init (k) (L : List (Γ k)) : TrCfg (TM2.init k L) (TM1.init (trIni
= fun a => (proj k').f (update (β := fun k => Option (Γ k)) default k (some a)) := rfl
rw [this, List.get?_map, proj, PointedMap.mk_val]
simp only []
- by_cases k' = k
+ by_cases h : k' = k
· subst k'
simp only [Function.update_same]
rw [ListBlank.nth_mk, List.getI_eq_iget_get?, ← List.map_reverse, List.get?_map]
The unported dependencies are