RosettaCodeData/Task/Church-numerals/Lua/church-numerals.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)))