induction ht generalizing t' <;> cases he
ctx : Ctx
t : Term
ty : Ty
t' : Term
ht : ctx ⊢ t ⋮ ty
he : t ⇒ t'
⊢ ctx ⊢ t' ⋮ ty
case app.app₁
ctx : Ctx
t : Term
ty : Ty
ctx✝ : Ctx
t₁✝ : Term
ty₁✝ ty₂✝ : Ty
t₂✝ : Term
a✝² : ctx✝ ⊢ t₁✝ ⋮ Ty.arrow ty₁✝ ty₂✝
a✝¹ : ctx✝ ⊢ t₂✝ ⋮ ty₁✝
a_ih✝¹ : ∀ {t' : Term}, t₁✝ ⇒ t' → ctx✝ ⊢ t' ⋮ Ty.arrow ty₁✝ ty₂✝
a_ih✝ : ∀ {t' : Term}, t₂✝ ⇒ t' → ctx✝ ⊢ t' ⋮ ty₁✝
t₁'✝ : Term
a✝ : t₁✝ ⇒ t₁'✝
⊢ ctx✝ ⊢ Term.app t₁'✝ t₂✝ ⋮ ty₂✝

case app.app₂
ctx : Ctx
t : Term
ty : Ty
ctx✝ : Ctx
ty₁✝ ty₂✝ : Ty
t₂✝ : Term
a✝² : ctx✝ ⊢ t₂✝ ⋮ ty₁✝
a_ih✝¹ : ∀ {t' : Term}, t₂✝ ⇒ t' → ctx✝ ⊢ t' ⋮ ty₁✝
t₂'✝ : Term
v₁✝ : Value
a✝¹ :
  ctx✝ ⊢
    match v₁✝ with
    | Value.abs ty body => Term.abs ty body ⋮
    Ty.arrow ty₁✝ ty₂✝
a_ih✝ :
  ∀ {t' : Term},
    (match v₁✝ with
        | Value.abs ty body => Term.abs ty body) ⇒
        t' →
      ctx✝ ⊢ t' ⋮ Ty.arrow ty₁✝ ty₂✝
a✝ : t₂✝ ⇒ t₂'✝
⊢ ctx✝ ⊢
    Term.app
      (match v₁✝ with
      | Value.abs ty body => Term.abs ty body)
      t₂'✝ ⋮
    ty₂✝

case app.beta
ctx : Ctx
t : Term
ty : Ty
ctx✝ : Ctx
ty₁✝ ty₂✝ ty✝ : Ty
t✝ : Term
v✝ : Value
a✝¹ : ctx✝ ⊢ Term.abs ty✝ t✝ ⋮ Ty.arrow ty₁✝ ty₂✝
a_ih✝¹ : ∀ {t' : Term}, Term.abs ty✝ t✝ ⇒ t' → ctx✝ ⊢ t' ⋮ Ty.arrow ty₁✝ ty₂✝
a✝ :
  ctx✝ ⊢
    match v✝ with
    | Value.abs ty body => Term.abs ty body ⋮
    ty₁✝
a_ih✝ :
  ∀ {t' : Term},
    (match v✝ with
        | Value.abs ty body => Term.abs ty body) ⇒
        t' →
      ctx✝ ⊢ t' ⋮ ty₁✝
⊢ ctx✝ ⊢
    Term.shift Dir.down 0
      t✝[0 ↦
        Term.shift Dir.up 0
          (match v✝ with
          | Value.abs ty body => Term.abs ty body)] ⋮
    ty₂✝