RosettaCodeData/Task/Church-numerals/Lua/church-numerals.lua

52 lines
1 KiB
Lua
Raw Permalink Normal View History

2023-07-01 11:58:00 -04:00
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)))