Ho letto che il principio di induzione per un tipo è solo un teorema su una proposizione P
. Quindi ho costruito un principio di induzione per List
basato sul costruttore di elenchi destro (o inverso).Come utilizzare un principio di induzione personalizzato in Coq?
Definition rcons {X:Type} (l:list X) (x:X) : list X :=
l ++ x::nil.
Il principio di induzione è di per sé:
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.
Ma ora, sto avendo problemi con il teorema. Non so come invocarlo per ottenere lo stesso risultato della tattica induction
.
Per esempio, ho provato:
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.
Ma nell'ultima riga, ho ottenuto:
Error: Cannot recognize an induction scheme.
Quali sono i passi corretti per definire e applicare un principio di induzione personalizzato come list_ind_rcons
?
Grazie
Penso che intendevate '(per tutti x l, P l -> P (l ++ (x :: nil))) ->' – gallais
@gallais infatti, grazie per averlo individuato. Appena risolto –