within¶
The remainder of a square root finder is a function within, which takes a tolerance and a list of approximations and looks down the list for two successive approximations that differ by no more than the given tolerance.
From “Why Functional Programming Matters” by John Hughes
(And note that by “list” he means a lazily-evaluated list.)
Using a generator driven by x and assuming such for square root approximations (or whatever) G, and further assuming that the first term a has been generated already and epsilon ε is handy on the stack…
a [b G] ε within
-------------------- a b - abs ε <=
b
a [b G] ε within
-------------------- a b - abs ε >
.
[b G] x ε ...
b [c G] ε ...
.
--------------------
b [c G] ε within
Predicate¶
a [b G] ε [first - abs] dip <=
a [b G] first - abs ε <=
a b - abs ε <=
a-b abs ε <=
abs(a-b) ε <=
(abs(a-b)<=ε)
P == [first - abs] dip <=
Recur¶
a [b G] ε R0 [within] R1
- Discard
a. - Use
xcombinator to generate next term from G. - Run
withinwithi(it is aprimrecfunction.)
a [b G] ε R0 [within] R1
a [b G] ε [popd x] dip [within] i
a [b G] popd x ε [within] i
[b G] x ε [within] i
b [c G] ε [within] i
b [c G] ε within
b [c G] ε within
R0 == [popd x] dip
Setting up¶
[a G] x ε
a [b G] ε
within == x ε [[first - abs] dip <=] [roll< popop first] [[popd x] dip] primrec