[基础软件理论与实践] 第二节作业实现 lxr2010
作业信息
- 课程信息:https://bbs.csdn.net/topics/608593392
- 第二节作业提交帖:https://bbs.csdn.net/topics/
作业内容描述:
- 完成Codewars Kata Church Numbers
- 完成Codewars Kata Church numbers: find the predecessor and subtract
作业实现
任务1 完成Codewars Kata Church Numbers
使用 lambda Calculus实现加法、乘法和指数运算。
add = (\ x y f x . x f (y f x))
mul = (\ a b f . a (b f))
exp = (\ a b . b a )
任务2 完成Codewars Kata Church numbers: find the predecessor and subtract
使用lambda Calculus实现pred
操作和减法sub
,其中
pred i == i - 1
,如果i > 0
;pred 0 == 0
。sub m n == m - n
,如果m >= n
;sub m n == 0
,如果m < n
。
我们需要定义一个特殊的函数g
,使得n g == (n-1) f
。令g
接受二元组Pair
作为输入,输出为二元组,于是可以在二元组上迭代应用g
。
为了实现pred
,需要定义二元组的第一项为表示函数g
的迭代次数是否超过1的Boolean值;第二项为数字,用于累积函数迭代结果。
则函数的实现是当函数g
第一次迭代时,向x
应用单位函数\ x .x
;当函数g
不是第一次迭代时,向x
应用函数f
。向二元组(False, x)
迭代g
时,可以保证n g (Pair False x) == (n-1) f x
。
Pair = \ x y . \ f . f x y
True = \ t f . t
False = \ t f . f
fst = \ p . p True
snd = \ p . p False
# pred : Number -> Number
pred = (\ n f x . snd (n (\ p . (fst p) (Pair True (f (snd p))) (Pair True (snd p)) ) (Pair False x)) )
# sub : Number -> Number -> Number
sub = \ m n . (n pred m)