////////////
// lamdba
////////////
// x | t t | λx.t
////////////
// 图灵机
////////////
N = x=>x?++x:1
P = x=>console.info('1')
////////////
// 自然数
////////////
ZERO = f=>x=>x
ONE = f=>x=>f(x)
TWO = f=>x=>f(f(x))
THREE = f=>x=>f(f(f(x)))
FOUR = f=>x=>f(f(f(f(x))))
FIVE = f=>x=>f(f(f(f(f(x)))))
// 后继
SUCC = (n)=>f=>x=>(f)(n(f)(x))
// 前驱
PRED = (n)=>f=>x=>n(g=>h=>h(g(f)))(u=>x)(u=>u)
/////////////
// 算数运算
/////////////
PLUS = (x,y)=>x(SUCC)(y)
SUB = (x,y)=>y(PRED)(x)
MULT = (x,y)=>f=>x(y(f))
/////////////
// 逻辑运算
/////////////
TRUE = x=>y=>x
FALSE = x=>y=>y
AND = (x,y)=>x(y)(FALSE)
OR = (x,y)=>x(TRUE)(y)
NOT = (x)=>x(FALSE)(TRUE)
IS_ZERO = x=>x(FALSE)(NOT)(FALSE)
EQUAL = (x,y)=>IS_ZERO(SUB(x,y))
/////////////
// 数据结构
/////////////
PAIR = (x,y)=>f=>f(x)(y)
FST = (x)=>x(TRUE)
SED = (x)=>x(FALSE)
// 后继
NEXT = (p)=>PAIR(SED(p),SUCC(SED(p)))
// 前驱
PRED = (x)=>FST(x(NEXT)(PAIR(ZERO,ZERO)))
/////////////
// 分支判断
/////////////
IF = (z,x,y)=>z(x)(y)
/////////////
// 递归循环
/////////////
WHILE = (n,f)=>n(f)
Y = y=>(x =>y(x(x)))(x=>y(n=>x(x)(n)));
// 阶乘计算
fact1 = f=>n=>n?n*f(n-1):1;
fact2 =f=>n=>IF(EQUAL(n,ONE),ONE,MULT(n,x=>f(PRED(n))(x)));
// 5的阶乘
Y(fact1)(5);
Y(fact2)(FIVE)(N)();
/////////////
// 测试
/////////////
Assert = (x,y)=>{
// lamdba表达式 转 阿拉伯数字
var trans=x=>x instanceof Function?( num=x(N)()||0):x;
x=trans(x);
y=trans(y);
var color=(x==y)?'color:blue':'color:red';
var normal='color:#000';
console.log('λ: %c%s %cequal %c%s %c= %c%s',color,x,normal,color,y,normal,color,(x==y));
};
console.info('---------自然数---------')
Assert(ZERO,ZERO)
Assert(ONE,ONE)
Assert(TWO,TWO)
Assert(THREE,THREE)
Assert(0,ZERO)
Assert(1,ONE)
Assert(2,TWO)
Assert(3,THREE)
console.info('后继函数')
Assert(1,SUCC(ZERO))
Assert(2,SUCC(ONE))
Assert(3,SUCC(TWO))
Assert(4,SUCC(THREE))
console.info('前继函数')
Assert(0,PRED(ONE))
Assert(1,PRED(TWO))
Assert(2,PRED(THREE))
Assert(3,PRED(FOUR))
console.info('---------算数运算---------')
Assert(3,PLUS(ONE,TWO))
Assert(5,PLUS(THREE,TWO))
Assert(1,SUB(THREE,TWO))
Assert(2,SUB(THREE,ONE))
Assert(2,MULT(ONE,TWO))
Assert(6,MULT(THREE,TWO))
console.info('---------逻辑运算---------')
Assert(1,TRUE(1)(0))
Assert(0,FALSE(1)(0))
Assert(0,NOT(TRUE)(1)(0))
Assert(0,AND(TRUE,FALSE)(1)(0))
Assert(1,AND(TRUE,TRUE)(1)(0))
Assert(1,OR(FALSE,TRUE)(1)(0))
Assert(0,OR(FALSE,FALSE)(1)(0))
console.info('---------数据结构---------')
Assert(0,FST(PAIR(ZERO,ONE)))
Assert(1,SED(PAIR(ZERO,ONE)))
Assert(0,FST(NEXT(PAIR(ZERO,ZERO))))
Assert(1,FST(NEXT(NEXT(PAIR(ZERO,ZERO)))))
Assert(2,FST(NEXT(NEXT(NEXT(PAIR(ZERO,ZERO))))))
Assert(3,PRED(FOUR))
Assert(4,PRED(FIVE))
console.info('---------分支---------')
Assert(1,IF(TRUE,1,0))
Assert(0,IF(FALSE,1,0))
console.info('---------循环递归---------')
Assert(4,WHILE(FOUR,SUCC)(ZERO))
Assert(120,Y(fact1)(5))
Assert(120,Y(fact2)(FIVE))
-
Notifications
You must be signed in to change notification settings - Fork 0
mircode/lamdba
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
About
JavaScript版lamdba演算
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published