71 |
71 |
72 subsection {* Quasiorders (preorders) *} |
72 subsection {* Quasiorders (preorders) *} |
73 |
73 |
74 class preorder = ord + |
74 class preorder = ord + |
75 assumes less_le: "x \<sqsubset> y \<longleftrightarrow> x \<sqsubseteq> y \<and> x \<noteq> y" |
75 assumes less_le: "x \<sqsubset> y \<longleftrightarrow> x \<sqsubseteq> y \<and> x \<noteq> y" |
76 and refl [iff]: "x \<sqsubseteq> x" |
76 and order_refl [iff]: "x \<sqsubseteq> x" |
77 and trans: "x \<sqsubseteq> y \<Longrightarrow> y \<sqsubseteq> z \<Longrightarrow> x \<sqsubseteq> z" |
77 and order_trans: "x \<sqsubseteq> y \<Longrightarrow> y \<sqsubseteq> z \<Longrightarrow> x \<sqsubseteq> z" |
78 begin |
78 begin |
79 |
79 |
80 text {* Reflexivity. *} |
80 text {* Reflexivity. *} |
81 |
81 |
82 lemma eq_refl: "x = y \<Longrightarrow> x \<sqsubseteq> y" |
82 lemma eq_refl: "x = y \<Longrightarrow> x \<sqsubseteq> y" |
83 -- {* This form is useful with the classical reasoner. *} |
83 -- {* This form is useful with the classical reasoner. *} |
84 by (erule ssubst) (rule refl) |
84 by (erule ssubst) (rule order_refl) |
85 |
85 |
86 lemma less_irrefl [iff]: "\<not> x \<sqsubset> x" |
86 lemma less_irrefl [iff]: "\<not> x \<sqsubset> x" |
87 by (simp add: less_le) |
87 by (simp add: less_le) |
88 |
88 |
89 lemma le_less: "x \<sqsubseteq> y \<longleftrightarrow> x \<sqsubset> y \<or> x = y" |
89 lemma le_less: "x \<sqsubseteq> y \<longleftrightarrow> x \<sqsubset> y \<or> x = y" |
117 lemma le_neq_trans: "\<lbrakk> a \<sqsubseteq> b; a \<noteq> b \<rbrakk> \<Longrightarrow> a \<sqsubset> b" |
117 lemma le_neq_trans: "\<lbrakk> a \<sqsubseteq> b; a \<noteq> b \<rbrakk> \<Longrightarrow> a \<sqsubset> b" |
118 by (simp add: less_le) |
118 by (simp add: less_le) |
119 |
119 |
120 end |
120 end |
121 |
121 |
122 |
|
123 subsection {* Partial orderings *} |
122 subsection {* Partial orderings *} |
124 |
123 |
125 class order = preorder + |
124 class order = preorder + |
126 assumes antisym: "x \<sqsubseteq> y \<Longrightarrow> y \<sqsubseteq> x \<Longrightarrow> x = y" |
125 assumes antisym: "x \<sqsubseteq> y \<Longrightarrow> y \<sqsubseteq> x \<Longrightarrow> x = y" |
127 begin |
126 begin |
145 |
144 |
146 |
145 |
147 text {* Transitivity. *} |
146 text {* Transitivity. *} |
148 |
147 |
149 lemma less_trans: "\<lbrakk> x \<sqsubset> y; y \<sqsubset> z \<rbrakk> \<Longrightarrow> x \<sqsubset> z" |
148 lemma less_trans: "\<lbrakk> x \<sqsubset> y; y \<sqsubset> z \<rbrakk> \<Longrightarrow> x \<sqsubset> z" |
150 by (simp add: less_le) (blast intro: trans antisym) |
149 by (simp add: less_le) (blast intro: order_trans antisym) |
151 |
150 |
152 lemma le_less_trans: "\<lbrakk> x \<sqsubseteq> y; y \<sqsubset> z \<rbrakk> \<Longrightarrow> x \<sqsubset> z" |
151 lemma le_less_trans: "\<lbrakk> x \<sqsubseteq> y; y \<sqsubset> z \<rbrakk> \<Longrightarrow> x \<sqsubset> z" |
153 by (simp add: less_le) (blast intro: trans antisym) |
152 by (simp add: less_le) (blast intro: order_trans antisym) |
154 |
153 |
155 lemma less_le_trans: "\<lbrakk> x \<sqsubset> y; y \<sqsubseteq> z \<rbrakk> \<Longrightarrow> x \<sqsubset> z" |
154 lemma less_le_trans: "\<lbrakk> x \<sqsubset> y; y \<sqsubseteq> z \<rbrakk> \<Longrightarrow> x \<sqsubset> z" |
156 by (simp add: less_le) (blast intro: trans antisym) |
155 by (simp add: less_le) (blast intro: order_trans antisym) |
157 |
156 |
158 |
157 |
159 text {* Useful for simplification, but too risky to include by default. *} |
158 text {* Useful for simplification, but too risky to include by default. *} |
160 |
159 |
161 lemma less_imp_not_less: "x \<sqsubset> y \<Longrightarrow> (\<not> y \<sqsubset> x) \<longleftrightarrow> True" |
160 lemma less_imp_not_less: "x \<sqsubset> y \<Longrightarrow> (\<not> y \<sqsubset> x) \<longleftrightarrow> True" |
187 |
186 |
188 lemma le_cases [case_names le ge]: |
187 lemma le_cases [case_names le ge]: |
189 "\<lbrakk> x \<sqsubseteq> y \<Longrightarrow> P; y \<sqsubseteq> x \<Longrightarrow> P\<rbrakk> \<Longrightarrow> P" |
188 "\<lbrakk> x \<sqsubseteq> y \<Longrightarrow> P; y \<sqsubseteq> x \<Longrightarrow> P\<rbrakk> \<Longrightarrow> P" |
190 using linear by blast |
189 using linear by blast |
191 |
190 |
192 lemma cases [case_names less equal greater]: |
191 lemma linorder_cases [case_names less equal greater]: |
193 "\<lbrakk> x \<sqsubset> y \<Longrightarrow> P; x = y \<Longrightarrow> P; y \<sqsubset> x \<Longrightarrow> P\<rbrakk> \<Longrightarrow> P" |
192 "\<lbrakk> x \<sqsubset> y \<Longrightarrow> P; x = y \<Longrightarrow> P; y \<sqsubset> x \<Longrightarrow> P\<rbrakk> \<Longrightarrow> P" |
194 using less_linear by blast |
193 using less_linear by blast |
195 |
194 |
196 lemma not_less: "\<not> x \<sqsubset> y \<longleftrightarrow> y \<sqsubseteq> x" |
195 lemma not_less: "\<not> x \<sqsubset> y \<longleftrightarrow> y \<sqsubseteq> x" |
197 apply (simp add: less_le) |
196 apply (simp add: less_le) |
237 |
236 |
238 definition |
237 definition |
239 max :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" where |
238 max :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" where |
240 "max a b = (if a \<sqsubseteq> b then b else a)" |
239 "max a b = (if a \<sqsubseteq> b then b else a)" |
241 |
240 |
|
241 end |
|
242 |
|
243 context linorder |
|
244 begin |
|
245 |
242 lemma min_le_iff_disj: |
246 lemma min_le_iff_disj: |
243 "min x y \<sqsubseteq> z \<longleftrightarrow> x \<sqsubseteq> z \<or> y \<sqsubseteq> z" |
247 "min x y \<sqsubseteq> z \<longleftrightarrow> x \<sqsubseteq> z \<or> y \<sqsubseteq> z" |
244 unfolding min_def using linear by (auto intro: trans) |
248 unfolding min_def using linear by (auto intro: order_trans) |
245 |
249 |
246 lemma le_max_iff_disj: |
250 lemma le_max_iff_disj: |
247 "z \<sqsubseteq> max x y \<longleftrightarrow> z \<sqsubseteq> x \<or> z \<sqsubseteq> y" |
251 "z \<sqsubseteq> max x y \<longleftrightarrow> z \<sqsubseteq> x \<or> z \<sqsubseteq> y" |
248 unfolding max_def using linear by (auto intro: trans) |
252 unfolding max_def using linear by (auto intro: order_trans) |
249 |
253 |
250 lemma min_less_iff_disj: |
254 lemma min_less_iff_disj: |
251 "min x y \<sqsubset> z \<longleftrightarrow> x \<sqsubset> z \<or> y \<sqsubset> z" |
255 "min x y \<sqsubset> z \<longleftrightarrow> x \<sqsubset> z \<or> y \<sqsubset> z" |
252 unfolding min_def le_less using less_linear by (auto intro: less_trans) |
256 unfolding min_def le_less using less_linear by (auto intro: less_trans) |
253 |
257 |
274 end |
278 end |
275 |
279 |
276 |
280 |
277 subsection {* Name duplicates *} |
281 subsection {* Name duplicates *} |
278 |
282 |
279 lemmas order_refl [iff] = preorder_class.refl |
283 (*lemmas order_refl [iff] = preorder_class.order_refl |
280 lemmas order_trans = preorder_class.trans |
284 lemmas order_trans = preorder_class.order_trans*) |
281 lemmas order_less_le = preorder_class.less_le |
285 lemmas order_less_le = less_le |
282 lemmas order_eq_refl = preorder_class.eq_refl |
286 lemmas order_eq_refl = preorder_class.eq_refl |
283 lemmas order_less_irrefl = preorder_class.less_irrefl |
287 lemmas order_less_irrefl = preorder_class.less_irrefl |
284 lemmas order_le_less = preorder_class.le_less |
288 lemmas order_le_less = preorder_class.le_less |
285 lemmas order_le_imp_less_or_eq = preorder_class.le_imp_less_or_eq |
289 lemmas order_le_imp_less_or_eq = preorder_class.le_imp_less_or_eq |
286 lemmas order_less_imp_le = preorder_class.less_imp_le |
290 lemmas order_less_imp_le = preorder_class.less_imp_le |
287 lemmas order_less_imp_not_eq = preorder_class.less_imp_not_eq |
291 lemmas order_less_imp_not_eq = preorder_class.less_imp_not_eq |
288 lemmas order_less_imp_not_eq2 = preorder_class.less_imp_not_eq2 |
292 lemmas order_less_imp_not_eq2 = preorder_class.less_imp_not_eq2 |
289 lemmas order_neq_le_trans = preorder_class.neq_le_trans |
293 lemmas order_neq_le_trans = preorder_class.neq_le_trans |
290 lemmas order_le_neq_trans = preorder_class.le_neq_trans |
294 lemmas order_le_neq_trans = preorder_class.le_neq_trans |
291 |
295 |
292 lemmas order_antisym = order_class.antisym |
296 lemmas order_antisym = antisym |
293 lemmas order_less_not_sym = order_class.less_not_sym |
297 lemmas order_less_not_sym = order_class.less_not_sym |
294 lemmas order_less_asym = order_class.less_asym |
298 lemmas order_less_asym = order_class.less_asym |
295 lemmas order_eq_iff = order_class.eq_iff |
299 lemmas order_eq_iff = order_class.eq_iff |
296 lemmas order_antisym_conv = order_class.antisym_conv |
300 lemmas order_antisym_conv = order_class.antisym_conv |
297 lemmas less_imp_neq = order_class.less_imp_neq |
301 lemmas less_imp_neq = order_class.less_imp_neq |
300 lemmas order_less_le_trans = order_class.less_le_trans |
304 lemmas order_less_le_trans = order_class.less_le_trans |
301 lemmas order_less_imp_not_less = order_class.less_imp_not_less |
305 lemmas order_less_imp_not_less = order_class.less_imp_not_less |
302 lemmas order_less_imp_triv = order_class.less_imp_triv |
306 lemmas order_less_imp_triv = order_class.less_imp_triv |
303 lemmas order_less_asym' = order_class.less_asym' |
307 lemmas order_less_asym' = order_class.less_asym' |
304 |
308 |
305 lemmas linorder_linear = linorder_class.linear |
309 lemmas linorder_linear = linear |
306 lemmas linorder_less_linear = linorder_class.less_linear |
310 lemmas linorder_less_linear = linorder_class.less_linear |
307 lemmas linorder_le_less_linear = linorder_class.le_less_linear |
311 lemmas linorder_le_less_linear = linorder_class.le_less_linear |
308 lemmas linorder_le_cases = linorder_class.le_cases |
312 lemmas linorder_le_cases = linorder_class.le_cases |
309 lemmas linorder_cases = linorder_class.cases |
313 (*lemmas linorder_cases = linorder_class.linorder_cases*) |
310 lemmas linorder_not_less = linorder_class.not_less |
314 lemmas linorder_not_less = linorder_class.not_less |
311 lemmas linorder_not_le = linorder_class.not_le |
315 lemmas linorder_not_le = linorder_class.not_le |
312 lemmas linorder_neq_iff = linorder_class.neq_iff |
316 lemmas linorder_neq_iff = linorder_class.neq_iff |
313 lemmas linorder_neqE = linorder_class.neqE |
317 lemmas linorder_neqE = linorder_class.neqE |
314 lemmas linorder_antisym_conv1 = linorder_class.antisym_conv1 |
318 lemmas linorder_antisym_conv1 = linorder_class.antisym_conv1 |