﻿
# boolean logic

true   = \t.\f.t
false  = \t.\f.f
not    = \p.p<false><true>
and    = \x.\y.xy<false>
or     = \x.\y.x<true>y
if     = \c.\t.\f.ctf


# church numerals

zero   = \s.\z.z
zero?  = \n.n(\x.<false>)<true>
succ   = \n.\f.\x.f(nfx)
1      = \s.\z.sz
2      = \s.\z.s(sz)
4      = \s.\z.s(s(s(sz)))
10     = \s.\z.s(s(s(s(s(s(s(s(s(sz)))))))))
add    = \m.\n.\s.\z.ms(nsz)
mul    = \m.\n.\s.\z.m(ns)z
pair   = \x.\y.\p.pxy
fst    = \p.p<true>
snd    = \p.p<false>
prefn  = \f.\p.<pair>(f(<fst>p))(<fst>p)
pred   = \n.\f.\x.<snd>(n(<prefn>f)(<pair>xx))
pred2  = \n.\f.\x.n(\p.\y.y(f(p(\t.\f.t)))(p(\t.\f.t)))(\p.pxx)(\t.\f.f)
pred3  = \n.\f.\x.n(\g.\h.h(gf))(\u.x)(\u.u)
fix    = \f.(\x.f(xx))(\x.f(xx))
eq     = <fix>(\f.\n.\m.(<or>(<zero?>n)(<zero?>m))(<and>(<zero?>n)(<zero?>m))(f(<pred>n)(<pred>m)))
one?   = \n.n(\x.\p.p(\t.\f.f)(x(\t.\f.t)))(\p.p(\t.\f.t)(\t.\f.t))(\t.\f.f)

# combinators

S      = \x.\y.\z.(xz)(yz)
K      = \x.\y.x
I      = \x.x
Y      = \f.(\x.f(xx))(\x.f(xx))

#
# samples
#
# <eq><1><2>
# <or><true>(<not>(<and><true><false>))

#
# output wwww
#
# (<fix>(\f.\n.<zero?>(<pred>n)(w)(f(<pred>n)w)))<4>  # 438 steps
# (<fix>(\f.\n.<one?>nw(f(<pred2>n)w)))<4>            # 183 steps
# (<fix>(\f.\n.<one?>nw(f(<pred3>n)w)))<4>            # 145 steps


