split_ifs
D : Type
I : Interpretation D
τ : PredName → PredName
hd : Definition
tl : List Definition
X : DefName
xs : List VarName
V : VarAssignment D
ih :
  ∀ (V : VarAssignment D) (F : Formula),
    Holds D I V tl (sub τ F) ↔
      Holds D
        { nonempty := ⋯, pred_const_ := I.pred_const_,
          pred_var_ := fun P ds => if ds = [] then I.pred_var_ (τ P) [] else I.pred_var_ P ds }
        V tl F
⊢ (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
        { nonempty := ⋯, pred_const_ := I.pred_const_,
          pred_var_ := fun P ds => if ds = [] then I.pred_var_ (τ P) (List.map V []) else I.pred_var_ P ds }
        (Function.updateListITE V hd.args (List.map V xs)) tl hd.q
    else
      Holds D
        { nonempty := ⋯, pred_const_ := I.pred_const_,
          pred_var_ := fun P ds => if ds = [] then I.pred_var_ (τ P) (List.map V []) else I.pred_var_ P ds }
        V tl (def_ X xs)
case pos
D : Type
I : Interpretation D
τ : PredName → PredName
hd : Definition
tl : List Definition
X : DefName
xs : List VarName
V : VarAssignment D
ih :
  ∀ (V : VarAssignment D) (F : Formula),
    Holds D I V tl (sub τ F) ↔
      Holds D
        { nonempty := ⋯, pred_const_ := I.pred_const_,
          pred_var_ := fun P ds => if ds = [] then I.pred_var_ (τ P) [] else I.pred_var_ P ds }
        V tl F
h✝ : X = hd.name ∧ xs.length = hd.args.length
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔
    Holds D
      { nonempty := ⋯, pred_const_ := I.pred_const_,
        pred_var_ := fun P ds => if ds = [] then I.pred_var_ (τ P) (List.map V []) else I.pred_var_ P ds }
      (Function.updateListITE V hd.args (List.map V xs)) tl hd.q

case neg
D : Type
I : Interpretation D
τ : PredName → PredName
hd : Definition
tl : List Definition
X : DefName
xs : List VarName
V : VarAssignment D
ih :
  ∀ (V : VarAssignment D) (F : Formula),
    Holds D I V tl (sub τ F) ↔
      Holds D
        { nonempty := ⋯, pred_const_ := I.pred_const_,
          pred_var_ := fun P ds => if ds = [] then I.pred_var_ (τ P) [] else I.pred_var_ P ds }
        V tl F
h✝ : ¬(X = hd.name ∧ xs.length = hd.args.length)
⊢ Holds D I V tl (def_ X xs) ↔
    Holds D
      { nonempty := ⋯, pred_const_ := I.pred_const_,
        pred_var_ := fun P ds => if ds = [] then I.pred_var_ (τ P) (List.map V []) else I.pred_var_ P ds }
      V tl (def_ X xs)