exists tailVal
α₁ σ₁ : Type
ε₁ : σ₁ → Type
δ₁ : Dialect α₁ σ₁ ε₁
α₂ σ₂ : Type
ε₂ : σ₂ → Type
δ₂ : Dialect α₂ σ₂ ε₂
α σ : Type
ε : σ → Type
δ : Dialect α σ ε
argsHead : TypedArg δ
argsTail : TypedArgs δ
env : SSAEnv δ
res : Unit
env' : SSAEnv δ
headVal : SSAVal
tailVal : List SSAVal
H :
  (match headVal :: tailVal with
      | [] => TopM.raiseUB "not enough names in denoteTypedArgs"
      | name :: names => do
        TopM.set argsHead.fst name argsHead.snd
        denoteTypedArgs argsTail names)
      env =
    Except.ok (res, env')
⊢ ∃ valTail,
    headVal :: tailVal = headVal :: valTail ∧
      TopM.set argsHead.fst headVal argsHead.snd env =
          Except.ok ((), SSAEnv.set headVal argsHead.fst argsHead.snd env) ∧
        denoteTypedArgs argsTail valTail (SSAEnv.set headVal argsHead.fst argsHead.snd env) = Except.ok ((), env')
α₁ σ₁ : Type
ε₁ : σ₁ → Type
δ₁ : Dialect α₁ σ₁ ε₁
α₂ σ₂ : Type
ε₂ : σ₂ → Type
δ₂ : Dialect α₂ σ₂ ε₂
α σ : Type
ε : σ → Type
δ : Dialect α σ ε
argsHead : TypedArg δ
argsTail : TypedArgs δ
env : SSAEnv δ
res : Unit
env' : SSAEnv δ
headVal : SSAVal
tailVal : List SSAVal
H :
  (match headVal :: tailVal with
      | [] => TopM.raiseUB "not enough names in denoteTypedArgs"
      | name :: names => do
        TopM.set argsHead.fst name argsHead.snd
        denoteTypedArgs argsTail names)
      env =
    Except.ok (res, env')
⊢ headVal :: tailVal = headVal :: tailVal ∧
    TopM.set argsHead.fst headVal argsHead.snd env = Except.ok ((), SSAEnv.set headVal argsHead.fst argsHead.snd env) ∧
      denoteTypedArgs argsTail tailVal (SSAEnv.set headVal argsHead.fst argsHead.snd env) = Except.ok ((), env')