Left folds are tidily computable #
If list and init are tidily computable from a common input, and step is tidily computable
on pairs, then fun x => (list x).foldl step (init x) is tidily computable, relative to encodings
of pairs, options and lists as in Turing.MultiTapeTM.PairEncoding,
Turing.MultiTapeTM.OptionEncoding and Turing.MultiTapeTM.ListEncoding.
The fold is computed by Turing.MultiTapeTM.iterateWhile on the state some (l, b), holding the
rest l of the list and the accumulator b: one round replaces it by some (l.tail, step b a),
where a is the head of l, or by none once l is empty. The case distinction is made by
Turing.MultiTapeTM.ComputableTidilyInTimeAndSpace.ite.
Main results #
Turing.MultiTapeTM.ComputableTidilyInTimeAndSpace.foldl: left folds are tidily computable.
Bounds up to a constant factor #
One round of the fold #
Left folds #
If list and init are tidily computable from a common input and step is tidily computable
on pairs, then fun x => (list x).foldl step (init x) is tidily computable. Each of the
(list x).length steps is bounded by tMax x steps and sMax x cells, and the encodings of the
intermediate states ((list x).drop i, ((list x).take i).foldl step (init x)) by lMax x.