- С тех пор как я узнал немного Coq, я хотел научиться писать доказательство Coq так называемого алгоритма деления, который на самом деле является логическим предложением:
forall n m : nat, exists q : nat, exists r : nat, n = q * m + r
- Недавно я выполнил эту задачу, используя то, что я узнал из Software Foundations.
- Coq, являясь системой для разработки конструктивных доказательств, является доказательством существования метода построения подходящих значений
q
иr
из значенийm
иn
. - Coq имеет интригующее средство для "извлечения" алгоритма в языке алгоритма Coq (Gallina) для языков функционального программирования общего назначения, включая Haskell.
- Отдельно мне удалось написать операцию divmod как Gallina
Fixpoint
и извлечь ее. Я хочу отметить, что это не то, что я рассматриваю здесь. - Адам Хлипала написал в Сертифицированное программирование с зависимыми типами: "Многие поклонники корреспонденции Карри-Говарда поддерживают идею извлечения программ из доказательств В действительности, немногие пользователи Coq и связанные с ними инструменты делают что-то подобное".
Можно ли даже извлечь алгоритм, неявный в моем доказательстве, в Haskell? Если это возможно, как это сделать?