私はCoqの2つのパラメータにネストされた再帰関数を定義しようとしています。部分的なアプリケーションでネストされた再帰
Require Import List.
Import ListNotations.
Fixpoint map_sequence2 {A B C : Set} (f : A -> B -> option C)
(xs : list A) (ys : list B) : option (list C) :=
match xs, ys with
| [], [] => Some []
| x :: xs, y :: ys =>
match f x y, map_sequence2 f xs ys with
| Some z, Some zs => Some (z :: zs)
| _, _ => None
end
| _, _ => None
end.
Inductive T : Set := TA | TB : list T -> T.
Definition max n m := if Nat.leb n m then m else n.
Fixpoint height (t : T) : nat :=
match t with
| TA => 1
| TB xs => 1 + List.fold_left max (List.map height xs) 0
end.
Function bar (t1 : T) (t2 : T) {measure height t2} : option T :=
match t1, t2 with
| TA, TA => Some TA
| TB xs, TB ys =>
match map_sequence2 bar xs ys with
| Some zs => Some (TB zs)
| None => None
end
| _, _ => None
end.
Proof.
Abort.
しかし、私は次のエラーを取得:
Error: No such section variable or assumption: bar.
にFunction
のドキュメントを明示的に述べている:
Function does not support partial application of the function being defined.
しかし、これはまさに私の場合です。そのような場合の戦略は何ですか?
ありがとうございます!終了オラクルをよりよく知るための文献がありますか? – authchir
マニュアルには[この説明](https://coq.inria.fr/distrib/current/refman/gallina.html#sec57)があります。そしておそらく、[このCocricoの記事](https://coq.inria.fr/cocorico/CoqTerminationDiscussion)が役に立ちます。 –