#!/usr/bin/python # Truth testing TRUE = lambda x: lambda y: x FALSE = lambda x: lambda y: y IF = lambda b: lambda t: lambda f: b(t)(f) print "IF(TRUE)('yes')('no')", IF(TRUE)('yes')('no') print "IF(FALSE)('yes')('no')", IF(FALSE)('yes')('no') # def TRUE(x)(y): x # def FALSE(x)(y): y # def IF(b)(t)(f): b(t)(f) # Pairs PAIR = lambda x: lambda y: lambda b: b(x)(y) FIRST = lambda p: p(TRUE) REST = lambda p: p(FALSE) # def PAIR(x)(y)(b): b(x)(y) # def FIRST(p): p(TRUE) # def REST(p): p(FALSE) print "FIRST(PAIR('p')('q'))", FIRST(PAIR('p')('q')) print "REST(PAIR('p')('q'))", REST(PAIR('p')('q')) # Numbers! ZERO = PAIR(TRUE)(TRUE) SUCC = lambda n: PAIR(FALSE)(n) ONE = SUCC(ZERO) TWO = SUCC(ONE) THREE = SUCC(TWO) FOUR = SUCC(THREE) FIVE = SUCC(FOUR) # Tests etc. print "IF(FIRST(ZERO))('yes')('no')", IF(FIRST(ZERO))('yes')('no') print "IF(FIRST(ONE))('yes')('no')", IF(FIRST(ONE))('yes')('no') YM = lambda f: (lambda x: (lambda y: f(x(x))))(lambda x: (lambda y: f(x(x)))) FORCE = lambda x: x R = lambda g: (lambda m: lambda n: ( IF(FIRST(m)) (lambda q: n) (lambda q: g(FORCE)(REST(m))(SUCC(n))) ) (FORCE) ) ADD = YM(R)(FORCE) def INTIZE(n): i = 0 while 1: if IF(FIRST(n))(1)(0): break i += 1 n = REST(n) return i print "INTIZE(ADD(ONE)(ONE))", INTIZE(ADD(ONE)(ONE)) print "INTIZE(ADD(ONE)(TWO))", INTIZE(ADD(ONE)(TWO)) print "INTIZE(ADD(THREE)(TWO))", INTIZE(ADD(THREE)(TWO)) print "INTIZE(ADD(THREE)(SUCC(TWO)))", INTIZE(ADD(THREE)(SUCC(TWO))) # # ZERO = lambda f: lambda x: x # ZERO = FALSE # # ZERO = PAIR(TRUE)(TRUE) = lambda b: b(TRUE)(TRUE) # SUCC = lambda n: lambda f: lambda x: f(n(f)(x)) # # SUCC = lambda n: PAIR(FALSE)(n) # ADD = %mn.%f.%x.(m f) (n f x) # def SUCC(n)(f)(x): f(n(f)(x)) # def ADD(m)(n)(f)(x): m(f)(n(f)(x)) # # N0 = ZERO # N1 = SUCC(N0) # N2 = SUCC(N1) # N3 = SUCC(N2) # N4 = SUCC(N3) # IS_ZERO = lambda n: n(lambda k: FALSE)(TRUE) # # IS_ZERO = lambda n: FIRST(n) # print "IF(IS_ZERO(N0))('yes')('no')", IF(IS_ZERO(N0))('yes')('no') # print "IF(IS_ZERO(N1))('yes')('no')", IF(IS_ZERO(N1))('yes')('no') # ADD = lambda m, n: lambda f: lambda x: (m(f))(n(f)(x)) # INTIZE = lambda n: n(lambda x:x+1)(0) # INTIZE(N3) # print "INTIZE(ADD(N1, N1))", INTIZE(ADD(N1, N1)) # print "INTIZE(ADD(N1, N2))", INTIZE(ADD(N1, N2)) # print "INTIZE(ADD(N3, N2))", INTIZE(ADD(N3, N2)) # print "INTIZE(ADD(N3, SUCC(N2)))", INTIZE(ADD(N3, SUCC(N2)))