internlm/Lean-Github huggingface dataset:
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case h
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
⊢ ∀ (a : D), Holds D I (Function.updateITE V x a) E phi ↔ Holds D I (Function.updateITE V' x a) E phi'
Tactic:
intro d
Proof state after:
case h
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
⊢ Holds D I (Function.updateITE V x d) E phi ↔ Holds D I (Function.updateITE V' x d) E phi'
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
⊢ (∀ (d : D), Holds D I (Function.updateITE V x d) E phi) ↔ ∀ (d : D), Holds D I (Function.updateITE V' x d) E phi'
Tactic:
apply forall_congr'
Proof state after:
case h
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
⊢ ∀ (a : D), Holds D I (Function.updateITE V x a) E phi ↔ Holds D I (Function.updateITE V' x a) E phi'
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
⊢ (∃ d, Holds D I (Function.updateITE V x d) E phi) ↔ ∃ d, Holds D I (Function.updateITE V' x d) E phi'
Tactic:
apply exists_congr
Proof state after:
case h
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
⊢ ∀ (a : D), Holds D I (Function.updateITE V x a) E phi ↔ Holds D I (Function.updateITE V' x a) E phi'
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case h.h2
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
⊢ ∀ (v : VarName),
    v ∈ binders' ∨ v = x → Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
intro v a1
Proof state after:
case h.h2
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case h.h2
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
by_cases c1 : v = x
Proof state after:
case pos
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)

case neg
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : ¬v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case pos
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
simp only [Function.updateITE]
Proof state after:
case pos
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : v = x
⊢ (if v = x then d else V v) = if (if v = x then x else σ' v) = x then d else V' (if v = x then x else σ' v)
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case pos
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : v = x
⊢ (if v = x then d else V v) = if (if v = x then x else σ' v) = x then d else V' (if v = x then x else σ' v)
Tactic:
simp only [if_pos c1]
Proof state after:
case pos
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : v = x
⊢ d = if True then d else V' x
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case pos
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : v = x
⊢ d = if True then d else V' x
Tactic:
simp
Proof state after:
no goals
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case neg
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : ¬v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
simp only [Function.updateITE]
Proof state after:
case neg
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : ¬v = x
⊢ (if v = x then d else V v) = if (if v = x then x else σ' v) = x then d else V' (if v = x then x else σ' v)
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case neg
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : ¬v = x
⊢ (if v = x then d else V v) = if (if v = x then x else σ' v) = x then d else V' (if v = x then x else σ' v)
Tactic:
simp only [if_neg c1]
Proof state after:
case neg
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : ¬v = x
⊢ V v = if σ' v = x then d else V' (σ' v)
Theorem: FOL.NV.Sub.Var.All.Ind.substitution_theorem_aux
Proof state before:
case neg
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
a1 : v ∈ binders' ∨ v = x
c1 : ¬v = x
⊢ V v = if σ' v = x then d else V' (σ' v)
Tactic:
cases a1
Proof state after:
case neg.inl
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
c1 : ¬v = x
h✝ : v ∈ binders'
⊢ V v = if σ' v = x then d else V' (σ' v)

case neg.inr
D : Type
I : Interpretation D
E : Env
σ : VarName → VarName
binders : Finset VarName
F F' : Formula
σ' : VarName → VarName
binders' : Finset VarName
x : VarName
phi phi' : Formula
a✝ : IsSubAux (Function.updateITE σ' x x) (binders' ∪ {x}) phi phi'
V V' : VarAssignment D
h2 : ∀ v ∈ binders', V v = V' (σ' v)
h3 : ∀ (v : VarName), σ' v ∉ binders' → V v = V' (σ' v)
h4 : ∀ v ∈ binders', v = σ' v
ih_2 :
  ∀ (V V' : VarAssignment D),
    (∀ (v : VarName), v ∈ binders' ∨ v = x → V v = V' (Function.updateITE σ' x x v)) →
      (∀ (v : VarName),
          Function.updateITE σ' x x v ∉ binders' →
            ¬Function.updateITE σ' x x v = x → V v = V' (Function.updateITE σ' x x v)) →
        (∀ (v : VarName), v ∈ binders' ∨ v = x → v = Function.updateITE σ' x x v) →
          (Holds D I V E phi ↔ Holds D I V' E phi')
s1 : ∀ (v : VarName), ¬v = x → v ∈ binders' → ¬σ' v = x
d : D
v : VarName
c1 : ¬v = x
h✝ : v = x
⊢ V v = if σ' v = x then d else V' (σ' v)