当前位置: 首页 > news >正文

【Programming Languages And Lambda calculi】4.5 Lambda 表达式 数值编码

4.5 数值编码

在Lambda演算中,又很多给数值编码的方法,但是最流行的方法来自于Church,因此数值编码又被称为 Church 数。它的思想是一个自然数 n 被编码成一个有两个参数的函数,参数分别为 f 与 x,函数将f应用于x n遍。因此,0的函数接收一个 f 和 x,返回 x(相当于应用 f 0次)。1 的函数应用 f 一次,以此类推。
在这里插入图片描述

方法 add1 需要接收数值 n 的代表,并且生产出数值 n + 1的代表。换言之,它接收一个含有两个参数的函数并且返回另一个含有两个参数的函数;新的函数将应用它第一个参数于第二个参数 n + 1 次。为了使第一个 n 被应用,新函数应该使用旧的 n。
在这里插入图片描述

类似于 true 和 false 的编码,数值编码也很简便。为了对两个数值 n 和 m 使用加法,我们只需应用 add1 到 n 共 m 次 —— 而 m 恰巧是一个会接收 add1 并应用其 m 次的函数。
在这里插入图片描述

将数值作为函数的想法对定义 iszero 也十分有用,该函数接收数值后,如果数值为 0 则返回 true,其他返回 false;如果这个函数应用 0 次于 true,则结果为 true,其他情况则为 false。
在这里插入图片描述

为了将函数推广到数相等,我们需要减法。就像我们用 add1 实现加法一样,减法可以用 sub1 实现。但是,尽管 add1,add 和 iszero 函数在 Church 的书编码中非常简单,sub1 会显得略微复杂。sub1 将接收的数值函数作为参数,并且应用 n 次,但是其返回的函数却要 应用函数一次。当然,任意函数的逆函数不可用于反转一个应用程序。

实现 sub1 的函数分为两个部分:

  • 将给定的参数 x 与 true 成对。 true 标示了对 f 的应用应该被跳过
  • 将给定的函数 f 封包,以接收对值,以及当对值用含有 false 时应用 f 。必定返回一个包含 false 的对值,以确保 f 会在将来被应用。

wrap 函数将给定的 f 封包:
在这里插入图片描述

sub1 函数接收一个 n 并且返回一个新函数,新函数接收 f 和 x, 用 wrap 函数将 f 封包,并且将 x 与 true 对编码, 在 (wrap f) 和 ⟨true, x⟩ 上使用 n,并且抽出结果的第二部分 —— f 应用于 x (n - 1) 次。
在这里插入图片描述

有关编码的提示:对 0 的编码与对 false 的编码一致。因此,没有程序能够区分 0 与 false,编程者必须确保只有在布尔上下文中才使用 true 和 false。这与 C语言使用相同的比特值实现 0、false和null指针类似。

练习 4.6

证明 add1 1 =n 2

题解

add1 1 = (λn.λf.λx.f (n f x)) (λf.λx.f x)

nβ λf.λx.f ((λf.λx.f x) f x)

nβ λf.λx.f ((λx.f x) x)

nβ λf.λx.f ((λx.f x) x)

nβ λf.λx.f (f x) = 2

练习 4.7

证明 iszero 1 =n false

题解

iszero 1 = λn.n (λx.false) true (λf.λx.f x)

nβ (λf.λx.f x) (λx.false) true

nβ (λx.(λx.false) x) true

nβ (λx.false) true

nβ false

练习 4.8

证明 sub1 1 =n 0

题解

sub1 1 = (λn.λf.λx.snd (n (wrap f) ⟨true, x⟩)) (λf.λx.f x)

nβ λf.λx.snd ((λf.λx.f x) (wrap f) ⟨true, x⟩)

nβ λf.λx.snd (λx.(wrap f) x)⟨true, x⟩)

nβ λf.λx.snd ((wrap f) ⟨true, x⟩)

= λf.λx.snd (((λf.λp.⟨false, if (fst p) (snd p) (f (snd p))⟩) f) ⟨true, x⟩)

nβ λf.λx.snd ((λp.⟨false, if (fst p) (snd p) (f (snd p))⟩) ⟨true, x⟩)

nβ λf.λx.snd (⟨false, if (fst ⟨true, x⟩) (snd ⟨true, x⟩) (f (snd ⟨true, x⟩))⟩)

→→n λf.λx.snd (⟨false, if true (snd ⟨true, x⟩) (f (snd ⟨true, x⟩))⟩

→→n λf.λx.snd (⟨false, snd ⟨true, x⟩)⟩

→→n λf.λx.snd ⟨false, x⟩

→→n λf.λx.x

= 0

练习 4.9

用帮助我们实现 add 的方式定义 mult 。换句话说,实现 (mult n m) ,利用 n 本身应用函数 n 次的事实,应用 m 于 0 n 次 加法。(提示: (add m) 是什么类型的值?)

题解

mult ≐ λn.λm.λf.m (n f)

练习 4.10

Lambda演算没有提供错误信号的机制,如果 sub1应用于 0 之后,将会发生什么?当 iszero 应用于 true 后,将会发生什么?

题解
  • sub1 0 = (λn.λf.λx.snd (n (wrap f) ⟨true, x⟩)) (λf.λx.x)

    nβ λf.λx.snd ((λf.λx.x) (wrap f) ⟨true, x⟩)

    nβ λf.λx.snd ((λx.x) ⟨true, x⟩)

    nβ λf.λx.snd ⟨true, x⟩

    →→n λf.λx.x = 0

  • iszero true = (λn.n (λx.false) true) (λx.λy.x)

    nβ (λx.λy.x) (λx.false) true

    nβ λy.λx.false true

    nβ λx.false

相关文章:

  • 【Programming Languages And Lambda calculi】4.6 Lambda表达式 递归 (重要,建议彻底弄懂)
  • 【Programming Languages And Lambda calculi】4.7~4.8 关于Lambda演算的一些事实 范式 历史 第四章完
  • 【LWC】轻巧的加载预显示行 UI组件 - loading-place-holder #lwc组件 #Salesforce #用户体验
  • 【Programming Languages And Lambda calculi】现实语言模型 5.1 ISWIM表达式
  • 【web development】输入框单击回车隐式提交表单的禁用与讨论 enter keypress inside input causing form submit
  • 【Salesforce】VSCode中找不到 Salesforce Cli 的 Org Broswer 云图标的解决办法
  • 【Salesforce】生产环境元数据版本备份 、还原完整方案 Production Metadata backup recover solution
  • 【Programming Languages And Lambda calculi】5.2 ISWIM 约化
  • 【Apex】Apex 报错 System.StringException: Invalid id: 的解决办法 / 判断查找字段非空
  • 【LWC】Lightning标准/自定义编辑表单组件中,<lightning-messages> 标签显示错误信息的两种方法 show error messages in lwc edit-form
  • npm 设置模组安装路径以及缓存路径
  • 【LWC】lightning-input-field参照字段值响应式清除失效的解决方法 #hack trick
  • 【Salesforce / LWC】LWC中使用第三方库开发 Use Third-Party JavaScript Libraries In LWC
  • 【读完掌握】JavaScript 中 Array.prototype.map() 的定义、特点、易错点、使用技巧 返回undefined的解决方法
  • 【Salesforce】 使用自定义通知功能
  • 【Leetcode】104. 二叉树的最大深度
  • 【RocksDB】TransactionDB源码分析
  • CentOS 7 防火墙操作
  • CSS相对定位
  • Electron入门介绍
  • HTTP 简介
  • Java反射-动态类加载和重新加载
  • java中具有继承关系的类及其对象初始化顺序
  • nfs客户端进程变D,延伸linux的lock
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Sass 快速入门教程
  • 测试开发系类之接口自动化测试
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 反思总结然后整装待发
  • 解决iview多表头动态更改列元素发生的错误
  • 前端工程化(Gulp、Webpack)-webpack
  • 实战|智能家居行业移动应用性能分析
  • 探索 JS 中的模块化
  • 新手搭建网站的主要流程
  • 延迟脚本的方式
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (3)选择元素——(17)练习(Exercises)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (翻译)terry crowley: 写给程序员
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (剑指Offer)面试题34:丑数
  • (接口自动化)Python3操作MySQL数据库
  • (九十四)函数和二维数组
  • (原創) 未来三学期想要修的课 (日記)
  • (转)C#调用WebService 基础
  • (转)Linux下编译安装log4cxx
  • *1 计算机基础和操作系统基础及几大协议
  • .cfg\.dat\.mak(持续补充)
  • .java 9 找不到符号_java找不到符号
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器