CoqでAckermann-Peters関数を定義しようとしていますが、わからないエラーメッセージが表示されています。ご覧のとおり、私はAckermannの引数a, b
を1組でパッケージ化しています。ab
;私は、引数の順序付け関数を定義する順序付けを提供します。次に、Function
形式を使用して、Ackermann自体を定義し、ab
引数の順序付け関数を提供します。私は何を得るCoqでAckermannを定義する際にエラーが発生しました。
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
.
私はコックを気にかわからないんだけど、インターネットを検索、私は提案は、再帰を使用してに問題がある可能性があり見つから関数は、順序付けまたはメジャーで定義され、再帰呼び出しは一致内で発生します。しかし、投影fst
とsnd
とif-then-else
を使用すると、異なるエラーメッセージが生成されました。誰かがCoqでAckermannを定義する方法をお勧めしますか?
今日も同じ問題が発生しました。あなたは解決策を見つけましたか? –
@AbhishekAnandそれはしばらくしています...下記の 'Program Fixpoint'の解決策を提供しました。あなたは 'Function'で解決策を見つけましたか? –
いいえ、私はしませんでした。ご回答有難うございます。 –