function churchZero() return function(x) return x end end function churchSucc(c) return function(f) return function(x) return f(c(f)(x)) end end end function churchAdd(c, d) return function(f) return function(x) return c(f)(d(f)(x)) end end end function churchMul(c, d) return function(f) return c(d(f)) end end function churchExp(c, e) return e(c) end function numToChurch(n) local ret = churchZero for i = 1, n do ret = succ(ret) end return ret end function churchToNum(c) return c(function(x) return x + 1 end)(0) end three = churchSucc(churchSucc(churchSucc(churchZero))) four = churchSucc(churchSucc(churchSucc(churchSucc(churchZero)))) print("'three'\t=", churchToNum(three)) print("'four' \t=", churchToNum(four)) print("'three' * 'four' =", churchToNum(churchMul(three, four))) print("'three' + 'four' =", churchToNum(churchAdd(three, four))) print("'three' ^ 'four' =", churchToNum(churchExp(three, four))) print("'four' ^ 'three' =", churchToNum(churchExp(four, three)))