我目前正处于初学者的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⇓上的箭头究竟是什么意思?提前谢谢!
答案 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
。