cases i
D : Type
V : VarAssignment D
j : ℕ
zs : List String
d : D
i : ℕ
⊢ shift D (V ∘ Var.openList j (List.map free_ zs)) d (bound_ i) =
    shift D V d (Var.openList (j + 1) (List.map free_ zs) (bound_ i))
case zero
D : Type
V : VarAssignment D
j : ℕ
zs : List String
d : D
⊢ shift D (V ∘ Var.openList j (List.map free_ zs)) d (bound_ 0) =
    shift D V d (Var.openList (j + 1) (List.map free_ zs) (bound_ 0))

case succ
D : Type
V : VarAssignment D
j : ℕ
zs : List String
d : D
n✝ : ℕ
⊢ shift D (V ∘ Var.openList j (List.map free_ zs)) d (bound_ (n✝ + 1)) =
    shift D V d (Var.openList (j + 1) (List.map free_ zs) (bound_ (n✝ + 1)))