证明 Haskell 中乘法对加法函数的分配律

Prove distributive law of multiplication over addition functions in Haskell

我目前正在学习 haskell 和 lambda 演算的初学者课程,我不确定如何进行以下练习:

使用haskell中的(+)和(*)操作的以下定义,证明:

1)(*)对(+)的分配律

(∀m⇓,n⇓,k⇓::N) (m+n) * k = m * k + n * k

定义:

(+) :: N -> N -> N
(+) = \m n -> case m of { 0 -> n; S(y) -> S(y+n)}

(*) :: N -> N -> N
(*) = \m n -> case m of { 0 -> 0; S y -> n + (y*n)}

我的想法是做我在之前练习中所做的事情,证明 m 的每个可能情况。不同的是,我做的练习是针对布尔类型的,它只能是真或假,这是很自然的,所以我的猜测是对 m = 0 和 m = S(y)[=15 的情况进行证明=]

我很容易地证明了 m = 0 的等式,但在 m = S(y) 时被卡住了

案例 m = 0

(0 + n) * k =? 0 * k + n * k
Left side:
(0 + n) * k = (case 0 of {0->n;Sy->...}) * k
= n * k
Right side:
0 * k + n * k = (case 0 of {0->0;Sy->...}) + (n * k)
= 0 + (n * k) = (case 0 of {0->(n*k);Sy->...}) = n * k (equal to the left side)

案例 m = S(y)

(Sy + n) * k =? Sy * k + n * k
Left side:
(case Sy of {0->...;Sy->S(y+n)}) * k = S(y+n) * k
= case Sx of {0->...;Sx-> k + k * (y+n)
Right side:
Sy * k + n * k = (case Sy of {0->...;Sy->k + k*y}) + n * k
= k + k*y + n * k (Point at which I got stuck)

(...) 代表无关代码

附带一问,∀m⇓上的向下箭头⇓到底是什么意思?提前致谢!

好吧,您只是忘记应用归纳假设:

(Sy + n) * k =? Sy * k + n * k
Left side:
(case Sy of {0->...;Sy->S(y+n)}) * k = S(y+n) * k
= case Sx of {0->...;Sx-> k + k * (y+n)
( inductive hypothesis; we know that k * (y+n) = k*y + k*n)
= k + k*y + k*n
Right side:
Sy * k + n * k = (case Sy of {0->...;Sy->k + k*y}) + n * k
= k + k*y + n * k 

记住:您是通过归纳法对 + 的第一个参数提供 (m+n)*k == m*k + n*k。您证明了基本情况 (0+n)*k,因此在证明归纳情况时,您假设知道 (y+n)*k == y*k + n*k 达到某个特定值 y,并且您想证明 (S(y) + n)*k == S(y)*k + n*k