Theorem: FOL.NV.Sub.Var.One.Rec.substitution_theorem_aux
Proof state before:
case cons.pred_const_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (pred_const_ a✝¹ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (pred_const_ a✝¹ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (pred_const_ a✝¹ a✝))

case cons.pred_var_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (pred_var_ a✝¹ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (pred_var_ a✝¹ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (pred_var_ a✝¹ a✝))

case cons.eq_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : VarName
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (eq_ a✝¹ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (eq_ a✝¹ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (eq_ a✝¹ a✝))

case cons.true_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders true_
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) true_ ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t true_)

case cons.false_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders false_
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) false_ ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t false_)

case cons.not_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders a✝.not_
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝.not_ ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝.not_)

case cons.imp_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (a✝¹.imp_ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (a✝¹.imp_ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (a✝¹.imp_ a✝))

case cons.and_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (a✝¹.and_ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (a✝¹.and_ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (a✝¹.and_ a✝))

case cons.or_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (a✝¹.or_ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (a✝¹.or_ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (a✝¹.or_ a✝))

case cons.iff_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (a✝¹.iff_ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (a✝¹.iff_ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (a✝¹.iff_ a✝))

case cons.forall_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (forall_ a✝¹ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (forall_ a✝¹ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (forall_ a✝¹ a✝))

case cons.exists_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (exists_ a✝¹ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (exists_ a✝¹ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (exists_ a✝¹ a✝))

case cons.def_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : DefName
a✝ : List VarName
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders (def_ a✝¹ a✝)
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) (def_ a✝¹ a✝) ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t (def_ a✝¹ a✝))
Tactic:
all_goals
  simp only [fastAdmitsAux] at h1
  simp only [fastReplaceFree]
  simp only [Holds]
Proof state after:
case cons.pred_const_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
binders : Finset VarName
h1 : v ∈ a✝ → t ∉ binders
h2 : ∀ v ∉ binders, V' v = V v
⊢ I.pred_const_ a✝¹ (List.map (Function.updateITE V v (V' t)) a✝) ↔
    I.pred_const_ a✝¹ (List.map V (List.map (fun x => if v = x then t else x) a✝))

case cons.pred_var_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : PredName
a✝ : List VarName
V : VarAssignment D
binders : Finset VarName
h1 : v ∈ a✝ → t ∉ binders
h2 : ∀ v ∉ binders, V' v = V v
⊢ I.pred_var_ a✝¹ (List.map (Function.updateITE V v (V' t)) a✝) ↔
    I.pred_var_ a✝¹ (List.map V (List.map (fun x => if v = x then t else x) a✝))

case cons.eq_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : VarName
V : VarAssignment D
binders : Finset VarName
h1 : v = a✝¹ ∨ v = a✝ → t ∉ binders
h2 : ∀ v ∉ binders, V' v = V v
⊢ Function.updateITE V v (V' t) a✝¹ = Function.updateITE V v (V' t) a✝ ↔
    V (if v = a✝¹ then t else a✝¹) = V (if v = a✝ then t else a✝)

case cons.not_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders a✝
h2 : ∀ v ∉ binders, V' v = V v
⊢ ¬Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
    ¬Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝)

case cons.imp_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders a✝¹ ∧ fastAdmitsAux v t binders a✝
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ →
      Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹) → Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝)

case cons.and_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders a✝¹ ∧ fastAdmitsAux v t binders a✝
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ∧
      Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹) ∧ Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝)

case cons.or_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders a✝¹ ∧ fastAdmitsAux v t binders a✝
h2 : ∀ v ∉ binders, V' v = V v
⊢ Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ∨
      Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
    Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹) ∨ Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝)

case cons.iff_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ a✝ : Formula
a_ih✝¹ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝¹ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹))
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : fastAdmitsAux v t binders a✝¹ ∧ fastAdmitsAux v t binders a✝
h2 : ∀ v ∉ binders, V' v = V v
⊢ (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝¹ ↔
      Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝) ↔
    (Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝¹) ↔ Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))

case cons.forall_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : v = a✝¹ ∨ fastAdmitsAux v t (binders ∪ {a✝¹}) a✝
h2 : ∀ v ∉ binders, V' v = V v
⊢ (∀ (d : D), Holds D I (Function.updateITE (Function.updateITE V v (V' t)) a✝¹ d) (head✝ :: tail✝) a✝) ↔
    Holds D I V (head✝ :: tail✝) (if v = a✝¹ then forall_ a✝¹ a✝ else forall_ a✝¹ (fastReplaceFree v t a✝))

case cons.exists_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : VarName
a✝ : Formula
a_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName),
    fastAdmitsAux v t binders a✝ →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) (head✝ :: tail✝) a✝ ↔
          Holds D I V (head✝ :: tail✝) (fastReplaceFree v t a✝))
V : VarAssignment D
binders : Finset VarName
h1 : v = a✝¹ ∨ fastAdmitsAux v t (binders ∪ {a✝¹}) a✝
h2 : ∀ v ∉ binders, V' v = V v
⊢ (∃ d, Holds D I (Function.updateITE (Function.updateITE V v (V' t)) a✝¹ d) (head✝ :: tail✝) a✝) ↔
    Holds D I V (head✝ :: tail✝) (if v = a✝¹ then exists_ a✝¹ a✝ else exists_ a✝¹ (fastReplaceFree v t a✝))

case cons.def_
D : Type
I : Interpretation D
V' : VarAssignment D
v t : VarName
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (binders : Finset VarName) (F : Formula),
    fastAdmitsAux v t binders F →
      (∀ v ∉ binders, V' v = V v) →
        (Holds D I (Function.updateITE V v (V' t)) tail✝ F ↔ Holds D I V tail✝ (fastReplaceFree v t F))
a✝¹ : DefName
a✝ : List VarName
V : VarAssignment D
binders : Finset VarName
h1 : v ∈ a✝ → t ∉ binders
h2 : ∀ v ∉ binders, V' v = V v
⊢ (if a✝¹ = head✝.name ∧ a✝.length = head✝.args.length then
      Holds D I
        (Function.updateListITE (Function.updateITE V v (V' t)) head✝.args
          (List.map (Function.updateITE V v (V' t)) a✝))
        tail✝ head✝.q
    else Holds D I (Function.updateITE V v (V' t)) tail✝ (def_ a✝¹ a✝)) ↔
    if a✝¹ = head✝.name ∧ (List.map (fun x => if v = x then t else x) a✝).length = head✝.args.length then
      Holds D I (Function.updateListITE V head✝.args (List.map V (List.map (fun x => if v = x then t else x) a✝))) tail✝
        head✝.q
    else Holds D I V tail✝ (def_ a✝¹ (List.map (fun x => if v = x then t else x) a✝))