В настоящее время я прохожу курс для начинающих по хаскелю и лямбда-исчислению, и я не знаю, как выполнить следующее упражнение:
Используя следующие определения операций (+) и (*) в 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⇓? Заранее спасибо!
n :: Nat; n = S n
, что является бесконечным числом. А также:loop :: Nat; loop = loop
, которое является расходящимся вычислением типаNat
. Если вы подставите такие значения в это уравнение, уравнение может не выполняться. - person Bakuriu   schedule 02.10.2016