タイプの誘導原理は、命題P
についての単なる定理であることを読んだ。そこで私はList
の誘導原理を正しい(または逆の)リストコンストラクタに基づいて構築しました。Coqでカスタム誘導原理を使用するには?
Definition rcons {X:Type} (l:list X) (x:X) : list X :=
l ++ x::nil.
誘導原理自体は次のとおりです。
Definition true_for_nil {X:Type}(P:list X -> Prop) : Prop :=
P nil.
Definition true_for_list {X:Type} (P:list X -> Prop) : Prop :=
forall xs, P xs.
Definition preserved_by_rcons {X:Type} (P: list X -> Prop): Prop :=
forall xs' x, P xs' -> P (rcons xs' x).
Theorem list_ind_rcons:
forall {X:Type} (P:list X -> Prop),
true_for_nil P ->
preserved_by_rcons P ->
true_for_list P.
Proof. Admitted.
しかし、今、私は定理を使って問題を抱えています。 induction
の戦術と同じようにそれを実行する方法はありません。
は例えば、私が試した:
Theorem rev_app_dist: forall {X} (l1 l2:list X), rev (l1 ++ l2) = rev l2 ++ rev l1.
Proof. intros X l1 l2.
induction l2 using list_ind_rcons.
しかし、最後の行の
は、私が得た:Error: Cannot recognize an induction scheme.
定義し、list_ind_rcons
のようなカスタムの誘導の原理を適用するための正しい手順は何ですか?
ありがとうございました
あなたはそれを見つけていただきありがとうございます。(forall x l、P l - > P(l ++(x :: nil))) - > ' – gallais
@gallaisちょうどそれを固定した。 –