case cons.def_ hd tl ih X xs =>
  split_ifs
  case pos c1 =>
    apply ih
    intro v a1
    simp only [isFreeIn_iff_mem_freeVarSet v hd.q] at a1
    have s1 : v ∈ List.toFinset hd.args
    apply Finset.mem_of_subset hd.h1 a1
    simp only [List.mem_toFinset] at s1
    apply Function.updateListITE_fun_coincide_mem_eq_len V V' hd.args xs v h1 s1
    tauto
  case neg c1 =>
    apply ih
    tauto
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (F : Formula),
    (∀ (v : VarName), isFreeIn v F → V v = V' v) → (Holds D I V tl F ↔ Holds D I V' tl F)
X : DefName
xs : List VarName
V V' : VarAssignment D
h1 : ∀ v ∈ xs, V v = V' v
⊢ (if X = hd.name ∧ xs.length = hd.args.length then Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q
    else Holds D I V tl (def_ X xs)) ↔
    if X = hd.name ∧ xs.length = hd.args.length then
      Holds D I (Function.updateListITE V' hd.args (List.map V' xs)) tl hd.q
    else Holds D I V' tl (def_ X xs)
no goals