J'ai besoin de raisonner sur les permutations de vecteurs dans Coq. La bibliothèque standard inclut uniquement des définitions de permutation pour les listes. Comme ma première tentative, j'ai essayé de l'imiter pour les vecteurs comme:Permutations de vecteur Coq
Inductive VPermutation: forall n, vector A n -> vector A n -> Prop :=
| vperm_nil: VPermutation 0 [] []
| vperm_skip {n} x l l' : VPermutation n l l' -> VPermutation (S n) (x::l) (x::l')
| vperm_swap {n} x y l : VPermutation (S (S n)) (y::x::l) (x::y::l)
| vperm_trans {n} l l' l'' :
VPermutation n l l' -> VPermutation n l' l'' -> VPermutation n l l''.
Je suis vite rendu compte qu'il ya beaucoup de lemmes de permutation, déjà fait leurs preuves sur les listes qui doit être aussi éprouvée pour les vecteurs. Il est beaucoup de travail, et je pensais que peut-être que je peux prendre un raccourci en prouvant le lemme suivant:
Lemma ListVecPermutation {n} {l1 l2} {v1 v2}:
l1 = list_of_vec v1 ->
l2 = list_of_vec v2 ->
Permutation l1 l2 ->
VPermutation A n v1 v2.
Proof.
Il me permettrait de réutiliser lemmes de permutation de liste pour des vecteurs aussi longtemps que je peux montrer que les vecteurs pourraient être convertis en listes correspondantes.
À côté: J'utilise la définition list_of_vec
de la bibliothèque coq-color
car il semble être plus facile à raisonner que VectorDef.to_list
.
Fixpoint list_of_vec n (v : vector A n) : list A :=
match v with
| Vnil => nil
| Vcons x v => x :: list_of_vec v
end.
En supposant que ce lemme soit terminé, il est difficile de le faire. J'ai essayé de le faire par induction:
Proof.
intros H1 H2 P.
revert H1 H2.
dependent induction P.
-
intros H1 H2.
dep_destruct v1; auto.
dep_destruct v2; auto.
inversion H1.
-
Mais il me laisse avec hypotehsis inductive qui est pas suffisamment généralisé et dépend de v1
et v2
:
IHP : l = list_of_vec v1 -> l' = list_of_vec v2 -> VPermutation A n v1 v2
Je serai heureux d'entendre des suggestions sur la approche en général et ma formulation de celui-ci.
P.S. L'exemple autonome complet: https://gist.github.com/vzaliva/c31300aa484ff6ad2089cb0c45c3828a
Pour les permutations, vous feriez mieux de travailler avec la bibliothèque 'seq' et' tuple' disponible dans math-comp. – ejgallego