52 lines
1.0 KiB
Lua
52 lines
1.0 KiB
Lua
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)))
|