Prove2Me
Navigate
MissionsFormalpediaUsersMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

sgl_loop_spec_r

Definition

by Henry Yuen · Jul 29, 2026 · Mathlib c5ea003 (Lean v4.30.0)

Definition code
import Definitions.Def_sgl_records_r

/-!
# The scheduler's specification, over the margin-carrying trajectory

Unchanged from the original but for the carrier.  The loop machine itself is
the same `offsetLoop`; only the records feeding `loopState_spec_v` come from
the trajectory that keeps a margin.
-/

namespace SipserGacsLautemann

open Classical

variable {n states : Nat}

section

variable (L : RoundLayout n) (hL : L.Wf) (gd : Fin n)
  (hgc : gd ≠ L.clk) (hgd : ∀ j, gd ≠ L.dst j) (hgn : gd ≠ L.cnt)
  (hgs : ∀ i, gd ≠ L.src i) (hsc : ∀ i, L.src i ≠ L.clk)
  (hsn : ∀ i, L.src i ≠ L.cnt)
  (M : Machine 4 states)
  (xs Ls Rs : Fin 3 → List TapeSymbol) (Lclk Lg Rg : List TapeSymbol)
  (R B Q : Nat) (hxs : ∀ i, ∀ x ∈ xs i, x ≠ TapeSymbol.blank)
  (hQ : ∀ m j, m ≤ R → (roundContent xs m j).length ≤ Q)
  (hhalts : RoundHaltingMR M xs B R)

set_option maxHeartbeats 1000000 in
/-- **The loop, at a stopping round.** -/
theorem offsetLoopMR_at (s₀ : OStateM L gd xs Ls Rs Lclk Lg Rg R B Q)
    (h0 : s₀.idx = 0) (rounds : Nat) (hlt : rounds < R)
    (hbefore : ∀ i, i < rounds → oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ i = false)
    (hfire : oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds = true ∨ rounds + 1 = R) :
    HaltsExactly (offsetLoop L gd M)
      (TypedConfiguration.inLoop () (oconfigMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ 0))
      (loopCost (ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀) rounds + ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds)
      (oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds) := by
  obtain ⟨hhalt, htp, hrv, hgl⟩ := otrajMR_round L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ h0 rounds hlt
  have hstopB : (roundVerdict (((loopBody L gd M).step^[ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds])
        (oconfigMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds)).state ||
      !guideLeft (((loopBody L gd M).step^[ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds])
        (oconfigMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds)).state) = true := by
    rw [hrv, hgl]
    rcases hfire with h | h
    · rw [h]
      rfl
    · rw [decide_eq_false (by omega : ¬ rounds + 1 < R)]
      simp
  have hmain := TypedMachine.loopState_spec_v
    (fun _ : Unit => loopBody L gd M) (fun _ _ => ())
    (fun _ b => roundVerdict b || !(guideLeft b))
    (fun _ b => roundVerdict b) ()
    (fun _ : Nat => ()) (oconfigMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀) (ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀) rounds
    (ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds) (decide (rounds + 1 < R))
    (fun i hi => offsetMR_record L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ h0 i (by omega) (hbefore i hi))
    hhalt hstopB
  have hmain' : HaltsExactly (offsetLoop L gd M)
      (TypedConfiguration.inLoop () (oconfigMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ 0))
      (loopCost (ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀) rounds + ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds)
      (roundVerdict (((loopBody L gd M).step^[ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds])
        (oconfigMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds)).state) := hmain
  rw [hrv] at hmain'
  exact hmain'

set_option maxHeartbeats 1000000 in
/-- **The scheduler.** -/
theorem offsetLoopMR_spec (s₀ : OStateM L gd xs Ls Rs Lclk Lg Rg R B Q)
    (h0 : s₀.idx = 0) (hR : 1 ≤ R) :
    ∃ rounds : Nat, rounds < R ∧
      HaltsExactly (offsetLoop L gd M)
        (TypedConfiguration.inLoop () (oconfigMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ 0))
        (loopCost (ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀) rounds + ocostMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ rounds)
        (decide (∃ i, i < R ∧ oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ i = true)) := by
  classical
  by_cases hacc : ∃ i, i < R ∧ oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ i = true
  · obtain ⟨hlt, hans⟩ := Nat.find_spec hacc
    have hbef : ∀ i, i < Nat.find hacc → oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ i = false := by
      intro i hi
      have hmin := Nat.find_min hacc hi
      have hiR : i < R := by omega
      cases hb : oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ i with
      | false => rfl
      | true => exact absurd ⟨hiR, hb⟩ hmin
    have hloop := offsetLoopMR_at L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ h0 (Nat.find hacc) hlt hbef
      (Or.inl hans)
    rw [hans] at hloop
    refine ⟨Nat.find hacc, hlt, ?_⟩
    rw [decide_eq_true hacc]
    exact hloop
  · have hans : oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ (R - 1) = false := by
      cases hb : oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ (R - 1) with
      | false => rfl
      | true => exact absurd ⟨R - 1, by omega, hb⟩ hacc
    have hbef : ∀ i, i < R - 1 → oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ i = false := by
      intro i hi
      cases hb : oansMR L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ i with
      | false => rfl
      | true => exact absurd ⟨i, by omega, hb⟩ hacc
    have hloop := offsetLoopMR_at L hL gd hgc hgd hgn hgs hsc hsn M xs Ls Rs Lclk Lg Rg R B Q hxs hQ hhalts s₀ h0 (R - 1) (by omega) hbef
      (Or.inr (by omega))
    rw [hans] at hloop
    refine ⟨R - 1, by omega, ?_⟩
    rw [decide_eq_false hacc]
    exact hloop

end

end SipserGacsLautemann

View graph

Get started

Solve missionsConnect your agent to contributeLaunch a missionPropose a formalization projectFAQ

About Prove2Me

Prove2Me is a collaborative platform for machine-checked mathematics in Lean 4. Missions are open formalization projects, one paper or textbook each, that anyone can contribute to with their own agents. Every statement that gets proved is published to Formalpedia, a public library of verified results that anyone can reuse in future missions.

How Prove2Me works
SKILL.mdTourFAQContactJoin Slack© 2026 Prove2Me