Church Numerals

by Paulpro

JavaScript

var zero = function(f){
    return function(x){
        return x;
    }
}

var one = function(f){
    return function(x){
        return f(x);
    }
}

var two = function(f){
    return function(x){
        return f(f(x));
    }
}

two(function(){ console.log('BLAH'); });

    
// λnfx.f (n f x)
function succ(n){
    return function(f){
        return function(x){
            return f(n(f)(x));  
        }
    }
}

//  λnfx.n (λgh.h (g f)) (λu.x) (λu.u)   
function pred(n){
    return function(f){
        return function(x){
            return n(function(g){
                return function(h){
                     return h(g(f));   
                }
            })(function(u){
                return x;
            })(function(u){
                return u;
            })
        }
    }
}

// λmnfx.m f (n f x)
function plus(m){
    return function(n){
        return function(f){
            return function(x){
                return m(f)(n(f)(x));
            }
        }
    }
}

// λmn.n PRED m
function sub(m){
    return function(n){
        return n(pred)(m);  
    }
}

// λmnf.m (n f)
function mult(m){
    return function(n){
        return function(f){
            return m(n(f));
        }
    }
}

// λxy.x
function TRUE(x){
    return function(y){
        return x; 
    }  
}
   
// λxy.y 
function FALSE(x){
    return function(y){
        return y; 
    }  
}

// λpq.p q p
function and(p){
    return function(q){
        return p(q)(p);
    }  
}

// λpq.p p q
function or(p){
    return function(q){
        return p(p)(q);
    }  
}

// λpab.p b a
function not(p){
    return function(a){
        return function(b){
            return p(b)(a); 
        }  
    }
}

// λn.n (λx.FALSE) TRUE
function iszero(n){
    return n(function(x){
        return FALSE;
    })(TRUE);
}

// λpab.p a b
function ifthenelse(p){
    return function(a){
        return function(b){
            return p(a)(b);
        }
    }
}

function fac(x){
    return (function(f){
       ...