#!/usr/local/bin/swift // SUCC := λnfx.f (n f x) // ((t1 -> t) -> t2 -> t1) -> (t1 -> t) -> t2 -> t func succ(n:(T1->T)->T2->T1)->(T1->T)->T2->T { return {(f:T1->T)->T2->T in {(x:T2)->T in f(n(f)(x))}} } // ADD := λm n f x. m f (n f x) // (t2 -> t1 -> t) -> (t2 -> t3 -> t1) -> t2 -> t3 -> t func add(m:T2->T1->T)->(T2->T3->T1)->T2->T3->T { return {(n:T2->T3->T1)->T2->T3->T in {(f:T2)->T3->T in {(x:T3)->T in m(f)(n(f)(x))}}} } // MUL := λm n f. m (n f) // (t1 -> t) -> (t2 -> t1) -> t2 -> t func mul(m:T1->T)->(T2->T1)->T2->T { return {(n:T2->T1)->T2->T in {(f:T2)->T in m(n(f))}} } // POW // t1 -> (t1 -> t) -> t func pow(m:T1)->(T1->T)->T { return {(n:T1->T)->T in n(m)} } // 0 func c0(f:(T)->T)->(T)->T { return {(x:T)->T in x} } // 1 func c1(f:(T)->T)->(T)->T { // return {(x:T)->T in f(x)} return {(x:T)->T in succ(c0)(f)(x)} } // 2 func c2(f:(T)->T)->(T)->T { // return {(x:T)->T in f(f(x))} return {(x:T)->T in succ(c1)(f)(x)} } // 3 func c3(f:(T)->T)->(T)->T { // return {(x:T)->T in f(f(x))} return {(x:T)->T in add(c1)(c2)(f)(x)} } // see if it works let v = succ(succ(mul(add(c2)(c3))(pow(c2)(c3)))) print(v({x in x+1})(0) == 42)