je fold_length
défini comme ceci:pliant retour après déploiement
Inductive list (X: Type) : Type :=
| nil : list X
| cons : X -> list X -> list X.
Arguments nil {X}.
Arguments cons {X} _ _.
Notation "x :: y" := (cons x y)
(at level 60, right associativity).
Notation "[ ]" := nil.
Fixpoint fold {X Y:Type} (f: X -> Y -> Y) (l:list X) (b:Y) : Y :=
match l with
| nil => b
| h :: t => f h (fold f t b)
end.
Definition fold_length {X : Type} (l : list X) : nat :=
fold (fun _ n => S n) l 0.
Je dois prouver un théorème et c'est mon code à ce jour:
Theorem fold_length_correct : forall X (l : list X),
fold_length l = length l.
Proof.
intros X l.
induction l as [| n l' IHl'].
- simpl.
unfold fold_length.
simpl.
reflexivity.
- simpl.
unfold fold_length.
simpl.
En ce moment, mon but ressemble à ceci :
X : Type
n : X
l' : list X
IHl' : fold_length l' = length l'
============================
S (fold (fun (_ : X) (n0 : nat) => S n0) l' 0) = S (length l')
maintenant, je veux convertir l'expression (fold (fun (_ : X) (n0 : nat) => S n0) l' 0)
à fold_length l'
en utilisant la définition de fold_length
. Existe-t-il un moyen de faire cela dans Coq (Il semble y avoir quelque chose de tactique nommé fold
dans Coq. Est-ce que cela peut arriver?)?
Aussi, est-il un moyen de prouver le théorème ci-dessus sans l'utilisation de unfold
et fold
tactique?
Vous pouvez réécrire à droite 'now rewrite <- IHl'' ou utiliser un lemme auxiliaire:' Lemma fold_lengthE {X: Type} (l: liste X): fold_right (fun _ n => S n) 0 l = fold_length l. Preuve. maintenant trivial. Qed. 'alors réécrire en l'utilisant. – ejgallego
@ejgallego Merci. Donc, quelque chose comme «fold» ne peut pas être utilisé ici? – Sibi
Qu'est-ce que «fold»? AFAICT ce n'est pas dans le [stdlib] (https://coq.inria.fr/library/Coq.Lists.List.html). Veuillez fournir un exemple complet (avec les bonnes importations et définitions). – gallais