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))
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 : ¬isBoundIn v (exists_ x phi)
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x phi))
Tactic:
push_neg at h1
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
h2 : ¬isBoundIn v (exists_ x phi)
h1 : v ≠ x → ¬isFreeIn v phi
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x 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
h2 : ¬isBoundIn v (exists_ x phi)
h1 : v ≠ x → ¬isFreeIn v phi
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x phi))
Tactic:
simp only [isBoundIn] at h2
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
h2 : ¬(v = x ∨ isBoundIn v phi)
h1 : v ≠ x → ¬isFreeIn v phi
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x 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
h2 : ¬(v = x ∨ isBoundIn v phi)
h1 : v ≠ x → ¬isFreeIn v phi
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x phi))
Tactic:
push_neg at h2
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 : v ≠ x ∧ ¬isBoundIn v phi
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x 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 : v ≠ x ∧ ¬isBoundIn v phi
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x phi))
Tactic:
cases h2
Proof state after:
case intro
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
left✝ : v ≠ x
right✝ : ¬isBoundIn v phi
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x 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
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (Sub.Var.One.Rec.fastReplaceFree u v (exists_ x phi))
Tactic:
simp only [Sub.Var.One.Rec.fastReplaceFree]
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
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝)
      (if u = x then exists_ x phi else exists_ x (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
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ x phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝)
      (if u = x then exists_ x phi else exists_ x (Sub.Var.One.Rec.fastReplaceFree u v phi))
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))
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
h✝ : 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 phi)

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))
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
h✝ : ¬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))
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 phi)
Tactic:
case pos c1 =>
  subst c1
  apply Holds_coincide_Var
  intro x a1
  simp only [isFreeIn] at a1
  cases a1
  case h1.intro a1_left a1_right =>
    simp only [Function.updateITE]
    simp only [if_neg a1_left]
    split_ifs
    case pos c2 =>
      subst c2
      tauto
    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))
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 phi)
Tactic:
subst c1
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
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ u phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (exists_ u 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))
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
⊢ Holds D I (Function.updateITE V u a) (head✝ :: tail✝) (exists_ u phi) ↔
    Holds D I (Function.updateITE V v a) (head✝ :: tail✝) (exists_ u phi)
Tactic:
apply Holds_coincide_Var
Proof state after:
case 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))
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
⊢ ∀ (v_1 : VarName), isFreeIn v_1 (exists_ u phi) → Function.updateITE V u a v_1 = Function.updateITE V v a v_1
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
case 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))
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
⊢ ∀ (v_1 : VarName), isFreeIn v_1 (exists_ u phi) → Function.updateITE V u a v_1 = Function.updateITE V v a v_1
Tactic:
intro x a1
Proof state after:
case 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))
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 : isFreeIn x (exists_ u phi)
⊢ Function.updateITE V u a x = Function.updateITE V v a x
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
case 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))
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 : isFreeIn x (exists_ u phi)
⊢ Function.updateITE V u a x = Function.updateITE V v a x
Tactic:
simp only [isFreeIn] at a1
Proof state after:
case 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))
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 : ¬x = u ∧ isFreeIn x phi
⊢ Function.updateITE V u a x = Function.updateITE V v a x
Theorem: FOL.NV.replace_empty_Holds
Proof state before:
case 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))
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 : ¬x = u ∧ isFreeIn x phi
⊢ Function.updateITE V u a x = Function.updateITE V v a x
Tactic:
cases a1
Proof state after:
case h1.intro
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
left✝ : ¬x = u
right✝ : isFreeIn x phi
⊢ Function.updateITE V u a x = Function.updateITE V v a 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
⊢ Function.updateITE V u a x = Function.updateITE V v a x
Tactic:
case h1.intro a1_left a1_right =>
  simp only [Function.updateITE]
  simp only [if_neg a1_left]
  split_ifs
  case pos c2 =>
    subst c2
    tauto
  case neg c2 =>
    rfl
Proof state after:
no goals