Coq で Ackermann-Peters 関数を定義しようとしていますが、理解できないエラー メッセージが表示されます。ご覧のとおりa, b
、Ackermann の引数をペアでパッケージ化していますab
。引数の順序付け関数を定義する順序付けを提供します。次に、Function
フォームを使用して Ackermann 自体を定義し、引数の順序付け関数を提供し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 で Ackermann を定義する方法を提案できますか?