Ваш код Coq использует Peano-кодировку натуральных чисел. Оценка mult 2 2
буквально исходит из сокращения:
mult (S (S 0)) (S (S 0)))
= (S (S 0)) + mult (S 0) (S (S 0)))
= (S (S 0)) + ((S (S 0)) + mult 0 (S (S 0)))
= (S (S 0)) + ((S (S 0)) + 0)
= (S (S 0)) + ((S 0) + (S 0))
= (S (S 0)) + (0 + (S (S 0))
= (S (S 0)) + (S (S 0))
= (S 0) + (S (S (S 0)))
= 0 + (S (S (S (S 0)))
= (S (S (S (S 0))))
и затем проверка равенства mult 2 2 =? 5
продолжается дальнейшим сокращением:
(S (S (S (S 0)))) =? (S (S (S (S (S 0)))))
(S (S (S 0))) =? (S (S (S (S 0))))
(S (S 0)) =? (S (S (S 0)))
(S 0) =? (S (S 0))
0 =? (S 0)
false
Между тем, на стороне Хаскеля оценка 2 * 2 == 5
происходит путем умножения двух Integers
и сравнения их с другим Integer
. Это несколько быстрее. ;)
Что удивительно, так это то, что оценка Coq isPrime 330
занимает всего 30 секунд вместо, скажем, 30 лет.
Я не знаю, что сказать о прогнозировании скорости извлеченного кода, за исключением того, что сказать, что примитивные операции над числами Пеано будут значительно ускорены, а другой код, вероятно, будет скромно быстрее, просто потому, что много работы ушло чтобы GHC генерировал быстрый код, а производительность не была в центре внимания разработки Coq.