Estoy intentando definir la función de Ackermann-Peters en Coq, y aparece un mensaje de error que no entiendo. Como puede ver, estoy empaquetando los argumentos a, b
de Ackermann en un par ab
; Proporciono un orden que define una función de orden para los argumentos. Luego utilizo el formulario Function
para definir Ackermann en sí, proporcionándole la función de ordenar para el argumento ab
.Error al definir Ackermann en 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.
Lo que se ve es el siguiente mensaje de error:
Error: No such section variable or assumption:
ack
.
No estoy seguro de lo que molesta Coq, pero buscando en internet, me encontré con una sugerencia que puede haber un problema con el uso de un recursivo función definida con un orden o una medida, donde la llamada recursiva ocurre dentro de una coincidencia. Sin embargo, al usar las proyecciones fst
y snd
y if-then-else
, se generó un mensaje de error diferente. ¿Puede alguien sugerir cómo definir a Ackermann en Coq?
Me encontré con el mismo problema hoy. ¿Encontraste una solución? –
@AbhishekAnand Ha pasado un tiempo ... Proporcioné una solución con 'Program Fixpoint' a continuación. ¿Encontró una solución con 'Function'? –
No, no lo hice. Gracias por tu respuesta. –