Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2022 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module topology.bornology.basic
! leanprover-community/mathlib commit 8631e2d5ea77f6c13054d9151d82b83069680cb1
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Order.Filter.Cofinite
/-!
# Basic theory of bornology
We develop the basic theory of bornologies. Instead of axiomatizing bounded sets and defining
bornologies in terms of those, we recognize that the cobounded sets form a filter and define a
bornology as a filter of cobounded sets which contains the cofinite filter. This allows us to make
use of the extensive library for filters, but we also provide the relevant connecting results for
bounded sets.
The specification of a bornology in terms of the cobounded filter is equivalent to the standard
one (e.g., see [Bourbaki, *Topological Vector Spaces*][bourbaki1987], **covering bornology**, now
often called simply **bornology**) in terms of bounded sets (see `Bornology.ofBounded`,
`IsBounded.union`, `IsBounded.subset`), except that we do not allow the empty bornology (that is,
we require that *some* set must be bounded; equivalently, `∅` is bounded). In the literature the
cobounded filter is generally referred to as the *filter at infinity*.
## Main definitions
- `Bornology α`: a class consisting of `cobounded : Filter α` and a proof that this filter
contains the `cofinite` filter.
- `Bornology.IsCobounded`: the predicate that a set is a member of the `cobounded α` filter. For
`s : Set α`, one should prefer `Bornology.IsCobounded s` over `s ∈ cobounded α`.
- `bornology.IsBounded`: the predicate that states a set is bounded (i.e., the complement of a
cobounded set). One should prefer `Bornology.IsBounded s` over `sᶜ ∈ cobounded α`.
- `BoundedSpace α`: a class extending `Bornology α` with the condition
`Bornology.IsBounded (Set.univ : Set α)`
Although use of `cobounded α` is discouraged for indicating the (co)boundedness of individual sets,
it is intended for regular use as a filter on `α`.
-/
open Set Filter
variable { ι α β : Type _ : Type (?u.10045+1) Type _}
/-- A **bornology** on a type `α` is a filter of cobounded sets which contains the cofinite filter.
Such spaces are equivalently specified by their bounded sets, see `Bornology.ofBounded`
and `Bornology.ext_iff_isBounded`-/
class Bornology ( α : Type _ ) where
/-- The filter of cobounded sets in a bornology. This is a field of the structure, but one
should always prefer `Bornology.cobounded` because it makes the `α` argument explciit. -/
cobounded' : Filter α
/-- The cobounded filter in a bornology is smaller than the cofinite filter. This is a field of
the structure, but one should always prefer `Bornology.le_cofinite` because it makes the `α`
argument explciit. -/
le_cofinite' : ∀ {α : Type u_1} [self : Bornology α ], Bornology.cobounded' ≤ cofinite le_cofinite' : cobounded' ≤ cofinite
#align bornology Bornology
/- porting note: Because Lean 4 doesn't accept the `[]` syntax to make arguments of structure
fields explicit, we have to define these separately, prove the `ext` lemmas manually, and
initialize new `simps` projections. -/
/-- The filter of cobounded sets in a bornology. -/
def Bornology.cobounded ( α : Type _ ) [ Bornology α ] : Filter α := Bornology.cobounded'
#align bornology.cobounded Bornology.cobounded
alias Bornology.cobounded ← Bornology.Simps.cobounded
lemma Bornology.le_cofinite ( α : Type _ ) [ Bornology α ] : cobounded α ≤ cofinite :=
Bornology.le_cofinite' : ∀ {α : Type ?u.254} [self : Bornology α ], cobounded' ≤ cofinite Bornology.le_cofinite'
#align bornology.le_cofinite Bornology.le_cofinite
initialize_simps_projections Bornology ( cobounded' → cobounded )
@[ ext ]
lemma Bornology.ext ( t t' : Bornology α )
( h_cobounded : @ Bornology.cobounded α t = @ Bornology.cobounded α t' ) :
t = t' := by
cases t mk { cobounded' := cobounded'✝ , le_cofinite' := le_cofinite'✝ } = t'
cases t' mk.mk { cobounded' := cobounded'✝¹ , le_cofinite' := le_cofinite'✝¹ } = { cobounded' := cobounded'✝ , le_cofinite' := le_cofinite'✝ }
congr
#align bornology.ext Bornology.ext
lemma Bornology.ext_iff ( t t' : Bornology α ) :
t = t' ↔ @ Bornology.cobounded α t = @ Bornology.cobounded α t' :=
⟨ congrArg : ∀ {α : Sort ?u.635} {β : Sort ?u.634} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg _ , Bornology.ext _ _ ⟩
#align bornology.ext_iff Bornology.ext_iff
/-- A constructor for bornologies by specifying the bounded sets,
and showing that they satisfy the appropriate conditions. -/
@[ simps : ∀ {α : Type u_1} (B : Set (Set α ) ) (empty_mem : ∅ ∈ B )
(subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B )
(union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) (singleton_mem : ∀ (x : α ), {x } ∈ B ),
(cobounded α ).sets = { s | s ᶜ ∈ B } simps ]
def Bornology.ofBounded : {α : Type u_1} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → (∀ (x : α ), {x } ∈ B ) → Bornology α Bornology.ofBounded { α : Type _ } ( B : Set ( Set α ))
( empty_mem : ∅ ∈ B )
( subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem : ∀ s₁ ( _ : s₁ ∈ B ) s₂ , s₂ ⊆ s₁ → s₂ ∈ B )
( union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B union_mem : ∀ s₁ ( _ : s₁ ∈ B ) s₂ ( _ : s₂ ∈ B ), s₁ ∪ s₂ ∈ B )
( singleton_mem : ∀ (x : ?m.1001 ), ?m.1064 x ∈ B singleton_mem : ∀ x , { x } ∈ B ) : Bornology α
where
cobounded' :=
{ sets := { s : Set α | s ᶜ ∈ B }
univ_sets := by ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B rwa [ ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B ← compl_univ : ∀ {α : Type ?u.1278}, univ ᶜ = ∅ compl_univι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : univ ᶜ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B ] ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : univ ᶜ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B at empty_mem
sets_of_superset := fun hx hy => subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem _ hx _ ( compl_subset_compl : ∀ {α : Type ?u.1207} {s t : Set α }, s ᶜ ⊆ t ᶜ ↔ t ⊆ s compl_subset_compl. mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr hy )
inter_sets := fun hx hy => by ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B x✝, y✝ : Set α hx : x✝ ∈ { s | s ᶜ ∈ B } hy : y✝ ∈ { s | s ᶜ ∈ B } simpa [ compl_inter : ∀ {α : Type ?u.1321} (s t : Set α ), (s ∩ t )ᶜ = s ᶜ ∪ t ᶜ compl_inter] using union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B union_mem _ hx _ hy }
le_cofinite' := by
ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) } ≤ cofinite rw [ ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) } ≤ cofinite le_cofinite_iff_compl_singleton_mem : ∀ {α : Type ?u.1893} {l : Filter α }, l ≤ cofinite ↔ ∀ (x : α ), {x } ᶜ ∈ l le_cofinite_iff_compl_singleton_memι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B ∀ (x : α ),
{x } ᶜ ∈ { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) } ] ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B ∀ (x : α ),
{x } ᶜ ∈ { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) }
ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) } ≤ cofinite intro x ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B x : α {x } ᶜ ∈ { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) }
ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) } ≤ cofinite change { x }ᶜᶜ ∈ B ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B x : α
ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) } ≤ cofinite rw [ ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B x : α compl_compl ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B x : α ] ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B x : α
ι : Type ?u.663α✝ : Type ?u.666β : Type ?u.669α : Type ?u.672B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B singleton_mem : ∀ (x : α ), {x } ∈ B { sets := { s | s ᶜ ∈ B } , univ_sets := (_ : univ ᶜ ∈ B ) ,
sets_of_superset := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → x ⊆ y → y ᶜ ∈ B ) ,
inter_sets := (_ : ∀ {x y : Set α }, x ∈ { s | s ᶜ ∈ B } → y ∈ { s | s ᶜ ∈ B } → x ∩ y ∈ { s | s ᶜ ∈ B } ) } ≤ cofinite exact singleton_mem : ∀ (x : α ), {x } ∈ B singleton_mem x
#align bornology.of_bounded Bornology.ofBounded : {α : Type u_1} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → (∀ (x : α ), {x } ∈ B ) → Bornology α Bornology.ofBounded
#align bornology.of_bounded_cobounded_sets Bornology.ofBounded_cobounded_sets : ∀ {α : Type u_1} (B : Set (Set α ) ) (empty_mem : ∅ ∈ B )
(subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B )
(union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) (singleton_mem : ∀ (x : α ), {x } ∈ B ),
(Bornology.cobounded α ).sets = { s | s ᶜ ∈ B } Bornology.ofBounded_cobounded_sets
/-- A constructor for bornologies by specifying the bounded sets,
and showing that they satisfy the appropriate conditions. -/
@[ simps! ]
def Bornology.ofBounded' : {α : Type u_1} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → ⋃₀ B = univ → Bornology α Bornology.ofBounded' { α : Type _ } ( B : Set ( Set α ))
( empty_mem : ∅ ∈ B )
( subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem : ∀ s₁ ( _ : s₁ ∈ B ) s₂ , s₂ ⊆ s₁ → s₂ ∈ B )
( union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B union_mem : ∀ s₁ ( _ : s₁ ∈ B ) s₂ ( _ : s₂ ∈ B ), s₁ ∪ s₂ ∈ B )
( sUnion_univ : ⋃₀ B = univ ) :
Bornology α :=
Bornology.ofBounded : {α : Type ?u.2955} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → (∀ (x : α ), {x } ∈ B ) → Bornology α Bornology.ofBounded B empty_mem subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B union_mem fun x => by
ι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ⋃₀ B = univ x : α rw [ ι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ⋃₀ B = univ x : α sUnion_eq_univ_iff : ∀ {α : Type ?u.2991} {c : Set (Set α ) }, ⋃₀ c = univ ↔ ∀ (a : α ), ∃ b , b ∈ c ∧ a ∈ b sUnion_eq_univ_iffι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (a : α ), ∃ b , b ∈ B ∧ a ∈ b x : α ] ι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (a : α ), ∃ b , b ∈ B ∧ a ∈ b x : α at sUnion_univ ι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (a : α ), ∃ b , b ∈ B ∧ a ∈ b x : α
ι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ⋃₀ B = univ x : α rcases sUnion_univ : ∀ (a : α ), ∃ b , b ∈ B ∧ a ∈ b sUnion_univ x with ⟨s, hs, hxs⟩ : s ∈ B ∧ x ∈ s ⟨s ⟨s, hs, hxs⟩ : s ∈ B ∧ x ∈ s , hs ⟨s, hs, hxs⟩ : s ∈ B ∧ x ∈ s , hxs ⟨s, hs, hxs⟩ : s ∈ B ∧ x ∈ s ⟩ι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (a : α ), ∃ b , b ∈ B ∧ a ∈ b x : α s : Set α hs : s ∈ B hxs : x ∈ s intro.intro
ι : Type ?u.2558α✝ : Type ?u.2561β : Type ?u.2564α : Type ?u.2567B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ⋃₀ B = univ x : α exact subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem s hs { x } ( singleton_subset_iff : ∀ {α : Type ?u.3100} {a : α } {s : Set α }, {a } ⊆ s ↔ a ∈ s singleton_subset_iff. mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr hxs )
#align bornology.of_bounded' Bornology.ofBounded' : {α : Type u_1} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → ⋃₀ B = univ → Bornology α Bornology.ofBounded'
#align bornology.of_bounded'_cobounded_sets Bornology.ofBounded'_cobounded_sets : ∀ {α : Type u_1} (B : Set (Set α ) ) (empty_mem : ∅ ∈ B )
(subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B )
(union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) (sUnion_univ : ⋃₀ B = univ ),
(Bornology.cobounded α ).sets = { s | s ᶜ ∈ B } Bornology.ofBounded'_cobounded_sets
namespace Bornology
section
variable [ Bornology α ] { s t : Set α } { x : α }
/-- `IsCobounded` is the predicate that `s` is in the filter of cobounded sets in the ambient
bornology on `α` -/
def IsCobounded ( s : Set α ) : Prop :=
s ∈ cobounded α
#align bornology.is_cobounded Bornology.IsCobounded
/-- `IsBounded` is the predicate that `s` is bounded relative to the ambient bornology on `α`. -/
def IsBounded ( s : Set α ) : Prop :=
IsCobounded ( s ᶜ)
#align bornology.is_bounded Bornology.IsBounded
theorem isCobounded_def { s : Set α } : IsCobounded s ↔ s ∈ cobounded α :=
Iff.rfl : ∀ {a : Prop }, a ↔ a Iff.rfl
#align bornology.is_cobounded_def Bornology.isCobounded_def
theorem isBounded_def { s : Set α } : IsBounded s ↔ s ᶜ ∈ cobounded α :=
Iff.rfl : ∀ {a : Prop }, a ↔ a Iff.rfl
#align bornology.is_bounded_def Bornology.isBounded_def
@[ simp ]
theorem isBounded_compl_iff : IsBounded ( s ᶜ) ↔ IsCobounded s := by
rw [ isBounded_def , isCobounded_def , compl_compl ]
#align bornology.is_bounded_compl_iff Bornology.isBounded_compl_iff
@[ simp ]
theorem isCobounded_compl_iff : IsCobounded ( s ᶜ) ↔ IsBounded s :=
Iff.rfl : ∀ {a : Prop }, a ↔ a Iff.rfl
#align bornology.is_cobounded_compl_iff Bornology.isCobounded_compl_iff
alias isBounded_compl_iff ↔ IsBounded.of_compl IsCobounded.compl
#align bornology.is_bounded.of_compl Bornology.IsBounded.of_compl
#align bornology.is_cobounded.compl Bornology.IsCobounded.compl
alias isCobounded_compl_iff ↔ IsCobounded.of_compl IsBounded.compl
#align bornology.is_cobounded.of_compl Bornology.IsCobounded.of_compl
#align bornology.is_bounded.compl Bornology.IsBounded.compl
@[ simp ]
theorem isBounded_empty : IsBounded ( ∅ : Set α ) := by
rw [ isBounded_def , compl_empty : ∀ {α : Type ?u.4367}, ∅ ᶜ = univ compl_empty]
exact univ_mem : ∀ {α : Type ?u.4385} {f : Filter α }, univ ∈ f univ_mem
#align bornology.is_bounded_empty Bornology.isBounded_empty
@[ simp ]
theorem isBounded_singleton : IsBounded ({ x } : Set α ) := by
rw [ isBounded_def ]
exact le_cofinite _ ( finite_singleton x ). compl_mem_cofinite
#align bornology.is_bounded_singleton Bornology.isBounded_singleton
@[ simp ]
theorem isCobounded_univ : IsCobounded ( univ : Set α ) :=
univ_mem : ∀ {α : Type ?u.4580} {f : Filter α }, univ ∈ f univ_mem
#align bornology.is_cobounded_univ Bornology.isCobounded_univ
@[ simp ]
theorem isCobounded_inter : IsCobounded ( s ∩ t ) ↔ IsCobounded s ∧ IsCobounded t :=
inter_mem_iff
#align bornology.is_cobounded_inter Bornology.isCobounded_inter
theorem IsCobounded.inter ( hs : IsCobounded s ) ( ht : IsCobounded t ) : IsCobounded ( s ∩ t ) :=
isCobounded_inter . 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 ⟨ hs , ht ⟩
#align bornology.is_cobounded.inter Bornology.IsCobounded.inter
@[ simp ]
theorem isBounded_union : IsBounded ( s ∪ t ) ↔ IsBounded s ∧ IsBounded t := by
simp only [← isCobounded_compl_iff , compl_union : ∀ {α : Type ?u.4915} (s t : Set α ), (s ∪ t )ᶜ = s ᶜ ∩ t ᶜ compl_union, isCobounded_inter ]
#align bornology.is_bounded_union Bornology.isBounded_union
theorem IsBounded.union ( hs : IsBounded s ) ( ht : IsBounded t ) : IsBounded ( s ∪ t ) :=
isBounded_union . 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 ⟨ hs , ht ⟩
#align bornology.is_bounded.union Bornology.IsBounded.union
theorem IsCobounded.superset ( hs : IsCobounded s ) ( ht : s ⊆ t ) : IsCobounded t :=
mem_of_superset : ∀ {α : Type ?u.5287} {f : Filter α } {x y : Set α }, x ∈ f → x ⊆ y → y ∈ f mem_of_superset hs ht
#align bornology.is_cobounded.superset Bornology.IsCobounded.superset
theorem IsBounded.subset ( ht : IsBounded t ) ( hs : s ⊆ t ) : IsBounded s :=
ht . superset ( compl_subset_compl : ∀ {α : Type ?u.5392} {s t : Set α }, s ᶜ ⊆ t ᶜ ↔ t ⊆ s compl_subset_compl. mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr hs )
#align bornology.is_bounded.subset Bornology.IsBounded.subset
@[ simp ]
theorem sUnion_bounded_univ : ⋃₀ { s : Set α | IsBounded s } = univ :=
sUnion_eq_univ_iff : ∀ {α : Type ?u.5497} {c : Set (Set α ) }, ⋃₀ c = univ ↔ ∀ (a : α ), ∃ b , b ∈ c ∧ a ∈ b sUnion_eq_univ_iff. 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 fun a => ⟨{ a }, isBounded_singleton , mem_singleton : ∀ {α : Type ?u.5599} (a : α ), a ∈ {a } mem_singleton a ⟩
#align bornology.sUnion_bounded_univ Bornology.sUnion_bounded_univ
theorem comap_cobounded_le_iff [ Bornology β ] { f : α → β } :
( cobounded β ). comap f ≤ cobounded α ↔ ∀ ⦃ s ⦄, IsBounded s → IsBounded ( f '' s ) := by
refine'
⟨ fun h s hs => _ , fun h t ht =>
⟨( f '' t ᶜ)ᶜ, h <| IsCobounded.compl ht , compl_subset_comm : ∀ {α : Type ?u.5908} {s t : Set α }, s ᶜ ⊆ t ↔ t ᶜ ⊆ s compl_subset_comm. 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 <| subset_preimage_image : ∀ {α : Type ?u.5931} {β : Type ?u.5932} (f : α → β ) (s : Set α ), s ⊆ f ⁻¹' (f '' s ) subset_preimage_image _ _ ⟩⟩
obtain ⟨ t , ht , hts ⟩ := h hs . compl
rw [ subset_compl_comm : ∀ {α : Type ?u.6043} {s t : Set α }, s ⊆ t ᶜ ↔ t ⊆ s ᶜ subset_compl_comm, ← preimage_compl : ∀ {α : Type ?u.6069} {β : Type ?u.6068} {f : α → β } {s : Set β }, f ⁻¹' s ᶜ = (f ⁻¹' s )ᶜ preimage_compl] at hts
exact ( IsCobounded.compl ht ). subset (( image_subset : ∀ {α : Type ?u.6132} {β : Type ?u.6133} {a b : Set α } (f : α → β ), a ⊆ b → f '' a ⊆ f '' b image_subset f hts ). trans : ∀ {α : Type ?u.6141} [inst : HasSubset α ] [inst_1 : IsTrans α fun x x_1 => x ⊆ x_1 ] {a b c : α }, a ⊆ b → b ⊆ c → a ⊆ c trans <| image_preimage_subset : ∀ {α : Type ?u.6191} {β : Type ?u.6190} (f : α → β ) (s : Set β ), f '' (f ⁻¹' s ) ⊆ s image_preimage_subset _ _ )
#align bornology.comap_cobounded_le_iff Bornology.comap_cobounded_le_iff
end
theorem ext_iff' { t t' : Bornology α } :
t = t' ↔ ∀ s , (@ cobounded α t ). sets s ↔ (@ cobounded α t' ). sets s :=
( Bornology.ext_iff _ _ ). trans : ∀ {a b c : Prop }, (a ↔ b ) → (b ↔ c ) → (a ↔ c ) trans Filter.ext_iff : ∀ {α : Type ?u.6287} {f g : Filter α }, f = g ↔ ∀ (s : Set α ), s ∈ f ↔ s ∈ g Filter.ext_iff
#align bornology.ext_iff' Bornology.ext_iff'
theorem ext_iff_isBounded { t t' : Bornology α } :
t = t' ↔ ∀ s , @ IsBounded α t s ↔ @ IsBounded α t' s :=
⟨ fun h s => h ▸ Iff.rfl : ∀ {a : Prop }, a ↔ a Iff.rfl, fun h => by
ext s
simpa [@ isBounded_def _ t , isBounded_def , compl_compl ] using h ( s ᶜ) ⟩
-- porting note: Lean 3 could do this without `@isBounded_def _ t`
#align bornology.ext_iff_is_bounded Bornology.ext_iff_isBounded
variable { s : Set α }
theorem isCobounded_ofBounded_iff : ∀ (B : Set (Set α ) ) {empty_mem : ∅ ∈ B } {subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B }
{union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B } {sUnion_univ : ∀ (x : α ), {x } ∈ B },
IsCobounded s ↔ s ᶜ ∈ B isCobounded_ofBounded_iff ( B : Set ( Set α )) { empty_mem subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem union_mem sUnion_univ : ∀ (x : α ), {x } ∈ B sUnion_univ } :
@ IsCobounded _ ( ofBounded : {α : Type ?u.6659} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → (∀ (x : α ), {x } ∈ B ) → Bornology α ofBounded B empty_mem subset_mem union_mem sUnion_univ ) s ↔ s ᶜ ∈ B :=
Iff.rfl : ∀ {a : Prop }, a ↔ a Iff.rfl
#align bornology.is_cobounded_of_bounded_iff Bornology.isCobounded_ofBounded_iff : ∀ {α : Type u_1} {s : Set α } (B : Set (Set α ) ) {empty_mem : ∅ ∈ B }
{subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B }
{union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B } {sUnion_univ : ∀ (x : α ), {x } ∈ B },
IsCobounded s ↔ s ᶜ ∈ B Bornology.isCobounded_ofBounded_iff
theorem isBounded_ofBounded_iff : ∀ (B : Set (Set α ) ) {empty_mem : ∅ ∈ B } {subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B }
{union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B } {sUnion_univ : ∀ (x : α ), {x } ∈ B },
IsBounded s ↔ s ∈ B isBounded_ofBounded_iff ( B : Set ( Set α )) { empty_mem subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem union_mem sUnion_univ : ∀ (x : α ), {x } ∈ B sUnion_univ } :
@ IsBounded _ ( ofBounded : {α : Type ?u.6811} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → (∀ (x : α ), {x } ∈ B ) → Bornology α ofBounded B empty_mem subset_mem union_mem sUnion_univ ) s ↔ s ∈ B := by
ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B rw [ ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B @ isBounded_def _ ( ofBounded : {α : Type ?u.6872} →
(B : Set (Set α ) ) →
∅ ∈ B →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B ) →
(∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) → (∀ (x : α ), {x } ∈ B ) → Bornology α ofBounded B empty_mem subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B subset_mem union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B union_mem sUnion_univ : ∀ (x : α ), {x } ∈ B sUnion_univ ), ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B ← Filter.mem_sets : ∀ {α : Type ?u.6914} {f : Filter α } {s : Set α }, s ∈ f .sets ↔ s ∈ f Filter.mem_sets, ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B
ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B ofBounded_cobounded_sets : ∀ {α : Type ?u.6929} (B : Set (Set α ) ) (empty_mem : ∅ ∈ B )
(subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B )
(union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B ) (singleton_mem : ∀ (x : α ), {x } ∈ B ),
(cobounded α ).sets = { s | s ᶜ ∈ B } ofBounded_cobounded_sets, ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B Set.mem_setOf_eq : ∀ {α : Type ?u.6994} {x : α } {p : α → Prop }, (x ∈ { y | p y } ) = p x Set.mem_setOf_eq, ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B compl_compl ι : Type ?u.6781α : Type u_1β : Type ?u.6787s : Set α B : Set (Set α )empty_mem : ∅ ∈ B subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B sUnion_univ : ∀ (x : α ), {x } ∈ B ]
-- porting note: again had to use `@isBounded_def _` and feed Lean the instance
#align bornology.is_bounded_of_bounded_iff Bornology.isBounded_ofBounded_iff : ∀ {α : Type u_1} {s : Set α } (B : Set (Set α ) ) {empty_mem : ∅ ∈ B }
{subset_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ⊆ s₁ → s₂ ∈ B }
{union_mem : ∀ (s₁ : Set α ), s₁ ∈ B → ∀ (s₂ : Set α ), s₂ ∈ B → s₁ ∪ s₂ ∈ B } {sUnion_univ : ∀ (x : α ), {x } ∈ B },
IsBounded s ↔ s ∈ B Bornology.isBounded_ofBounded_iff
variable [ Bornology α ]
theorem isCobounded_biInter { s : Set ι } { f : ι → Set α } ( hs : s . Finite ) :
IsCobounded (⋂ i ∈ s , f i ) ↔ ∀ i ∈ s , IsCobounded ( f i ) :=
biInter_mem hs
#align bornology.is_cobounded_bInter Bornology.isCobounded_biInter
@[ simp ]
theorem isCobounded_biInter_finset ( s : Finset ι ) { f : ι → Set α } :
IsCobounded (⋂ i ∈ s , f i ) ↔ ∀ i ∈ s , IsCobounded ( f i ) :=
biInter_finset_mem s
#align bornology.is_cobounded_bInter_finset Bornology.isCobounded_biInter_finset
@[ simp ]
theorem isCobounded_iInter [ Finite ι ] { f : ι → Set α } :
IsCobounded (⋂ i , f i ) ↔ ∀ i , IsCobounded ( f i ) :=
iInter_mem
#align bornology.is_cobounded_Inter Bornology.isCobounded_iInter
theorem isCobounded_sInter { S : Set ( Set α )} ( hs : S . Finite ) :
IsCobounded (⋂₀ S ) ↔ ∀ s ∈ S , IsCobounded s :=
sInter_mem hs
#align bornology.is_cobounded_sInter Bornology.isCobounded_sInter
theorem isBounded_biUnion { s : Set ι } { f : ι → Set α } ( hs : s . Finite ) :
IsBounded (⋃ i ∈ s , f i ) ↔ ∀ i ∈ s , IsBounded ( f i ) := by
simp only [← isCobounded_compl_iff , compl_iUnion , isCobounded_biInter hs ]
#align bornology.is_bounded_bUnion Bornology.isBounded_biUnion
theorem isBounded_biUnion_finset ( s : Finset ι ) { f : ι → Set α } :
IsBounded (⋃ i ∈ s , f i ) ↔ ∀ i ∈ s , IsBounded ( f i ) :=
isBounded_biUnion s . finite_toSet
#align bornology.is_bounded_bUnion_finset Bornology.isBounded_biUnion_finset
theorem isBounded_sUnion { S : Set ( Set α )} ( hs : S . Finite ) :
IsBounded (⋃₀ S ) ↔ ∀ s ∈ S , IsBounded s := by rw [ sUnion_eq_biUnion , isBounded_biUnion hs ]
#align bornology.is_bounded_sUnion Bornology.isBounded_sUnion
@[ simp ]
theorem isBounded_iUnion [ Finite ι ] { s : ι → Set α } : IsBounded (⋃ i , s i ) ↔ ∀ i , IsBounded ( s i ) :=
by rw [ ← sUnion_range , isBounded_sUnion ( finite_range s ), forall_range_iff : ∀ {α : Type ?u.9106} {ι : Sort ?u.9107} {f : ι → α } {p : α → Prop }, (∀ (a : α ), a ∈ range f → p a ) ↔ ∀ (i : ι ), p (f i ) forall_range_iff]
#align bornology.is_bounded_Union Bornology.isBounded_iUnion
end Bornology
open Bornology
theorem Set.Finite.isBounded [ Bornology α ] { s : Set α } ( hs : s . Finite ) : IsBounded s :=
Bornology.le_cofinite α hs . compl_mem_cofinite
#align set.finite.is_bounded Set.Finite.isBounded
instance : Bornology PUnit :=
⟨ ⊥ , bot_le ⟩
/-- The cofinite filter as a bornology -/
@[reducible]
def Bornology.cofinite : Bornology α
where
cobounded' := Filter.cofinite
le_cofinite' := le_rfl
#align bornology.cofinite Bornology.cofinite
/-- A space with a `Bornology` is a **bounded space** if `Set.univ : Set α` is bounded. -/
class BoundedSpace ( α : Type _ : Type (?u.10021+1) Type _) [ Bornology : Type ?u.10024 → Type ?u.10024 Bornology α ] : Prop where
/-- The `Set.univ` is bounded. -/
bounded_univ : Bornology.IsBounded ( univ : Set α )
#align bounded_space BoundedSpace
namespace Bornology
variable [ Bornology : Type ?u.10343 → Type ?u.10343 Bornology α ]
theorem isBounded_univ : IsBounded ( univ : Set α ) ↔ BoundedSpace α :=
⟨ fun h => ⟨ h ⟩, fun h => h . 1 ⟩
#align bornology.is_bounded_univ Bornology.isBounded_univ
theorem cobounded_eq_bot_iff : cobounded α = ⊥ ↔ BoundedSpace α := by
rw [ ← isBounded_univ , isBounded_def , compl_univ : ∀ {α : Type ?u.10274}, univ ᶜ = ∅ compl_univ, empty_mem_iff_bot ]
#align bornology.cobounded_eq_bot_iff Bornology.cobounded_eq_bot_iff
variable [ BoundedSpace α ]
theorem IsBounded.all ( s : Set α ) : IsBounded s :=
BoundedSpace.bounded_univ . subset s . subset_univ : ∀ {α : Type ?u.10406} (s : Set α ), s ⊆ univ subset_univ
#align bornology.is_bounded.all Bornology.IsBounded.all
theorem IsCobounded.all ( s : Set α ) : IsCobounded s :=
compl_compl s ▸ IsBounded.all ( s ᶜ)
#align bornology.is_cobounded.all Bornology.IsCobounded.all
variable ( α )
@[ simp ]
theorem cobounded_eq_bot : cobounded α = ⊥ :=
cobounded_eq_bot_iff . 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 ‹_›
#align bornology.cobounded_eq_bot Bornology.cobounded_eq_bot
end Bornology