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 : ) :

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 : } (h : b l) :
List.TFAE (a :: l) (a b)
theorem List.tfae_cons_cons {a : Prop} {b : Prop} {l : } :
List.TFAE (a :: b :: l) (a b) List.TFAE (b :: l)
@[simp]
theorem List.tfae_cons_self {a : Prop} {l : } :
List.TFAE (a :: a :: l) List.TFAE (a :: l)
theorem List.tfae_of_forall (b : Prop) (l : ) (h : ∀ (a : Prop), a l(a b)) :
theorem List.tfae_of_cycle {a : Prop} {b : Prop} {l : } (h_chain : List.Chain (fun (x x_1 : Prop) => xx_1) a (b :: l)) (h_last : a) :
List.TFAE (a :: b :: l)
theorem List.TFAE.out {l : } (h : ) (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

theorem List.TFAE.not {l : } :
List.TFAE ()

Alias of the reverse direction of List.tfae_not_iff.