# Relation closures #

This file defines the reflexive, transitive, reflexive transitive and equivalence closures of relations and proves some basic results on them.

Note that this is about unbundled relations, that is terms of types of the form α → β → Prop. For the bundled version, see Rel.

## Definitions #

• Relation.ReflGen: Reflexive closure. ReflGen r relates everything r related, plus for all a it relates a with itself. So ReflGen r a b ↔ r a b ∨ a = b.
• Relation.TransGen: Transitive closure. TransGen r relates everything r related transitively. So TransGen r a b ↔ ∃ x₀ ... xₙ, r a x₀ ∧ r x₀ x₁ ∧ ... ∧ r xₙ b.
• Relation.ReflTransGen: Reflexive transitive closure. ReflTransGen r relates everything r related transitively, plus for all a it relates a with itself. So ReflTransGen r a b ↔ (∃ x₀ ... xₙ, r a x₀ ∧ r x₀ x₁ ∧ ... ∧ r xₙ b) ∨ a = b. It is the same as the reflexive closure of the transitive closure, or the transitive closure of the reflexive closure. In terms of rewriting systems, this means that a can be rewritten to b in a number of rewrites.
• Relation.EqvGen: Equivalence closure. EqvGen r relates everything ReflTransGen r relates, plus for all related pairs it relates them in the opposite order.
• Relation.Comp: Relation composition. We provide notation ∘r. For r : α → β → Prop and s : β → γ → Prop, r ∘r srelates a : α and c : γ iff there exists b : β that's related to both.
• Relation.Map: Image of a relation under a pair of maps. For r : α → β → Prop, f : α → γ, g : β → δ, Map r f g is the relation γ → δ → Prop relating f a and g b for all a, b related by r.
• Relation.Join: Join of a relation. For r : α → α → Prop, Join r a b ↔ ∃ c, r a c ∧ r b c. In terms of rewriting systems, this means that a and b can be rewritten to the same term.
theorem IsRefl.reflexive {α : Type u_1} {r : ααProp} [IsRefl α r] :
theorem Reflexive.rel_of_ne_imp {α : Type u_1} {r : ααProp} (h : ) {x : α} {y : α} (hr : x yr x y) :
r x y

To show a reflexive relation r : α → α → Prop holds over x y : α, it suffices to show it holds when x ≠ y.

theorem Reflexive.ne_imp_iff {α : Type u_1} {r : ααProp} (h : ) {x : α} {y : α} :
x yr x y r x y

If a reflexive relation r : α → α → Prop holds over x y : α, then it holds whether or not x ≠ y.

theorem reflexive_ne_imp_iff {α : Type u_1} {r : ααProp} [IsRefl α r] {x : α} {y : α} :
x yr x y r x y

If a reflexive relation r : α → α → Prop holds over x y : α, then it holds whether or not x ≠ y. Unlike Reflexive.ne_imp_iff, this uses [IsRefl α r].

theorem Symmetric.iff {α : Type u_1} {r : ααProp} (H : ) (x : α) (y : α) :
r x y r y x
theorem Symmetric.flip_eq {α : Type u_1} {r : ααProp} (h : ) :
flip r = r
theorem Symmetric.swap_eq {α : Type u_1} {r : ααProp} :
theorem flip_eq_iff {α : Type u_1} {r : ααProp} :
flip r = r
theorem swap_eq_iff {α : Type u_1} {r : ααProp} :
theorem Reflexive.comap {α : Type u_1} {β : Type u_2} {r : ββProp} (h : ) (f : αβ) :
theorem Symmetric.comap {α : Type u_1} {β : Type u_2} {r : ββProp} (h : ) (f : αβ) :
theorem Transitive.comap {α : Type u_1} {β : Type u_2} {r : ββProp} (h : ) (f : αβ) :
theorem Equivalence.comap {α : Type u_1} {β : Type u_2} {r : ββProp} (h : ) (f : αβ) :
def Relation.Comp {α : Type u_1} {β : Type u_2} {γ : Type u_3} (r : αβProp) (p : βγProp) (a : α) (c : γ) :

The composition of two relations, yielding a new relation. The result relates a term of α and a term of γ if there is an intermediate term of β related to both.

Equations
Instances For
theorem Relation.comp_eq {α : Type u_1} {β : Type u_2} {r : αβProp} :
(Relation.Comp r fun (x1 x2 : β) => x1 = x2) = r
theorem Relation.eq_comp {α : Type u_1} {β : Type u_2} {r : αβProp} :
Relation.Comp (fun (x1 x2 : α) => x1 = x2) r = r
theorem Relation.iff_comp {α : Type u_1} {r : PropαProp} :
Relation.Comp (fun (x1 x2 : Prop) => x1 x2) r = r
theorem Relation.comp_iff {α : Type u_1} {r : α} :
(Relation.Comp r fun (x1 x2 : Prop) => x1 x2) = r
theorem Relation.comp_assoc {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} {r : αβProp} {p : βγProp} {q : γδProp} :
theorem Relation.flip_comp {α : Type u_1} {β : Type u_2} {γ : Type u_3} {r : αβProp} {p : βγProp} :
def Relation.Fibration {α : Type u_1} {β : Type u_2} (rα : ααProp) (rβ : ββProp) (f : αβ) :

A function f : α → β is a fibration between the relation rα and rβ if for all a : α and b : β, whenever b : β and f a are related by rβ, b is the image of some a' : α under f, and a' and a are related by rα.

Equations
Instances For
theorem Acc.of_fibration {α : Type u_1} {β : Type u_2} {rα : ααProp} {rβ : ββProp} (f : αβ) (fib : Relation.Fibration f) {a : α} (ha : Acc a) :
Acc (f a)

If f : α → β is a fibration between relations rα and rβ, and a : α is accessible under rα, then f a is accessible under rβ.

theorem Acc.of_downward_closed {α : Type u_1} {β : Type u_2} {rβ : ββProp} (f : αβ) (dc : ∀ {a : α} {b : β}, b (f a)∃ (c : α), f c = b) (a : α) (ha : Acc (InvImage f) a) :
Acc (f a)
def Relation.Map {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} (r : αβProp) (f : αγ) (g : βδ) :
γδProp

The map of a relation r through a pair of functions pushes the relation to the codomains of the functions. The resulting relation is defined by having pairs of terms related if they have preimages related by r.

Equations
Instances For
theorem Relation.map_apply {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} {r : αβProp} {f : αγ} {g : βδ} {c : γ} {d : δ} :
Relation.Map r f g c d ∃ (a : α), ∃ (b : β), r a b f a = c g b = d
@[simp]
theorem Relation.map_map {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} {ε : Type u_5} {ζ : Type u_6} (r : αβProp) (f₁ : αγ) (g₁ : βδ) (f₂ : γε) (g₂ : δζ) :
Relation.Map (Relation.Map r f₁ g₁) f₂ g₂ = Relation.Map r (f₂ f₁) (g₂ g₁)
@[simp]
theorem Relation.map_apply_apply {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} {f : αγ} {g : βδ} (hf : ) (hg : ) (r : αβProp) (a : α) (b : β) :
Relation.Map r f g (f a) (g b) r a b
@[simp]
theorem Relation.map_id_id {α : Type u_1} {β : Type u_2} (r : αβProp) :
Relation.Map r id id = r
instance Relation.instDecidableMapOfExistsAndEq {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} {r : αβProp} {f : αγ} {g : βδ} {c : γ} {d : δ} [Decidable (∃ (a : α), ∃ (b : β), r a b f a = c g b = d)] :
Equations
• Relation.instDecidableMapOfExistsAndEq = inst
theorem Relation.ReflTransGen.cases_tail_iff {α : Type u_1} (r : ααProp) (a : α) :
∀ (a_1 : α), a_1 = a ∃ (b : α), r b a_1
inductive Relation.ReflTransGen {α : Type u_1} (r : ααProp) (a : α) :
αProp

ReflTransGen r: reflexive transitive closure of r

• refl: ∀ {α : Type u_1} {r : ααProp} {a : α},
• tail: ∀ {α : Type u_1} {r : ααProp} {a b c : α}, r b c
Instances For
theorem Relation.reflGen_iff {α : Type u_1} (r : ααProp) (a : α) :
∀ (a_1 : α), Relation.ReflGen r a a_1 a_1 = a r a a_1
inductive Relation.ReflGen {α : Type u_1} (r : ααProp) (a : α) :
αProp

ReflGen r: reflexive closure of r

• refl: ∀ {α : Type u_1} {r : ααProp} {a : α},
• single: ∀ {α : Type u_1} {r : ααProp} {a b : α}, r a b
Instances For
theorem Relation.eqvGen_iff {α : Type u_1} (r : ααProp) :
∀ (a a_1 : α), Relation.EqvGen r a a_1 r a a_1 a_1 = a Relation.EqvGen r a_1 a ∃ (y : α), Relation.EqvGen r y a_1
inductive Relation.EqvGen {α : Type u_1} (r : ααProp) :
ααProp

EqvGen r: equivalence closure of r.

• rel: ∀ {α : Type u_1} {r : ααProp} (x y : α), r x y
• refl: ∀ {α : Type u_1} {r : ααProp} (x : α),
• symm: ∀ {α : Type u_1} {r : ααProp} (x y : α),
• trans: ∀ {α : Type u_1} {r : ααProp} (x y z : α),
Instances For
theorem Relation.transGen_iff {α : Sort u} (r : ααProp) :
∀ (a a_1 : α), Relation.TransGen r a a_1 r a a_1 ∃ (b : α), r b a_1
theorem Relation.ReflGen.to_reflTransGen {α : Type u_1} {r : ααProp} {a : α} {b : α} :
theorem Relation.ReflGen.mono {α : Type u_1} {r : ααProp} {p : ααProp} (hp : ∀ (a b : α), r a bp a b) {a : α} {b : α} :
instance Relation.ReflGen.instIsRefl {α : Type u_1} {r : ααProp} :
Equations
• =
theorem Relation.ReflTransGen.trans {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (hab : ) (hbc : ) :
theorem Relation.ReflTransGen.single {α : Type u_1} {r : ααProp} {a : α} {b : α} (hab : r a b) :
theorem Relation.ReflTransGen.head {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (hab : r a b) (hbc : ) :
theorem Relation.ReflTransGen.symmetric {α : Type u_1} {r : ααProp} (h : ) :
theorem Relation.ReflTransGen.cases_tail {α : Type u_1} {r : ααProp} {a : α} {b : α} :
b = a ∃ (c : α), r c b
theorem Relation.ReflTransGen.head_induction_on {α : Type u_1} {r : ααProp} {b : α} {P : (a : α) → Prop} {a : α} (h : ) (refl : P b ) (head : ∀ {a c : α} (h' : r a c) (h : ), P c hP a ) :
P a h
theorem Relation.ReflTransGen.trans_induction_on {α : Type u_1} {r : ααProp} {P : {a b : α} → Prop} {a : α} {b : α} (h : ) (ih₁ : ∀ (a : α), P ) (ih₂ : ∀ {a b : α} (h : r a b), P ) (ih₃ : ∀ {a b c : α} (h₁ : ) (h₂ : ), P h₁P h₂P ) :
P h
theorem Relation.ReflTransGen.cases_head {α : Type u_1} {r : ααProp} {a : α} {b : α} (h : ) :
a = b ∃ (c : α), r a c
theorem Relation.ReflTransGen.cases_head_iff {α : Type u_1} {r : ααProp} {a : α} {b : α} :
a = b ∃ (c : α), r a c
theorem Relation.ReflTransGen.total_of_right_unique {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (U : ) (ab : ) (ac : ) :
theorem Relation.TransGen.to_reflTransGen {α : Type u_1} {r : ααProp} {a : α} {b : α} (h : ) :
theorem Relation.TransGen.trans_left {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (hab : ) (hbc : ) :
instance Relation.TransGen.instTransReflTransGen {α : Type u_1} {r : ααProp} :
Equations
• Relation.TransGen.instTransReflTransGen = { trans := }
instance Relation.TransGen.instTrans_mathlib {α : Type u_1} {r : ααProp} :
Equations
• Relation.TransGen.instTrans_mathlib = { trans := }
theorem Relation.TransGen.head' {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (hab : r a b) (hbc : ) :
theorem Relation.TransGen.tail' {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (hab : ) (hbc : r b c) :
theorem Relation.TransGen.head {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (hab : r a b) (hbc : ) :
theorem Relation.TransGen.head_induction_on {α : Type u_1} {r : ααProp} {b : α} {P : (a : α) → Prop} {a : α} (h : ) (base : ∀ {a : α} (h : r a b), P a ) (ih : ∀ {a c : α} (h' : r a c) (h : ), P c hP a ) :
P a h
theorem Relation.TransGen.trans_induction_on {α : Type u_1} {r : ααProp} {P : {a b : α} → Prop} {a : α} {b : α} (h : ) (base : ∀ {a b : α} (h : r a b), P ) (ih : ∀ {a b c : α} (h₁ : ) (h₂ : ), P h₁P h₂P ) :
P h
theorem Relation.TransGen.trans_right {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (hab : ) (hbc : ) :
instance Relation.TransGen.instTransReflTransGen_1 {α : Type u_1} {r : ααProp} :
Equations
• Relation.TransGen.instTransReflTransGen_1 = { trans := }
theorem Relation.TransGen.tail'_iff {α : Type u_1} {r : ααProp} {a : α} {c : α} :
∃ (b : α), r b c
theorem Relation.TransGen.head'_iff {α : Type u_1} {r : ααProp} {a : α} {c : α} :
∃ (b : α), r a b
theorem Relation.reflGen_eq_self {α : Type u_1} {r : ααProp} (hr : ) :
theorem Relation.reflexive_reflGen {α : Type u_1} {r : ααProp} :
theorem Relation.reflGen_minimal {α : Type u_1} {r : ααProp} {r' : ααProp} (hr' : ) (h : ∀ (x y : α), r x yr' x y) {x : α} {y : α} (hxy : ) :
r' x y
theorem Relation.transGen_eq_self {α : Type u_1} {r : ααProp} (trans : ) :
theorem Relation.transitive_transGen {α : Type u_1} {r : ααProp} :
instance Relation.instIsTransTransGen {α : Type u_1} {r : ααProp} :
Equations
• =
theorem Relation.transGen_idem {α : Type u_1} {r : ααProp} :
theorem Relation.TransGen.lift {α : Type u_1} {β : Type u_2} {r : ααProp} {p : ββProp} {a : α} {b : α} (f : αβ) (h : ∀ (a b : α), r a bp (f a) (f b)) (hab : ) :
Relation.TransGen p (f a) (f b)
theorem Relation.TransGen.lift' {α : Type u_1} {β : Type u_2} {r : ααProp} {p : ββProp} {a : α} {b : α} (f : αβ) (h : ∀ (a b : α), r a bRelation.TransGen p (f a) (f b)) (hab : ) :
Relation.TransGen p (f a) (f b)
theorem Relation.TransGen.closed {α : Type u_1} {r : ααProp} {a : α} {b : α} {p : ααProp} :
(∀ (a b : α), r a b)
theorem Relation.TransGen.closed' {α : Type u_1} {r : ααProp} {P : αProp} (dc : ∀ {a b : α}, r a bP bP a) {a : α} {b : α} (h : ) :
P bP a
theorem Relation.TransGen.mono {α : Type u_1} {r : ααProp} {a : α} {b : α} {p : ααProp} :
(∀ (a b : α), r a bp a b)
theorem Relation.transGen_minimal {α : Type u_1} {r : ααProp} {r' : ααProp} (hr' : ) (h : ∀ (x y : α), r x yr' x y) {x : α} {y : α} (hxy : ) :
r' x y
theorem Relation.TransGen.swap {α : Type u_1} {r : ααProp} {a : α} {b : α} (h : ) :
theorem Relation.transGen_swap {α : Type u_1} {r : ααProp} {a : α} {b : α} :
theorem Relation.reflTransGen_iff_eq {α : Type u_1} {r : ααProp} {a : α} {b : α} (h : ∀ (b : α), ¬r a b) :
b = a
theorem Relation.reflTransGen_iff_eq_or_transGen {α : Type u_1} {r : ααProp} {a : α} {b : α} :
b = a
theorem Relation.ReflTransGen.lift {α : Type u_1} {β : Type u_2} {r : ααProp} {p : ββProp} {a : α} {b : α} (f : αβ) (h : ∀ (a b : α), r a bp (f a) (f b)) (hab : ) :
Relation.ReflTransGen p (f a) (f b)
theorem Relation.ReflTransGen.mono {α : Type u_1} {r : ααProp} {a : α} {b : α} {p : ααProp} :
(∀ (a b : α), r a bp a b)
theorem Relation.reflTransGen_eq_self {α : Type u_1} {r : ααProp} (refl : ) (trans : ) :
theorem Relation.reflTransGen_minimal {α : Type u_1} {r : ααProp} {r' : ααProp} (hr₁ : ) (hr₂ : ) (h : ∀ (x y : α), r x yr' x y) {x : α} {y : α} (hxy : ) :
r' x y
theorem Relation.reflexive_reflTransGen {α : Type u_1} {r : ααProp} :
theorem Relation.transitive_reflTransGen {α : Type u_1} {r : ααProp} :
instance Relation.instIsReflReflTransGen {α : Type u_1} {r : ααProp} :
Equations
• =
instance Relation.instIsTransReflTransGen {α : Type u_1} {r : ααProp} :
Equations
• =
theorem Relation.reflTransGen_idem {α : Type u_1} {r : ααProp} :
theorem Relation.ReflTransGen.lift' {α : Type u_1} {β : Type u_2} {r : ααProp} {p : ββProp} {a : α} {b : α} (f : αβ) (h : ∀ (a b : α), r a bRelation.ReflTransGen p (f a) (f b)) (hab : ) :
Relation.ReflTransGen p (f a) (f b)
theorem Relation.reflTransGen_closed {α : Type u_1} {r : ααProp} {a : α} {b : α} {p : ααProp} :
(∀ (a b : α), r a b)
theorem Relation.ReflTransGen.swap {α : Type u_1} {r : ααProp} {a : α} {b : α} (h : ) :
theorem Relation.reflTransGen_swap {α : Type u_1} {r : ααProp} {a : α} {b : α} :
@[simp]
theorem Relation.reflGen_transGen {α : Type u_1} {r : ααProp} :
@[simp]
theorem Relation.transGen_reflGen {α : Type u_1} {r : ααProp} :
@[simp]
theorem Relation.reflTransGen_reflGen {α : Type u_1} {r : ααProp} :
@[simp]
theorem Relation.reflTransGen_transGen {α : Type u_1} {r : ααProp} :
theorem Relation.reflTransGen_eq_transGen {α : Type u_1} {r : ααProp} (hr : ) :
theorem Relation.reflTransGen_eq_reflGen {α : Type u_1} {r : ααProp} (hr : ) :
theorem Relation.EqvGen.is_equivalence {α : Type u_1} (r : ααProp) :
def Relation.EqvGen.setoid {α : Type u_1} (r : ααProp) :

EqvGen.setoid r is the setoid generated by a relation r.

The motivation for this definition is that Quot r behaves like Quotient (EqvGen.setoid r), see for example Quot.eqvGen_exact and Quot.eqvGen_sound.

Equations
• = { r := , iseqv := }
Instances For
theorem Relation.EqvGen.mono {α : Type u_1} {a : α} {b : α} {r : ααProp} {p : ααProp} (hrp : ∀ (a b : α), r a bp a b) (h : ) :
@[deprecated Relation.EqvGen.is_equivalence]
theorem EqvGen.is_equivalence {α : Type u_1} (r : ααProp) :

Alias of Relation.EqvGen.is_equivalence.

@[deprecated Relation.EqvGen.setoid]
def EqvGen.Setoid {α : Type u_1} (r : ααProp) :

Alias of Relation.EqvGen.setoid.

EqvGen.setoid r is the setoid generated by a relation r.

The motivation for this definition is that Quot r behaves like Quotient (EqvGen.setoid r), see for example Quot.eqvGen_exact and Quot.eqvGen_sound.

Equations
Instances For
@[deprecated Relation.EqvGen.mono]
theorem EqvGen.mono {α : Type u_1} {a : α} {b : α} {r : ααProp} {p : ααProp} (hrp : ∀ (a b : α), r a bp a b) (h : ) :

Alias of Relation.EqvGen.mono.

def Relation.Join {α : Type u_1} (r : ααProp) :
ααProp

The join of a relation on a single type is a new relation for which pairs of terms are related if there is a third term they are both related to. For example, if r is a relation representing rewrites in a term rewriting system, then confluence is the property that if a rewrites to both b and c, then join r relates b and c (see Relation.church_rosser).

Equations
• = ∃ (c : α), r a c r b c
Instances For
theorem Relation.church_rosser {α : Type u_1} {r : ααProp} {a : α} {b : α} {c : α} (h : ∀ (a b c : α), r a br a c∃ (d : α), ) (hab : ) (hac : ) :

A sufficient condition for the Church-Rosser property.

theorem Relation.join_of_single {α : Type u_1} {r : ααProp} {a : α} {b : α} (h : ) (hab : r a b) :
theorem Relation.symmetric_join {α : Type u_1} {r : ααProp} :
theorem Relation.reflexive_join {α : Type u_1} {r : ααProp} (h : ) :
theorem Relation.transitive_join {α : Type u_1} {r : ααProp} (ht : ) (h : ∀ (a b c : α), r a br a c) :
theorem Relation.equivalence_join {α : Type u_1} {r : ααProp} (hr : ) (ht : ) (h : ∀ (a b c : α), r a br a c) :
theorem Relation.equivalence_join_reflTransGen {α : Type u_1} {r : ααProp} (h : ∀ (a b c : α), r a br a c∃ (d : α), ) :
theorem Relation.join_of_equivalence {α : Type u_1} {r : ααProp} {a : α} {b : α} {r' : ααProp} (hr : ) (h : ∀ (a b : α), r' a br a b) :
Relation.Join r' a br a b
theorem Relation.reflTransGen_of_transitive_reflexive {α : Type u_1} {r : ααProp} {a : α} {b : α} {r' : ααProp} (hr : ) (ht : ) (h : ∀ (a b : α), r' a br a b) (h' : ) :
r a b
theorem Relation.reflTransGen_of_equivalence {α : Type u_1} {r : ααProp} {a : α} {b : α} {r' : ααProp} (hr : ) :
(∀ (a b : α), r' a br a b)r a b
theorem Quot.eqvGen_exact {α : Type u_1} {r : ααProp} {a : α} {b : α} (H : Quot.mk r a = Quot.mk r b) :
theorem Quot.eqvGen_sound {α : Type u_1} {r : ααProp} {a : α} {b : α} (H : ) :
Quot.mk r a = Quot.mk r b
instance Quotient.decidableEq {α : Sort u_7} {s : } [d : (a b : α) → Decidable (a b)] :
Equations
theorem Equivalence.eqvGen_iff {α : Type u_1} {r : ααProp} {a : α} {b : α} (h : ) :
r a b
theorem Equivalence.eqvGen_eq {α : Type u_1} {r : ααProp} (h : ) :
@[deprecated Quot.eqvGen_exact]
theorem Quot.exact {α : Type u_1} {r : ααProp} {a : α} {b : α} (H : Quot.mk r a = Quot.mk r b) :

Alias of Quot.eqvGen_exact.

@[deprecated Quot.eqvGen_sound]
theorem Quot.EqvGen_sound {α : Type u_1} {r : ααProp} {a : α} {b : α} (H : ) :
Quot.mk r a = Quot.mk r b

Alias of Quot.eqvGen_sound.