Lambda演算如何加上数字?
我一直在读关于lambda演算的书,喜欢它提出的想法,但有些事情我就是解释不了 lambda演算如何进行数字相加 我明白Lambda演算如何加上数字?,lambda,functional-programming,lambda-calculus,Lambda,Functional Programming,Lambda Calculus,我一直在读关于lambda演算的书,喜欢它提出的想法,但有些事情我就是解释不了 lambda演算如何进行数字相加 我明白 (\x . + x x) 3 与3+3(即6)相同,但添加功能首先是如何实现的 它是编译器/语言必须内置的东西,还是可以由lambda演算单独定义?假设您使用的是加法,而不是一些基本的数字类型: \x \y . (\z . x(y(z))) 如果您向lambda演算中添加了某种基本数字类型,那么加法必须是基本的,或者必须按照类似后续操作的方式进行定义。是的,您可以在lam
(\x . + x x) 3
与3+3
(即6
)相同,但添加功能首先是如何实现的
它是编译器/语言必须内置的东西,还是可以由lambda演算单独定义?假设您使用的是加法,而不是一些基本的数字类型:
\x \y . (\z . x(y(z)))
如果您向lambda演算中添加了某种基本数字类型,那么加法必须是基本的,或者必须按照类似后续操作的方式进行定义。是的,您可以在lambda演算中定义数字(实际上是任意数据类型)。这是我的想法 首先,让我们选择要定义的数字。最简单的数字是自然数:0、1、2、3等等。我们如何定义这些?通常的方法是使用:
- ⟦0⟧ = λzs。z
- ⟦1.⟧ = λzs。s z
- ⟦2.⟧ = λzs。s(sz)
- ⟦3.⟧ = λzs。s(s(s z))
- ⟦0⟧ = λzs。z
- ⟦s⟧ = λn。λzs。s(n z s)
- ⟦0⟧ = λzs。z
- ⟦1.⟧ = ⟦S0⟧
=(λn.λz s.s(nz s))(λz′.z′)
⇝ λzs。s((λz′.z′)zs)
⇝ λzs。s z - ⟦2.⟧ = ⟦SS0⟧
=(λn.λz s.s(nz s))((λn′.λz′.s′(n′z′))(λz〃s〃.z〃))
⇝ (λn.λzs.s(nzs))(λz′.s′((λz〃s〃.z〃)z′)
⇝ (λn.λzs.s(nzs))(λz′.s′.s′z′)
⇝ λzs。s((λz′s′.s′)zs)
⇝ λzs。s(sz) - ⟦3.⟧ = ⟦SSS0⟧
=(λn.λz s.s(nz s))((λn′.λz′.s′(n′z′))((λn〃.λz〃s〃.s〃(n〃z〃s))(λz〃s〃.z〃)
⇝ (λn.λz s.s(nz s))((λn′.λz′.s′(n′z′))(λz〃s〃.s〃((λz′.s′)z〃s〃))
⇝ (λn.λz s.s(nz s))((λn′.λz′.s′(n′z′))(λz〃s〃.s〃z〃))
⇝ (λn.λz s.s(nz s))(λz′.s′((λz〃s〃.s〃z〃)z′)
⇝ (λn.λzs.s(nzs))(λz′s′.s′(s′z′))
⇝ λzs。s((λz′s′.s′(s′z′))zs)
⇝ λzs。s(s(s z))
- ⟦+⟧ = λmn。λzs。n(mzs)s
data Int = NonNeg Nat | NegSucc Nat
data Pos = One
| Twice Pos
| TwiceSucc Pos
data Nat = Zero | PosNat Pos