src/HOL/Orderings.thy
changeset 22384 33a46e6c7f04
parent 22377 61610b1beedf
child 22424 8a5412121687
equal deleted inserted replaced
22383:01e90256550d 22384:33a46e6c7f04
    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
   894 
   898 
   895 lemma max_of_mono:
   899 lemma max_of_mono:
   896     "(!!x y. (f x <= f y) = (x <= y)) ==> max (f m) (f n) = f (max m n)"
   900     "(!!x y. (f x <= f y) = (x <= y)) ==> max (f m) (f n) = f (max m n)"
   897   by (simp add: max_def)
   901   by (simp add: max_def)
   898 
   902 
   899 
       
   900 subsection {* Basic ML bindings *}
   903 subsection {* Basic ML bindings *}
   901 
   904 
   902 ML {*
   905 ML {*
   903 val leD = thm "leD";
   906 val leD = thm "leD";
   904 val leI = thm "leI";
   907 val leI = thm "leI";