internlm/Lean-Github huggingface dataset:
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
⊢ Function.updateITE V u a x = Function.updateITE V v a x
Tactic:
simp only [Function.updateITE]
Proof state after:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
⊢ (if x = u then a else V x) = if x = v then a else V x
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
⊢ (if x = u then a else V x) = if x = v then a else V x
Tactic:
simp only [if_neg a1_left]
Proof state after:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
⊢ V x = if x = v then a else V x
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
⊢ V x = if x = v then a else V x
Tactic:
split_ifs
Proof state after:
case pos
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
h✝ : x = v
⊢ V x = a

case neg
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
h✝ : ¬x = v
⊢ V x = V x
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
c2 : x = v
⊢ V x = a
Tactic:
case pos c2 =>
  subst c2
  tauto
Proof state after:
no goals
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
c2 : ¬x = v
⊢ V x = V x
Tactic:
case neg c2 =>
  rfl
Proof state after:
no goals
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
c2 : x = v
⊢ V x = a
Tactic:
subst c2
Proof state after:
D : Type
I : Interpretation D
u : VarName
a : D
head✝ : Definition
tail✝ : List Definition
phi : Formula
V : VarAssignment D
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn x F →
      ¬isBoundIn x F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V x a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u x F))
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn x phi →
      ¬isBoundIn x phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V x a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u x phi))
h2_right : ¬isBoundIn x phi
h1 : x ≠ u → ¬isFreeIn x phi
h2_left : x ≠ u
⊢ V x = a
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u : VarName
a : D
head✝ : Definition
tail✝ : List Definition
phi : Formula
V : VarAssignment D
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn x F →
      ¬isBoundIn x F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V x a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u x F))
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn x phi →
      ¬isBoundIn x phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V x a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u x phi))
h2_right : ¬isBoundIn x phi
h1 : x ≠ u → ¬isFreeIn x phi
h2_left : x ≠ u
⊢ V x = a
Tactic:
tauto
Proof state after:
no goals
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h2_right : ¬isBoundIn v phi
h1 : v ≠ u → ¬isFreeIn v phi
h2_left : v ≠ u
x : VarName
a1_left : ¬x = u
a1_right : isFreeIn x phi
c2 : ¬x = v
⊢ V x = V x
Tactic:
rfl
Proof state after:
no goals
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (exists_ x (Sub.Var.One.Rec.fastReplaceFree u v phi))
Tactic:
simp only [Holds]
Proof state after:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
⊢ (∃ d, Holds D I (Function.updateITE (Function.updateITE V u a) x d) (head✝ :: tail✝) phi) ↔
    ∃ d,
      Holds D I (Function.updateITE (Function.updateITE V v a) x d) (head✝ :: tail✝)
        (Sub.Var.One.Rec.fastReplaceFree u v phi)
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
⊢ (∃ d, Holds D I (Function.updateITE (Function.updateITE V u a) x d) (head✝ :: tail✝) phi) ↔
    ∃ d,
      Holds D I (Function.updateITE (Function.updateITE V v a) x d) (head✝ :: tail✝)
        (Sub.Var.One.Rec.fastReplaceFree u v phi)
Tactic:
first | apply forall_congr' | apply exists_congr
Proof state after:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
⊢ ∀ (a_1 : D),
    Holds D I (Function.updateITE (Function.updateITE V u a) x a_1) (head✝ :: tail✝) phi ↔
      Holds D I (Function.updateITE (Function.updateITE V v a) x a_1) (head✝ :: tail✝)
        (Sub.Var.One.Rec.fastReplaceFree u v phi)
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
⊢ ∀ (a_1 : D),
    Holds D I (Function.updateITE (Function.updateITE V u a) x a_1) (head✝ :: tail✝) phi ↔
      Holds D I (Function.updateITE (Function.updateITE V v a) x a_1) (head✝ :: tail✝)
        (Sub.Var.One.Rec.fastReplaceFree u v phi)
Tactic:
intro d
Proof state after:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ Holds D I (Function.updateITE (Function.updateITE V u a) x d) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE (Function.updateITE V v a) x d) (head✝ :: tail✝)
      (Sub.Var.One.Rec.fastReplaceFree u v phi)
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ Holds D I (Function.updateITE (Function.updateITE V u a) x d) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE (Function.updateITE V v a) x d) (head✝ :: tail✝)
      (Sub.Var.One.Rec.fastReplaceFree u v phi)
Tactic:
simp only [Function.updateITE_comm V v x d a h2_left]
Proof state after:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ Holds D I (Function.updateITE (Function.updateITE V u a) x d) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE (Function.updateITE V x d) v a) (head✝ :: tail✝)
      (Sub.Var.One.Rec.fastReplaceFree u v phi)
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ Holds D I (Function.updateITE (Function.updateITE V u a) x d) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE (Function.updateITE V x d) v a) (head✝ :: tail✝)
      (Sub.Var.One.Rec.fastReplaceFree u v phi)
Tactic:
simp only [Function.updateITE_comm V u x d a c1]
Proof state after:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ Holds D I (Function.updateITE (Function.updateITE V x d) u a) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE (Function.updateITE V x d) v a) (head✝ :: tail✝)
      (Sub.Var.One.Rec.fastReplaceFree u v phi)
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
case h
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ Holds D I (Function.updateITE (Function.updateITE V x d) u a) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE (Function.updateITE V x d) v a) (head✝ :: tail✝)
      (Sub.Var.One.Rec.fastReplaceFree u v phi)
Tactic:
apply phi_ih
Proof state after:
case h.h1
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ ¬isFreeIn v phi

case h.h2
D : Type
I : Interpretation D
u v : VarName
a : D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V : VarAssignment D) (F : Formula),
    ¬isFreeIn v F →
      ¬isBoundIn v F →
        (Holds D I (Function.updateITE V u a) tail✝ F ↔
          Holds D I (Function.updateITE V v a) tail✝ (Sub.Var.One.Rec.fastReplaceFree u v F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V : VarAssignment D),
    ¬isFreeIn v phi →
      ¬isBoundIn v phi →
        (Holds D I (Function.updateITE V u a) (head✝ :: tail✝) phi ↔
          Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v phi))
V : VarAssignment D
h1 : v ≠ x → ¬isFreeIn v phi
h2_left : v ≠ x
h2_right : ¬isBoundIn v phi
c1 : ¬u = x
d : D
⊢ ¬isBoundIn v phi