我讀到一種類型的歸納原理只是一個關於命題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的確,感謝您發現它。只是修復它。 –