Theorem: Lean4Lean.TrExpr.weakN_inv (Lean4Lean/Verify/Typing/Lemmas.lean)

State before:
env : VEnv
Δ Δ₂ : VLCtx
dk n k : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂
H : TrExpr env Us Δ₁ e e'
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) e dk
⊢ ∃ e', TrExpr env Us Δ e e'
Tactic:
induction H generalizing Δ Δ₂ dk k with
| @bvar e A Δ₁ i h1 =>
  suffices ∃ p, Δ.find? (.inl i) = some p from let ⟨_, h⟩ := this; ⟨_, .bvar h⟩
  simp [InScope] at hs
  induction W generalizing i e A Δ₁ with | @cons_bvar _ Δ₂ _ _ _ d W ih => ?_ | _ => cases hs
  obtain ⟨d, Δ₂, rfl, hΔ₁⟩ : ∃ d Δ₁', Δ₁ = (none, d) :: Δ₁' ∧
      VLCtx.IsDefEq env Us.length Δ₁' Δ₂ := by cases d <;> cases hΔ <;> exact ⟨_, _, rfl, ‹_›⟩
  simp [VLCtx.find?] at h1 ⊢
  rcases i with _ | i <;> simp [VLCtx.next, bind] at h1 ⊢
  obtain ⟨_, h1, _⟩ := h1
  have ⟨_, h1⟩ := ih h1 hΔ₁ (Nat.lt_of_succ_lt_succ hs)
  exact ⟨_, _, h1, rfl⟩
| @fvar e A _ fv h1 => let ⟨_, h⟩ := VLCtx.find?_eq_some.2 hs; exact ⟨_, .fvar h⟩
| sort h1 => exact ⟨_, .sort h1⟩
| const h1 h2 h3 => exact ⟨_, .const h1 h2 h3⟩
| app h1 h2 hf ha ih1 ih2 =>
  have hΔ₁ := hΔ.wf; have hΔ₂ := (hΔ.symm henv).wf
  let ⟨f₁, ih1⟩ := ih1 W hΔ hs.1
  let ⟨a₁, ih2⟩ := ih2 W hΔ hs.2
  have h1 := h1.defeqU_l henv hΔ₁.toCtx <| hf.uniq henv hΔ (ih1.weakN henv W hΔ₂)
  have h2 := h2.defeqU_l henv hΔ₁.toCtx <| ha.uniq henv hΔ (ih2.weakN henv W hΔ₂)
  have := VExpr.WF.weakN_iff henv hΔ₂.toCtx W.toCtx (e := f₁.app a₁)
  have := this.1 ⟨_, (h1.app h2).defeqDFC henv hΔ.defeqCtx⟩
  have ⟨_, _, h1, h2⟩ := this.app_inv henv (W.wf henv hΔ₂).toCtx
  exact ⟨_, .app h1 h2 ih1 ih2⟩
| lam h1 ht hb ih1 ih2 =>
  let ⟨_, h1⟩ := h1
  have hΔ₁ := hΔ.wf; have hΔ₂ := (hΔ.symm henv).wf
  let ⟨ty₁, ih1⟩ := ih1 W hΔ hs.1
  have htt := ht.uniq henv hΔ (ih1.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h1
  have ⟨_, ih2⟩ := ih2 (W.cons_bvar (.vlam _))
    (hΔ.cons (ofv := none) nofun <| .vlam htt) hs.2.fvars_cons
  have h1 := HasType.weakN_iff (A := .sort _) henv hΔ₂.toCtx W.toCtx
    |>.1 (htt.hasType.2.defeqDFC henv hΔ.defeqCtx)
  exact ⟨_, .lam ⟨_, h1⟩ ih1 ih2⟩
| forallE h1 h2 ht hb ih1 ih2 =>
  let ⟨_, h1⟩ := h1; let ⟨_, h2⟩ := h2
  have hΔ₁ := hΔ.wf; have hΔ₂ := (hΔ.symm henv).wf
  let ⟨ty₁, ih1⟩ := ih1 W hΔ hs.1
  have htt := ht.uniq henv hΔ (ih1.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h1
  have hΔ' := hΔ.cons (ofv := none) nofun <| .vlam htt
  have ⟨_, ih2⟩ := ih2 (W.cons_bvar (.vlam _)) hΔ' hs.2.fvars_cons
  have h1' := htt.hasType.2.defeqDFC henv hΔ.defeqCtx
  have h1 := HasType.weakN_iff (A := .sort _) henv hΔ₂.toCtx W.toCtx |>.1 h1'
  have hΔ₂' : VLCtx.WF _ _ ((none, .vlam _) :: _) := ⟨hΔ₂, nofun, _, h1'⟩
  have h2 := (HasType.weakN_iff (A := .sort _) henv hΔ₂'.toCtx (W.cons_bvar (.vlam _)).toCtx).1 <|
    hb.uniq henv hΔ' (ih2.weakN henv (W.cons_bvar _) hΔ₂')
    |>.of_l (Γ := _::_) henv ⟨hΔ₁.toCtx, _, htt.hasType.1⟩ h2
    |>.hasType.2.defeqDFC henv (.succ hΔ.defeqCtx htt)
  exact ⟨_, .forallE ⟨_, h1⟩ ⟨_, h2⟩ ih1 ih2⟩
| letE h1 ht hv hb ih1 ih2 ih3 =>
  have hΔ₁ := hΔ.wf; have hΔ₂ := (hΔ.symm henv).wf
  let ⟨ty₁, ih1⟩ := ih1 W hΔ hs.1
  let ⟨val₁, ih2⟩ := ih2 W hΔ hs.2.1
  have hvv := hv.uniq henv hΔ (ih2.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h1
  let ⟨_, h2⟩ := h1.isType henv hΔ₁.toCtx
  have htt := ht.uniq henv hΔ (ih1.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h2
  have ⟨_, ih3⟩ := ih3 (W.cons_bvar (.vlet ..)) (hΔ.cons nofun <| .vlet hvv htt) hs.2.2.fvars_cons
  have h1 := HasType.weakN_iff henv hΔ₂.toCtx W.toCtx
    |>.1 ((htt.defeqDF hvv).hasType.2.defeqDFC henv hΔ.defeqCtx)
  exact ⟨_, .letE h1 ih1 ih2 ih3⟩
| lit _ ih => let ⟨_, ih⟩ := ih W hΔ .toConstructor; exact ⟨_, .lit ih⟩
| mdata _ ih => let ⟨_, ih⟩ := ih W hΔ hs; exact ⟨_, .mdata ih⟩
| proj h1 h2 ih =>
  have hΔ₁ := hΔ.wf; have hΔ₂ := (hΔ.symm henv).wf
  let ⟨_, ih⟩ := ih W hΔ hs
  have htt := h1.uniq henv hΔ (ih.weakN henv W hΔ₂)
  have ⟨_, h2⟩ := h2.defeqDFC henv hΔ.defeqCtx htt
  have ⟨_, h2⟩ := h2.weakN_inv henv hΔ₂.toCtx W.toCtx
  exact ⟨_, .proj ih h2⟩
State after:
no goals

State before:
case bvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.bvar i) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.bvar i) e'
Tactic:
suffices ∃ p, Δ.find? (.inl i) = some p from let ⟨_, h⟩ := this; ⟨_, .bvar h⟩
State after:
case bvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.bvar i) dk
⊢ ∃ p, VLCtx.find? Δ (Sum.inl i) = some p

State before:
case bvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.bvar i) dk
⊢ ∃ p, VLCtx.find? Δ (Sum.inl i) = some p
Tactic:
simp [InScope] at hs
State after:
case bvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂
hs : i < dk
⊢ ∃ p, VLCtx.find? Δ (Sum.inl i) = some p

State before:
case bvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂
hs : i < dk
⊢ ∃ p, VLCtx.find? Δ (Sum.inl i) = some p
Tactic:
induction W generalizing i e A Δ₁ with | @cons_bvar _ Δ₂ _ _ _ d W ih => ?_ | _ => cases hs
State after:
case bvar.cons_bvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝ : VLCtx
dk k : Nat
Δ✝ Δ₂ : VLCtx
dk✝ n✝ k✝ : Nat
d : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ ((none, VLocalDecl.liftN d n✝ k✝) :: Δ₂)
hs : i < dk✝ + 1
⊢ ∃ p, VLCtx.find? ((none, d) :: Δ✝) (Sum.inl i) = some p

State before:
case bvar.cons_bvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝ : VLCtx
dk k : Nat
Δ✝ Δ₂ : VLCtx
dk✝ n✝ k✝ : Nat
d : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ ((none, VLocalDecl.liftN d n✝ k✝) :: Δ₂)
hs : i < dk✝ + 1
⊢ ∃ p, VLCtx.find? ((none, d) :: Δ✝) (Sum.inl i) = some p
Tactic:
obtain ⟨d, Δ₂, rfl, hΔ₁⟩ : ∃ d Δ₁', Δ₁ = (none, d) :: Δ₁' ∧
    VLCtx.IsDefEq env Us.length Δ₁' Δ₂ := by cases d <;> cases hΔ <;> exact ⟨_, _, rfl, ‹_›⟩
State after:
case bvar.cons_bvar.intro.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
i : Nat
hs : i < dk✝ + 1
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
h1 : VLCtx.find? ((none, d) :: Δ₂) (Sum.inl i) = some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
⊢ ∃ p, VLCtx.find? ((none, d✝) :: Δ✝) (Sum.inl i) = some p

State before:
case bvar.cons_bvar.intro.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
i : Nat
hs : i < dk✝ + 1
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
h1 : VLCtx.find? ((none, d) :: Δ₂) (Sum.inl i) = some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
⊢ ∃ p, VLCtx.find? ((none, d✝) :: Δ✝) (Sum.inl i) = some p
Tactic:
simp [VLCtx.find?] at h1 ⊢
State after:
case bvar.cons_bvar.intro.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
i : Nat
hs : i < dk✝ + 1
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
h1 :
  (match VLCtx.next none (Sum.inl i) with
    | none => some (VLocalDecl.value d, VLocalDecl.type d)
    | some v =>
      Option.bind (VLCtx.find? Δ₂ v) fun __discr =>
        some (VExpr.liftN (VLocalDecl.depth d) __discr.fst, VExpr.liftN (VLocalDecl.depth d) __discr.snd)) =
    some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
⊢ ∃ p,
    (match VLCtx.next none (Sum.inl i) with
      | none => some (VLocalDecl.value d✝, VLocalDecl.type d✝)
      | some v =>
        Option.bind (VLCtx.find? Δ✝ v) fun __discr =>
          some (VExpr.liftN (VLocalDecl.depth d✝) __discr.fst, VExpr.liftN (VLocalDecl.depth d✝) __discr.snd)) =
      some p

State before:
case bvar.cons_bvar.intro.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
i : Nat
hs : i < dk✝ + 1
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
h1 :
  (match VLCtx.next none (Sum.inl i) with
    | none => some (VLocalDecl.value d, VLocalDecl.type d)
    | some v =>
      Option.bind (VLCtx.find? Δ₂ v) fun __discr =>
        some (VExpr.liftN (VLocalDecl.depth d) __discr.fst, VExpr.liftN (VLocalDecl.depth d) __discr.snd)) =
    some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
⊢ ∃ p,
    (match VLCtx.next none (Sum.inl i) with
      | none => some (VLocalDecl.value d✝, VLocalDecl.type d✝)
      | some v =>
        Option.bind (VLCtx.find? Δ✝ v) fun __discr =>
          some (VExpr.liftN (VLocalDecl.depth d✝) __discr.fst, VExpr.liftN (VLocalDecl.depth d✝) __discr.snd)) =
      some p
Tactic:
rcases i with _ | i <;> simp [VLCtx.next, bind] at h1 ⊢
State after:
case bvar.cons_bvar.intro.intro.intro.succ
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
i : Nat
hs : Nat.succ i < dk✝ + 1
h1 :
  ∃ a,
    VLCtx.find? Δ₂ (Sum.inl i) = some a ∧
      VExpr.liftN (VLocalDecl.depth d) a.fst = e ∧ VExpr.liftN (VLocalDecl.depth d) a.snd = A
⊢ ∃ p a,
    VLCtx.find? Δ✝ (Sum.inl i) = some a ∧
      (VExpr.liftN (VLocalDecl.depth d✝) a.fst, VExpr.liftN (VLocalDecl.depth d✝) a.snd) = p

State before:
case bvar.cons_bvar.intro.intro.intro.succ
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
i : Nat
hs : Nat.succ i < dk✝ + 1
h1 :
  ∃ a,
    VLCtx.find? Δ₂ (Sum.inl i) = some a ∧
      VExpr.liftN (VLocalDecl.depth d) a.fst = e ∧ VExpr.liftN (VLocalDecl.depth d) a.snd = A
⊢ ∃ p a,
    VLCtx.find? Δ✝ (Sum.inl i) = some a ∧
      (VExpr.liftN (VLocalDecl.depth d✝) a.fst, VExpr.liftN (VLocalDecl.depth d✝) a.snd) = p
Tactic:
obtain ⟨_, h1, _⟩ := h1
State after:
case bvar.cons_bvar.intro.intro.intro.succ.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
i : Nat
hs : Nat.succ i < dk✝ + 1
w✝ : VExpr × VExpr
h1 : VLCtx.find? Δ₂ (Sum.inl i) = some w✝
right✝ : VExpr.liftN (VLocalDecl.depth d) w✝.fst = e ∧ VExpr.liftN (VLocalDecl.depth d) w✝.snd = A
⊢ ∃ p a,
    VLCtx.find? Δ✝ (Sum.inl i) = some a ∧
      (VExpr.liftN (VLocalDecl.depth d✝) a.fst, VExpr.liftN (VLocalDecl.depth d✝) a.snd) = p

State before:
case bvar.cons_bvar.intro.intro.intro.succ.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
i : Nat
hs : Nat.succ i < dk✝ + 1
w✝ : VExpr × VExpr
h1 : VLCtx.find? Δ₂ (Sum.inl i) = some w✝
right✝ : VExpr.liftN (VLocalDecl.depth d) w✝.fst = e ∧ VExpr.liftN (VLocalDecl.depth d) w✝.snd = A
⊢ ∃ p a,
    VLCtx.find? Δ✝ (Sum.inl i) = some a ∧
      (VExpr.liftN (VLocalDecl.depth d✝) a.fst, VExpr.liftN (VLocalDecl.depth d✝) a.snd) = p
Tactic:
have ⟨_, h1⟩ := ih h1 hΔ₁ (Nat.lt_of_succ_lt_succ hs)
State after:
case bvar.cons_bvar.intro.intro.intro.succ.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
i : Nat
hs : Nat.succ i < dk✝ + 1
w✝¹ : VExpr × VExpr
h1✝ : VLCtx.find? Δ₂ (Sum.inl i) = some w✝¹
right✝ : VExpr.liftN (VLocalDecl.depth d) w✝¹.fst = e ∧ VExpr.liftN (VLocalDecl.depth d) w✝¹.snd = A
w✝ : VExpr × VExpr
h1 : VLCtx.find? Δ✝ (Sum.inl i) = some w✝
⊢ ∃ p a,
    VLCtx.find? Δ✝ (Sum.inl i) = some a ∧
      (VExpr.liftN (VLocalDecl.depth d✝) a.fst, VExpr.liftN (VLocalDecl.depth d✝) a.snd) = p

State before:
case bvar.cons_bvar.intro.intro.intro.succ.intro.intro
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝¹ : VLCtx
dk k : Nat
Δ✝ Δ₂✝ : VLCtx
dk✝ n✝ k✝ : Nat
d✝ : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂✝ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂✝ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
d : VLocalDecl
Δ₂ : List (Option FVarId × VLocalDecl)
hΔ₁ : VLCtx.IsDefEq env (List.length Us) Δ₂ Δ₂✝
hΔ : VLCtx.IsDefEq env (List.length Us) ((none, d) :: Δ₂) ((none, VLocalDecl.liftN d✝ n✝ k✝) :: Δ₂✝)
i : Nat
hs : Nat.succ i < dk✝ + 1
w✝¹ : VExpr × VExpr
h1✝ : VLCtx.find? Δ₂ (Sum.inl i) = some w✝¹
right✝ : VExpr.liftN (VLocalDecl.depth d) w✝¹.fst = e ∧ VExpr.liftN (VLocalDecl.depth d) w✝¹.snd = A
w✝ : VExpr × VExpr
h1 : VLCtx.find? Δ✝ (Sum.inl i) = some w✝
⊢ ∃ p a,
    VLCtx.find? Δ✝ (Sum.inl i) = some a ∧
      (VExpr.liftN (VLocalDecl.depth d✝) a.fst, VExpr.liftN (VLocalDecl.depth d✝) a.snd) = p
Tactic:
exact ⟨_, _, h1, rfl⟩
State after:
no goals

State before:
case bvar.skip_fvar
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂ : VLCtx
dk k : Nat
Δ✝ Δ'✝ : VLCtx
n✝ : Nat
fv✝ : FVarId
d✝ : VLocalDecl
a✝ : VLCtx.LiftN Δ✝ Δ'✝ 0 n✝ 0
a_ih✝ :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ'✝ → i < 0 → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ ((some fv✝, d✝) :: Δ'✝)
hs : i < 0
⊢ ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
Tactic:
cases hs
State after:
no goals

State before:
env : VEnv
n : Nat
Δ₁✝ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
Δ Δ₂✝ : VLCtx
dk k : Nat
Δ✝ Δ₂ : VLCtx
dk✝ n✝ k✝ : Nat
d : VLocalDecl
W : VLCtx.LiftN Δ✝ Δ₂ dk✝ n✝ k✝
ih :
  ∀ {e A : VExpr} {Δ₁ : VLCtx} {i : Nat},
    VLCtx.find? Δ₁ (Sum.inl i) = some (e, A) →
      VLCtx.IsDefEq env (List.length Us) Δ₁ Δ₂ → i < dk✝ → ∃ p, VLCtx.find? Δ✝ (Sum.inl i) = some p
e A : VExpr
Δ₁ : VLCtx
i : Nat
h1 : VLCtx.find? Δ₁ (Sum.inl i) = some (e, A)
hΔ : VLCtx.IsDefEq env (List.length Us) Δ₁ ((none, VLocalDecl.liftN d n✝ k✝) :: Δ₂)
hs : i < dk✝ + 1
⊢ ∃ d Δ₁', Δ₁ = (none, d) :: Δ₁' ∧ VLCtx.IsDefEq env (List.length Us) Δ₁' Δ₂
Tactic:
cases d <;> cases hΔ <;> exact ⟨_, _, rfl, ‹_›⟩
State after:
no goals

State before:
case fvar
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ✝ : VLCtx
fv : FVarId
h1 : VLCtx.find? Δ✝ (Sum.inr fv) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.fvar fv) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.fvar fv) e'
Tactic:
let ⟨_, h⟩ := VLCtx.find?_eq_some.2 hs
State after:
case fvar
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ✝ : VLCtx
fv : FVarId
h1 : VLCtx.find? Δ✝ (Sum.inr fv) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.fvar fv) dk
w✝ : VExpr × VExpr
h : VLCtx.find? Δ (Sum.inr fv) = some w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.fvar fv) e'

State before:
case fvar
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e✝ : Expr
e' : VExpr
henv : Ordered env
e A : VExpr
Δ✝ : VLCtx
fv : FVarId
h1 : VLCtx.find? Δ✝ (Sum.inr fv) = some (e, A)
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.fvar fv) dk
w✝ : VExpr × VExpr
h : VLCtx.find? Δ (Sum.inr fv) = some w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.fvar fv) e'
Tactic:
exact ⟨_, .fvar h⟩
State after:
no goals

State before:
case sort
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
u✝ : Level
u'✝ : VLevel
Δ✝ : VLCtx
h1 : VLevel.ofLevel Us u✝ = some u'✝
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.sort u✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.sort u✝) e'
Tactic:
exact ⟨_, .sort h1⟩
State after:
no goals

State before:
case const
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
c✝ : Name
ci✝ : VConstant
us'✝ : List VLevel
Δ✝ : VLCtx
us✝ : List Level
h1 : env.constants c✝ = some (some ci✝)
h2 : List.mapM (VLevel.ofLevel Us) us✝ = some us'✝
h3 : List.length us✝ = ci✝.uvars
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.const c✝ us✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.const c✝ us✝) e'
Tactic:
exact ⟨_, .const h1 h2 h3⟩
State after:
no goals

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
have hΔ₁ := hΔ.wf
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
have hΔ₂ := (hΔ.symm henv).wf
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
let ⟨f₁, ih1⟩ := ih1 W hΔ hs.1
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
let ⟨a₁, ih2⟩ := ih2 W hΔ hs.2
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
have h1 := h1.defeqU_l henv hΔ₁.toCtx <| hf.uniq henv hΔ (ih1.weakN henv W hΔ₂)
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
have h2 := h2.defeqU_l henv hΔ₁.toCtx <| ha.uniq henv hΔ (ih2.weakN henv W hΔ₂)
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
have := VExpr.WF.weakN_iff henv hΔ₂.toCtx W.toCtx (e := f₁.app a₁)
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
this :
  VExpr.WF env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n (VExpr.app f₁ a₁) k) ↔
    VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
this :
  VExpr.WF env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n (VExpr.app f₁ a₁) k) ↔
    VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
have := this.1 ⟨_, (h1.app h2).defeqDFC henv hΔ.defeqCtx⟩
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
this✝ :
  VExpr.WF env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n (VExpr.app f₁ a₁) k) ↔
    VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
this : VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
this✝ :
  VExpr.WF env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n (VExpr.app f₁ a₁) k) ↔
    VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
this : VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
have ⟨_, _, h1, h2⟩ := this.app_inv henv (W.wf henv hΔ₂).toCtx
State after:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝¹ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝¹ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
this✝ :
  VExpr.WF env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n (VExpr.app f₁ a₁) k) ↔
    VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
this : VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
w✝¹ w✝ : VExpr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) f₁ (VExpr.forallE w✝¹ w✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ) a₁ w✝¹
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'

State before:
case app
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
f'✝ A✝ B✝ a'✝ : VExpr
Δ✝ : VLCtx
f✝ a✝ : Expr
h1✝¹ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) f'✝ (VExpr.forallE A✝ B✝)
h2✝¹ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) a'✝ A✝
hf : TrExpr env Us Δ✝ f✝ f'✝
ha : TrExpr env Us Δ✝ a✝ a'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) f✝ dk → ∃ e', TrExpr env Us Δ f✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) a✝ dk → ∃ e', TrExpr env Us Δ a✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.app f✝ a✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
f₁ : VExpr
ih1 : TrExpr env Us Δ f✝ f₁
a₁ : VExpr
ih2 : TrExpr env Us Δ a✝ a₁
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n f₁ k) (VExpr.forallE A✝ B✝)
h2✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) (VExpr.liftN n a₁ k) A✝
this✝ :
  VExpr.WF env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n (VExpr.app f₁ a₁) k) ↔
    VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
this : VExpr.WF env (List.length Us) (VLCtx.toCtx Δ) (VExpr.app f₁ a₁)
w✝¹ w✝ : VExpr
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) f₁ (VExpr.forallE w✝¹ w✝)
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ) a₁ w✝¹
⊢ ∃ e', TrExpr env Us Δ (Expr.app f✝ a✝) e'
Tactic:
exact ⟨_, .app h1 h2 ih1 ih2⟩
State after:
no goals

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1 : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
let ⟨_, h1⟩ := h1
State after:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
have hΔ₁ := hΔ.wf
State after:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
have hΔ₂ := (hΔ.symm henv).wf
State after:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
let ⟨ty₁, ih1⟩ := ih1 W hΔ hs.1
State after:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
have htt := ht.uniq henv hΔ (ih1.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h1
State after:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
have ⟨_, ih2⟩ := ih2 (W.cons_bvar (.vlam _))
  (hΔ.cons (ofv := none) nofun <| .vlam htt) hs.2.fvars_cons
State after:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
have h1 := HasType.weakN_iff (A := .sort _) henv hΔ₂.toCtx W.toCtx
  |>.1 (htt.hasType.2.defeqDFC henv hΔ.defeqCtx)
State after:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝¹)
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'

State before:
case lam
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lam name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝¹)
⊢ ∃ e', TrExpr env Us Δ (Expr.lam name✝ ty✝ body✝ bi✝) e'
Tactic:
exact ⟨_, .lam ⟨_, h1⟩ ih1 ih2⟩
State after:
no goals

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1 : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2 : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
let ⟨_, h1⟩ := h1
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2 : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2 : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
let ⟨_, h2⟩ := h2
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have hΔ₁ := hΔ.wf
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have hΔ₂ := (hΔ.symm henv).wf
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
let ⟨ty₁, ih1⟩ := ih1 W hΔ hs.1
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have htt := ht.uniq henv hΔ (ih1.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h1
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have hΔ' := hΔ.cons (ofv := none) nofun <| .vlam htt
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝¹ : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
w✝ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have ⟨_, ih2⟩ := ih2 (W.cons_bvar (.vlam _)) hΔ' hs.2.fvars_cons
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have h1' := htt.hasType.2.defeqDFC henv hΔ.defeqCtx
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have h1 := HasType.weakN_iff (A := .sort _) henv hΔ₂.toCtx W.toCtx |>.1 h1'
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝²)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝²)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have hΔ₂' : VLCtx.WF _ _ ((none, .vlam _) :: _) := ⟨hΔ₂, nofun, _, h1'⟩
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝²)
hΔ₂' : VLCtx.WF env (List.length Us) ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2 : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝²)
hΔ₂' : VLCtx.WF env (List.length Us) ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
have h2 := (HasType.weakN_iff (A := .sort _) henv hΔ₂'.toCtx (W.cons_bvar (.vlam _)).toCtx).1 <|
  hb.uniq henv hΔ' (ih2.weakN henv (W.cons_bvar _) hΔ₂')
  |>.of_l (Γ := _::_) henv ⟨hΔ₁.toCtx, _, htt.hasType.1⟩ h2
  |>.hasType.2.defeqDFC henv (.succ hΔ.defeqCtx htt)
State after:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝¹ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2✝ : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝²)
hΔ₂' : VLCtx.WF env (List.length Us) ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
h2 : HasType env (List.length Us) (VLCtx.toCtx ((none, VLocalDecl.vlam ty₁) :: Δ)) w✝ (VExpr.sort w✝¹)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'

State before:
case forallE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
ty'✝ body'✝ : VExpr
Δ✝ : VLCtx
ty✝ body✝ : Expr
name✝ : Name
bi✝ : BinderInfo
h1✝¹ : IsType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝
h2✝¹ : IsType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hb : TrExpr env Us ((none, VLocalDecl.vlam ty'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.forallE name✝ ty✝ body✝ bi✝) dk
w✝² : VLevel
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝²)
w✝¹ : VLevel
h2✝ : HasType env (List.length Us) (ty'✝ :: VLCtx.toCtx Δ✝) body'✝ (VExpr.sort w✝¹)
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
hΔ' :
  VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlam ty'✝) :: Δ✝)
    ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
w✝ : VExpr
ih2 : TrExpr env Us ((none, VLocalDecl.vlam ty₁) :: Δ) body✝ w✝
h1' : IsDefEq env (List.length Us) (VLCtx.toCtx Δ₂) (VExpr.liftN n ty₁ k) (VExpr.liftN n ty₁ k) (VExpr.sort w✝²)
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) ty₁ (VExpr.sort w✝²)
hΔ₂' : VLCtx.WF env (List.length Us) ((none, VLocalDecl.vlam (VExpr.liftN n ty₁ k)) :: Δ₂)
h2 : HasType env (List.length Us) (VLCtx.toCtx ((none, VLocalDecl.vlam ty₁) :: Δ)) w✝ (VExpr.sort w✝¹)
⊢ ∃ e', TrExpr env Us Δ (Expr.forallE name✝ ty✝ body✝ bi✝) e'
Tactic:
exact ⟨_, .forallE ⟨_, h1⟩ ⟨_, h2⟩ ih1 ih2⟩
State after:
no goals

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
have hΔ₁ := hΔ.wf
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
have hΔ₂ := (hΔ.symm henv).wf
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
let ⟨ty₁, ih1⟩ := ih1 W hΔ hs.1
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
let ⟨val₁, ih2⟩ := ih2 W hΔ hs.2.1
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
have hvv := hv.uniq henv hΔ (ih2.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h1
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
let ⟨_, h2⟩ := h1.isType henv hΔ₁.toCtx
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
have htt := ht.uniq henv hΔ (ih1.weakN henv W hΔ₂) |>.of_l henv hΔ₁.toCtx h2
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3 :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝)
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝)
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
have ⟨_, ih3⟩ := ih3 (W.cons_bvar (.vlet ..)) (hΔ.cons nofun <| .vlet hvv htt) hs.2.2.fvars_cons
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝¹ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih3 : TrExpr env Us ((none, VLocalDecl.vlet ty₁ val₁) :: Δ) body✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝¹ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih3 : TrExpr env Us ((none, VLocalDecl.vlet ty₁ val₁) :: Δ) body✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
have h1 := HasType.weakN_iff henv hΔ₂.toCtx W.toCtx
  |>.1 ((htt.defeqDF hvv).hasType.2.defeqDFC henv hΔ.defeqCtx)
State after:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝¹ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih3 : TrExpr env Us ((none, VLocalDecl.vlet ty₁ val₁) :: Δ) body✝ w✝
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) val₁ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'

State before:
case letE
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
val'✝ ty'✝ : VExpr
Δ✝ : VLCtx
ty✝ val✝ body✝ : Expr
body'✝ : VExpr
name✝ : Name
bi✝ : Bool
h1✝ : HasType env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ ty'✝
ht : TrExpr env Us Δ✝ ty✝ ty'✝
hv : TrExpr env Us Δ✝ val✝ val'✝
hb : TrExpr env Us ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) body✝ body'✝
ih1✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) ty✝ dk → ∃ e', TrExpr env Us Δ ty✝ e'
ih2✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) val✝ dk → ∃ e', TrExpr env Us Δ val✝ e'
ih3✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) ((none, VLocalDecl.vlet ty'✝ val'✝) :: Δ✝) Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) body✝ dk → ∃ e', TrExpr env Us Δ body✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.letE name✝ ty✝ val✝ body✝ bi✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
ty₁ : VExpr
ih1 : TrExpr env Us Δ ty✝ ty₁
val₁ : VExpr
ih2 : TrExpr env Us Δ val✝ val₁
hvv : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) val'✝ (VExpr.liftN n val₁ k) ty'✝
w✝¹ : VLevel
h2 : HasType env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.sort w✝¹)
htt : IsDefEq env (List.length Us) (VLCtx.toCtx Δ✝) ty'✝ (VExpr.liftN n ty₁ k) (VExpr.sort w✝¹)
w✝ : VExpr
ih3 : TrExpr env Us ((none, VLocalDecl.vlet ty₁ val₁) :: Δ) body✝ w✝
h1 : HasType env (List.length Us) (VLCtx.toCtx Δ) val₁ ty₁
⊢ ∃ e', TrExpr env Us Δ (Expr.letE name✝ ty✝ val✝ body✝ bi✝) e'
Tactic:
exact ⟨_, .letE h1 ih1 ih2 ih3⟩
State after:
no goals

State before:
case lit
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : VExpr
l✝ : Literal
a✝ : TrExpr env Us Δ✝ (Literal.toConstructor l✝) e✝
ih :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) (Literal.toConstructor l✝) dk →
          ∃ e', TrExpr env Us Δ (Literal.toConstructor l✝) e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lit l✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.lit l✝) e'
Tactic:
let ⟨_, ih⟩ := ih W hΔ .toConstructor
State after:
case lit
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : VExpr
l✝ : Literal
a✝ : TrExpr env Us Δ✝ (Literal.toConstructor l✝) e✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) (Literal.toConstructor l✝) dk →
          ∃ e', TrExpr env Us Δ (Literal.toConstructor l✝) e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lit l✝) dk
w✝ : VExpr
ih : TrExpr env Us Δ (Literal.toConstructor l✝) w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.lit l✝) e'

State before:
case lit
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : VExpr
l✝ : Literal
a✝ : TrExpr env Us Δ✝ (Literal.toConstructor l✝) e✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) (Literal.toConstructor l✝) dk →
          ∃ e', TrExpr env Us Δ (Literal.toConstructor l✝) e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.lit l✝) dk
w✝ : VExpr
ih : TrExpr env Us Δ (Literal.toConstructor l✝) w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.lit l✝) e'
Tactic:
exact ⟨_, .lit ih⟩
State after:
no goals

State before:
case mdata
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
d✝ : MData
a✝ : TrExpr env Us Δ✝ e✝ e'✝
ih :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.mdata d✝ e✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.mdata d✝ e✝) e'
Tactic:
let ⟨_, ih⟩ := ih W hΔ hs
State after:
case mdata
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
d✝ : MData
a✝ : TrExpr env Us Δ✝ e✝ e'✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.mdata d✝ e✝) dk
w✝ : VExpr
ih : TrExpr env Us Δ e✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.mdata d✝ e✝) e'

State before:
case mdata
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
d✝ : MData
a✝ : TrExpr env Us Δ✝ e✝ e'✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.mdata d✝ e✝) dk
w✝ : VExpr
ih : TrExpr env Us Δ e✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.mdata d✝ e✝) e'
Tactic:
exact ⟨_, .mdata ih⟩
State after:
no goals

State before:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'
Tactic:
have hΔ₁ := hΔ.wf
State after:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'

State before:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'
Tactic:
have hΔ₂ := (hΔ.symm henv).wf
State after:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'

State before:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'
Tactic:
let ⟨_, ih⟩ := ih W hΔ hs
State after:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝ : VExpr
ih : TrExpr env Us Δ e✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'

State before:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝ : VExpr
ih : TrExpr env Us Δ e✝ w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'
Tactic:
have htt := h1.uniq henv hΔ (ih.weakN henv W hΔ₂)
State after:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝ : VExpr
ih : TrExpr env Us Δ e✝ w✝
htt : IsDefEqU env (List.length Us) (VLCtx.toCtx Δ✝) e'✝ (VExpr.liftN n w✝ k)
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'

State before:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2 : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝ : VExpr
ih : TrExpr env Us Δ e✝ w✝
htt : IsDefEqU env (List.length Us) (VLCtx.toCtx Δ✝) e'✝ (VExpr.liftN n w✝ k)
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'
Tactic:
have ⟨_, h2⟩ := h2.defeqDFC henv hΔ.defeqCtx htt
State after:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2✝ : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝¹ : VExpr
ih : TrExpr env Us Δ e✝ w✝¹
htt : IsDefEqU env (List.length Us) (VLCtx.toCtx Δ✝) e'✝ (VExpr.liftN n w✝¹ k)
w✝ : VExpr
h2 : TrProj (VLCtx.toCtx Δ₂) s✝ i✝ (VExpr.liftN n w✝¹ k) w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'

State before:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2✝ : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝¹ : VExpr
ih : TrExpr env Us Δ e✝ w✝¹
htt : IsDefEqU env (List.length Us) (VLCtx.toCtx Δ✝) e'✝ (VExpr.liftN n w✝¹ k)
w✝ : VExpr
h2 : TrProj (VLCtx.toCtx Δ₂) s✝ i✝ (VExpr.liftN n w✝¹ k) w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'
Tactic:
have ⟨_, h2⟩ := h2.weakN_inv henv hΔ₂.toCtx W.toCtx
State after:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2✝¹ : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝² : VExpr
ih : TrExpr env Us Δ e✝ w✝²
htt : IsDefEqU env (List.length Us) (VLCtx.toCtx Δ✝) e'✝ (VExpr.liftN n w✝² k)
w✝¹ : VExpr
h2✝ : TrProj (VLCtx.toCtx Δ₂) s✝ i✝ (VExpr.liftN n w✝² k) w✝¹
w✝ : VExpr
h2 : TrProj (VLCtx.toCtx Δ) s✝ i✝ w✝² w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'

State before:
case proj
env : VEnv
n : Nat
Δ₁ : VLCtx
Us : List Name
e : Expr
e' : VExpr
henv : Ordered env
Δ✝ : VLCtx
e✝ : Expr
e'✝ : VExpr
s✝ : Name
i✝ : Nat
e''✝ : VExpr
h1 : TrExpr env Us Δ✝ e✝ e'✝
h2✝¹ : TrProj (VLCtx.toCtx Δ✝) s✝ i✝ e'✝ e''✝
ih✝ :
  ∀ {Δ Δ₂ : VLCtx} {dk k : Nat},
    VLCtx.LiftN Δ Δ₂ dk n k →
      VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂ →
        InScope (fun x => x ∈ VLCtx.fvars Δ) e✝ dk → ∃ e', TrExpr env Us Δ e✝ e'
Δ Δ₂ : VLCtx
dk k : Nat
W : VLCtx.LiftN Δ Δ₂ dk n k
hΔ : VLCtx.IsDefEq env (List.length Us) Δ✝ Δ₂
hs : InScope (fun x => x ∈ VLCtx.fvars Δ) (Expr.proj s✝ i✝ e✝) dk
hΔ₁ : VLCtx.WF env (List.length Us) Δ✝
hΔ₂ : VLCtx.WF env (List.length Us) Δ₂
w✝² : VExpr
ih : TrExpr env Us Δ e✝ w✝²
htt : IsDefEqU env (List.length Us) (VLCtx.toCtx Δ✝) e'✝ (VExpr.liftN n w✝² k)
w✝¹ : VExpr
h2✝ : TrProj (VLCtx.toCtx Δ₂) s✝ i✝ (VExpr.liftN n w✝² k) w✝¹
w✝ : VExpr
h2 : TrProj (VLCtx.toCtx Δ) s✝ i✝ w✝² w✝
⊢ ∃ e', TrExpr env Us Δ (Expr.proj s✝ i✝ e✝) e'
Tactic:
exact ⟨_, .proj ih h2⟩
State after:
no goals