Skip to content

Commit 467c358

Browse files
committed
feat(Logic/Relation): add missing relation material and show ⩿ = ReflGen (· ⋖ ·) (#6711)
1 parent c085fa8 commit 467c358

File tree

2 files changed

+69
-3
lines changed

2 files changed

+69
-3
lines changed

Mathlib/Logic/Relation.lean

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,20 @@ theorem _root_.WellFounded.transGen (h : WellFounded r) : WellFounded (TransGen
448448
fun a ↦ (h.apply a).TransGen⟩
449449
#align well_founded.trans_gen WellFounded.transGen
450450

451+
section reflGen
452+
453+
lemma reflGen_eq_self (hr : Reflexive r) : ReflGen r = r := by
454+
ext x y
455+
simpa only [reflGen_iff, or_iff_right_iff_imp] using fun h ↦ h ▸ hr y
456+
457+
lemma reflexive_reflGen : Reflexive (ReflGen r) := fun _ ↦ .refl
458+
459+
lemma reflGen_minimal {r' : α → α → Prop} (hr' : Reflexive r') (h : ∀ x y, r x y → r' x y) {x y : α}
460+
(hxy : ReflGen r x y) : r' x y := by
461+
simpa [reflGen_eq_self hr'] using ReflGen.mono h hxy
462+
463+
end reflGen
464+
451465
section TransGen
452466

453467
theorem transGen_eq_self (trans : Transitive r) : TransGen r = r :=
@@ -491,6 +505,10 @@ theorem TransGen.mono {p : α → α → Prop} :
491505
TransGen.lift id
492506
#align relation.trans_gen.mono Relation.TransGen.mono
493507

508+
lemma transGen_minimal {r' : α → α → Prop} (hr' : Transitive r') (h : ∀ x y, r x y → r' x y)
509+
{x y : α} (hxy : TransGen r x y) : r' x y := by
510+
simpa [transGen_eq_self hr'] using TransGen.mono h hxy
511+
494512
theorem TransGen.swap (h : TransGen r b a) : TransGen (swap r) a b := by
495513
induction' h with b h b c _ hbc ih
496514
· exact TransGen.single h
@@ -539,6 +557,10 @@ theorem reflTransGen_eq_self (refl : Reflexive r) (trans : Transitive r) : ReflT
539557
· exact trans IH h₂, single⟩
540558
#align relation.refl_trans_gen_eq_self Relation.reflTransGen_eq_self
541559

560+
lemma reflTransGen_minimal {r' : α → α → Prop} (hr₁ : Reflexive r') (hr₂ : Transitive r')
561+
(h : ∀ x y, r x y → r' x y) {x y : α} (hxy : ReflTransGen r x y) : r' x y := by
562+
simpa [reflTransGen_eq_self hr₁ hr₂] using ReflTransGen.mono h hxy
563+
542564
theorem reflexive_reflTransGen : Reflexive (ReflTransGen r) := fun _ ↦ refl
543565
#align relation.reflexive_refl_trans_gen Relation.reflexive_reflTransGen
544566

@@ -551,14 +573,14 @@ instance : IsRefl α (ReflTransGen r) :=
551573
instance : IsTrans α (ReflTransGen r) :=
552574
⟨@ReflTransGen.trans α r⟩
553575

554-
theorem refl_trans_gen_idem : ReflTransGen (ReflTransGen r) = ReflTransGen r :=
576+
theorem reflTransGen_idem : ReflTransGen (ReflTransGen r) = ReflTransGen r :=
555577
reflTransGen_eq_self reflexive_reflTransGen transitive_reflTransGen
556-
#align relation.refl_trans_gen_idem Relation.refl_trans_gen_idem
578+
#align relation.refl_trans_gen_idem Relation.reflTransGen_idem
557579

558580
theorem ReflTransGen.lift' {p : β → β → Prop} {a b : α} (f : α → β)
559581
(h : ∀ a b, r a b → ReflTransGen p (f a) (f b))
560582
(hab : ReflTransGen r a b) : ReflTransGen p (f a) (f b) := by
561-
simpa [refl_trans_gen_idem] using hab.lift f h
583+
simpa [reflTransGen_idem] using hab.lift f h
562584
#align relation.refl_trans_gen.lift' Relation.ReflTransGen.lift'
563585

564586
theorem reflTransGen_closed {p : α → α → Prop} :
@@ -576,6 +598,33 @@ theorem reflTransGen_swap : ReflTransGen (swap r) a b ↔ ReflTransGen r b a :=
576598
⟨ReflTransGen.swap, ReflTransGen.swap⟩
577599
#align relation.refl_trans_gen_swap Relation.reflTransGen_swap
578600

601+
@[simp] lemma reflGen_transGen : ReflGen (TransGen r) = ReflTransGen r := by
602+
ext x y
603+
simp_rw [reflTransGen_iff_eq_or_transGen, reflGen_iff]
604+
605+
@[simp] lemma transGen_reflGen : TransGen (ReflGen r) = ReflTransGen r := by
606+
ext x y
607+
refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
608+
· simpa [reflTransGen_idem]
609+
using TransGen.to_reflTransGen <| TransGen.mono (fun _ _ ↦ ReflGen.to_reflTransGen) h
610+
· obtain (rfl | h) := reflTransGen_iff_eq_or_transGen.mp h
611+
· exact .single .refl
612+
· exact TransGen.mono (fun _ _ ↦ .single) h
613+
614+
@[simp] lemma reflTransGen_reflGen : ReflTransGen (ReflGen r) = ReflTransGen r := by
615+
simp only [←transGen_reflGen, reflGen_eq_self reflexive_reflGen]
616+
617+
@[simp] lemma reflTransGen_transGen : ReflTransGen (TransGen r) = ReflTransGen r := by
618+
simp only [←reflGen_transGen, transGen_idem]
619+
620+
lemma reflTransGen_eq_transGen (hr : Reflexive r) :
621+
ReflTransGen r = TransGen r := by
622+
rw [← transGen_reflGen, reflGen_eq_self hr]
623+
624+
lemma reflTransGen_eq_reflGen (hr : Transitive r) :
625+
ReflTransGen r = ReflGen r := by
626+
rw [← reflGen_transGen, transGen_eq_self hr]
627+
579628
end ReflTransGen
580629

581630
/-- The join of a relation on a single type is a new relation for which

Mathlib/Order/Cover.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,23 @@ theorem covby_insert {x : α} {s : Set α} (hx : x ∉ s) : s ⋖ insert x s :=
493493

494494
end Set
495495

496+
section Relation
497+
498+
open Relation
499+
500+
lemma wcovby_eq_reflGen_covby [PartialOrder α] : ((· : α) ⩿ ·) = ReflGen (· ⋖ ·) := by
501+
ext x y; simp_rw [wcovby_iff_eq_or_covby, @eq_comm _ x, reflGen_iff]
502+
503+
lemma transGen_wcovby_eq_reflTransGen_covby [PartialOrder α] :
504+
TransGen ((· : α) ⩿ ·) = ReflTransGen (· ⋖ ·) := by
505+
rw [wcovby_eq_reflGen_covby, transGen_reflGen]
506+
507+
lemma reflTransGen_wcovby_eq_reflTransGen_covby [PartialOrder α] :
508+
ReflTransGen ((· : α) ⩿ ·) = ReflTransGen (· ⋖ ·) := by
509+
rw [wcovby_eq_reflGen_covby, reflTransGen_reflGen]
510+
511+
end Relation
512+
496513
namespace Prod
497514

498515
variable [PartialOrder α] [PartialOrder β] {a a₁ a₂ : α} {b b₁ b₂ : β} {x y : α × β}

0 commit comments

Comments
 (0)