UNPKG

lambda-calculus-with-js

Version:

Using JS' anonymous functions to perform lambda calculus

29 lines (28 loc) 1.03 kB
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)))));