Tôi đang cố xác định hàm Ackermann-Peters trong Coq và tôi nhận được thông báo lỗi mà tôi không hiểu. Như bạn có thể thấy, tôi đang đóng gói các đối số a, b
của Ackermann theo cặp ab
; Tôi cung cấp một thứ tự xác định một hàm đặt hàng cho các đối số. Sau đó, tôi sử dụng biểu mẫu Function
để xác định chính Ackermann, cung cấp cho nó hàm đặt hàng cho đối số ab
.Lỗi khi xác định Ackermann trong 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.
Những gì tôi nhận được là thông báo lỗi sau:
Error: No such section variable or assumption:
ack
.
Tôi không chắc chắn những gì phiền Coq, nhưng tìm kiếm trên internet, tôi thấy một gợi ý có thể có vấn đề với việc sử dụng một đệ quy hàm được định nghĩa với một thứ tự hoặc một số đo, trong đó cuộc gọi đệ quy xuất hiện trong một trận đấu. Tuy nhiên, sử dụng các dự báo fst
và snd
và một if-then-else
đã tạo một thông báo lỗi khác. Ai đó có thể xin đề nghị làm thế nào để xác định Ackermann trong Coq?
Tôi đã gặp phải sự cố tương tự ngay hôm nay. Bạn đã tìm thấy một giải pháp? –
@AbhishekAnand Đã lâu rồi ... Tôi đã cung cấp giải pháp với 'Program Fixpoint' bên dưới. Bạn đã tìm thấy một giải pháp với 'Chức năng'? –
Không, tôi đã không làm vậy. Cảm ơn câu trả lời của bạn. –