You can do this with a heterogeneous list, as shown below.
Require Vector. Require Import List. Import ListNotations. Inductive hlist {A : Type} (B : A -> Type) : list A -> Type := | hnil : hlist B [] | hcons : forall al, B a -> hlist B l -> hlist B (a :: l). Definition vector_of_vectors (T : Type) (l : list nat) : Type := hlist (Vector.t T) l.
Then, if l is your list of lengths, the type vector_of_vectors T l s will describe the type.
For example, we can build the element vector_of_vectors bool [2; 0; 1] vector_of_vectors bool [2; 0; 1] 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.
This example uses some notation for vectors, which you can configure as follows:
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.
James wilcox
source share