Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 670735f

Browse files
committed
feat(model_theory/order): The theory of dense linear orders without endpoints (#13253)
Defines the theory of dense linear orders without endpoints
1 parent 34853a9 commit 670735f

File tree

1 file changed

+131
-20
lines changed

1 file changed

+131
-20
lines changed

src/model_theory/order.lean

Lines changed: 131 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,32 @@ This file defines ordered first-order languages and structures, as well as their
1515
representing `≤` to the actual relation `≤`.
1616
* `first_order.language.is_ordered` points out a specific symbol in a language as representing `≤`.
1717
* `first_order.language.is_ordered_structure` indicates that a structure over a
18-
* `first_order.language.linear_order` and similar define the theories of preorders, partial orders,
19-
and linear orders.
18+
* `first_order.language.Theory.linear_order` and similar define the theories of preorders,
19+
partial orders, and linear orders.
20+
* `first_order.language.Theory.DLO` defines the theory of dense linear orders without endpoints, a
21+
particularly useful example in model theory.
22+
2023
2124
## Main Results
22-
* `partial_order`s model the theory of partial orders, and `linear_order`s model the theory of
23-
linear orders.
25+
* `partial_order`s model the theory of partial orders, `linear_order`s model the theory of
26+
linear orders, and dense linear orders without endpoints model `Theory.DLO`.
2427
2528
-/
2629

27-
universes u v w
30+
universes u v w w'
2831

2932
namespace first_order
3033
namespace language
34+
open_locale first_order
3135
open Structure
3236

33-
variables {L : language.{u v}} {α : Type w} {n : ℕ}
37+
variables {L : language.{u v}} {α : Type w} {M : Type w'} {n : ℕ}
3438

3539
/-- The language consisting of a single relation representing `≤`. -/
3640
protected def order : language :=
3741
language.mk₂ empty empty empty empty unit
3842

39-
instance order.Structure [has_le α] : language.order.Structure α :=
43+
instance order.Structure [has_le M] : language.order.Structure M :=
4044
Structure.mk₂ empty.elim empty.elim empty.elim empty.elim (λ _, (≤))
4145

4246
instance : is_relational (language.order) := language.is_relational_mk₂
@@ -57,6 +61,10 @@ variables [is_ordered L]
5761
def term.le (t₁ t₂ : L.term (α ⊕ fin n)) : L.bounded_formula α n :=
5862
le_symb.bounded_formula₂ t₁ t₂
5963

64+
/-- Joins two terms `t₁, t₂` in a formula representing `t₁ < t₂`. -/
65+
def term.lt (t₁ t₂ : L.term (α ⊕ fin n)) : L.bounded_formula α n :=
66+
(t₁.le t₂) ⊓ ∼ (t₂.le t₁)
67+
6068
variable (L)
6169

6270
/-- The language homomorphism sending the unique symbol `≤` of `language.order` to `≤` in an ordered
@@ -68,6 +76,9 @@ end is_ordered
6876

6977
instance : is_ordered language.order := ⟨unit.star⟩
7078

79+
@[simp] lemma order_Lhom_le_symb [L.is_ordered] :
80+
(order_Lhom L).on_relation le_symb = (le_symb : L.relations 2) := rfl
81+
7182
@[simp]
7283
lemma order_Lhom_order : order_Lhom language.order = Lhom.id language.order :=
7384
Lhom.funext (subsingleton.elim _ _) (subsingleton.elim _ _)
@@ -86,45 +97,145 @@ protected def Theory.partial_order : language.order.Theory :=
8697
protected def Theory.linear_order : language.order.Theory :=
8798
{le_symb.reflexive, le_symb.antisymmetric, le_symb.transitive, le_symb.total}
8899

89-
variables (L α)
100+
/-- A sentence indicating that an order has no top element:
101+
$\forall x, \exists y, \not y \le x$. -/
102+
protected def sentence.no_top_order : language.order.sentence := ∀' ∃' ∼ ((&1).le &0)
103+
104+
/-- A sentence indicating that an order has no bottom element:
105+
$\forall x, \exists y, \not x \le y$. -/
106+
protected def sentence.no_bot_order : language.order.sentence := ∀' ∃' ∼ ((&0).le &1)
107+
108+
/-- A sentence indicating that an order is dense:
109+
$\forall x, \forall y, x < y \to \exists z, x < z \wedge z < y$. -/
110+
protected def sentence.densely_ordered : language.order.sentence :=
111+
∀' ∀' (((&0).lt &1) ⟹ (∃' (((&0).lt &2) ⊓ ((&2).lt &1))))
112+
113+
/-- The theory of dense linear orders without endpoints. -/
114+
protected def Theory.DLO : language.order.Theory :=
115+
Theory.linear_order ∪ {sentence.no_top_order, sentence.no_bot_order, sentence.densely_ordered}
116+
117+
variables (L M)
90118

91119
/-- A structure is ordered if its language has a `≤` symbol whose interpretation is -/
92-
def is_ordered_structure [is_ordered L] [has_le α] [L.Structure α] : Prop :=
93-
Lhom.is_expansion_on (order_Lhom L) α
120+
abbreviation is_ordered_structure [is_ordered L] [has_le M] [L.Structure M] : Prop :=
121+
Lhom.is_expansion_on (order_Lhom L) M
122+
123+
variables {L M}
124+
125+
@[simp] lemma is_ordered_structure_iff [is_ordered L] [has_le M] [L.Structure M] :
126+
L.is_ordered_structure M ↔ Lhom.is_expansion_on (order_Lhom L) M := iff.rfl
94127

95-
instance is_ordered_structure_has_le [has_le α] :
96-
is_ordered_structure language.order α :=
128+
instance is_ordered_structure_has_le [has_le M] :
129+
is_ordered_structure language.order M :=
97130
begin
98-
rw [is_ordered_structure, order_Lhom_order],
99-
exact Lhom.id_is_expansion_on α,
131+
rw [is_ordered_structure_iff, order_Lhom_order],
132+
exact Lhom.id_is_expansion_on M,
100133
end
101134

102-
instance model_preorder [preorder α] :
103-
α ⊨ Theory.preorder :=
135+
instance model_preorder [preorder M] :
136+
M ⊨ Theory.preorder :=
104137
begin
105138
simp only [Theory.preorder, Theory.model_iff, set.mem_insert_iff, set.mem_singleton_iff,
106139
forall_eq_or_imp, relations.realize_reflexive, rel_map_apply₂, forall_eq,
107140
relations.realize_transitive],
108141
exact ⟨le_refl, λ _ _ _, le_trans⟩
109142
end
110143

111-
instance model_partial_order [partial_order α] :
112-
α ⊨ Theory.partial_order :=
144+
instance model_partial_order [partial_order M] :
145+
M ⊨ Theory.partial_order :=
113146
begin
114147
simp only [Theory.partial_order, Theory.model_iff, set.mem_insert_iff, set.mem_singleton_iff,
115148
forall_eq_or_imp, relations.realize_reflexive, rel_map_apply₂, relations.realize_antisymmetric,
116149
forall_eq, relations.realize_transitive],
117150
exact ⟨le_refl, λ _ _, le_antisymm, λ _ _ _, le_trans⟩,
118151
end
119152

120-
instance model_linear_order [linear_order α] :
121-
α ⊨ Theory.linear_order :=
153+
instance model_linear_order [linear_order M] :
154+
M ⊨ Theory.linear_order :=
122155
begin
123156
simp only [Theory.linear_order, Theory.model_iff, set.mem_insert_iff, set.mem_singleton_iff,
124157
forall_eq_or_imp, relations.realize_reflexive, rel_map_apply₂, relations.realize_antisymmetric,
125158
relations.realize_transitive, forall_eq, relations.realize_total],
126159
exact ⟨le_refl, λ _ _, le_antisymm, λ _ _ _, le_trans, le_total⟩,
127160
end
128161

162+
section is_ordered_structure
163+
variables [is_ordered L] [L.Structure M]
164+
165+
@[simp] lemma rel_map_le_symb [has_le M] [L.is_ordered_structure M] {a b : M} :
166+
rel_map (le_symb : L.relations 2) ![a, b] ↔ a ≤ b :=
167+
begin
168+
rw [← order_Lhom_le_symb, Lhom.is_expansion_on.map_on_relation],
169+
refl,
170+
end
171+
172+
@[simp] lemma term.realize_le [has_le M] [L.is_ordered_structure M]
173+
{t₁ t₂ : L.term (α ⊕ fin n)} {v : α → M} {xs : fin n → M} :
174+
(t₁.le t₂).realize v xs ↔ t₁.realize (sum.elim v xs) ≤ t₂.realize (sum.elim v xs) :=
175+
by simp [term.le]
176+
177+
@[simp] lemma term.realize_lt [preorder M] [L.is_ordered_structure M]
178+
{t₁ t₂ : L.term (α ⊕ fin n)} {v : α → M} {xs : fin n → M} :
179+
(t₁.lt t₂).realize v xs ↔ t₁.realize (sum.elim v xs) < t₂.realize (sum.elim v xs) :=
180+
by simp [term.lt, lt_iff_le_not_le]
181+
182+
end is_ordered_structure
183+
184+
section has_le
185+
variables [has_le M]
186+
187+
theorem realize_no_top_order_iff : M ⊨ sentence.no_top_order ↔ no_top_order M :=
188+
begin
189+
simp only [sentence.no_top_order, sentence.realize, formula.realize, bounded_formula.realize_all,
190+
bounded_formula.realize_ex, bounded_formula.realize_not, realize, term.realize_le,
191+
sum.elim_inr],
192+
refine ⟨λ h, ⟨λ a, h a⟩, _⟩,
193+
introsI h a,
194+
exact exists_not_le a,
195+
end
196+
197+
@[simp] lemma realize_no_top_order [h : no_top_order M] : M ⊨ sentence.no_top_order :=
198+
realize_no_top_order_iff.2 h
199+
200+
theorem realize_no_bot_order_iff : M ⊨ sentence.no_bot_order ↔ no_bot_order M :=
201+
begin
202+
simp only [sentence.no_bot_order, sentence.realize, formula.realize, bounded_formula.realize_all,
203+
bounded_formula.realize_ex, bounded_formula.realize_not, realize, term.realize_le,
204+
sum.elim_inr],
205+
refine ⟨λ h, ⟨λ a, h a⟩, _⟩,
206+
introsI h a,
207+
exact exists_not_ge a,
208+
end
209+
210+
@[simp] lemma realize_no_bot_order [h : no_bot_order M] : M ⊨ sentence.no_bot_order :=
211+
realize_no_bot_order_iff.2 h
212+
213+
end has_le
214+
215+
theorem realize_densely_ordered_iff [preorder M] :
216+
M ⊨ sentence.densely_ordered ↔ densely_ordered M :=
217+
begin
218+
simp only [sentence.densely_ordered, sentence.realize, formula.realize,
219+
bounded_formula.realize_imp, bounded_formula.realize_all, realize, term.realize_lt,
220+
sum.elim_inr, bounded_formula.realize_ex, bounded_formula.realize_inf],
221+
refine ⟨λ h, ⟨λ a b ab, h a b ab⟩, _⟩,
222+
introsI h a b ab,
223+
exact exists_between ab,
224+
end
225+
226+
@[simp] lemma realize_densely_ordered [preorder M] [h : densely_ordered M] :
227+
M ⊨ sentence.densely_ordered :=
228+
realize_densely_ordered_iff.2 h
229+
230+
instance model_DLO [linear_order M] [densely_ordered M] [no_top_order M] [no_bot_order M] :
231+
M ⊨ Theory.DLO :=
232+
begin
233+
simp only [Theory.DLO, set.union_insert, set.union_singleton, Theory.model_iff,
234+
set.mem_insert_iff, forall_eq_or_imp, realize_no_top_order, realize_no_bot_order,
235+
realize_densely_ordered, true_and],
236+
rw ← Theory.model_iff,
237+
apply_instance,
238+
end
239+
129240
end language
130241
end first_order

0 commit comments

Comments
 (0)