【Programming Languages And Lambda calculi】4.4 Lambda 表达式 对值编码

4.4 对编码

实行对编码,我们需要三类操作:

  • 结合两个值
  • 提取第一个值的操作
  • 提取第二个值的操作

话句话说,我们需要 mkpair, fst, snd 满足下述等式:
f s t ( m k p a i r   M   N ) = n M s n d ( m k p a i r   M   N ) = n N fst(mkpair\ M\ N) =_n M\\ snd(mkpair \ M\ N) =_n N fst(mkpair M N)=nMsnd(mkpair M N)=nN
我们也可以使用符号 ⟨M, N⟩ 作为对的缩写(第一个值为M,第二个值为N)。一种寻找 mkpair 等定义的方法是考虑一个 ⟨M, N⟩ 的值可能长什么样。

因为我们所有的值都是函数,⟨M, N⟩ 也必须是一个函数,这个函数需要包含 M 和 N 的表达式,并且,它必须又返回给用户其中一个值的方法(取决于用户需要第一个还是第二个值)。这提示了用户必须以函数的方式调用对,并且提供 true 来得到第一个值,提供 false 来得到第二个值:
⟨ M , N ⟩ ≐ λ s . i f   s   M   N ⟨M,N⟩\doteq \lambda s.if\ s\ M\ N M,Nλs.if s M N
前一小节说过,if 函数并不是必要的,所以上述函数可以通过丢弃 if 简化。

这样编码, fst 函数接收对值,并且应用其作为 true的参数。
f s t ≐ λ p . p   t r u e fst\doteq\lambda p.p\ true fstλp.p true
类似地, snd 应用对值作为false的参数。最终,为了定义 mkpair,我们将 ⟨M, N⟩ 抽象缩写成任意 M 与 N。
在这里插入图片描述

练习 4.5

证明上述的 mkpair,fst 和 snd 满足此小节开头的等式。

题解
  • fst (mkpair M N) = (λp.p true) ((λx.λy.λs.s x y) M N)

    nβ ((λx.λy.λs.s x y) M N) true

    nβ (λy.λs.s M y) N) true

    nβ (λs.s M N) true

    nβ true M N = (λx.λy.x) M N

    nβ (λ.M) N

    nβ M

  • snd (mkpair M N) = (λp.p false) ((λx.λy.λs.s x y) M N)

    nβ ((λx.λy.λs.s x y) M N) false

    nβ (λy.λs.s M y) N) false

    nβ (λs.s M N) false

    nβ false M N = (λx.λy.y) M N

    nβ (λy.y) N

    nβ N

猜你喜欢

转载自blog.csdn.net/qq_35714301/article/details/113812615