2026-08-28·by Sijie Wang#idea#math

binary-successor

Binary successor: n ↦ n+1

Parent: examples

Idea: starting at the rightmost bit, flip trailing 1s to 0 (carrying), and the first 0 (or blank) to 1.

The 7-tuple (Q, Γ, b, Σ, δ, q₀, F).

  • Q = {carry, done}; q₀ = carry; F = {done}.
  • Γ = {0, 1, b} (b = blank); Σ = {0, 1}.
  • δ — the "guide book":
δ(carry, 1) = (carry, 0, L)     a trailing 1 becomes 0, keep carrying left
δ(carry, 0) = (done,  1, R)     first 0 absorbs the carry -> 1, stop
δ(carry, b) = (done,  1, R)     ran off the left (e.g. 11 -> 100): blank -> 1

Trace on input 1011 (= 11), head on the rightmost bit (^ = head; state on the left):

carry:  1 0 1 1        scanned Γ-symbol = 1
              ^        look up δ(carry,1)=(carry,0,L)   [uses δ + Q]
carry:  1 0 1 0        wrote 0 (Γ); moved L; stayed carry (Q)
            ^
carry:  1 0 1 0        scanned 1  ->  δ(carry,1)=(carry,0,L)
            ^
carry:  1 0 0 0        wrote 0; moved L
          ^
carry:  1 0 0 0        scanned 0  ->  δ(carry,0)=(done,1,R)
          ^
done:   1 1 0 0        wrote 1; moved R; entered done
            ^

done ∈ Fhalt. Output 1100 = 12. ✓

Which component acts, per step: the head + Γ give the scanned symbol → δ + Q pick the action → Γ is written, the {L,R} direction moves the head, Q updates → halting is the F test.

As code — idiomatically Haskell

A TM's δ is literally a pattern-matched function, Q/Γ/{L,R} are algebraic data types, and the tape is a list zipper (left-reversed, current, right). The transition table maps one-to-one onto the clauses:

data St = Carry | Done deriving Eq
data Mv = L | R

-- delta: each rule of the table is one pattern-match clause
delta :: St -> Char -> (St, Char, Mv)
delta Carry '1' = (Carry, '0', L)   -- trailing 1 -> 0, carry left
delta Carry '0' = (Done,  '1', R)   -- first 0 -> 1, stop
delta Carry _   = (Done,  '1', R)   -- blank -> 1 (ran off the left)

-- tape zipper: ls is the left half reversed, c the scanned cell, rs the right
run :: St -> [Char] -> Char -> [Char] -> [Char]
run Done ls c rs = reverse ls ++ c : rs                 -- F-test: halt
run q    ls c rs =
  let (q', w, m) = delta q c                            -- look up delta
  in case m of                                          -- write w, then move
       L -> case ls of (l:ls') -> run q' ls'      l   (w:rs)
                       []      -> run q' []        'b' (w:rs)
       R -> case rs of (r:rs') -> run q' (w:ls)    r   rs'
                       []      -> run q' (w:ls)    'b' []

-- run Carry (reverse "101") '1' ""  ==>  "1100"   (11 + 1 = 12)

The clean fit is the point: δ = pattern matching, states = an ADT, the tape = a zipper — a Turing machine is a tiny functional program. Swap delta for another table and the same run executes a different machine — which is exactly the universal machine with δ as data.

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →