证明Haskell中乘法函数的乘法分布定律

时间:2016-10-01 23:01:12

标签: haskell functional-programming lambda-calculus

我目前正处于初学者的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)

我很容易设法证明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⇓上的箭头究竟是什么意思?提前谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,你只是忘记应用归纳假设:

(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