Я пытаюсь определить функцию Акерманна-Петерса в Coq и получаю сообщение об ошибке, которого я не понимаю. Как видите, я упаковываю аргументы a, b
Аккермана в пару ab
; Я предоставляю упорядочение, определяющее функцию упорядочивания аргументов. Затем я использую форму Function
для определения самого Аккермана, предоставляя ему функцию упорядочивания для аргумента ab
.
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.
Я получаю следующее сообщение об ошибке:
Ошибка: нет такой переменной раздела или предположения:
ack
.
Я не уверен, что беспокоит Coq, но поискав в Интернете, я обнаружил, что может быть проблема с использованием рекурсивной функции, определенной с помощью упорядочивания или меры, где рекурсивный вызов происходит внутри совпадения. Однако использование прогнозов fst
и snd
и if-then-else
привело к другому сообщению об ошибке. Может кто-нибудь подсказать, как определить Акерманна в Coq?
Program Fixpoint
ниже. Вы нашли решение сFunction
? - person Anton Trunov   schedule 30.06.2017