@@ -448,6 +448,20 @@ theorem _root_.WellFounded.transGen (h : WellFounded r) : WellFounded (TransGen
448
448
⟨fun a ↦ (h.apply a).TransGen⟩
449
449
#align well_founded.trans_gen WellFounded.transGen
450
450
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
+
451
465
section TransGen
452
466
453
467
theorem transGen_eq_self (trans : Transitive r) : TransGen r = r :=
@@ -491,6 +505,10 @@ theorem TransGen.mono {p : α → α → Prop} :
491
505
TransGen.lift id
492
506
#align relation.trans_gen.mono Relation.TransGen.mono
493
507
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
+
494
512
theorem TransGen.swap (h : TransGen r b a) : TransGen (swap r) a b := by
495
513
induction' h with b h b c _ hbc ih
496
514
· exact TransGen.single h
@@ -539,6 +557,10 @@ theorem reflTransGen_eq_self (refl : Reflexive r) (trans : Transitive r) : ReflT
539
557
· exact trans IH h₂, single⟩
540
558
#align relation.refl_trans_gen_eq_self Relation.reflTransGen_eq_self
541
559
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
+
542
564
theorem reflexive_reflTransGen : Reflexive (ReflTransGen r) := fun _ ↦ refl
543
565
#align relation.reflexive_refl_trans_gen Relation.reflexive_reflTransGen
544
566
@@ -551,14 +573,14 @@ instance : IsRefl α (ReflTransGen r) :=
551
573
instance : IsTrans α (ReflTransGen r) :=
552
574
⟨@ReflTransGen.trans α r⟩
553
575
554
- theorem refl_trans_gen_idem : ReflTransGen (ReflTransGen r) = ReflTransGen r :=
576
+ theorem reflTransGen_idem : ReflTransGen (ReflTransGen r) = ReflTransGen r :=
555
577
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
557
579
558
580
theorem ReflTransGen.lift' {p : β → β → Prop } {a b : α} (f : α → β)
559
581
(h : ∀ a b, r a b → ReflTransGen p (f a) (f b))
560
582
(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
562
584
#align relation.refl_trans_gen.lift' Relation.ReflTransGen.lift'
563
585
564
586
theorem reflTransGen_closed {p : α → α → Prop } :
@@ -576,6 +598,33 @@ theorem reflTransGen_swap : ReflTransGen (swap r) a b ↔ ReflTransGen r b a :=
576
598
⟨ReflTransGen.swap, ReflTransGen.swap⟩
577
599
#align relation.refl_trans_gen_swap Relation.reflTransGen_swap
578
600
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
+
579
628
end ReflTransGen
580
629
581
630
/-- The join of a relation on a single type is a new relation for which
0 commit comments