[基础软件理论与实践] 第二节作业实现 lxr2010

[基础软件理论与实践] 第二节作业实现 lxr2010

作业信息
  • 课程信息:https://bbs.csdn.net/topics/608593392
  • 第二节作业提交帖:https://bbs.csdn.net/topics/

作业内容描述:

  1. 完成Codewars Kata Church Numbers
  2. 完成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 > 0pred 0 == 0sub m n == m - n,如果m >= nsub 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxr2010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值