First-Order Substructures #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4. This file defines substructures of first-order structures in a similar manner to the various substructures appearing in the algebra library.
Main Definitions #
- A
first_order.language.substructure
is defined so thatL.substructure M
is the type of all substructures of theL
-structureM
. first_order.language.substructure.closure
is defined so that ifs : set M
,closure L s
is the least substructure ofM
containings
.first_order.language.substructure.comap
is defined so thats.comap f
is the preimage of the substructures
under the homomorphismf
, as a substructure.first_order.language.substructure.map
is defined so thats.map f
is the image of the substructures
under the homomorphismf
, as a substructure.first_order.language.hom.range
is defined so thatf.map
is the range of the the homomorphismf
, as a substructure.first_order.language.hom.dom_restrict
andfirst_order.language.hom.cod_restrict
restrict the domain and codomain respectively of first-order homomorphisms to substructures.first_order.language.embedding.dom_restrict
andfirst_order.language.embedding.cod_restrict
restrict the domain and codomain respectively of first-order embeddings to substructures.first_order.language.substructure.inclusion
is the inclusion embedding between substructures.
Main Results #
L.substructure M
forms acomplete_lattice
.
Indicates that a set in a given structure is a closed under a function symbol.
- carrier : set M
- fun_mem : ∀ {n : ℕ} (f : L.functions n), first_order.language.closed_under f self.carrier
A substructure of a structure M
is a set closed under application of function symbols.
Instances for first_order.language.substructure
- first_order.language.substructure.has_sizeof_inst
- first_order.language.substructure.set_like
- first_order.language.substructure.has_top
- first_order.language.substructure.inhabited
- first_order.language.substructure.has_inf
- first_order.language.substructure.has_Inf
- first_order.language.substructure.complete_lattice
- first_order.language.elementary_substructure.first_order.language.substructure.has_coe
Equations
See Note [custom simps projection]
Equations
Two substructures are equal if they have the same elements.
Copy a substructure replacing carrier
with a set that is equal to it.
The substructure M
of the structure M
.
Equations
The inf of two substructures is their intersection.
Equations
- first_order.language.substructure.has_Inf = {Inf := λ (s : set (L.substructure M)), {carrier := ⋂ (t : L.substructure M) (H : t ∈ s), ↑t, fun_mem := _}}
Substructures of a structure form a complete lattice.
Equations
- first_order.language.substructure.complete_lattice = {sup := complete_lattice.sup (complete_lattice_of_Inf (L.substructure M) first_order.language.substructure.complete_lattice._proof_1), le := has_le.le (preorder.to_has_le (L.substructure M)), lt := has_lt.lt (preorder.to_has_lt (L.substructure M)), le_refl := _, le_trans := _, lt_iff_le_not_le := _, le_antisymm := _, le_sup_left := _, le_sup_right := _, sup_le := _, inf := has_inf.inf first_order.language.substructure.has_inf, inf_le_left := _, inf_le_right := _, le_inf := _, Sup := complete_lattice.Sup (complete_lattice_of_Inf (L.substructure M) first_order.language.substructure.complete_lattice._proof_1), le_Sup := _, Sup_le := _, Inf := has_Inf.Inf first_order.language.substructure.has_Inf, Inf_le := _, le_Inf := _, top := ⊤, bot := complete_lattice.bot (complete_lattice_of_Inf (L.substructure M) first_order.language.substructure.complete_lattice._proof_1), le_top := _, bot_le := _}
The L.substructure
generated by a set.
Equations
- first_order.language.substructure.closure L = {to_fun := λ (s : set M), has_Inf.Inf {S : L.substructure M | s ⊆ ↑S}, gc' := _}
The substructure generated by a set includes the set.
A substructure S
includes closure L s
if and only if it includes s
.
Substructure closure of a set is monotone in its argument: if s ⊆ t
,
then closure L s ≤ closure L t
.
An induction principle for closure membership. If p
holds for all elements of s
, and
is preserved under function symbols, then p
holds for all elements of the closure of s
.
If s
is a dense set in a structure M
, substructure.closure L s = ⊤
, then in order to prove
that some predicate p
holds for all x : M
it suffices to verify p x
for x ∈ s
, and verify
that p
is preserved under function symbols.
closure
forms a Galois insertion with the coercion to set.
Equations
- first_order.language.substructure.gi L M = {choice := λ (s : set M) (_x : ↑(⇑(first_order.language.substructure.closure L) s) ≤ s), ⇑(first_order.language.substructure.closure L) s, gc := _, le_l_u := _, choice_eq := _}
Closure of a substructure S
equals S
.
comap
and map
#
The preimage of a substructure along a homomorphism is a substructure.
The image of a substructure along a homomorphism is a substructure.
map f
and comap f
form a galois_coinsertion
when f
is injective.
Equations
map f
and comap f
form a galois_insertion
when f
is surjective.
Equations
Equations
- first_order.language.substructure.induced_Structure = {fun_map := λ (n : ℕ) (f : L.functions n) (x : fin n → ↥S), ⟨first_order.language.Structure.fun_map f (λ (i : fin n), ↑(x i)), _⟩, rel_map := λ (n : ℕ) (r : L.relations n) (x : fin n → ↥S), first_order.language.Structure.rel_map r (λ (i : fin n), ↑(x i))}
The natural embedding of an L.substructure
of M
into M
.
The equivalence between the maximal substructure of a structure and the structure itself.
A dependent version of substructure.closure_induction
.
Reduces the language of a substructure along a language hom.
Equations
- φ.substructure_reduct = {to_embedding := {to_fun := λ (S : L'.substructure M), {carrier := ↑S, fun_mem := _}, inj' := _}, map_rel_iff' := _}
Turns any substructure containing a constant set A
into a L[[A]]
-substructure.
The restriction of a first-order hom to a substructure s ⊆ M
gives a hom s → N
.
Equations
- f.dom_restrict p = f.comp p.subtype.to_hom
A first-order hom f : M → N
whose values lie in a substructure p ⊆ N
can be restricted to a
hom M → p
.
The range of a first-order hom f : M → N
is a submodule of N
.
See Note [range copy pattern].
The restriction of a first-order embedding to a substructure s ⊆ M
gives an embedding s → N
.
Equations
- f.dom_restrict p = f.comp p.subtype
A first-order embedding f : M → N
whose values lie in a substructure p ⊆ N
can be restricted
to an embedding M → p
.
Equations
- first_order.language.embedding.cod_restrict p f h = {to_embedding := {to_fun := ⇑(first_order.language.hom.cod_restrict p f.to_hom h), inj' := _}, map_fun' := _, map_rel' := _}
The equivalence between a substructure s
and its image s.map f.to_hom
, where f
is an
embedding.
Equations
- f.substructure_equiv_map s = {to_equiv := {to_fun := ⇑(first_order.language.embedding.cod_restrict (first_order.language.substructure.map f.to_hom s) (f.dom_restrict s) _), inv_fun := λ (n : ↥(first_order.language.substructure.map f.to_hom s)), ⟨classical.some _, _⟩, left_inv := _, right_inv := _}, map_fun' := _, map_rel' := _}
The equivalence between the domain and the range of an embedding f
.
The embedding associated to an inclusion of substructures.