@@ -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
2932namespace first_order
3033namespace language
34+ open_locale first_order
3135open 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 `≤`. -/
3640protected def order : language :=
3741language.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 :=
4044Structure.mk₂ empty.elim empty.elim empty.elim empty.elim (λ _, (≤))
4145
4246instance : is_relational (language.order) := language.is_relational_mk₂
@@ -57,6 +61,10 @@ variables [is_ordered L]
5761def term.le (t₁ t₂ : L.term (α ⊕ fin n)) : L.bounded_formula α n :=
5862le_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+
6068variable (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
6977instance : 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]
7283lemma order_Lhom_order : order_Lhom language.order = Lhom.id language.order :=
7384Lhom.funext (subsingleton.elim _ _) (subsingleton.elim _ _)
@@ -86,45 +97,145 @@ protected def Theory.partial_order : language.order.Theory :=
8697protected 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 :=
97130begin
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 ,
100133end
101134
102- instance model_preorder [preorder α ] :
103- α ⊨ Theory.preorder :=
135+ instance model_preorder [preorder M ] :
136+ M ⊨ Theory.preorder :=
104137begin
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⟩
109142end
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 :=
113146begin
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⟩,
118151end
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 :=
122155begin
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⟩,
127160end
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+
129240end language
130241end first_order
0 commit comments