Я пытаюсь определить функцию Ackermann-Peters в Coq, и я получаю сообщение об ошибке, которое я не понимаю. Как вы можете видеть, я собираю аргументы a, b
Ackermann в паре ab
; Я предоставляю упорядочение, определяющее функцию упорядочения для аргументов. Затем я использую форму Function
для определения самого Аккермана, предоставляя ему функцию упорядочения для аргумента ab
.Ошибка в определении Ackermann в Coq
Require Import Recdef.
Definition ack_ordering (ab1 ab2 : nat * nat) :=
match (ab1, ab2) with
|((a1, b1), (a2, b2)) =>
(a1 > a2) \/ ((a1 = a2) /\ (b1 > b2))
end.
Function ack (ab : nat * nat) {wf ack_ordering} : nat :=
match ab with
| (0, b) => b + 1
| (a, 0) => ack (a-1, 1)
| (a, b) => ack (a-1, ack (a, b-1))
end.
Что я получаю следующее сообщение об ошибке:
Error: No such section variable or assumption:
ack
.
Я не уверен, что беспокоит Coq, но поиск в интернете, я нашел предложение может быть проблема с использованием рекурсивного функция, определенная с помощью порядка или меры, где рекурсивный вызов встречается в пределах совпадения. Однако с использованием прогнозов fst
и snd
и if-then-else
сгенерировано другое сообщение об ошибке. Может кто-нибудь предложить, как определить Ackermann в Coq?
Я столкнулся с той же проблемой сегодня. Вы нашли решение? –
@AbhishekAnand Это было какое-то время ... Я предложил решение с «Программой Fixpoint» ниже. Вы нашли решение с 'Function'? –
Нет, я этого не сделал. Спасибо за Ваш ответ. –