Documentation

Mathlib.Data.List.TFAE

The Following Are Equivalent #

This file allows to state that all propositions in a list are equivalent. It is used by Mathlib.Tactic.Tfae. TFAE l means ∀ x ∈ l, ∀ y ∈ l, x ↔ y. This is equivalent to Pairwise (↔) l.

def List.TFAE (l : List Prop) :

TFAE: The Following (propositions) Are Equivalent.

The tfae_have and tfae_finish tactics can be useful in proofs with TFAE goals.

Equations
Instances For
    @[simp]
    theorem List.tfae_cons_of_mem {a : Prop} {b : Prop} {l : List Prop} (h : b l) :
    theorem List.tfae_cons_cons {a : Prop} {b : Prop} {l : List Prop} :
    List.TFAE (a :: b :: l) (a b) List.TFAE (b :: l)
    @[simp]
    theorem List.tfae_cons_self {a : Prop} {l : List Prop} :
    List.TFAE (a :: a :: l) List.TFAE (a :: l)
    theorem List.tfae_of_forall (b : Prop) (l : List Prop) (h : ∀ (a : Prop), a l(a b)) :
    theorem List.tfae_of_cycle {a : Prop} {b : Prop} {l : List Prop} (h_chain : List.Chain (fun (x x_1 : Prop) => xx_1) a (b :: l)) (h_last : List.getLastD l ba) :
    List.TFAE (a :: b :: l)
    theorem List.TFAE.out {l : List Prop} (h : List.TFAE l) (n₁ : Nat) (n₂ : Nat) {a : Prop} {b : Prop} (h₁ : autoParam (List.get? l n₁ = some a) _auto✝) (h₂ : autoParam (List.get? l n₂ = some b) _auto✝) :
    a b
    theorem List.forall_tfae {α : Type u_1} (l : List (αProp)) (H : ∀ (a : α), List.TFAE (List.map (fun (p : αProp) => p a) l)) :
    List.TFAE (List.map (fun (p : αProp) => ∀ (a : α), p a) l)

    If P₁ x ↔ ... ↔ Pₙ x for all x, then (∀ x, P₁ x) ↔ ... ↔ (∀ x, Pₙ x). Note: in concrete cases, Lean has trouble finding the list [P₁, ..., Pₙ] from the list [(∀ x, P₁ x), ..., (∀ x, Pₙ x)], but simply providing a list of underscores with the right length makes it happier.

    Example:

    example (P₁ P₂ P₃ : ℕ → Prop) (H : ∀ n, [P₁ n, P₂ n, P₃ n].TFAE) :
        [∀ n, P₁ n, ∀ n, P₂ n, ∀ n, P₃ n].TFAE :=
      forall_tfae [_, _, _] H
    
    theorem List.exists_tfae {α : Type u_1} (l : List (αProp)) (H : ∀ (a : α), List.TFAE (List.map (fun (p : αProp) => p a) l)) :
    List.TFAE (List.map (fun (p : αProp) => ∃ (a : α), p a) l)

    If P₁ x ↔ ... ↔ Pₙ x for all x, then (∃ x, P₁ x) ↔ ... ↔ (∃ x, Pₙ x). Note: in concrete cases, Lean has trouble finding the list [P₁, ..., Pₙ] from the list [(∃ x, P₁ x), ..., (∃ x, Pₙ x)], but simply providing a list of underscores with the right length makes it happier.

    Example:

    example (P₁ P₂ P₃ : ℕ → Prop) (H : ∀ n, [P₁ n, P₂ n, P₃ n].TFAE) :
        [∃ n, P₁ n, ∃ n, P₂ n, ∃ n, P₃ n].TFAE :=
      exists_tfae [_, _, _] H