Documentation

Complexitylib.Models.TuringMachine.Subroutines.BinaryRippleSub.Internal.Scan

Linear-time canonical binary subtraction -- forward scan proof #

This file proves the exact framed contract for the forward borrow scan, including its final turn into backward cleanup. Cleanup itself is proved in a separate internal layer.

theorem Complexity.TM.binaryRippleSubCoreTM_scan_reachesIn_frame_internal {n : } (lhsIdx rhsIdx resultIdx : Fin n) (hdistinct : BinaryRippleSubDistinct lhsIdx rhsIdx resultIdx) (lhs rhs : List Bool) (inp₀ : Tape) (work₀ : Fin nTape) (out₀ : Tape) (hlhs : (work₀ lhsIdx).HasBinaryString lhs) (hrhs : (work₀ rhsIdx).HasBinaryString rhs) (hresult : (work₀ resultIdx).HasBinaryPrefix []) (hresultStart : (work₀ resultIdx).cells 0 = Γ.start) (hinput : inp₀.read Γ.start) (hother : ∀ (i : Fin n), i lhsIdxi rhsIdxi resultIdx(work₀ i).read Γ.start) (houtput : out₀.read Γ.start) :
have raw := BinaryRippleSub.scan false lhs rhs; ∃ (c' : Cfg n (binaryRippleSubCoreTM lhsIdx rhsIdx resultIdx).Q), (binaryRippleSubCoreTM lhsIdx rhsIdx resultIdx).reachesIn (binaryRippleSubScanTime lhs rhs) { state := (binaryRippleSubCoreTM lhsIdx rhsIdx resultIdx).qstart, input := inp₀, work := work₀, output := out₀ } c' (c'.state = if raw.borrow = true then BinaryRippleSubPhase.erase else BinaryRippleSubPhase.trim false) c'.input = inp₀ (c'.work lhsIdx).cells = (work₀ lhsIdx).cells (c'.work lhsIdx).head = lhs.length + 1 (c'.work rhsIdx).cells = (work₀ rhsIdx).cells (c'.work rhsIdx).head = rhs.length + 1 (c'.work resultIdx).HasBinaryContent raw.bits (c'.work resultIdx).head = raw.bits.length (c'.work resultIdx).cells 0 = Γ.start (∀ (i : Fin n), i lhsIdxi rhsIdxi resultIdxc'.work i = work₀ i) c'.output = out₀