/* the term is structured so that each definition (tru, fls, ...) may be used in every subsequent definition, as well as in the main term */ (lambda tru. (lambda fls. (lambda if. (lambda fix. (lambda zero. (lambda one. (lambda plus. (lambda pair. (lambda iszero. (lambda fst. (lambda snd. (lambda pred. fix (lambda fib. lambda n. if (iszero n) (lambda x. zero) (lambda x. if (iszero(pred n)) (lambda x. one) (lambda x. plus (fib(pred(pred n))) (fib(pred n))))) /* end scope of pred */ ) /* pred's definition */ ((lambda ss. lambda zz. lambda m. fst(m ss zz)) (lambda p. pair (snd p) (plus one (snd p))) (pair zero zero)) /* end scope of snd */) /* snd's definition */ (lambda p. p fls) /* end scope of fst */) /* fst's definition */ (lambda p. p tru) /* end scope of iszero */) /* iszero's definition */ (lambda n. n (lambda x. fls) tru) /* end scope of pair */) /* pair's definition */ (lambda f. lambda s. lambda b. b f s) /* end scope of plus */) /* plus's definition */ (lambda m. lambda n. lambda s. lambda z. m s (n s z)) /* end scope of one */) /* one's definition */ (lambda s. lambda z. s z) /* end scope of zero */) /* zero's definition */ (lambda s. lambda z. z) /* end scope of fix */) /* fix's definition */ (lambda f. lambda y. (lambda x. f(lambda y. x x y)) (lambda x. f(lambda y. x x y)) y) /* end scope of if */) /* if's definition (note that f1 and f2 are functions with dummy arguments) */ (lambda b. lambda f1. lambda f2. b f1 f2 tru) /* end scope of fls */) /* fls's definition */ (lambda x. lambda y. y) /* end scope of tru */ ) /* tru's definition */ (lambda x. lambda y. x)