Theorem: FOL.NV.Sub.Var.All.Rec.substitution_theorem_aux (FOL/NV/Sub/Var/All/Rec/Admits.lean)

State before:
D : Type
I : Interpretation D
V V' : VarAssignment D
E : Env
σ σ' : VarName → VarName
binders : Finset VarName
F : Formula
h1 : admitsAux σ binders F
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V E F ↔ Holds D I V' E (fastReplaceFree σ' F)
Tactic:
induction E generalizing F binders V V' σ σ'
State after:
case nil
D : Type
I : Interpretation D
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
F : Formula
h1 : admitsAux σ binders F
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V [] F ↔ Holds D I V' [] (fastReplaceFree σ' F)

case cons
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
F : Formula
h1 : admitsAux σ binders F
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) F ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' F)

State before:
case cons
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
F : Formula
h1 : admitsAux σ binders F
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) F ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' F)
Tactic:
induction F generalizing binders V V' σ σ'
State after:
case cons.pred_const_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : PredName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders (pred_const_ a✝¹ a✝)
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (pred_const_ a✝¹ a✝) ↔
    Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' (pred_const_ a✝¹ a✝))

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

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

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

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

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

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

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

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

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

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

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

case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders (def_ a✝¹ a✝)
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' (def_ a✝¹ a✝))

State before:
case cons.pred_const_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : PredName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders (pred_const_ a✝¹ a✝)
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (pred_const_ a✝¹ a✝) ↔
    Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' (pred_const_ a✝¹ a✝))

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

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

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

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

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

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

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

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

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

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

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

case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders (def_ a✝¹ a✝)
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' (def_ a✝¹ a✝))
Tactic:
all_goals
  simp only [admitsAux] at h1
  simp only [fastReplaceFree]
  simp only [Holds]
State after:
case cons.pred_const_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : PredName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ a✝, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ I.pred_const_ a✝¹ (List.map V a✝) ↔ I.pred_const_ a✝¹ (List.map V' (List.map σ' a✝))

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

case cons.eq_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ a✝ : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : (a✝¹ ∉ binders → σ a✝¹ ∉ binders) ∧ (a✝ ∉ binders → σ a✝ ∉ binders)
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ V a✝¹ = V a✝ ↔ V' (σ' a✝¹) = V' (σ' a✝)

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

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

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

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

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

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

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

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

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ¬Holds D I V (head✝ :: tail✝) phi ↔ ¬Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi)
Tactic:
case not_ phi phi_ih =>
  congr! 1
  exact phi_ih V V' σ σ' binders h1 h2 h2' h3
State after:
no goals

State before:
case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders (def_ a✝¹ a✝)
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' (def_ a✝¹ a✝))
Tactic:
simp only [admitsAux] at h1
State after:
case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ a✝, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' (def_ a✝¹ a✝))

State before:
case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ a✝, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' (def_ a✝¹ a✝))
Tactic:
simp only [fastReplaceFree]
State after:
case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ a✝, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I V' (head✝ :: tail✝) (def_ a✝¹ (List.map σ' a✝))

State before:
case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ a✝, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) (def_ a✝¹ a✝) ↔ Holds D I V' (head✝ :: tail✝) (def_ a✝¹ (List.map σ' a✝))
Tactic:
simp only [Holds]
State after:
case cons.def_
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
a✝¹ : DefName
a✝ : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ a✝, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ (if a✝¹ = head✝.name ∧ a✝.length = head✝.args.length then
      Holds D I (Function.updateListITE V head✝.args (List.map V a✝)) tail✝ head✝.q
    else Holds D I V tail✝ (def_ a✝¹ a✝)) ↔
    if a✝¹ = head✝.name ∧ (List.map σ' a✝).length = head✝.args.length then
      Holds D I (Function.updateListITE V' head✝.args (List.map V' (List.map σ' a✝))) tail✝ head✝.q
    else Holds D I V' tail✝ (def_ a✝¹ (List.map σ' a✝))

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ I.pred_var_ X (List.map V xs) ↔ I.pred_var_ X (List.map V' (List.map σ' xs))
Tactic:
congr! 1
State after:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ List.map V xs = List.map V' (List.map σ' xs)

State before:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ List.map V xs = List.map V' (List.map σ' xs)
Tactic:
simp
State after:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ List.map V xs = List.map (V' ∘ σ') xs

State before:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ List.map V xs = List.map (V' ∘ σ') xs
Tactic:
simp only [List.map_eq_map_iff]
State after:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ∀ x ∈ xs, V x = (V' ∘ σ') x

State before:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ∀ x ∈ xs, V x = (V' ∘ σ') x
Tactic:
intro v a1
State after:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
⊢ V v = (V' ∘ σ') v

State before:
case a.h.e'_4
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
⊢ V v = (V' ∘ σ') v
Tactic:
apply h2
State after:
case a.h.e'_4.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
⊢ v ∈ binders ∨ σ' v ∉ binders

State before:
case a.h.e'_4.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
⊢ v ∈ binders ∨ σ' v ∉ binders
Tactic:
by_cases c1 : v ∈ binders
State after:
case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∈ binders
⊢ v ∈ binders ∨ σ' v ∉ binders

case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∉ binders
⊢ v ∈ binders ∨ σ' v ∉ binders

State before:
case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∈ binders
⊢ v ∈ binders ∨ σ' v ∉ binders
Tactic:
left
State after:
case pos.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∈ binders
⊢ v ∈ binders

State before:
case pos.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∈ binders
⊢ v ∈ binders
Tactic:
exact c1
State after:
no goals

State before:
case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∉ binders
⊢ v ∈ binders ∨ σ' v ∉ binders
Tactic:
right
State after:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∉ binders
⊢ σ' v ∉ binders

State before:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∉ binders
⊢ σ' v ∉ binders
Tactic:
simp only [h3 v c1]
State after:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∉ binders
⊢ σ v ∉ binders

State before:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
X : PredName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
v : VarName
a1 : v ∈ xs
c1 : v ∉ binders
⊢ σ v ∉ binders
Tactic:
exact h1 v a1 c1
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : (x ∉ binders → σ x ∉ binders) ∧ (y ∉ binders → σ y ∉ binders)
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ V x = V y ↔ V' (σ' x) = V' (σ' y)
Tactic:
cases h1
State after:
case intro
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
left✝ : x ∉ binders → σ x ∉ binders
right✝ : y ∉ binders → σ y ∉ binders
⊢ V x = V y ↔ V' (σ' x) = V' (σ' y)

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ V x = V y ↔ V' (σ' x) = V' (σ' y)
Tactic:
congr! 1
State after:
case a.h.e'_2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ V x = V' (σ' x)

case a.h.e'_3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ V y = V' (σ' y)

State before:
case a.h.e'_2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ V x = V' (σ' x)
Tactic:
apply h2
State after:
case a.h.e'_2.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ x ∈ binders ∨ σ' x ∉ binders

State before:
case a.h.e'_2.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ x ∈ binders ∨ σ' x ∉ binders
Tactic:
by_cases c1 : x ∈ binders
State after:
case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∈ binders
⊢ x ∈ binders ∨ σ' x ∉ binders

case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∉ binders
⊢ x ∈ binders ∨ σ' x ∉ binders

State before:
case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∈ binders
⊢ x ∈ binders ∨ σ' x ∉ binders
Tactic:
left
State after:
case pos.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∈ binders
⊢ x ∈ binders

State before:
case pos.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∈ binders
⊢ x ∈ binders
Tactic:
exact c1
State after:
no goals

State before:
case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∉ binders
⊢ x ∈ binders ∨ σ' x ∉ binders
Tactic:
right
State after:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∉ binders
⊢ σ' x ∉ binders

State before:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∉ binders
⊢ σ' x ∉ binders
Tactic:
simp only [h3 x c1]
State after:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∉ binders
⊢ σ x ∉ binders

State before:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : x ∉ binders
⊢ σ x ∉ binders
Tactic:
exact h1_left c1
State after:
no goals

State before:
case a.h.e'_3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ V y = V' (σ' y)
Tactic:
apply h2
State after:
case a.h.e'_3.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ y ∈ binders ∨ σ' y ∉ binders

State before:
case a.h.e'_3.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
⊢ y ∈ binders ∨ σ' y ∉ binders
Tactic:
by_cases c1 : y ∈ binders
State after:
case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∈ binders
⊢ y ∈ binders ∨ σ' y ∉ binders

case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∉ binders
⊢ y ∈ binders ∨ σ' y ∉ binders

State before:
case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∈ binders
⊢ y ∈ binders ∨ σ' y ∉ binders
Tactic:
left
State after:
case pos.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∈ binders
⊢ y ∈ binders

State before:
case pos.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∈ binders
⊢ y ∈ binders
Tactic:
exact c1
State after:
no goals

State before:
case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∉ binders
⊢ y ∈ binders ∨ σ' y ∉ binders
Tactic:
right
State after:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∉ binders
⊢ σ' y ∉ binders

State before:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∉ binders
⊢ σ' y ∉ binders
Tactic:
simp only [h3 y c1]
State after:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∉ binders
⊢ σ y ∉ binders

State before:
case neg.h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x y : VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : x ∉ binders → σ x ∉ binders
h1_right : y ∉ binders → σ y ∉ binders
c1 : y ∉ binders
⊢ σ y ∉ binders
Tactic:
exact h1_right c1
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ¬Holds D I V (head✝ :: tail✝) phi ↔ ¬Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi)
Tactic:
congr! 1
State after:
case a.h.e'_1.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi)

State before:
case a.h.e'_1.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi)
Tactic:
exact phi_ih V V' σ σ' binders h1 h2 h2' h3
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi psi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
psi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders psi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ binders phi ∧ admitsAux σ binders psi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V (head✝ :: tail✝) psi) ↔
    (Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
Tactic:
cases h1
State after:
case intro
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi psi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
psi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders psi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
left✝ : admitsAux σ binders phi
right✝ : admitsAux σ binders psi
⊢ (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V (head✝ :: tail✝) psi) ↔
    (Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi psi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
psi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders psi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : admitsAux σ binders phi
h1_right : admitsAux σ binders psi
⊢ (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V (head✝ :: tail✝) psi) ↔
    (Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi) ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
Tactic:
congr! 1
State after:
case a.h.e'_1.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi psi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
psi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders psi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : admitsAux σ binders phi
h1_right : admitsAux σ binders psi
⊢ Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi)

case a.h.e'_2.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi psi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
psi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders psi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : admitsAux σ binders phi
h1_right : admitsAux σ binders psi
⊢ Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi)

State before:
case a.h.e'_1.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi psi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
psi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders psi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : admitsAux σ binders phi
h1_right : admitsAux σ binders psi
⊢ Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi)
Tactic:
exact phi_ih V V' σ σ' binders h1_left h2 h2' h3
State after:
no goals

State before:
case a.h.e'_2.a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi psi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
psi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders psi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h1_left : admitsAux σ binders phi
h1_right : admitsAux σ binders psi
⊢ Holds D I V (head✝ :: tail✝) psi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' psi)
Tactic:
exact psi_ih V V' σ σ' binders h1_right h2 h2' h3
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ (∃ d, Holds D I (Function.updateITE V x d) (head✝ :: tail✝) phi) ↔
    ∃ d, Holds D I (Function.updateITE V' x d) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)
Tactic:
first | apply forall_congr' | apply exists_congr
State after:
case h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ∀ (a : D),
    Holds D I (Function.updateITE V x a) (head✝ :: tail✝) phi ↔
      Holds D I (Function.updateITE V' x a) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)

State before:
case h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ∀ (a : D),
    Holds D I (Function.updateITE V x a) (head✝ :: tail✝) phi ↔
      Holds D I (Function.updateITE V' x a) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)
Tactic:
intro d
State after:
case h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ Holds D I (Function.updateITE V x d) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE V' x d) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)

State before:
case h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ Holds D I (Function.updateITE V x d) (head✝ :: tail✝) phi ↔
    Holds D I (Function.updateITE V' x d) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)
Tactic:
apply phi_ih (Function.updateITE V x d) (Function.updateITE V' x d) σ (Function.updateITE σ' x x) (binders ∪ {x}) h1
State after:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ ∀ (v : VarName),
    v ∈ binders ∪ {x} ∨ Function.updateITE σ' x x v ∉ binders ∪ {x} →
      Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)

case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ ∀ v ∈ binders ∪ {x}, v = Function.updateITE σ' x x v

case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ ∀ v ∉ binders ∪ {x}, Function.updateITE σ' x x v = σ v

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ (∀ (d : D), Holds D I (Function.updateITE V x d) (head✝ :: tail✝) phi) ↔
    ∀ (d : D), Holds D I (Function.updateITE V' x d) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)
Tactic:
apply forall_congr'
State after:
case h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ∀ (a : D),
    Holds D I (Function.updateITE V x a) (head✝ :: tail✝) phi ↔
      Holds D I (Function.updateITE V' x a) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ (∃ d, Holds D I (Function.updateITE V x d) (head✝ :: tail✝) phi) ↔
    ∃ d, Holds D I (Function.updateITE V' x d) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)
Tactic:
apply exists_congr
State after:
case h
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ ∀ (a : D),
    Holds D I (Function.updateITE V x a) (head✝ :: tail✝) phi ↔
      Holds D I (Function.updateITE V' x a) (head✝ :: tail✝) (fastReplaceFree (Function.updateITE σ' x x) phi)

State before:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ ∀ (v : VarName),
    v ∈ binders ∪ {x} ∨ Function.updateITE σ' x x v ∉ binders ∪ {x} →
      Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
intro v a1
State after:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∪ {x} ∨ Function.updateITE σ' x x v ∉ binders ∪ {x}
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)

State before:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∪ {x} ∨ Function.updateITE σ' x x v ∉ binders ∪ {x}
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
simp only [Function.updateITE] at a1
State after:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∪ {x} ∨ (if v = x then x else σ' v) ∉ binders ∪ {x}
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)

State before:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∪ {x} ∨ (if v = x then x else σ' v) ∉ binders ∪ {x}
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
simp at a1
State after:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)

State before:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
⊢ Function.updateITE V x d v = Function.updateITE V' x d (Function.updateITE σ' x x v)
Tactic:
simp only [Function.updateITE]
State after:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' 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)

State before:
case h.h2
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' 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:
split_ifs
State after:
case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
h✝¹ : v = x
h✝ : x = x
⊢ d = d

case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
h✝¹ : v = x
h✝ : ¬x = x
⊢ d = V' x

case pos
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
h✝¹ : ¬v = x
h✝ : σ' v = x
⊢ V v = d

case neg
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
h✝¹ : ¬v = x
h✝ : ¬σ' v = x
⊢ V v = V' (σ' v)

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : v = x
c2 : x = x
⊢ d = d
Tactic:
case _ c1 c2 =>
  rfl
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : v = x
c2 : ¬x = x
⊢ d = V' x
Tactic:
case _ c1 c2 =>
  contradiction
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : ¬v = x
c2 : σ' v = x
⊢ V v = d
Tactic:
case _ c1 c2 =>
  subst c2
  tauto
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : ¬v = x
c2 : ¬σ' v = x
⊢ V v = V' (σ' v)
Tactic:
case _ c1 c2 =>
  simp only [if_neg c1] at a1
  apply h2
  tauto
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : v = x
c2 : x = x
⊢ d = d
Tactic:
rfl
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : v = x
c2 : ¬x = x
⊢ d = V' x
Tactic:
contradiction
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : ¬v = x
c2 : σ' v = x
⊢ V v = d
Tactic:
subst c2
State after:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
h1 : admitsAux σ (binders ∪ {σ' v}) phi
a1 : (v ∈ binders ∨ v = σ' v) ∨ (if v = σ' v then σ' v else σ' v) ∉ binders ∧ ¬v = σ' v ∧ ¬σ' v = σ' v
c1 : ¬v = σ' v
⊢ V v = d

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
h1 : admitsAux σ (binders ∪ {σ' v}) phi
a1 : (v ∈ binders ∨ v = σ' v) ∨ (if v = σ' v then σ' v else σ' v) ∉ binders ∧ ¬v = σ' v ∧ ¬σ' v = σ' v
c1 : ¬v = σ' v
⊢ V v = d
Tactic:
tauto
State after:
no goals

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : (v ∈ binders ∨ v = x) ∨ (if v = x then x else σ' v) ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
c1 : ¬v = x
c2 : ¬σ' v = x
⊢ V v = V' (σ' v)
Tactic:
simp only [if_neg c1] at a1
State after:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
c1 : ¬v = x
c2 : ¬σ' v = x
a1 : (v ∈ binders ∨ v = x) ∨ σ' v ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
⊢ V v = V' (σ' v)

State before:
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
c1 : ¬v = x
c2 : ¬σ' v = x
a1 : (v ∈ binders ∨ v = x) ∨ σ' v ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
⊢ V v = V' (σ' v)
Tactic:
apply h2
State after:
case a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
c1 : ¬v = x
c2 : ¬σ' v = x
a1 : (v ∈ binders ∨ v = x) ∨ σ' v ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
⊢ v ∈ binders ∨ σ' v ∉ binders

State before:
case a
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
c1 : ¬v = x
c2 : ¬σ' v = x
a1 : (v ∈ binders ∨ v = x) ∨ σ' v ∉ binders ∧ ¬v = x ∧ ¬σ' v = x
⊢ v ∈ binders ∨ σ' v ∉ binders
Tactic:
tauto
State after:
no goals

State before:
case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ ∀ v ∈ binders ∪ {x}, v = Function.updateITE σ' x x v
Tactic:
intro v a1
State after:
case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∪ {x}
⊢ v = Function.updateITE σ' x x v

State before:
case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∪ {x}
⊢ v = Function.updateITE σ' x x v
Tactic:
simp at a1
State after:
case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∨ v = x
⊢ v = Function.updateITE σ' x x v

State before:
case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∨ v = x
⊢ v = Function.updateITE σ' x x v
Tactic:
simp only [Function.updateITE]
State after:
case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∨ v = x
⊢ v = if v = x then x else σ' v

State before:
case h.h2'
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∈ binders ∨ v = x
⊢ v = if v = x then x else σ' v
Tactic:
split_ifs <;> tauto
State after:
no goals

State before:
case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
⊢ ∀ v ∉ binders ∪ {x}, Function.updateITE σ' x x v = σ v
Tactic:
intro v a1
State after:
case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∉ binders ∪ {x}
⊢ Function.updateITE σ' x x v = σ v

State before:
case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∉ binders ∪ {x}
⊢ Function.updateITE σ' x x v = σ v
Tactic:
simp at a1
State after:
case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∉ binders ∧ ¬v = x
⊢ Function.updateITE σ' x x v = σ v

State before:
case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∉ binders ∧ ¬v = x
⊢ Function.updateITE σ' x x v = σ v
Tactic:
simp only [Function.updateITE]
State after:
case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∉ binders ∧ ¬v = x
⊢ (if v = x then x else σ' v) = σ v

State before:
case h.h3
D : Type
I : Interpretation D
head✝ : Definition
tail✝ : List Definition
tail_ih✝ :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tail✝ F ↔ Holds D I V' tail✝ (fastReplaceFree σ' F))
x : VarName
phi : Formula
phi_ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName),
    admitsAux σ binders phi →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) →
            (Holds D I V (head✝ :: tail✝) phi ↔ Holds D I V' (head✝ :: tail✝) (fastReplaceFree σ' phi))
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : admitsAux σ (binders ∪ {x}) phi
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
d : D
v : VarName
a1 : v ∉ binders ∧ ¬v = x
⊢ (if v = x then x else σ' v) = σ v
Tactic:
split_ifs <;> tauto
State after:
no goals

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
⊢ (if X = hd.name ∧ xs.length = hd.args.length then Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q
    else Holds D I V tl (def_ X xs)) ↔
    if X = hd.name ∧ (List.map σ' xs).length = hd.args.length then
      Holds D I (Function.updateListITE V' hd.args (List.map V' (List.map σ' xs))) tl hd.q
    else Holds D I V' tl (def_ X (List.map σ' xs))
Tactic:
split_ifs
State after:
case pos
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h✝¹ : X = hd.name ∧ xs.length = hd.args.length
h✝ : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map V' (List.map σ' xs))) tl hd.q

case neg
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h✝¹ : X = hd.name ∧ xs.length = hd.args.length
h✝ : ¬(X = hd.name ∧ (List.map σ' xs).length = hd.args.length)
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔ Holds D I V' tl (def_ X (List.map σ' xs))

case pos
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h✝¹ : ¬(X = hd.name ∧ xs.length = hd.args.length)
h✝ : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ Holds D I V tl (def_ X xs) ↔ Holds D I (Function.updateListITE V' hd.args (List.map V' (List.map σ' xs))) tl hd.q

case neg
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
h✝¹ : ¬(X = hd.name ∧ xs.length = hd.args.length)
h✝ : ¬(X = hd.name ∧ (List.map σ' xs).length = hd.args.length)
⊢ Holds D I V tl (def_ X xs) ↔ Holds D I V' tl (def_ X (List.map σ' xs))

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : ¬(X = hd.name ∧ (List.map σ' xs).length = hd.args.length)
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔ Holds D I V' tl (def_ X (List.map σ' xs))
Tactic:
case _ c1 c2 =>
  simp only [List.length_map] at c2
  contradiction
State after:
no goals

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : ¬(X = hd.name ∧ xs.length = hd.args.length)
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ Holds D I V tl (def_ X xs) ↔ Holds D I (Function.updateListITE V' hd.args (List.map V' (List.map σ' xs))) tl hd.q
Tactic:
case _ c1 c2 =>
  simp at c2
  contradiction
State after:
no goals

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : ¬(X = hd.name ∧ xs.length = hd.args.length)
c2 : ¬(X = hd.name ∧ (List.map σ' xs).length = hd.args.length)
⊢ Holds D I V tl (def_ X xs) ↔ Holds D I V' tl (def_ X (List.map σ' xs))
Tactic:
case _ c1 c2 =>
  specialize ih V V' σ σ' binders (def_ X xs)
  simp only [fastReplaceFree] at ih
  apply ih h1 h2 h2' h3
State after:
no goals

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map V' (List.map σ' xs))) tl hd.q
Tactic:
simp
State after:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs)) tl hd.q

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs)) tl hd.q
Tactic:
have s1 : List.map V xs = List.map (V' ∘ σ') xs
State after:
case s1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ List.map V xs = List.map (V' ∘ σ') xs

D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs)) tl hd.q

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
⊢ Holds D I (Function.updateListITE V hd.args (List.map V xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs)) tl hd.q
Tactic:
simp only [s1]
State after:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
⊢ Holds D I (Function.updateListITE V hd.args (List.map (V' ∘ σ') xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs)) tl hd.q

State before:
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
⊢ Holds D I (Function.updateListITE V hd.args (List.map (V' ∘ σ') xs)) tl hd.q ↔
    Holds D I (Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs)) tl hd.q
Tactic:
apply Holds_coincide_Var
State after:
case h1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
⊢ ∀ (v : VarName),
    isFreeIn v hd.q →
      Function.updateListITE V hd.args (List.map (V' ∘ σ') xs) v =
        Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs) v

State before:
case h1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
⊢ ∀ (v : VarName),
    isFreeIn v hd.q →
      Function.updateListITE V hd.args (List.map (V' ∘ σ') xs) v =
        Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs) v
Tactic:
intro v a1
State after:
case h1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
v : VarName
a1 : isFreeIn v hd.q
⊢ Function.updateListITE V hd.args (List.map (V' ∘ σ') xs) v =
    Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs) v

State before:
case h1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
v : VarName
a1 : isFreeIn v hd.q
⊢ Function.updateListITE V hd.args (List.map (V' ∘ σ') xs) v =
    Function.updateListITE V' hd.args (List.map (V' ∘ σ') xs) v
Tactic:
apply Function.updateListITE_mem_eq_len
State after:
case h1.h1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
v : VarName
a1 : isFreeIn v hd.q
⊢ v ∈ hd.args

case h1.h2
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
s1 : List.map V xs = List.map (V' ∘ σ') xs
v : VarName
a1 : isFreeIn v hd.q
⊢ hd.args.length = (List.map (V' ∘ σ') xs).length

State before:
case s1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ List.map V xs = List.map (V' ∘ σ') xs
Tactic:
simp only [List.map_eq_map_iff]
State after:
case s1
D : Type
I : Interpretation D
hd : Definition
tl : List Definition
ih :
  ∀ (V V' : VarAssignment D) (σ σ' : VarName → VarName) (binders : Finset VarName) (F : Formula),
    admitsAux σ binders F →
      (∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)) →
        (∀ v ∈ binders, v = σ' v) →
          (∀ v ∉ binders, σ' v = σ v) → (Holds D I V tl F ↔ Holds D I V' tl (fastReplaceFree σ' F))
X : DefName
xs : List VarName
V V' : VarAssignment D
σ σ' : VarName → VarName
binders : Finset VarName
h1 : ∀ v ∈ xs, v ∉ binders → σ v ∉ binders
h2 : ∀ (v : VarName), v ∈ binders ∨ σ' v ∉ binders → V v = V' (σ' v)
h2' : ∀ v ∈ binders, v = σ' v
h3 : ∀ v ∉ binders, σ' v = σ v
c1 : X = hd.name ∧ xs.length = hd.args.length
c2 : X = hd.name ∧ (List.map σ' xs).length = hd.args.length
⊢ ∀ x ∈ xs, V x = (V' ∘ σ') x