Imports
/- Copyright (c) 2026 Google LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. -/ module public import Cryptids.Semantics.Riemann120.Backend

Riemann104

104-state Turing machine halting-equivalent to the 120-state Riemann machine.

@[expose] public sectionset_option linter.style.setOption falseset_option maxRecDepth 200000namespace ConjectureMachines.Riemann104open Turing StateTransition

120-state Riemann Hypothesis reference machine (riemann_120, Shunia 2026).

abbrev reference : BundledMachine 2 := Machines.riemann120.bundle

104-state Riemann Hypothesis candidate machine (riemann_104).

abbrev candidate : BundledMachine 2 := Machines.riemann104.bundle

Alias for Machines.riemann120.

abbrev refM : Machine 120 2 := Machines.riemann120

Alias for Machines.riemann104.

abbrev candM : Machine 104 2 := Machines.riemann104theorem candidate_fewer_states : candidate.states < reference.states := ⊢ candidate.states < reference.states All goals completed! 🐙sectionopen Turing StateTransition ConjectureMachinesopen ConjectureMachines.Riemann120open ConjectureMachines.Riemann120.Layer2def embed104To121 (q : Fin 104) : Fin 121 := if q.val < 1 then ⟨11, q:Fin 104⊢ 11 < 121 All goals completed! 🐙⟩ else if q.val < 2 then ⟨q.val + 3, q:Fin 104⊢ ↑q + 3 < 121 All goals completed! 🐙⟩ else if q.val < 7 then ⟨q.val + 4, q:Fin 104⊢ ↑q + 4 < 121 All goals completed! 🐙⟩ else if q.val < 17 then ⟨q.val + 5, q:Fin 104⊢ ↑q + 5 < 121 All goals completed! 🐙⟩ else if q.val < 19 then ⟨q.val + 6, q:Fin 104⊢ ↑q + 6 < 121 All goals completed! 🐙⟩ else if q.val < 20 then ⟨q.val + 8, q:Fin 104⊢ ↑q + 8 < 121 All goals completed! 🐙⟩ else if q.val < 28 then ⟨q.val + 9, q:Fin 104⊢ ↑q + 9 < 121 All goals completed! 🐙⟩ else if q.val < 75 then ⟨q.val + 10, q:Fin 104⊢ ↑q + 10 < 121 All goals completed! 🐙⟩ else if q.val < 79 then ⟨q.val + 11, q:Fin 104⊢ ↑q + 11 < 121 All goals completed! 🐙⟩ else if q.val < 83 then ⟨q.val + 13, q:Fin 104⊢ ↑q + 13 < 121 All goals completed! 🐙⟩ else if q.val < 92 then ⟨q.val + 15, q:Fin 104⊢ ↑q + 15 < 121 All goals completed! 🐙⟩ else if q.val < 96 then ⟨q.val + 16, q:Fin 104⊢ ↑q + 16 < 121 All goals completed! 🐙⟩ else ⟨q.val + 17, q:Fin 104⊢ ↑q + 17 < 121 All goals completed! 🐙⟩def embedCfg (c : Cfg 104 2) : Cfg 121 2 := ⟨embed104To121 c.state, c.tape⟩set_option maxHeartbeats 400000 in -- Finite state-table decision procedure. theorem embed_transition_eq (q : Fin 104) (a : Fin 2) : edited121.transition (embed104To121 q) a = (candM.transition q a).map fun t => (t.1, t.2.1, embed104To121 t.2.2) := q:Fin 104a:Fin 2⊢ edited121.transition (embed104To121 q) a = Option.map (fun t ↦ (t.1, t.2.1, embed104To121 t.2.2)) (candM.transition q a) ⊢ ∀ (q : Fin 104) (a : Fin 2), edited121.transition (embed104To121 q) a = Option.map (fun t ↦ (t.1, t.2.1, embed104To121 t.2.2)) (candM.transition q a); All goals completed! 🐙theorem embedCfg_step (c : Cfg 104 2) : Option.map embedCfg (step candM c) = step edited121 (embedCfg c) := c:Cfg 104 2⊢ Option.map embedCfg (step candM c) = step edited121 (embedCfg c) q:Fin 104t:Tape (Fin 2)⊢ Option.map embedCfg (step candM { state := q, tape := t }) = step edited121 (embedCfg { state := q, tape := t }) q:Fin 104t:Tape (Fin 2)⊢ Option.map embedCfg (Option.map (fun x ↦ { state := x.2.2, tape := Tape.move x.2.1 (Tape.write x.1 t) }) (candM.transition q t.head)) = Option.map (fun x ↦ { state := x.2.2, tape := Tape.move x.2.1 (Tape.write x.1 t) }) (edited121.transition (embed104To121 q) t.head) q:Fin 104t:Tape (Fin 2)⊢ Option.map (embedCfg ∘ fun x ↦ { state := x.2.2, tape := Tape.move x.2.1 (Tape.write x.1 t) }) (candM.transition q t.head) = Option.map ((fun x ↦ { state := x.2.2, tape := Tape.move x.2.1 (Tape.write x.1 t) }) ∘ fun t ↦ (t.1, t.2.1, embed104To121 t.2.2)) (candM.transition q t.head) All goals completed! 🐙theorem halts_candidate_iff_halts_edited121 : Halts candidate ↔ (StateTransition.eval (step edited121) ⟨11, default⟩).Dom := ⊢ candidate.Halts ↔ (eval (step edited121) { state := 11, tape := default }).Dom hrel:Respects (step candM) (step edited121) fun c₁ c₂ ↦ c₂ = embedCfg c₁⊢ candidate.Halts ↔ (eval (step edited121) { state := 11, tape := default }).Dom All goals completed! 🐙def inCompare (bits : List (Fin 2)) : Bool := bits == [1, 1, 1, 1, 1] || bits == [1, 1, 1, 1, 1, 0, 1] || bits == [1, 1, 1, 1, 1, 0, 1, 0, 1] || bits == [1, 1, 1, 1, 1, 0, 1, 1]def inCompareStepOk (bits : List (Fin 2)) : Bool := match evalStackOf false bits with | .halt => true | .jump s' => if inCompare s' then inCompare bits else true | .inc r s_succ => if inCompare s_succ then inCompare bits && decide (r ≠ 1) else true | .decnz r s_succ s_fail => (if inCompare s_succ then inCompare bits && decide (r ≠ 1) else true) && (if inCompare s_fail then inCompare bits || decide (r = 1) else true)set_option maxHeartbeats 800000 in -- Finite state-table decision procedure. theorem inCompareStepOk_all : ∀ bits ∈ allValidStacks, inCompareStepOk bits = true := ⊢ ∀ bits ∈ allValidStacks, inCompareStepOk bits = true All goals completed! 🐙theorem getD_one_set_ne : ∀ (regs : List ℕ) (r : ℕ), r ≠ 1 → ∀ (v : ℕ), (regs.set r v).getD 1 0 = regs.getD 1 0 | [], _, _, _ => rfl head✝:ℕr:ℕx✝¹:r ≠ 1x✝:ℕ⊢ ([head✝].set r x✝).getD 1 0 = [head✝].getD 1 0 head✝:ℕr:ℕx✝¹:r ≠ 1x✝:ℕ⊢ ([head✝].set r x✝).getD 1 0 = [head✝].getD 1 0 head✝:ℕx✝¹:ℕx✝:0 ≠ 1⊢ ([head✝].set 0 x✝¹).getD 1 0 = [head✝].getD 1 0head✝:ℕx✝¹:ℕn✝:ℕx✝:n✝ + 1 ≠ 1⊢ ([head✝].set (n✝ + 1) x✝¹).getD 1 0 = [head✝].getD 1 0 head✝:ℕx✝¹:ℕx✝:0 ≠ 1⊢ ([head✝].set 0 x✝¹).getD 1 0 = [head✝].getD 1 0head✝:ℕx✝¹:ℕn✝:ℕx✝:n✝ + 1 ≠ 1⊢ ([head✝].set (n✝ + 1) x✝¹).getD 1 0 = [head✝].getD 1 0 All goals completed! 🐙 | _ :: _ :: _, 0, _, _ => rfl | _ :: _ :: _, 1, hr, _ => absurd rfl hr | _ :: _ :: _, _ + 2, _, _ => rfldef RhRegInv (c : RhRegCfg) : Prop := isValidStack c.stack = true ∧ (inCompare c.stack = true → c.regs.getD 1 0 = 0)theorem rhRegInv_init : RhRegInv rhRegInit := ⊢ RhRegInv rhRegInit ⊢ inCompare rhRegInit.stack = true → rhRegInit.regs.getD 1 0 = 0 h:inCompare rhRegInit.stack = true⊢ rhRegInit.regs.getD 1 0 = 0; All goals completed! 🐙theorem rhRegInv_step {c c' : RhRegCfg} (hinv : RhRegInv c) (hs : rhRegStepOf false c = some c') : RhRegInv c' := c:RhRegCfgc':RhRegCfghinv:RhRegInv chs:rhRegStepOf false c = some c'⊢ RhRegInv c' c':RhRegCfgstack:List (Fin 2)regs:List ℕhinv:RhRegInv { stack := stack, regs := regs }hs:rhRegStepOf false { stack := stack, regs := regs } = some c'⊢ RhRegInv c' stack:List (Fin 2)regs:List ℕhinv:RhRegInv { stack := stack, regs := regs }stack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }⊢ RhRegInv { stack := stack', regs := regs' } stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0⊢ RhRegInv { stack := stack', regs := regs' } stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = true⊢ RhRegInv { stack := stack', regs := regs' } stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStacks⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:inCompareStepOk stack = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:rhRegStepOf false { stack := stack, regs := regs } = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }hev:evalStackOf false stack = RhInstr.halt⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }s':List (Fin 2)hev:evalStackOf false stack = RhInstr.jump s'⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hev:evalStackOf false stack = RhInstr.inc r s_succ⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hev:evalStackOf false stack = RhInstr.decnz r s_succ s_fail⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }hev:evalStackOf false stack = RhInstr.halt⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match RhInstr.halt with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }hev:evalStackOf false stack = RhInstr.halt⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0; All goals completed! 🐙 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }s':List (Fin 2)hev:evalStackOf false stack = RhInstr.jump s'⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }s':List (Fin 2)hok:(match RhInstr.jump s' with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehs:(match RhInstr.jump s' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.jump s'⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }hok:(match RhInstr.jump stack' with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehev:evalStackOf false stack = RhInstr.jump stack'hs:(match RhInstr.jump stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs }⊢ inCompare { stack := stack', regs := regs }.stack = true → { stack := stack', regs := regs }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }hok:(match RhInstr.jump stack' with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehev:evalStackOf false stack = RhInstr.jump stack'hs:(match RhInstr.jump stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs }hc':inCompare { stack := stack', regs := regs }.stack = true⊢ { stack := stack', regs := regs }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }hok:(if inCompare stack' = true then inCompare stack else true) = truehev:evalStackOf false stack = RhInstr.jump stack'hs:(match RhInstr.jump stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs }hc':inCompare stack' = true⊢ regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }hok:inCompare stack = truehev:evalStackOf false stack = RhInstr.jump stack'hs:(match RhInstr.jump stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs }hc':inCompare stack' = true⊢ regs.getD 1 0 = 0 All goals completed! 🐙 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hev:evalStackOf false stack = RhInstr.inc r s_succ⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok:(match RhInstr.inc r s_succ with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehs:(match RhInstr.inc r s_succ with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.inc r s_succ⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕhok:(match RhInstr.inc r stack' with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehev:evalStackOf false stack = RhInstr.inc r stack'hs:(match RhInstr.inc r stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }⊢ inCompare { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }.stack = true → { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕhok:(match RhInstr.inc r stack' with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehev:evalStackOf false stack = RhInstr.inc r stack'hs:(match RhInstr.inc r stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }hc':inCompare { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }.stack = true⊢ { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕhok:(if inCompare stack' = true then inCompare stack && decide (r ≠ 1) else true) = truehev:evalStackOf false stack = RhInstr.inc r stack'hs:(match RhInstr.inc r stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }hc':inCompare stack' = true⊢ (regs.set r (regs.getD r 0 + 1)).getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕhok:inCompare stack = true ∧ decide (r ≠ 1) = truehev:evalStackOf false stack = RhInstr.inc r stack'hs:(match RhInstr.inc r stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }hc':inCompare stack' = true⊢ (regs.set r (regs.getD r 0 + 1)).getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕhok:inCompare stack = true ∧ decide (r ≠ 1) = truehev:evalStackOf false stack = RhInstr.inc r stack'hs:(match RhInstr.inc r stack' with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs.set r (regs.getD r 0 + 1) }hc':inCompare stack' = true⊢ regs.getD 1 0 = 0 All goals completed! 🐙 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhs:(match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshok:(match evalStackOf false stack with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hev:evalStackOf false stack = RhInstr.decnz r s_succ s_fail⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hok:(match RhInstr.decnz r s_succ s_fail with | RhInstr.halt => true | RhInstr.jump s' => if inCompare s' = true then inCompare stack else true | RhInstr.inc r s_succ => if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true | RhInstr.decnz r s_succ s_fail => (if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehs:(match RhInstr.decnz r s_succ s_fail with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_fail⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hok:((if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) && if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehs:(if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_fail⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hok:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = true ∧ (if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehs:(if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_fail⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hs:(if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_failhok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hs:(if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_failhok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:(regs.getD r 0 == 0) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hs:(if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_failhok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hs:(if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_failhok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:(regs.getD r 0 == 0) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hs:some { stack := s_fail, regs := regs } = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_failhok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:(regs.getD r 0 == 0) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hok_fail:(if inCompare stack' = true then inCompare stack || decide (r = 1) else true) = truehs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }⊢ inCompare { stack := stack', regs := regs }.stack = true → { stack := stack', regs := regs }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hok_fail:(if inCompare stack' = true then inCompare stack || decide (r = 1) else true) = truehs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare { stack := stack', regs := regs }.stack = true⊢ { stack := stack', regs := regs }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hok_fail:(if inCompare stack' = true then inCompare stack || decide (r = 1) else true) = truehs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = true⊢ regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hok_fail:inCompare stack = true ∨ decide (r = 1) = truehs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = true⊢ regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = truehc:inCompare stack = true⊢ regs.getD 1 0 = 0stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = truehr1:decide (r = 1) = true⊢ regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = truehc:inCompare stack = true⊢ regs.getD 1 0 = 0 All goals completed! 🐙 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = truehr1:decide (r = 1) = true⊢ regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)hok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehz:(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r s_succ stack'hs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = truehr1:decide (r = 1) = truehr_eq:r = 1⊢ regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }s_succ:List (Fin 2)hs:some { stack := stack', regs := regs } = some { stack := stack', regs := regs }hc':inCompare stack' = truehok_succ:(if inCompare s_succ = true then inCompare stack && decide (1 ≠ 1) else true) = truehz:(regs.getD 1 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz 1 s_succ stack'hr1:decide (1 = 1) = true⊢ regs.getD 1 0 = 0 All goals completed! 🐙 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hs:(if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }) = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_failhok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)regs':List ℕhv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_succ:List (Fin 2)s_fail:List (Fin 2)hs:some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) } = some { stack := stack', regs := regs' }hev:evalStackOf false stack = RhInstr.decnz r s_succ s_failhok_succ:(if inCompare s_succ = true then inCompare stack && decide (r ≠ 1) else true) = truehok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = true⊢ inCompare { stack := stack', regs := regs' }.stack = true → { stack := stack', regs := regs' }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_fail:List (Fin 2)hok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r stack' s_failhok_succ:(if inCompare stack' = true then inCompare stack && decide (r ≠ 1) else true) = truehs:some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) } = some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }⊢ inCompare { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }.stack = true → { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_fail:List (Fin 2)hok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r stack' s_failhok_succ:(if inCompare stack' = true then inCompare stack && decide (r ≠ 1) else true) = truehs:some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) } = some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }hc':inCompare { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }.stack = true⊢ { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }.regs.getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_fail:List (Fin 2)hok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r stack' s_failhok_succ:(if inCompare stack' = true then inCompare stack && decide (r ≠ 1) else true) = truehs:some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) } = some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }hc':inCompare stack' = true⊢ (regs.set r (regs.getD r 0 - 1)).getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_fail:List (Fin 2)hok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r stack' s_failhok_succ:inCompare stack = true ∧ decide (r ≠ 1) = truehs:some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) } = some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }hc':inCompare stack' = true⊢ (regs.set r (regs.getD r 0 - 1)).getD 1 0 = 0 stack:List (Fin 2)regs:List ℕstack':List (Fin 2)hv:isValidStack { stack := stack, regs := regs }.stack = truehcmp:inCompare { stack := stack, regs := regs }.stack = true → { stack := stack, regs := regs }.regs.getD 1 0 = 0hv':isValidStack stack' = truehmem:stack ∈ allValidStackshstep_eq:rhRegStepOf false { stack := stack, regs := regs } = match evalStackOf false stack with | RhInstr.halt => none | RhInstr.jump s' => some { stack := s', regs := regs } | RhInstr.inc r s_succ => some { stack := s_succ, regs := regs.set r (regs.getD r 0 + 1) } | RhInstr.decnz r s_succ s_fail => if (regs.getD r 0 == 0) = true then some { stack := s_fail, regs := regs } else some { stack := s_succ, regs := regs.set r (regs.getD r 0 - 1) }r:ℕs_fail:List (Fin 2)hok_fail:(if inCompare s_fail = true then inCompare stack || decide (r = 1) else true) = truehz:¬(regs.getD r 0 == 0) = truehev:evalStackOf false stack = RhInstr.decnz r stack' s_failhok_succ:inCompare stack = true ∧ decide (r ≠ 1) = truehs:some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) } = some { stack := stack', regs := regs.set r (regs.getD r 0 - 1) }hc':inCompare stack' = true⊢ regs.getD 1 0 = 0 All goals completed! 🐙theorem rhRegHalts_true_iff_false : RhRegHaltsOf true ↔ RhRegHaltsOf false := ⊢ RhRegHaltsOf true ↔ RhRegHaltsOf false hrel:Respects (rhRegStepOf false) (rhRegStepOf true) fun c₁ c₂ ↦ RhRegInv c₁ ∧ c₁ = c₂⊢ RhRegHaltsOf true ↔ RhRegHaltsOf false All goals completed! 🐙endtheorem candidate_equivalent : Halts candidate ↔ Halts reference := halts_candidate_iff_halts_edited121 |>.trans (ConjectureMachines.Riemann120.halts_tm_iff_rhRegHaltsOf true) |>.trans rhRegHalts_true_iff_false |>.trans (ConjectureMachines.Riemann120.halts_tm_iff_rhRegHaltsOf false).symm |>.trans ConjectureMachines.Riemann120.halts_riemann120_iff_halts_riemann121.symmend ConjectureMachines.Riemann104