Program Instance vectorOfUnsized {A} (k : nat) (g : G A)
`{Unsized _ g } : Unsized (vectorOf k g).
Next Obligation.
rewrite ! semVectorOfSize.
split; move => [H1 H2]; split => //; by rewrite unsized; eauto.
Qed.
Program Instance vectorOfMonotonic {A} (k : nat) (g : G A)
`{SizeMonotonic _ g } : SizeMonotonic (vectorOf k g).
Next Obligation.
rewrite ! semVectorOfSize.
move => l [H1 H2]; split => // a Ha. by eapply (monotonic H0); eauto.
Qed.

(* Specifications: *)
Lemma semListOfSize {A : Type} (g : G A) size :
semGenSize (listOf g) size <-->
[set l | length l <= size /\ l \subset (semGenSize g size)].
Lemma semListOfUnsized {A} (g : G A) (k : nat) `{Unsized _ g} :
semGen (listOf g) <--> [set l | l \subset semGen g ].