tokencrawler/.venv/lib/python3.9/site-packages/oslash/util/numerals.py
2022-03-17 22:16:30 +01:00

46 lines
1.1 KiB
Python

"""
Lambda calculus.
* http://en.wikipedia.org/wiki/Church_encoding
* http://www.cs.bham.ac.uk/~axj/pub/papers/lambda-calculus.pdf
* http://vanderwijk.info/blog/pure-lambda-calculus-python/
* http://eflorenzano.com/blog/2008/11/20/lambda-calculus/
Just for the fun of it.
"""
identity = lambda x: x
self_apply = lambda s: s(s)
select_first = lambda first: lambda second: first
select_second = lambda first: lambda second: second
make_pair = lambda first: lambda second: lambda func: func(first)(second)
apply = lambda func: lambda arg: func(arg)
cond = lambda e1: lambda e2: lambda c: c(e1)(e2)
true = select_first
false = select_second
iff = lambda c, a, b: c(a)(b)
not_ = lambda x: cond(false)(true)(x)
and_ = lambda x: lambda y: x(y)(false)
or_ = lambda x: lambda y: x(true)(y)
# succ = λn.λf.λx.f (n f x)
succ = lambda n: lambda f: lambda x: f(n(f)(x))
zero = lambda f: identity
one = lambda f: lambda x: f(x)
two = succ(one)
three = succ(two)
iszero = lambda n: n(select_first)
to_int = lambda n: n(lambda x: x + 1)(0)
printl = lambda n: n(lambda x: x + 1)(0)