Vous pouvez le faire avec une liste hétérogène, comme suit.
Require Vector.
Require Import List.
Import ListNotations.
Inductive hlist {A : Type} (B : A -> Type) : list A -> Type :=
| hnil : hlist B []
| hcons : forall a l, B a -> hlist B l -> hlist B (a :: l).
Definition vector_of_vectors (T : Type) (l : list nat) : Type :=
hlist (Vector.t T) l.
Ensuite, si l
est votre liste de longueurs, le type vector_of_vectors T l
avec la volonté du type que vous décrivez.
Par exemple, nous pouvons construire un élément de vector_of_vectors bool [2; 0; 1]
:
Section example.
Definition ls : list nat := [2; 0; 1].
Definition v : vector_of_vectors bool ls :=
hcons [false; true]
(hcons []
(hcons [true] hnil)).
End example.
Cet exemple utilise des notations pour les vecteurs que vous pouvez configurer comme ceci:
Arguments hnil {_ _}.
Arguments hcons {_ _ _ _} _ _.
Arguments Vector.nil {_}.
Arguments Vector.cons {_} _ {_} _.
Delimit Scope vector with vector.
Bind Scope vector with Vector.t.
Notation "[ ]" := (@Vector.nil _) : vector.
Notation "a :: v" := (@Vector.cons _ a _ v) : vector.
Notation " [ x ] " := (Vector.cons x Vector.nil) : vector.
Notation " [ x ; y ; .. ; z ] " := (Vector.cons x (Vector.cons y .. (Vector.cons z Vector.nil) ..)) : vector.
Open Scope vector.
Ou vous pouvez 'Importer Vector.VectorNotations.' –
Bon point. Malheureusement, 'VectorNotations' a un bug où la notation pour Vector.nil est déclarée comme' [] 'au lieu de' [] ', ce qui est la façon dont elle est déclarée pour List.nil. Ceci confond Coq en pensant '' [] 'est un jeton plutôt que deux jetons séparés et interfère avec mon utilisation de' [] 'pour List.nil. J'ai donc pris la triste habitude de ne jamais importer «VectorNotations». Ce bug est corrigé dans le maître, donc je vais désapprendre cette habitude un jour. –
On dirait qu'ils l'ont corrigé pour Coq 8.6.1. –