Theorem: FOL.NV.Holds_coincide_PredVar
Proof state before:
case cons.pred_const_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D),
    predVarOccursIn P ds.length (pred_const_ a✝¹ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (pred_const_ a✝¹ a✝) ↔ Holds D I' V (head✝ :: tail✝) (pred_const_ a✝¹ a✝)

case cons.pred_var_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D),
    predVarOccursIn P ds.length (pred_var_ a✝¹ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (pred_var_ a✝¹ a✝) ↔ Holds D I' V (head✝ :: tail✝) (pred_var_ a✝¹ a✝)

case cons.eq_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : VarName
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (eq_ a✝¹ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (eq_ a✝¹ a✝) ↔ Holds D I' V (head✝ :: tail✝) (eq_ a✝¹ a✝)

case cons.true_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length true_ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) true_ ↔ Holds D I' V (head✝ :: tail✝) true_

case cons.false_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length false_ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) false_ ↔ Holds D I' V (head✝ :: tail✝) false_

case cons.not_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝.not_ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) a✝.not_ ↔ Holds D I' V (head✝ :: tail✝) a✝.not_

case cons.imp_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (a✝¹.imp_ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (a✝¹.imp_ a✝) ↔ Holds D I' V (head✝ :: tail✝) (a✝¹.imp_ a✝)

case cons.and_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (a✝¹.and_ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (a✝¹.and_ a✝) ↔ Holds D I' V (head✝ :: tail✝) (a✝¹.and_ a✝)

case cons.or_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (a✝¹.or_ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (a✝¹.or_ a✝) ↔ Holds D I' V (head✝ :: tail✝) (a✝¹.or_ a✝)

case cons.iff_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (a✝¹.iff_ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (a✝¹.iff_ a✝) ↔ Holds D I' V (head✝ :: tail✝) (a✝¹.iff_ a✝)

case cons.forall_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (forall_ a✝¹ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (forall_ a✝¹ a✝) ↔ Holds D I' V (head✝ :: tail✝) (forall_ a✝¹ a✝)

case cons.exists_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (exists_ a✝¹ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (exists_ a✝¹ a✝) ↔ Holds D I' V (head✝ :: tail✝) (exists_ a✝¹ a✝)

case cons.def_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : DefName
a✝ : List VarName
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length (def_ a✝¹ a✝) → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I' V (head✝ :: tail✝) (def_ a✝¹ a✝)
Tactic:
all_goals
  simp only [predVarOccursIn] at h2
  simp only [Holds]
Proof state after:
case cons.pred_const_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), False → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ I.pred_const_ a✝¹ (List.map V a✝) ↔ I'.pred_const_ a✝¹ (List.map V a✝)

case cons.pred_var_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), P = a✝¹ ∧ ds.length = a✝.length → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ I.pred_var_ a✝¹ (List.map V a✝) ↔ I'.pred_var_ a✝¹ (List.map V a✝)

case cons.not_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ ¬Holds D I V (head✝ :: tail✝) a✝ ↔ ¬Holds D I' V (head✝ :: tail✝) a✝

case cons.imp_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D),
    predVarOccursIn P ds.length a✝¹ ∨ predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) a✝¹ → Holds D I V (head✝ :: tail✝) a✝ ↔
    Holds D I' V (head✝ :: tail✝) a✝¹ → Holds D I' V (head✝ :: tail✝) a✝

case cons.and_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D),
    predVarOccursIn P ds.length a✝¹ ∨ predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) a✝¹ ∧ Holds D I V (head✝ :: tail✝) a✝ ↔
    Holds D I' V (head✝ :: tail✝) a✝¹ ∧ Holds D I' V (head✝ :: tail✝) a✝

case cons.or_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D),
    predVarOccursIn P ds.length a✝¹ ∨ predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ Holds D I V (head✝ :: tail✝) a✝¹ ∨ Holds D I V (head✝ :: tail✝) a✝ ↔
    Holds D I' V (head✝ :: tail✝) a✝¹ ∨ Holds D I' V (head✝ :: tail✝) a✝

case cons.iff_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝¹ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝¹)
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 :
  ∀ (P : PredName) (ds : List D),
    predVarOccursIn P ds.length a✝¹ ∨ predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ (Holds D I V (head✝ :: tail✝) a✝¹ ↔ Holds D I V (head✝ :: tail✝) a✝) ↔
    (Holds D I' V (head✝ :: tail✝) a✝¹ ↔ Holds D I' V (head✝ :: tail✝) a✝)

case cons.forall_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ (∀ (d : D), Holds D I (Function.updateITE V a✝¹ d) (head✝ :: tail✝) a✝) ↔
    ∀ (d : D), Holds D I' (Function.updateITE V a✝¹ d) (head✝ :: tail✝) a✝

case cons.exists_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V (head✝ :: tail✝) a✝ ↔ Holds D I' V (head✝ :: tail✝) a✝)
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length a✝ → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ (∃ d, Holds D I (Function.updateITE V a✝¹ d) (head✝ :: tail✝) a✝) ↔
    ∃ d, Holds D I' (Function.updateITE V a✝¹ d) (head✝ :: tail✝) a✝

case cons.def_
D : Type
I I' : Interpretation D
h1 : I.pred_const_ = I'.pred_const_
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    (∀ (P : PredName) (ds : List D), predVarOccursIn P ds.length F → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)) →
      (Holds D I V tail✝ F ↔ Holds D I' V tail✝ F)
a✝¹ : DefName
a✝ : List VarName
V : VarAssignment D
h2 : ∀ (P : PredName) (ds : List D), False → (I.pred_var_ P ds ↔ I'.pred_var_ P ds)
⊢ (if a✝¹ = head✝.name ∧ a✝.length = head✝.args.length then
      Holds D I (Function.updateListITE V head✝.args (List.map V a✝)) tail✝ head✝.q
    else Holds D I V tail✝ (def_ a✝¹ a✝)) ↔
    if a✝¹ = head✝.name ∧ a✝.length = head✝.args.length then
      Holds D I' (Function.updateListITE V head✝.args (List.map V a✝)) tail✝ head✝.q
    else Holds D I' V tail✝ (def_ a✝¹ a✝)