Skip to content

Instantly share code, notes, and snippets.

@olligobber
Created February 4, 2018 01:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save olligobber/7eef8c74bea046b78de611265426fe31 to your computer and use it in GitHub Desktop.
Save olligobber/7eef8c74bea046b78de611265426fe31 to your computer and use it in GitHub Desktop.
#! /usr/bin/env python3
identity = lambda x: x
b_true = lambda x: lambda y: x
b_false = lambda x: lambda y: y
b_not = lambda b: b(b_false)(b_true)
b_and = lambda x: lambda y: x(y)(x)
b_or = lambda x: lambda y: x(x)(y)
b_xor = lambda x: lambda y: x(b_not(y))(y)
b_nor = lambda x: lambda y: x(b_false)(b_not(y))
b_nand = lambda x: lambda y: x(b_not(y))(b_true)
b_if = lambda b: lambda if_t: lambda if_f: b(if_t)(if_f)(identity)
pair = lambda x: lambda y: lambda z: z(x)(y)
p_first = lambda p: p(lambda x: lambda y: x)
p_second = lambda p: p(lambda x: lambda y: y)
n_iszero = lambda x: p_first(x)
n_zero = pair(b_true)(identity)
n_succ = lambda x: pair(b_false)(x)
n_pred = lambda x: p_second(x)
n_equal = lambda x: lambda y: b_if(
n_iszero(x)
)(
lambda a: n_iszero(y)
)(
lambda a: b_if(
n_iszero(y)
)(
lambda b: b_false
)(
lambda b: n_equal(n_pred(x))(n_pred(y))
)
)
n_add = lambda x: lambda y: b_if(
n_iszero(x)
)(
lambda a: y
)(
lambda a: b_if (
n_iszero(y)
)(
lambda b: x
)(
lambda b: n_add(n_pred(x))(n_succ(y))
)
)
n_difference = lambda x: lambda y: b_if(
n_iszero(x)
)(
lambda a: y
)(
lambda a: b_if(
n_iszero(y)
)(
lambda b: x
)(
lambda b: n_difference(n_pred(x))(n_pred(y))
)
)
################################################################################
def to_bool(b):
return b(True)(False)
def to_lambda(x):
if x == None:
return identity
if type(x) == bool:
if (x):
return b_true
return b_false
if (type(x) == int):
if (x >= 0):
output = n_zero
while x != 0:
output = n_succ(output)
x-=1
return output
raise TypeError()
if (type(x) == tuple):
if (len(x) == 2):
return pair(to_lambda(x[0]))(to_lambda(x[1]))
raise TypeError()
raise TypeError()
def to_int(x):
output = 0
while not to_bool(n_iszero(x)):
output += 1
x = n_pred(x)
return output
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment