let head = \lst. lst (\h sofar. h) junk in
let tail = \lst. (\shift lst. lst shift (make_pair empty junk) get_2nd)
; where shift is
- (\h p. p (\t y. make_pair (make-list h t) t)) in
+ (\h p. p (\t y. make_pair (make_list h t) t)) in
let length = \lst. lst (\h sofar. succ sofar) 0 in
let map = \f lst. lst (\h sofar. make_list (f h) sofar) empty in
let filter = \f lst. lst (\h sofar. f h (make_list h sofar) sofar) empty in ; or
let filter = \f lst. lst (\h. f h (make_list h) I) empty in
+ let reverse = \lst. lst (\h t. t make_list (\f n. f h n)) empty in
; version 1 lists
)) in
- ; Curry's fixed point combinator
+ ; Rosenbloom's fixed point combinator
let Y = \f. (\h. f (h h)) (\h. f (h h)) in
; Turing's fixed point combinator
- let Z = (\u f. f (u u f)) (\u f. f (u u f)) in
+ let Theta = (\u f. f (u u f)) (\u f. f (u u f)) in
; length for version 1 lists
- fact Z 3 ; returns 6
+ fact Theta 3 ; returns 6
<!--
; and consume is
(\p. p get_2nd p) in ; or
-->
+
+<!--
+ gcd
+ pow_mod
+
+
+ show Oleg's definition of integers:
+ church_to_int = \n sign. n
+ church_to_negint = \n sign s z. sign (n s z)
+
+ ; int_to_church
+ abs = \int. int I
+
+ sign_case = \int ifpos ifzero ifneg. int (K ifneg) (K ifpos) ifzero
+
+ negate_int = \int. sign_case int (church_to_negint (abs int)) zero (church_to_int (abs int))
+
+ for more, see http://okmij.org/ftp/Computation/lambda-arithm-neg.scm
+
+-->