Moving a list of integers between stacks (register-held count)
ProvedNLogN.FW.spec_mvLet be registers below 55 with and , let stack start with the integer list and register hold . If and all entries of have bit length , the program mvList i j c (reg r) moves reversed onto stack within cost .
Formalization Note. The machine layer: IState HS is a state with stacks of items (Item = integer or mark), an input position and an output; RM programs (straight-line register code RS, loops rep, conditionals, calls of the multiplication procedure through a MulSpec giving its domain and cost) have a functional semantics p.run s, a definedness predicate p.ok M s and a cost p.cost M s; Spec M p s s' c abbreviates p.ok M s ∧ p.run s = s' ∧ p.cost M s ≤ c. ints L / gints U push an integer list / a list of pairs as items (head = top); zsz z is the bit length of . MulBnd M m Φ says the multiplication procedure accepts all pairs of integers of bit length at cost . Register names (GU, CR, KB, XN, …) are fixed stack indices.
-- Harvey–van der Hoeven multitape-TM development (NLogN), generated by skeleton subtraction. import Definitions.Def_IntMul_HvdH_M_Defs4 set_option autoImplicit false set_option relaxedAutoImplicit false set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedVariables false open NLogN open NLogN.FW open IntMul NLogN
theorem NLogN.FW.spec_mv (M : MulSpec) (i j c r : Fin HS) (s : IState HS) (l : List ℤ)
(Ri Lr : List Item) (hij : i ≠ j) (hci : c ≠ i) (hcj : c ≠ j) (hi : s.G i = ints l ++ Ri)
(hr : s.G r = .int (l.length : ℤ) :: Lr)
(hi55 : i.val < 55) (hj55 : j.val < 55) (hc55 : c.val < 55) (hr55 : r.val < 55)
(B : ℕ) (hlB : zsz (l.length : ℤ) ≤ B) (hB : ∀ x ∈ l, zsz x ≤ B) :
Spec M (RM.rs (mvList i j c (.reg r))) s ((s.upd i Ri).upd j (ints l.reverse ++ s.G j))
(l.length * (14000 * (B + 2) + 30) + 4000 * (B + 2) + 32) := by sorry