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
Used to define FirstOrder.Language₂
.
Equations
- FirstOrder.Sequence₂ a₀ a₁ a₂ x = match x with | 0 => a₀ | 1 => a₁ | 2 => a₂ | x => PEmpty.{u + 1}
Instances For
Equations
- FirstOrder.Sequence₂.inhabited₀ a₀ a₁ a₂ = h
Equations
- FirstOrder.Sequence₂.inhabited₁ a₀ a₁ a₂ = h
Equations
- FirstOrder.Sequence₂.inhabited₂ a₀ a₁ a₂ = h
Equations
- ⋯ = ⋯
A constructor for languages with only constants, unary and binary functions, and unary and binary relations.
Equations
- FirstOrder.Language.mk₂ c f₁ f₂ r₁ r₂ = { Functions := FirstOrder.Sequence₂ c f₁ f₂, Relations := FirstOrder.Sequence₂ PEmpty.{v + 1} r₁ r₂ }
Instances For
The empty language has no symbols.
Equations
Instances For
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 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
A language is relational when it has no function symbols.
There are no function symbols in the language.
Instances
There are no function symbols in the language.
A language is algebraic when it has no relation symbols.
There are no relation symbols in the language.
Instances
There are no relation symbols in the language.
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
Equations
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
Equations
- ⋯ = ⋯
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
The homomorphism commutes with the interpretations of the function symbols
The homomorphism sends related elements to related elements
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
The homomorphism commutes with the interpretations of the function symbols
The homomorphism sends related elements to related elements
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
The homomorphism commutes with the interpretations of the function symbols
The homomorphism sends related elements to related elements
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.
The function map for FirstOrder.Language.Structure₂
.
Equations
- FirstOrder.Language.funMap₂ c' f₁' f₂' x✝ x = match x✝¹, x✝, x with | 0, f, x => c' f | 1, f, x => f₁' f (x 0) | 2, f, x => f₂' f (x 0) (x 1) | n.succ.succ.succ, f, x => PEmpty.elim f
Instances For
The relation map for FirstOrder.Language.Structure₂
.
Equations
- FirstOrder.Language.RelMap₂ r₁' r₂' x✝ x = match x✝¹, x✝, x with | 0, r, x => PEmpty.elim r | 1, r, x => x 0 ∈ r₁' r | 2, r, x => r₂' r (x 0) (x 1) | n.succ.succ.succ, r, x => PEmpty.elim r
Instances For
A structure constructor to match FirstOrder.Language₂
.
Equations
- FirstOrder.Language.Structure.mk₂ c' f₁' f₂' r₁' r₂' = { funMap := fun {n : ℕ} => FirstOrder.Language.funMap₂ c' f₁' f₂', RelMap := fun {n : ℕ} => FirstOrder.Language.RelMap₂ r₁' r₂' }
Instances For
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
The homomorphism commutes with the interpretations of the function symbols
The homomorphism sends related elements to related elements
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
The homomorphism commutes with the interpretations of the function symbols
The homomorphism sends related elements to related elements
Equations
- ⋯ = ⋯
Not an instance to avoid a loop.
Equations
- FirstOrder.Language.Hom.instFunLike = { coe := FirstOrder.Language.Hom.toFun, coe_injective' := ⋯ }
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- FirstOrder.Language.Hom.hasCoeToFun = DFunLike.hasCoeToFun
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 = let __src := f.symm; { toEquiv := __src, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Equations
- FirstOrder.Language.Equiv.hasCoeToFun = DFunLike.hasCoeToFun
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.
Equations
- FirstOrder.Language.instUniqueStructureEmpty = { default := FirstOrder.Language.emptyStructure, uniq := ⋯ }
Equations
- ⋯ = ⋯
Makes a Language.empty.Hom
out of any function.
Equations
- Function.emptyHom f = { toFun := f, map_fun' := ⋯, map_rel' := ⋯ }
Instances For
Makes a Language.empty.Embedding
out of any function.
Equations
- Embedding.empty f = { toEmbedding := 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' := ⋯ }