Skip to content

Commit 48c7ceb

Browse files
committed
chore: use to_dual for SupClosed/InfClosed (leanprover-community#40175)
This PR tags lemmas about `SupClosed` with the `to_dual` attribute. Co-authored-by: Remy Degenne <remydegenne@gmail.com>
1 parent 2742bd8 commit 48c7ceb

1 file changed

Lines changed: 19 additions & 79 deletions

File tree

Mathlib/Order/SupClosed.lean

Lines changed: 19 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -44,51 +44,65 @@ variable {ι : Sort*} {S : Set (Set α)} {f : ι → Set α} {s t : Set α} {a :
4444
open Set
4545

4646
/-- A set `s` is *sup-closed* if `a ⊔ b ∈ s` for all `a ∈ s`, `b ∈ s`. -/
47+
@[to_dual /-- A set `s` is *inf-closed* if `a ⊓ b ∈ s` for all `a ∈ s`, `b ∈ s`. -/]
4748
def SupClosed (s : Set α) : Prop := ∀ ⦃a⦄, a ∈ s → ∀ ⦃b⦄, b ∈ s → a ⊔ b ∈ s
4849

49-
@[simp] lemma supClosed_empty : SupClosed (∅ : Set α) := by simp [SupClosed]
50-
@[simp] lemma supClosed_singleton : SupClosed ({a} : Set α) := by simp [SupClosed]
50+
@[to_dual (attr := simp)] lemma supClosed_empty : SupClosed (∅ : Set α) := by simp [SupClosed]
51+
@[to_dual (attr := simp)] lemma supClosed_singleton : SupClosed ({a} : Set α) := by simp [SupClosed]
5152

52-
@[simp] lemma supClosed_univ : SupClosed (univ : Set α) := by simp [SupClosed]
53+
@[to_dual (attr := simp)] lemma supClosed_univ : SupClosed (univ : Set α) := by simp [SupClosed]
54+
55+
@[to_dual]
5356
lemma SupClosed.inter (hs : SupClosed s) (ht : SupClosed t) : SupClosed (s ∩ t) :=
5457
fun _a ha _b hb ↦ ⟨hs ha.1 hb.1, ht ha.2 hb.2
5558

59+
@[to_dual]
5660
lemma supClosed_sInter (hS : ∀ s ∈ S, SupClosed s) : SupClosed (⋂₀ S) :=
5761
fun _a ha _b hb _s hs ↦ hS _ hs (ha _ hs) (hb _ hs)
5862

63+
@[to_dual]
5964
lemma supClosed_iInter (hf : ∀ i, SupClosed (f i)) : SupClosed (⋂ i, f i) :=
6065
supClosed_sInter <| forall_mem_range.2 hf
6166

67+
@[to_dual InfClosed.codirectedOn]
6268
lemma SupClosed.directedOn (hs : SupClosed s) : DirectedOn (· ≤ ·) s :=
6369
fun _a ha _b hb ↦ ⟨_, hs ha hb, le_sup_left, le_sup_right⟩
6470

71+
@[to_dual]
6572
lemma IsUpperSet.supClosed (hs : IsUpperSet s) : SupClosed s := fun _a _ _b ↦ hs le_sup_right
6673

74+
@[to_dual]
6775
lemma SupClosed.preimage [FunLike F β α] [SupHomClass F β α] (hs : SupClosed s) (f : F) :
6876
SupClosed (f ⁻¹' s) :=
6977
fun a ha b hb ↦ by simpa [map_sup] using hs ha hb
7078

79+
@[to_dual]
7180
lemma SupClosed.image [FunLike F α β] [SupHomClass F α β] (hs : SupClosed s) (f : F) :
7281
SupClosed (f '' s) := by
7382
rintro _ ⟨a, ha, rfl⟩ _ ⟨b, hb, rfl⟩
7483
rw [← map_sup]
7584
exact Set.mem_image_of_mem _ <| hs ha hb
7685

86+
@[to_dual]
7787
lemma supClosed_range [FunLike F α β] [SupHomClass F α β] (f : F) : SupClosed (Set.range f) := by
7888
simpa using supClosed_univ.image f
7989

90+
@[to_dual]
8091
lemma SupClosed.prod {t : Set β} (hs : SupClosed s) (ht : SupClosed t) : SupClosed (s ×ˢ t) :=
8192
fun _a ha _b hb ↦ ⟨hs ha.1 hb.1, ht ha.2 hb.2
8293

94+
@[to_dual]
8395
lemma supClosed_pi {ι : Type*} {α : ι → Type*} [∀ i, SemilatticeSup (α i)] {s : Set ι}
8496
{t : ∀ i, Set (α i)} (ht : ∀ i ∈ s, SupClosed (t i)) : SupClosed (s.pi t) :=
8597
fun _a ha _b hb _i hi ↦ ht _ hi (ha _ hi) (hb _ hi)
8698

99+
@[to_dual]
87100
lemma SupClosed.insert_upperBounds {s : Set α} {a : α} (hs : SupClosed s) (ha : a ∈ upperBounds s) :
88101
SupClosed (insert a s) := by
89102
rw [SupClosed]
90103
aesop
91104

105+
@[to_dual]
92106
lemma SupClosed.insert_lowerBounds {s : Set α} {a : α} (h : SupClosed s) (ha : a ∈ lowerBounds s) :
93107
SupClosed (insert a s) := by
94108
rw [SupClosed]
@@ -101,93 +115,19 @@ section Finset
101115
variable {ι : Type*} {f : ι → α} {s : Set α} {t : Finset ι} {a : α}
102116
open Finset
103117

118+
@[to_dual]
104119
lemma SupClosed.finsetSup'_mem (hs : SupClosed s) (ht : t.Nonempty) :
105120
(∀ i ∈ t, f i ∈ s) → t.sup' ht f ∈ s :=
106121
sup'_induction _ _ hs
107122

123+
@[to_dual]
108124
lemma SupClosed.finsetSup_mem [OrderBot α] (hs : SupClosed s) (ht : t.Nonempty) :
109125
(∀ i ∈ t, f i ∈ s) → t.sup f ∈ s :=
110126
sup'_eq_sup ht f ▸ hs.finsetSup'_mem ht
111127

112128
end Finset
113129
end SemilatticeSup
114130

115-
section SemilatticeInf
116-
variable [SemilatticeInf α] [SemilatticeInf β]
117-
118-
section Set
119-
variable {ι : Sort*} {S : Set (Set α)} {f : ι → Set α} {s t : Set α} {a : α}
120-
open Set
121-
122-
/-- A set `s` is *inf-closed* if `a ⊓ b ∈ s` for all `a ∈ s`, `b ∈ s`. -/
123-
def InfClosed (s : Set α) : Prop := ∀ ⦃a⦄, a ∈ s → ∀ ⦃b⦄, b ∈ s → a ⊓ b ∈ s
124-
125-
@[simp] lemma infClosed_empty : InfClosed (∅ : Set α) := by simp [InfClosed]
126-
@[simp] lemma infClosed_singleton : InfClosed ({a} : Set α) := by simp [InfClosed]
127-
128-
@[simp] lemma infClosed_univ : InfClosed (univ : Set α) := by simp [InfClosed]
129-
lemma InfClosed.inter (hs : InfClosed s) (ht : InfClosed t) : InfClosed (s ∩ t) :=
130-
fun _a ha _b hb ↦ ⟨hs ha.1 hb.1, ht ha.2 hb.2
131-
132-
lemma infClosed_sInter (hS : ∀ s ∈ S, InfClosed s) : InfClosed (⋂₀ S) :=
133-
fun _a ha _b hb _s hs ↦ hS _ hs (ha _ hs) (hb _ hs)
134-
135-
lemma infClosed_iInter (hf : ∀ i, InfClosed (f i)) : InfClosed (⋂ i, f i) :=
136-
infClosed_sInter <| forall_mem_range.2 hf
137-
138-
lemma InfClosed.codirectedOn (hs : InfClosed s) : DirectedOn (· ≥ ·) s :=
139-
fun _a ha _b hb ↦ ⟨_, hs ha hb, inf_le_left, inf_le_right⟩
140-
141-
lemma IsLowerSet.infClosed (hs : IsLowerSet s) : InfClosed s := fun _a _ _b ↦ hs inf_le_right
142-
143-
lemma InfClosed.preimage [FunLike F β α] [InfHomClass F β α] (hs : InfClosed s) (f : F) :
144-
InfClosed (f ⁻¹' s) :=
145-
fun a ha b hb ↦ by simpa [map_inf] using hs ha hb
146-
147-
lemma InfClosed.image [FunLike F α β] [InfHomClass F α β] (hs : InfClosed s) (f : F) :
148-
InfClosed (f '' s) := by
149-
rintro _ ⟨a, ha, rfl⟩ _ ⟨b, hb, rfl⟩
150-
rw [← map_inf]
151-
exact Set.mem_image_of_mem _ <| hs ha hb
152-
153-
lemma infClosed_range [FunLike F α β] [InfHomClass F α β] (f : F) : InfClosed (Set.range f) := by
154-
simpa using infClosed_univ.image f
155-
156-
lemma InfClosed.prod {t : Set β} (hs : InfClosed s) (ht : InfClosed t) : InfClosed (s ×ˢ t) :=
157-
fun _a ha _b hb ↦ ⟨hs ha.1 hb.1, ht ha.2 hb.2
158-
159-
lemma infClosed_pi {ι : Type*} {α : ι → Type*} [∀ i, SemilatticeInf (α i)] {s : Set ι}
160-
{t : ∀ i, Set (α i)} (ht : ∀ i ∈ s, InfClosed (t i)) : InfClosed (s.pi t) :=
161-
fun _a ha _b hb _i hi ↦ ht _ hi (ha _ hi) (hb _ hi)
162-
163-
lemma InfClosed.insert_upperBounds {s : Set α} {a : α} (hs : InfClosed s) (ha : a ∈ upperBounds s) :
164-
InfClosed (insert a s) := by
165-
rw [InfClosed]
166-
have ha' : ∀ b ∈ s, b ≤ a := fun _ a ↦ ha a
167-
aesop
168-
169-
lemma InfClosed.insert_lowerBounds {s : Set α} {a : α} (h : InfClosed s) (ha : a ∈ lowerBounds s) :
170-
InfClosed (insert a s) := by
171-
rw [InfClosed]
172-
aesop
173-
174-
end Set
175-
176-
section Finset
177-
variable {ι : Type*} {f : ι → α} {s : Set α} {t : Finset ι} {a : α}
178-
open Finset
179-
180-
lemma InfClosed.finsetInf'_mem (hs : InfClosed s) (ht : t.Nonempty) :
181-
(∀ i ∈ t, f i ∈ s) → t.inf' ht f ∈ s :=
182-
inf'_induction _ _ hs
183-
184-
lemma InfClosed.finsetInf_mem [OrderTop α] (hs : InfClosed s) (ht : t.Nonempty) :
185-
(∀ i ∈ t, f i ∈ s) → t.inf f ∈ s :=
186-
inf'_eq_inf ht f ▸ hs.finsetInf'_mem ht
187-
188-
end Finset
189-
end SemilatticeInf
190-
191131
open Finset OrderDual
192132

193133
section Lattice

0 commit comments

Comments
 (0)