Section squeeze.
Context {A:Type} (x:A).
Notation vec := (Vector.t A).
Fixpoint squeeze {n} (v:vec n) (i:Fin.t (S n)) {struct i} : vec (S n) :=
match i in Fin.t (S _n) return vec _n -> vec (S _n)
with
| @Fin.F1 n' => fun v' => Vector.cons _ x _ v'
| @Fin.FS n' i' =>
fun v' =>
match n' as _n return vec _n -> Fin.t _n -> vec (S _n)
with
| 0 => fun u i' => False_rect _ (fin_0_absurd i')
| S m =>
fun (u:vec (S m)) =>
match u in Vector.t _ (S _m)
return Fin.t (S _m) -> vec (S (S _m))
with
| Vector.nil _ => tt
| Vector.cons _ h _ u' =>
fun j' => Vector.cons _ h _ admit (* (squeeze u' j') *)
end
end v' i'
end v.
End squeeze.

Lemma squeeze_nth (A:Type) (x:A) (n:nat) (v:Vector.t A n) p i :
Vector.nth (squeeze x v p) i = match lower p i with
| Some j => Vector.nth v j
| None => x
end.