Agda-2.3.2.2: src/prototyping/eval/church.lam
zero = \s z -> z
suc = \n s z -> s (n s z)
n0 = zero
n1 = suc n0
n2 = suc n1
n3 = suc n2
n4 = suc n3
n5 = suc n4
n6 = suc n5
n10 = mul n2 n5
n20 = mul n10 n2
fix = \f -> (\x -> f (x x)) (\x -> f (x x))
fst (P x y) = x
snd (P x y) = y
pred n = snd (natrec (P n0 n0) (\p -> P (suc (fst p)) (fst p)) n)
natrec = \z s n -> n s z
add n m = natrec m suc n
mul n m = natrec zero (add m) n
sub n m = natrec n pred m
div = fix (\d n m ->
if (less n m)
zero
(suc (d (sub n m) m))
)
mod = fix (\d n m ->
if (less n m)
n
(d (sub n m) m)
)
fac = fix (\f n ->
if (nonZero n)
(mul n (fac (pred n)))
n1
)
if True = \x y -> x
if False = \x y -> y
nonZero = \n -> n (\x -> True) False
isZero = \n -> n (\x -> False) True
less = \n m -> nonZero (sub m n)
decimal = fix (\dec n ->
if (isZero n)
(\x -> x)
(dec (div n n10) (digit (mod n n10)))
)
inc D0 = D1
inc D1 = D2
inc D2 = D3
inc D3 = D4
inc D4 = D5
inc D5 = D6
inc D6 = D7
inc D7 = D8
inc D8 = D9
digit = natrec D0 inc
main = decimal (fac n4)