case
  forall_not_free_in h1_x h1_phi h1_v h1_t h1_1
| exists_not_free_in h1_x h1_phi h1_v h1_t h1_1 =>
  simp only [isFreeIn] at h1_1
  simp at h1_1
  simp only [Holds]
  first | apply forall_congr' | apply exists_congr
  intro d
  apply Holds_coincide_Var
  intro x a1
  simp only [Function.updateITE]
  split_ifs
  case _ c1 =>
    rfl
  case _ c1 c2 =>
    subst c2
    tauto
  case _ c1 c2 =>
    rfl
D : Type
I : Interpretation D
E : Env
v t : VarName
F F' : Formula
h1_x : VarName
h1_phi : Formula
h1_v h1_t : VarName
h1_1 : ¬isFreeIn h1_v (exists_ h1_x h1_phi)
V : VarAssignment D
⊢ Holds D I (Function.updateITE V h1_v (V h1_t)) E (exists_ h1_x h1_phi) ↔ Holds D I V E (exists_ h1_x h1_phi)
no goals