# Documentation

Mathlib.Tactic.TFAE

# The Following Are Equivalent (TFAE) #

This file provides the tactics tfae_have and tfae_finish for proving goals of the form TFAE [P₁, P₂, ...].

An arrow of the form ←, →, or ↔.

Instances For

tfae_have introduces hypotheses for proving goals of the form TFAE [P₁, P₂, ...]. Specifically, tfae_have i arrow j introduces a hypothesis of type Pᵢ arrow Pⱼ to the local context, where arrow can be →, ←, or ↔. Note that i and j are natural number indices (beginning at 1) used to specify the propositions P₁, P₂, ... that appear in the TFAE goal list. A proof is required afterward, typically via a tactic block.

example (h : P → R) : TFAE [P, Q, R] := by
tfae_have 1 → 3
· exact h
...


The resulting context now includes tfae_1_to_3 : P → R.

The introduced hypothesis can be given a custom name, in analogy to have syntax:

tfae_have h : 2 ↔ 3


Once sufficient hypotheses have been introduced by tfae_have, tfae_finish can be used to close the goal.

example : TFAE [P, Q, R] := by
tfae_have 1 → 2
· /- proof of P → Q -/
tfae_have 2 → 1
· /- proof of Q → P -/
tfae_have 2 ↔ 3
· /- proof of Q ↔ R -/
tfae_finish

Instances For

tfae_finish is used to close goals of the form TFAE [P₁, P₂, ...] once a sufficient collection of hypotheses of the form Pᵢ → Pⱼ or Pᵢ ↔ Pⱼ have been introduced to the local context.

tfae_have can be used to conveniently introduce these hypotheses; see tfae_have.

Example:

example : TFAE [P, Q, R] := by
tfae_have 1 → 2
· /- proof of P → Q -/
tfae_have 2 → 1
· /- proof of Q → P -/
tfae_have 2 ↔ 3
· /- proof of Q ↔ R -/
tfae_finish

Instances For

# Setup #

Extract a list of Prop expressions from an expression of the form TFAE [P₁, P₂, ...] as long as [P₁, P₂, ...] is an explicit list.

Instances For

Convert an expression representing an explicit list into a list of expressions.

# tfae_have components #

def Mathlib.Tactic.TFAE.mkTFAEHypName (i : Lean.TSyntax num) (j : Lean.TSyntax num) (arr : Lean.TSyntax Mathlib.Tactic.TFAE.impArrow) :

Construct a name for a hypothesis introduced by tfae_have.

Instances For
def Mathlib.Tactic.TFAE.tfaeHaveCore (goal : Lean.MVarId) (name : Option (Lean.TSyntax ident)) (i : Lean.TSyntax num) (j : Lean.TSyntax num) (arrow : Lean.TSyntax Mathlib.Tactic.TFAE.impArrow) (t : Lean.Expr) :

The core of tfae_have, which behaves like haveLetCore in Mathlib.Tactic.Have.

Instances For
def Mathlib.Tactic.TFAE.elabIndex (i : Lean.TSyntax num) (maxIndex : ) :

Turn syntax for a given index into a natural number, as long as it lies between 1 and maxIndex.

Instances For
def Mathlib.Tactic.TFAE.mkImplType (Pi : Q(Prop)) (arr : Lean.TSyntax Mathlib.Tactic.TFAE.impArrow) (Pj : Q(Prop)) :

Construct an expression for the type Pj → Pi, Pi → Pj, or Pi ↔ Pj given expressions Pi Pj : Q(Prop) and impArrow syntax arr, depending on whether arr is ←, →, or ↔` respectively.

Instances For