simp at *
ctx : Ctx
t : Term
ty : Ty
ctx✝ : Ctx
ty₁✝ ty₂✝ ty✝ : Ty
t✝ : Term
v✝ : Value
ht₁ : ctx✝ ⊢ Term.abs ty✝ t✝ ⋮ Ty.arrow ty₁✝ ty₂✝
a_ih✝¹ : ∀ {t' : Term}, Term.abs ty✝ t✝ ⇒ t' → ctx✝ ⊢ t' ⋮ Ty.arrow ty₁✝ ty₂✝
ht₂ :
  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₂✝
ctx : Ctx
t : Term
ty : Ty
ctx✝ : Ctx
ty₁✝ ty₂✝ ty✝ : Ty
t✝ : Term
v✝ : Value
ht₁ : ctx✝ ⊢ Term.abs ty✝ t✝ ⋮ Ty.arrow ty₁✝ ty₂✝
a_ih✝¹ : ∀ {t' : Term}, Term.abs ty✝ t✝ ⇒ t' → ctx✝ ⊢ t' ⋮ Ty.arrow ty₁✝ ty₂✝
ht₂ : ctx✝ ⊢ Term.abs v✝.1 v✝.2 ⋮ ty₁✝
a_ih✝ : ∀ {t' : Term}, Term.abs v✝.1 v✝.2 ⇒ t' → ctx✝ ⊢ t' ⋮ ty₁✝
⊢ ctx✝ ⊢ Term.shift Dir.down 0 t✝[0 ↦ Term.shift Dir.up 0 (Term.abs v✝.1 v✝.2)] ⋮ ty₂✝