Closure operators between preorders #
We define (bundled) closure operators on a preorder as monotone (increasing), extensive (inflationary) and idempotent functions. We define closed elements for the operator as elements which are fixed by it.
Lower adjoints to a function between preorders u : β → α allow to generalise closure operators to
situations where the closure operator we are dealing with naturally decomposes as u ∘ l where l
is a worthy function to have on its own. Typical examples include
l : set G → subgroup G := subgroup.closure, u : subgroup G → set G := coe, where G is a group.
This shows there is a close connection between closure operators, lower adjoints and Galois
connections/insertions: every Galois connection induces a lower adjoint which itself induces a
closure operator by composition (see galois_connection.lower_adjoint and
lower_adjoint.closure_operator), and every closure operator on a partial order induces a Galois
insertion from the set of closed elements to the underlying type (see closure_operator.gi).
Main definitions #
closure_operator: A closure operator is a monotone functionf : α → αsuch that∀ x, x ≤ f xand∀ x, f (f x) = f x.lower_adjoint: A lower adjoint tou : β → αis a functionl : α → βsuch thatlanduform a Galois connection.
Implementation details #
Although lower_adjoint is technically a generalisation of closure_operator (by defining
to_fun := id), it is desirable to have both as otherwise ids would be carried all over the
place when using concrete closure operators such as convex_hull.
lower_adjoint really is a semibundled structure version of galois_connection.
References #
Closure operator #
- to_order_hom : α →o α
- le_closure' : ∀ (x : α), x ≤ self.to_order_hom.to_fun x
- idempotent' : ∀ (x : α), self.to_order_hom.to_fun (self.to_order_hom.to_fun x) = self.to_order_hom.to_fun x
A closure operator on the preorder α is a monotone function which is extensive (every x
is less than its closure) and idempotent.
Instances for closure_operator
- closure_operator.has_sizeof_inst
- closure_operator.has_coe_to_fun
- closure_operator.inhabited
Equations
- closure_operator.has_coe_to_fun α = {coe := λ (c : closure_operator α), c.to_order_hom.to_fun}
See Note [custom simps projection]
Equations
The identity function as a closure operator.
Equations
- closure_operator.id α = {to_order_hom := order_hom.id (partial_order.to_preorder α), le_closure' := _, idempotent' := _}
Equations
- closure_operator.inhabited α = {default := closure_operator.id α _inst_1}
Constructor for a closure operator using the weaker idempotency axiom: f (f x) ≤ f x.
Equations
- closure_operator.mk' f hf₁ hf₂ hf₃ = {to_order_hom := {to_fun := f, monotone' := hf₁}, le_closure' := hf₂, idempotent' := _}
Convenience constructor for a closure operator using the weaker minimality axiom:
x ≤ f y → f x ≤ f y, which is sometimes easier to prove in practice.
Equations
- closure_operator.mk₂ f hf hmin = {to_order_hom := {to_fun := f, monotone' := _}, le_closure' := hf, idempotent' := _}
Expanded out version of mk₂. p implies being closed. This constructor should be used when
you already know a sufficient condition for being closed and using mem_mk₃_closed will avoid you
the (slight) hassle of having to prove it both inside and outside the constructor.
Equations
- closure_operator.mk₃ f p hf hfp hmin = closure_operator.mk₂ f hf _
This lemma shows that the image of x of a closure operator built from the mk₃ constructor
respects p, the property that was fed into it.
Analogue of closure_le_closed_iff_le but with the p that was fed into the mk₃ constructor.
Every element is less than its closure. This property is sometimes referred to as extensivity or inflationarity.
An element x is closed for the closure operator c if it is a fixed point for it.
The set of closed elements for c is exactly its range.
Send an x to an element of the set of closed elements (by taking the closure).
A closure operator is equal to the closure operator obtained by feeding c.closed into the
mk₃ constructor.
The property p fed into the mk₃ constructor implies being closed.
Lower adjoint #
- to_fun : α → β
- gc' : galois_connection self.to_fun u
A lower adjoint of u on the preorder α is a function l such that l and u form a Galois
connection. It allows us to define closure operators whose output does not match the input. In
practice, u is often coe : β → α.
Instances for lower_adjoint
- lower_adjoint.has_sizeof_inst
- lower_adjoint.inhabited
- lower_adjoint.has_coe_to_fun
The identity function as a lower adjoint to itself.
Equations
- lower_adjoint.id α = {to_fun := λ (x : α), x, gc' := _}
Equations
- lower_adjoint.inhabited = {default := lower_adjoint.id α _inst_1}
Equations
See Note [custom simps projection]
Equations
Every element is less than its closure. This property is sometimes referred to as extensivity or inflationarity.
Every lower adjoint induces a closure operator given by the composition. This is the partial order version of the statement that every adjunction induces a monad.
Equations
- l.closure_operator = {to_order_hom := {to_fun := λ (x : α), u (⇑l x), monotone' := _}, le_closure' := _, idempotent' := _}
An element x is closed for l : lower_adjoint u if it is a fixed point: u (l x) = x
The set of closed elements for l is the range of u ∘ l.
Send an x to an element of the set of closed elements (by taking the closure).
Translations between galois_connection, lower_adjoint, closure_operator #
Every Galois connection induces a lower adjoint.
Equations
- gc.lower_adjoint = {to_fun := l, gc' := gc}
Every Galois connection induces a closure operator given by the composition. This is the partial order version of the statement that every adjunction induces a monad.
Equations
The set of closed elements has a Galois insertion to the underlying type.
The Galois insertion associated to a closure operator can be used to reconstruct the closure operator. Note that the inverse in the opposite direction does not hold in general.