lambda-calculus-with-js
Version:
Using JS' anonymous functions to perform lambda calculus
29 lines (28 loc) • 1.03 kB
JavaScript
import { yC } from '..';
import { and, bFalse, bTrue, deBool, bFalse as n0, not } from './bool';
import { I } from './combinatory';
export const plus = a => b => F => X => a(F)(b(F)(X));
export const multi = a => b => a(plus(b))(n0);
export const succ = a => F => X => a(F)(F(X));
export const pred = n => F => X => n(p => h => h(p(F)))(_ => X)(I);
export const minus = a => b => b(pred)(a);
export const isZero = n => n(_ => bFalse)(bTrue);
export const le = a => b => isZero(minus(a)(b));
export const gt = a => b => not(le(a)(b));
export const ge = a => b => le(b)(a);
export const ls = a => b => not(ge(a)(b));
export const eq = a => b => and(le(a)(b))(le(b)(a));
export const ne = a => b => not(eq(a)(b));
export { n0 };
export function getNumber(n) {
return n === 0 ? n0 : succ(getNumber(n - 1));
}
export function deNumber(n) {
let k = 0;
while (!deBool(isZero(n))) {
n = pred(n);
k++;
}
return k;
}
export const factorial = yC(s => n => isZero(n)(getNumber(1))(multi(n)(s(pred(n)))));