Basics on First-Order Structures #
This file defines first-order languages and structures in the style of the Flypitch project, as well as several important maps between structures.
Main Definitions #
- A
FirstOrder.Language
defines a language as a pair of functions from the natural numbers toType l
. One sendsn
to the type ofn
-ary functions, and the other sendsn
to the type ofn
-ary relations. - A
FirstOrder.Language.Structure
interprets the symbols of a givenFirstOrder.Language
in the context of a given type. - A
FirstOrder.Language.Hom
, denotedM →[L] N
, is a map from theL
-structureM
to theL
-structureN
that commutes with the interpretations of functions, and which preserves the interpretations of relations (although only in the forward direction). - A
FirstOrder.Language.Embedding
, denotedM ↪[L] N
, is an embedding from theL
-structureM
to theL
-structureN
that commutes with the interpretations of functions, and which preserves the interpretations of relations in both directions. - A
FirstOrder.Language.Equiv
, denotedM ≃[L] N
, is an equivalence from theL
-structureM
to theL
-structureN
that commutes with the interpretations of functions, and which preserves the interpretations of relations in both directions.
References #
For the Flypitch project:
- [J. Han, F. van Doorn, A formal proof of the independence of the continuum hypothesis] [flypitch_cpp]
- [J. Han, F. van Doorn, A formalization of forcing and the unprovability of the continuum hypothesis][flypitch_itp]
Languages and Structures #
A first-order language consists of a type of functions of every natural-number arity and a type of relations of every natural-number arity.
For every arity, a
Type*
of functions of that arityFor every arity, a
Type*
of relations of that arity
Instances For
A language is relational when it has no function symbols.
Instances For
A language is algebraic when it has no relation symbols.
Instances For
The empty language has no symbols.
Equations
Instances For
Equations
Equations
Equations
- FirstOrder.Language.instInhabited = { default := FirstOrder.Language.empty }
The sum of two languages consists of the disjoint union of their symbols.
Equations
Instances For
The type of constants in a given language.
Equations
- L.Constants = L.Functions 0
Instances For
The type of symbols in a given language.
Instances For
The cardinality of a language is the cardinality of its type of symbols.
Equations
- L.card = Cardinal.mk L.Symbols
Instances For
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
Equations
- ⋯ = ⋯
Passes a DecidableEq
instance on a type of function symbols through the Language
constructor. Despite the fact that this is proven by inferInstance
, it is still needed -
see the example
s in ModelTheory/Ring/Basic
.
Equations
- FirstOrder.Language.instDecidableEqFunctions n = inferInstance
Passes a DecidableEq
instance on a type of relation symbols through the Language
constructor. Despite the fact that this is proven by inferInstance
, it is still needed -
see the example
s in ModelTheory/Ring/Basic
.
Equations
- FirstOrder.Language.instDecidableEqRelations n = inferInstance
A first-order structure on a type M
consists of interpretations of all the symbols in a given
language. Each function of arity n
is interpreted as a function sending tuples of length n
(modeled as (Fin n → M)
) to M
, and a relation of arity n
is a function from tuples of length
n
to Prop
.
Interpretation of the function symbols
Interpretation of the relation symbols
Instances
Used for defining FirstOrder.Language.Theory.ModelType.instInhabited
.
Equations
- FirstOrder.Language.Inhabited.trivialStructure L = { funMap := fun {n : ℕ} => default, RelMap := fun {n : ℕ} => default }
Instances For
Maps #
A homomorphism between first-order structures is a function that commutes with the interpretations of functions and maps tuples in one structure where a given relation is true to tuples in the second structure where that relation is still true.
- toFun : M → N
The underlying function of a homomorphism of structures
- map_fun' : ∀ {n : ℕ} (f : L.Functions n) (x : Fin n → M), self.toFun (FirstOrder.Language.Structure.funMap f x) = FirstOrder.Language.Structure.funMap f (self.toFun ∘ x)
The homomorphism commutes with the interpretations of the function symbols
- map_rel' : ∀ {n : ℕ} (r : L.Relations n) (x : Fin n → M), FirstOrder.Language.Structure.RelMap r x → FirstOrder.Language.Structure.RelMap r (self.toFun ∘ x)
The homomorphism sends related elements to related elements
Instances For
A homomorphism between first-order structures is a function that commutes with the interpretations of functions and maps tuples in one structure where a given relation is true to tuples in the second structure where that relation is still true.
Equations
- One or more equations did not get rendered due to their size.
Instances For
An embedding of first-order structures is an embedding that commutes with the interpretations of functions and relations.
- toFun : M → N
- inj' : Function.Injective self.toFun
- map_fun' : ∀ {n : ℕ} (f : L.Functions n) (x : Fin n → M), self.toFun (FirstOrder.Language.Structure.funMap f x) = FirstOrder.Language.Structure.funMap f (self.toFun ∘ x)
The homomorphism commutes with the interpretations of the function symbols
- map_rel' : ∀ {n : ℕ} (r : L.Relations n) (x : Fin n → M), FirstOrder.Language.Structure.RelMap r (self.toFun ∘ x) ↔ FirstOrder.Language.Structure.RelMap r x
The homomorphism sends related elements to related elements
Instances For
An embedding of first-order structures is an embedding that commutes with the interpretations of functions and relations.
Equations
- One or more equations did not get rendered due to their size.
Instances For
An equivalence of first-order structures is an equivalence that commutes with the interpretations of functions and relations.
- toFun : M → N
- invFun : N → M
- left_inv : Function.LeftInverse self.invFun self.toFun
- right_inv : Function.RightInverse self.invFun self.toFun
- map_fun' : ∀ {n : ℕ} (f : L.Functions n) (x : Fin n → M), self.toFun (FirstOrder.Language.Structure.funMap f x) = FirstOrder.Language.Structure.funMap f (self.toFun ∘ x)
The homomorphism commutes with the interpretations of the function symbols
- map_rel' : ∀ {n : ℕ} (r : L.Relations n) (x : Fin n → M), FirstOrder.Language.Structure.RelMap r (self.toFun ∘ x) ↔ FirstOrder.Language.Structure.RelMap r x
The homomorphism sends related elements to related elements
Instances For
An equivalence of first-order structures is an equivalence that commutes with the interpretations of functions and relations.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Interpretation of a constant symbol
Equations
- ↑c = FirstOrder.Language.Structure.funMap c default
Instances For
Equations
- FirstOrder.Language.instCoeTCConstants = { coe := FirstOrder.Language.constantMap }
Given a language with a nonempty type of constants, any structure will be nonempty. This cannot
be a global instance, because L
becomes a metavariable.
HomClass L F M N
states that F
is a type of L
-homomorphisms. You should extend this
typeclass when you extend FirstOrder.Language.Hom
.
- map_fun : ∀ (φ : F) {n : ℕ} (f : L.Functions n) (x : Fin n → M), φ (FirstOrder.Language.Structure.funMap f x) = FirstOrder.Language.Structure.funMap f (⇑φ ∘ x)
The homomorphism commutes with the interpretations of the function symbols
- map_rel : ∀ (φ : F) {n : ℕ} (r : L.Relations n) (x : Fin n → M), FirstOrder.Language.Structure.RelMap r x → FirstOrder.Language.Structure.RelMap r (⇑φ ∘ x)
The homomorphism sends related elements to related elements
Instances
StrongHomClass L F M N
states that F
is a type of L
-homomorphisms which preserve
relations in both directions.
- map_fun : ∀ (φ : F) {n : ℕ} (f : L.Functions n) (x : Fin n → M), φ (FirstOrder.Language.Structure.funMap f x) = FirstOrder.Language.Structure.funMap f (⇑φ ∘ x)
The homomorphism commutes with the interpretations of the function symbols
- map_rel : ∀ (φ : F) {n : ℕ} (r : L.Relations n) (x : Fin n → M), FirstOrder.Language.Structure.RelMap r (⇑φ ∘ x) ↔ FirstOrder.Language.Structure.RelMap r x
The homomorphism sends related elements to related elements
Instances
Equations
- ⋯ = ⋯
Not an instance to avoid a loop.
Equations
- FirstOrder.Language.Hom.instFunLike = { coe := FirstOrder.Language.Hom.toFun, coe_injective' := ⋯ }
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
The identity map from a structure to itself.
Equations
- FirstOrder.Language.Hom.id L M = { toFun := fun (m : M) => m, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Equations
- FirstOrder.Language.Hom.instInhabited = { default := FirstOrder.Language.Hom.id L M }
Composition of first-order homomorphisms.
Instances For
Composition of first-order homomorphisms is associative.
Any element of a HomClass
can be realized as a first_order homomorphism.
Equations
- FirstOrder.Language.HomClass.toHom φ = { toFun := ⇑φ, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Equations
- FirstOrder.Language.Embedding.funLike = { coe := fun (f : L.Embedding M N) => f.toFun, coe_injective' := ⋯ }
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
A first-order embedding is also a first-order homomorphism.
Equations
- FirstOrder.Language.Embedding.toHom = FirstOrder.Language.HomClass.toHom
Instances For
In an algebraic language, any injective homomorphism is an embedding.
Equations
- FirstOrder.Language.Embedding.ofInjective hf = { toFun := f.toFun, inj' := hf, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
The identity embedding from a structure to itself.
Equations
- FirstOrder.Language.Embedding.refl L M = { toEmbedding := Function.Embedding.refl M, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Equations
- FirstOrder.Language.Embedding.instInhabited = { default := FirstOrder.Language.Embedding.refl L M }
Composition of first-order embeddings.
Instances For
Composition of first-order embeddings is associative.
Any element of an injective StrongHomClass
can be realized as a first_order embedding.
Equations
- FirstOrder.Language.StrongHomClass.toEmbedding φ = { toFun := ⇑φ, inj' := ⋯, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Equations
- FirstOrder.Language.Equiv.instEquivLike = { coe := fun (f : L.Equiv M N) => f.toFun, inv := fun (f : L.Equiv M N) => f.invFun, left_inv := ⋯, right_inv := ⋯, coe_injective' := ⋯ }
Equations
- ⋯ = ⋯
The inverse of a first-order equivalence is a first-order equivalence.
Equations
- f.symm = { toEquiv := f.symm, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
A first-order equivalence is also a first-order embedding.
Equations
- FirstOrder.Language.Equiv.toEmbedding = FirstOrder.Language.StrongHomClass.toEmbedding
Instances For
A first-order equivalence is also a first-order homomorphism.
Equations
- FirstOrder.Language.Equiv.toHom = FirstOrder.Language.HomClass.toHom
Instances For
The identity equivalence from a structure to itself.
Equations
- FirstOrder.Language.Equiv.refl L M = { toEquiv := Equiv.refl M, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Equations
- FirstOrder.Language.Equiv.instInhabited = { default := FirstOrder.Language.Equiv.refl L M }
Composition of first-order equivalences.
Equations
Instances For
Composition of first-order homomorphisms is associative.
Any element of a bijective StrongHomClass
can be realized as a first_order isomorphism.
Equations
- FirstOrder.Language.StrongHomClass.toEquiv φ = { toFun := ⇑φ, invFun := EquivLike.inv φ, left_inv := ⋯, right_inv := ⋯, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Any type can be made uniquely into a structure over the empty language.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- FirstOrder.Language.instUniqueStructureEmpty = { default := FirstOrder.Language.emptyStructure, uniq := ⋯ }
Equations
- ⋯ = ⋯
Makes a Language.empty.Hom
out of any function.
This is only needed because there is no instance of FunLike (M → N) M N
, and thus no instance of
Language.empty.HomClass M N
.
Equations
- Function.emptyHom f = { toFun := f, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
A structure induced by a bijection.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A bijection as a first-order isomorphism with the induced structure on the codomain.
Equations
- e.inducedStructureEquiv = { toEquiv := e, map_fun' := ⋯, map_rel' := ⋯ }