src/HOL/Algebra/Order.thy
changeset 68004 a8a20be7053a
parent 67613 ce654b0e6d69
child 68073 fad29d2a17a5
equal deleted inserted replaced
68001:0a2a1b6507c1 68004:a8a20be7053a
    29   "inv_gorder (inv_gorder L) = L"
    29   "inv_gorder (inv_gorder L) = L"
    30   by simp
    30   by simp
    31 
    31 
    32 locale weak_partial_order = equivalence L for L (structure) +
    32 locale weak_partial_order = equivalence L for L (structure) +
    33   assumes le_refl [intro, simp]:
    33   assumes le_refl [intro, simp]:
    34       "x \<in> carrier L ==> x \<sqsubseteq> x"
    34       "x \<in> carrier L \<Longrightarrow> x \<sqsubseteq> x"
    35     and weak_le_antisym [intro]:
    35     and weak_le_antisym [intro]:
    36       "[| x \<sqsubseteq> y; y \<sqsubseteq> x; x \<in> carrier L; y \<in> carrier L |] ==> x .= y"
    36       "\<lbrakk>x \<sqsubseteq> y; y \<sqsubseteq> x; x \<in> carrier L; y \<in> carrier L\<rbrakk> \<Longrightarrow> x .= y"
    37     and le_trans [trans]:
    37     and le_trans [trans]:
    38       "[| x \<sqsubseteq> y; y \<sqsubseteq> z; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L |] ==> x \<sqsubseteq> z"
    38       "\<lbrakk>x \<sqsubseteq> y; y \<sqsubseteq> z; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> z"
    39     and le_cong:
    39     and le_cong:
    40       "\<lbrakk> x .= y; z .= w; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L; w \<in> carrier L \<rbrakk> \<Longrightarrow>
    40       "\<lbrakk>x .= y; z .= w; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L; w \<in> carrier L\<rbrakk> \<Longrightarrow>
    41       x \<sqsubseteq> z \<longleftrightarrow> y \<sqsubseteq> w"
    41       x \<sqsubseteq> z \<longleftrightarrow> y \<sqsubseteq> w"
    42 
    42 
    43 definition
    43 definition
    44   lless :: "[_, 'a, 'a] => bool" (infixl "\<sqsubset>\<index>" 50)
    44   lless :: "[_, 'a, 'a] => bool" (infixl "\<sqsubset>\<index>" 50)
    45   where "x \<sqsubset>\<^bsub>L\<^esub> y \<longleftrightarrow> x \<sqsubseteq>\<^bsub>L\<^esub> y \<and> x .\<noteq>\<^bsub>L\<^esub> y"
    45   where "x \<sqsubset>\<^bsub>L\<^esub> y \<longleftrightarrow> x \<sqsubseteq>\<^bsub>L\<^esub> y \<and> x .\<noteq>\<^bsub>L\<^esub> y"
    46 
    46 
    47 
       
    48 subsubsection \<open>The order relation\<close>
    47 subsubsection \<open>The order relation\<close>
    49 
    48 
    50 context weak_partial_order
    49 context weak_partial_order
    51 begin
    50 begin
    52 
    51 
    53 lemma le_cong_l [intro, trans]:
    52 lemma le_cong_l [intro, trans]:
    54   "\<lbrakk> x .= y; y \<sqsubseteq> z; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L \<rbrakk> \<Longrightarrow> x \<sqsubseteq> z"
    53   "\<lbrakk>x .= y; y \<sqsubseteq> z; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> z"
    55   by (auto intro: le_cong [THEN iffD2])
    54   by (auto intro: le_cong [THEN iffD2])
    56 
    55 
    57 lemma le_cong_r [intro, trans]:
    56 lemma le_cong_r [intro, trans]:
    58   "\<lbrakk> x \<sqsubseteq> y; y .= z; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L \<rbrakk> \<Longrightarrow> x \<sqsubseteq> z"
    57   "\<lbrakk>x \<sqsubseteq> y; y .= z; x \<in> carrier L; y \<in> carrier L; z \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> z"
    59   by (auto intro: le_cong [THEN iffD1])
    58   by (auto intro: le_cong [THEN iffD1])
    60 
    59 
    61 lemma weak_refl [intro, simp]: "\<lbrakk> x .= y; x \<in> carrier L; y \<in> carrier L \<rbrakk> \<Longrightarrow> x \<sqsubseteq> y"
    60 lemma weak_refl [intro, simp]: "\<lbrakk>x .= y; x \<in> carrier L; y \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> y"
    62   by (simp add: le_cong_l)
    61   by (simp add: le_cong_l)
    63 
    62 
    64 end
    63 end
    65 
    64 
    66 lemma weak_llessI:
    65 lemma weak_llessI:
   141 
   140 
   142 definition
   141 definition
   143   Lower :: "[_, 'a set] => 'a set"
   142   Lower :: "[_, 'a set] => 'a set"
   144   where "Lower L A = {l. (\<forall>x. x \<in> A \<inter> carrier L \<longrightarrow> l \<sqsubseteq>\<^bsub>L\<^esub> x)} \<inter> carrier L"
   143   where "Lower L A = {l. (\<forall>x. x \<in> A \<inter> carrier L \<longrightarrow> l \<sqsubseteq>\<^bsub>L\<^esub> x)} \<inter> carrier L"
   145 
   144 
   146 lemma Upper_closed [intro!, simp]:
       
   147   "Upper L A \<subseteq> carrier L"
       
   148   by (unfold Upper_def) clarify
       
   149 
       
   150 lemma Upper_memD [dest]:
       
   151   fixes L (structure)
       
   152   shows "[| u \<in> Upper L A; x \<in> A; A \<subseteq> carrier L |] ==> x \<sqsubseteq> u \<and> u \<in> carrier L"
       
   153   by (unfold Upper_def) blast
       
   154 
       
   155 lemma (in weak_partial_order) Upper_elemD [dest]:
       
   156   "[| u .\<in> Upper L A; u \<in> carrier L; x \<in> A; A \<subseteq> carrier L |] ==> x \<sqsubseteq> u"
       
   157   unfolding Upper_def elem_def
       
   158   by (blast dest: sym)
       
   159 
       
   160 lemma Upper_memI:
       
   161   fixes L (structure)
       
   162   shows "[| !! y. y \<in> A ==> y \<sqsubseteq> x; x \<in> carrier L |] ==> x \<in> Upper L A"
       
   163   by (unfold Upper_def) blast
       
   164 
       
   165 lemma (in weak_partial_order) Upper_elemI:
       
   166   "[| !! y. y \<in> A ==> y \<sqsubseteq> x; x \<in> carrier L |] ==> x .\<in> Upper L A"
       
   167   unfolding Upper_def by blast
       
   168 
       
   169 lemma Upper_antimono:
       
   170   "A \<subseteq> B ==> Upper L B \<subseteq> Upper L A"
       
   171   by (unfold Upper_def) blast
       
   172 
       
   173 lemma (in weak_partial_order) Upper_is_closed [simp]:
       
   174   "A \<subseteq> carrier L ==> is_closed (Upper L A)"
       
   175   by (rule is_closedI) (blast intro: Upper_memI)+
       
   176 
       
   177 lemma (in weak_partial_order) Upper_mem_cong:
       
   178   assumes a'carr: "a' \<in> carrier L" and Acarr: "A \<subseteq> carrier L"
       
   179     and aa': "a .= a'"
       
   180     and aelem: "a \<in> Upper L A"
       
   181   shows "a' \<in> Upper L A"
       
   182 proof (rule Upper_memI[OF _ a'carr])
       
   183   fix y
       
   184   assume yA: "y \<in> A"
       
   185   hence "y \<sqsubseteq> a" by (intro Upper_memD[OF aelem, THEN conjunct1] Acarr)
       
   186   also note aa'
       
   187   finally
       
   188       show "y \<sqsubseteq> a'"
       
   189       by (simp add: a'carr subsetD[OF Acarr yA] subsetD[OF Upper_closed aelem])
       
   190 qed
       
   191 
       
   192 lemma (in weak_partial_order) Upper_cong:
       
   193   assumes Acarr: "A \<subseteq> carrier L" and A'carr: "A' \<subseteq> carrier L"
       
   194     and AA': "A {.=} A'"
       
   195   shows "Upper L A = Upper L A'"
       
   196 unfolding Upper_def
       
   197 apply rule
       
   198  apply (rule, clarsimp) defer 1
       
   199  apply (rule, clarsimp) defer 1
       
   200 proof -
       
   201   fix x a'
       
   202   assume carr: "x \<in> carrier L" "a' \<in> carrier L"
       
   203     and a'A': "a' \<in> A'"
       
   204   assume aLxCond[rule_format]: "\<forall>a. a \<in> A \<and> a \<in> carrier L \<longrightarrow> a \<sqsubseteq> x"
       
   205 
       
   206   from AA' and a'A' have "\<exists>a\<in>A. a' .= a" by (rule set_eqD2)
       
   207   from this obtain a
       
   208       where aA: "a \<in> A"
       
   209       and a'a: "a' .= a"
       
   210       by auto
       
   211   note [simp] = subsetD[OF Acarr aA] carr
       
   212 
       
   213   note a'a
       
   214   also have "a \<sqsubseteq> x" by (simp add: aLxCond aA)
       
   215   finally show "a' \<sqsubseteq> x" by simp
       
   216 next
       
   217   fix x a
       
   218   assume carr: "x \<in> carrier L" "a \<in> carrier L"
       
   219     and aA: "a \<in> A"
       
   220   assume a'LxCond[rule_format]: "\<forall>a'. a' \<in> A' \<and> a' \<in> carrier L \<longrightarrow> a' \<sqsubseteq> x"
       
   221 
       
   222   from AA' and aA have "\<exists>a'\<in>A'. a .= a'" by (rule set_eqD1)
       
   223   from this obtain a'
       
   224       where a'A': "a' \<in> A'"
       
   225       and aa': "a .= a'"
       
   226       by auto
       
   227   note [simp] = subsetD[OF A'carr a'A'] carr
       
   228 
       
   229   note aa'
       
   230   also have "a' \<sqsubseteq> x" by (simp add: a'LxCond a'A')
       
   231   finally show "a \<sqsubseteq> x" by simp
       
   232 qed
       
   233 
       
   234 lemma Lower_closed [intro!, simp]:
       
   235   "Lower L A \<subseteq> carrier L"
       
   236   by (unfold Lower_def) clarify
       
   237 
       
   238 lemma Lower_memD [dest]:
       
   239   fixes L (structure)
       
   240   shows "[| l \<in> Lower L A; x \<in> A; A \<subseteq> carrier L |] ==> l \<sqsubseteq> x \<and> l \<in> carrier L"
       
   241   by (unfold Lower_def) blast
       
   242 
       
   243 lemma Lower_memI:
       
   244   fixes L (structure)
       
   245   shows "[| !! y. y \<in> A ==> x \<sqsubseteq> y; x \<in> carrier L |] ==> x \<in> Lower L A"
       
   246   by (unfold Lower_def) blast
       
   247 
       
   248 lemma Lower_antimono:
       
   249   "A \<subseteq> B ==> Lower L B \<subseteq> Lower L A"
       
   250   by (unfold Lower_def) blast
       
   251 
       
   252 lemma (in weak_partial_order) Lower_is_closed [simp]:
       
   253   "A \<subseteq> carrier L \<Longrightarrow> is_closed (Lower L A)"
       
   254   by (rule is_closedI) (blast intro: Lower_memI dest: sym)+
       
   255 
       
   256 lemma (in weak_partial_order) Lower_mem_cong:
       
   257   assumes a'carr: "a' \<in> carrier L" and Acarr: "A \<subseteq> carrier L"
       
   258     and aa': "a .= a'"
       
   259     and aelem: "a \<in> Lower L A"
       
   260   shows "a' \<in> Lower L A"
       
   261 using assms Lower_closed[of L A]
       
   262 by (intro Lower_memI) (blast intro: le_cong_l[OF aa'[symmetric]])
       
   263 
       
   264 lemma (in weak_partial_order) Lower_cong:
       
   265   assumes Acarr: "A \<subseteq> carrier L" and A'carr: "A' \<subseteq> carrier L"
       
   266     and AA': "A {.=} A'"
       
   267   shows "Lower L A = Lower L A'"
       
   268 unfolding Lower_def
       
   269 apply rule
       
   270  apply clarsimp defer 1
       
   271  apply clarsimp defer 1
       
   272 proof -
       
   273   fix x a'
       
   274   assume carr: "x \<in> carrier L" "a' \<in> carrier L"
       
   275     and a'A': "a' \<in> A'"
       
   276   assume "\<forall>a. a \<in> A \<and> a \<in> carrier L \<longrightarrow> x \<sqsubseteq> a"
       
   277   hence aLxCond: "\<And>a. \<lbrakk>a \<in> A; a \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> a" by fast
       
   278 
       
   279   from AA' and a'A' have "\<exists>a\<in>A. a' .= a" by (rule set_eqD2)
       
   280   from this obtain a
       
   281       where aA: "a \<in> A"
       
   282       and a'a: "a' .= a"
       
   283       by auto
       
   284 
       
   285   from aA and subsetD[OF Acarr aA]
       
   286       have "x \<sqsubseteq> a" by (rule aLxCond)
       
   287   also note a'a[symmetric]
       
   288   finally
       
   289       show "x \<sqsubseteq> a'" by (simp add: carr subsetD[OF Acarr aA])
       
   290 next
       
   291   fix x a
       
   292   assume carr: "x \<in> carrier L" "a \<in> carrier L"
       
   293     and aA: "a \<in> A"
       
   294   assume "\<forall>a'. a' \<in> A' \<and> a' \<in> carrier L \<longrightarrow> x \<sqsubseteq> a'"
       
   295   hence a'LxCond: "\<And>a'. \<lbrakk>a' \<in> A'; a' \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> a'" by fast+
       
   296 
       
   297   from AA' and aA have "\<exists>a'\<in>A'. a .= a'" by (rule set_eqD1)
       
   298   from this obtain a'
       
   299       where a'A': "a' \<in> A'"
       
   300       and aa': "a .= a'"
       
   301       by auto
       
   302   from a'A' and subsetD[OF A'carr a'A']
       
   303       have "x \<sqsubseteq> a'" by (rule a'LxCond)
       
   304   also note aa'[symmetric]
       
   305   finally show "x \<sqsubseteq> a" by (simp add: carr subsetD[OF A'carr a'A'])
       
   306 qed
       
   307 
       
   308 text \<open>Jacobson: Theorem 8.1\<close>
       
   309 
       
   310 lemma Lower_empty [simp]:
       
   311   "Lower L {} = carrier L"
       
   312   by (unfold Lower_def) simp
       
   313 
       
   314 lemma Upper_empty [simp]:
       
   315   "Upper L {} = carrier L"
       
   316   by (unfold Upper_def) simp
       
   317 
       
   318 
       
   319 subsubsection \<open>Least and greatest, as predicate\<close>
       
   320 
       
   321 definition
       
   322   least :: "[_, 'a, 'a set] => bool"
       
   323   where "least L l A \<longleftrightarrow> A \<subseteq> carrier L \<and> l \<in> A \<and> (\<forall>x\<in>A. l \<sqsubseteq>\<^bsub>L\<^esub> x)"
       
   324 
       
   325 definition
       
   326   greatest :: "[_, 'a, 'a set] => bool"
       
   327   where "greatest L g A \<longleftrightarrow> A \<subseteq> carrier L \<and> g \<in> A \<and> (\<forall>x\<in>A. x \<sqsubseteq>\<^bsub>L\<^esub> g)"
       
   328 
       
   329 text (in weak_partial_order) \<open>Could weaken these to @{term "l \<in> carrier L \<and> l
       
   330   .\<in> A"} and @{term "g \<in> carrier L \<and> g .\<in> A"}.\<close>
       
   331 
       
   332 lemma least_closed [intro, simp]:
       
   333   "least L l A ==> l \<in> carrier L"
       
   334   by (unfold least_def) fast
       
   335 
       
   336 lemma least_mem:
       
   337   "least L l A ==> l \<in> A"
       
   338   by (unfold least_def) fast
       
   339 
       
   340 lemma (in weak_partial_order) weak_least_unique:
       
   341   "[| least L x A; least L y A |] ==> x .= y"
       
   342   by (unfold least_def) blast
       
   343 
       
   344 lemma least_le:
       
   345   fixes L (structure)
       
   346   shows "[| least L x A; a \<in> A |] ==> x \<sqsubseteq> a"
       
   347   by (unfold least_def) fast
       
   348 
       
   349 lemma (in weak_partial_order) least_cong:
       
   350   "[| x .= x'; x \<in> carrier L; x' \<in> carrier L; is_closed A |] ==> least L x A = least L x' A"
       
   351   by (unfold least_def) (auto dest: sym)
       
   352 
       
   353 abbreviation is_lub :: "[_, 'a, 'a set] => bool"
       
   354 where "is_lub L x A \<equiv> least L x (Upper L A)"
       
   355 
       
   356 text (in weak_partial_order) \<open>@{const least} is not congruent in the second parameter for
       
   357   @{term "A {.=} A'"}\<close>
       
   358 
       
   359 lemma (in weak_partial_order) least_Upper_cong_l:
       
   360   assumes "x .= x'"
       
   361     and "x \<in> carrier L" "x' \<in> carrier L"
       
   362     and "A \<subseteq> carrier L"
       
   363   shows "least L x (Upper L A) = least L x' (Upper L A)"
       
   364   apply (rule least_cong) using assms by auto
       
   365 
       
   366 lemma (in weak_partial_order) least_Upper_cong_r:
       
   367   assumes Acarrs: "A \<subseteq> carrier L" "A' \<subseteq> carrier L" (* unneccessary with current Upper? *)
       
   368     and AA': "A {.=} A'"
       
   369   shows "least L x (Upper L A) = least L x (Upper L A')"
       
   370 apply (subgoal_tac "Upper L A = Upper L A'", simp)
       
   371 by (rule Upper_cong) fact+
       
   372 
       
   373 lemma least_UpperI:
       
   374   fixes L (structure)
       
   375   assumes above: "!! x. x \<in> A ==> x \<sqsubseteq> s"
       
   376     and below: "!! y. y \<in> Upper L A ==> s \<sqsubseteq> y"
       
   377     and L: "A \<subseteq> carrier L"  "s \<in> carrier L"
       
   378   shows "least L s (Upper L A)"
       
   379 proof -
       
   380   have "Upper L A \<subseteq> carrier L" by simp
       
   381   moreover from above L have "s \<in> Upper L A" by (simp add: Upper_def)
       
   382   moreover from below have "\<forall>x \<in> Upper L A. s \<sqsubseteq> x" by fast
       
   383   ultimately show ?thesis by (simp add: least_def)
       
   384 qed
       
   385 
       
   386 lemma least_Upper_above:
       
   387   fixes L (structure)
       
   388   shows "[| least L s (Upper L A); x \<in> A; A \<subseteq> carrier L |] ==> x \<sqsubseteq> s"
       
   389   by (unfold least_def) blast
       
   390 
       
   391 lemma greatest_closed [intro, simp]:
       
   392   "greatest L l A ==> l \<in> carrier L"
       
   393   by (unfold greatest_def) fast
       
   394 
       
   395 lemma greatest_mem:
       
   396   "greatest L l A ==> l \<in> A"
       
   397   by (unfold greatest_def) fast
       
   398 
       
   399 lemma (in weak_partial_order) weak_greatest_unique:
       
   400   "[| greatest L x A; greatest L y A |] ==> x .= y"
       
   401   by (unfold greatest_def) blast
       
   402 
       
   403 lemma greatest_le:
       
   404   fixes L (structure)
       
   405   shows "[| greatest L x A; a \<in> A |] ==> a \<sqsubseteq> x"
       
   406   by (unfold greatest_def) fast
       
   407 
       
   408 lemma (in weak_partial_order) greatest_cong:
       
   409   "[| x .= x'; x \<in> carrier L; x' \<in> carrier L; is_closed A |] ==>
       
   410   greatest L x A = greatest L x' A"
       
   411   by (unfold greatest_def) (auto dest: sym)
       
   412 
       
   413 abbreviation is_glb :: "[_, 'a, 'a set] => bool"
       
   414 where "is_glb L x A \<equiv> greatest L x (Lower L A)"
       
   415 
       
   416 text (in weak_partial_order) \<open>@{const greatest} is not congruent in the second parameter for
       
   417   @{term "A {.=} A'"} \<close>
       
   418 
       
   419 lemma (in weak_partial_order) greatest_Lower_cong_l:
       
   420   assumes "x .= x'"
       
   421     and "x \<in> carrier L" "x' \<in> carrier L"
       
   422     and "A \<subseteq> carrier L" (* unneccessary with current Lower *)
       
   423   shows "greatest L x (Lower L A) = greatest L x' (Lower L A)"
       
   424   apply (rule greatest_cong) using assms by auto
       
   425 
       
   426 lemma (in weak_partial_order) greatest_Lower_cong_r:
       
   427   assumes Acarrs: "A \<subseteq> carrier L" "A' \<subseteq> carrier L"
       
   428     and AA': "A {.=} A'"
       
   429   shows "greatest L x (Lower L A) = greatest L x (Lower L A')"
       
   430 apply (subgoal_tac "Lower L A = Lower L A'", simp)
       
   431 by (rule Lower_cong) fact+
       
   432 
       
   433 lemma greatest_LowerI:
       
   434   fixes L (structure)
       
   435   assumes below: "!! x. x \<in> A ==> i \<sqsubseteq> x"
       
   436     and above: "!! y. y \<in> Lower L A ==> y \<sqsubseteq> i"
       
   437     and L: "A \<subseteq> carrier L"  "i \<in> carrier L"
       
   438   shows "greatest L i (Lower L A)"
       
   439 proof -
       
   440   have "Lower L A \<subseteq> carrier L" by simp
       
   441   moreover from below L have "i \<in> Lower L A" by (simp add: Lower_def)
       
   442   moreover from above have "\<forall>x \<in> Lower L A. x \<sqsubseteq> i" by fast
       
   443   ultimately show ?thesis by (simp add: greatest_def)
       
   444 qed
       
   445 
       
   446 lemma greatest_Lower_below:
       
   447   fixes L (structure)
       
   448   shows "[| greatest L i (Lower L A); x \<in> A; A \<subseteq> carrier L |] ==> i \<sqsubseteq> x"
       
   449   by (unfold greatest_def) blast
       
   450 
       
   451 lemma Lower_dual [simp]:
   145 lemma Lower_dual [simp]:
   452   "Lower (inv_gorder L) A = Upper L A"
   146   "Lower (inv_gorder L) A = Upper L A"
   453   by (simp add:Upper_def Lower_def)
   147   by (simp add:Upper_def Lower_def)
   454 
   148 
   455 lemma Upper_dual [simp]:
   149 lemma Upper_dual [simp]:
   456   "Upper (inv_gorder L) A = Lower L A"
   150   "Upper (inv_gorder L) A = Lower L A"
   457   by (simp add:Upper_def Lower_def)
   151   by (simp add:Upper_def Lower_def)
   458 
   152 
   459 lemma least_dual [simp]:
   153 lemma (in weak_partial_order) equivalence_dual: "equivalence (inv_gorder L)"
   460   "least (inv_gorder L) x A = greatest L x A"
   154   by (rule equivalence.intro) (auto simp: intro: sym trans)
   461   by (simp add:least_def greatest_def)
   155 
   462 
   156 lemma  (in weak_partial_order) dual_weak_order: "weak_partial_order (inv_gorder L)"
   463 lemma greatest_dual [simp]:
   157   by intro_locales (auto simp add: weak_partial_order_axioms_def le_cong intro: equivalence_dual le_trans)
   464   "greatest (inv_gorder L) x A = least L x A"
   158 
   465   by (simp add:least_def greatest_def)
   159 lemma (in weak_partial_order) dual_eq_iff [simp]: "A {.=}\<^bsub>inv_gorder L\<^esub> A' \<longleftrightarrow> A {.=} A'"
   466 
   160   by (auto simp: set_eq_def elem_def)
   467 lemma (in weak_partial_order) dual_weak_order:
       
   468   "weak_partial_order (inv_gorder L)"
       
   469   apply (unfold_locales)
       
   470   apply (simp_all)
       
   471   apply (metis sym)
       
   472   apply (metis trans)
       
   473   apply (metis weak_le_antisym)
       
   474   apply (metis le_trans)
       
   475   apply (metis le_cong_l le_cong_r sym)
       
   476 done
       
   477 
   161 
   478 lemma dual_weak_order_iff:
   162 lemma dual_weak_order_iff:
   479   "weak_partial_order (inv_gorder A) \<longleftrightarrow> weak_partial_order A"
   163   "weak_partial_order (inv_gorder A) \<longleftrightarrow> weak_partial_order A"
   480 proof
   164 proof
   481   assume "weak_partial_order (inv_gorder A)"
   165   assume "weak_partial_order (inv_gorder A)"
   490   assume "weak_partial_order A"
   174   assume "weak_partial_order A"
   491   thus "weak_partial_order (inv_gorder A)"
   175   thus "weak_partial_order (inv_gorder A)"
   492     by (metis weak_partial_order.dual_weak_order)
   176     by (metis weak_partial_order.dual_weak_order)
   493 qed
   177 qed
   494 
   178 
       
   179 lemma Upper_closed [iff]:
       
   180   "Upper L A \<subseteq> carrier L"
       
   181   by (unfold Upper_def) clarify
       
   182 
       
   183 lemma Upper_memD [dest]:
       
   184   fixes L (structure)
       
   185   shows "\<lbrakk>u \<in> Upper L A; x \<in> A; A \<subseteq> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> u \<and> u \<in> carrier L"
       
   186   by (unfold Upper_def) blast
       
   187 
       
   188 lemma (in weak_partial_order) Upper_elemD [dest]:
       
   189   "\<lbrakk>u .\<in> Upper L A; u \<in> carrier L; x \<in> A; A \<subseteq> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> u"
       
   190   unfolding Upper_def elem_def
       
   191   by (blast dest: sym)
       
   192 
       
   193 lemma Upper_memI:
       
   194   fixes L (structure)
       
   195   shows "\<lbrakk>!! y. y \<in> A \<Longrightarrow> y \<sqsubseteq> x; x \<in> carrier L\<rbrakk> \<Longrightarrow> x \<in> Upper L A"
       
   196   by (unfold Upper_def) blast
       
   197 
       
   198 lemma (in weak_partial_order) Upper_elemI:
       
   199   "\<lbrakk>!! y. y \<in> A \<Longrightarrow> y \<sqsubseteq> x; x \<in> carrier L\<rbrakk> \<Longrightarrow> x .\<in> Upper L A"
       
   200   unfolding Upper_def by blast
       
   201 
       
   202 lemma Upper_antimono:
       
   203   "A \<subseteq> B \<Longrightarrow> Upper L B \<subseteq> Upper L A"
       
   204   by (unfold Upper_def) blast
       
   205 
       
   206 lemma (in weak_partial_order) Upper_is_closed [simp]:
       
   207   "A \<subseteq> carrier L \<Longrightarrow> is_closed (Upper L A)"
       
   208   by (rule is_closedI) (blast intro: Upper_memI)+
       
   209 
       
   210 lemma (in weak_partial_order) Upper_mem_cong:
       
   211   assumes  "a' \<in> carrier L" "A \<subseteq> carrier L" "a .= a'" "a \<in> Upper L A"
       
   212   shows "a' \<in> Upper L A"
       
   213   by (metis assms Upper_closed Upper_is_closed closure_of_eq complete_classes)
       
   214 
       
   215 lemma (in weak_partial_order) Upper_semi_cong:
       
   216   assumes "A \<subseteq> carrier L" "A {.=} A'"
       
   217   shows "Upper L A \<subseteq> Upper L A'"
       
   218   unfolding Upper_def
       
   219    by clarsimp (meson assms equivalence.refl equivalence_axioms le_cong set_eqD2 subset_eq)
       
   220 
       
   221 lemma (in weak_partial_order) Upper_cong:
       
   222   assumes "A \<subseteq> carrier L" "A' \<subseteq> carrier L" "A {.=} A'"
       
   223   shows "Upper L A = Upper L A'"
       
   224   using assms by (simp add: Upper_semi_cong set_eq_sym subset_antisym)
       
   225 
       
   226 lemma Lower_closed [intro!, simp]:
       
   227   "Lower L A \<subseteq> carrier L"
       
   228   by (unfold Lower_def) clarify
       
   229 
       
   230 lemma Lower_memD [dest]:
       
   231   fixes L (structure)
       
   232   shows "\<lbrakk>l \<in> Lower L A; x \<in> A; A \<subseteq> carrier L\<rbrakk> \<Longrightarrow> l \<sqsubseteq> x \<and> l \<in> carrier L"
       
   233   by (unfold Lower_def) blast
       
   234 
       
   235 lemma Lower_memI:
       
   236   fixes L (structure)
       
   237   shows "\<lbrakk>!! y. y \<in> A \<Longrightarrow> x \<sqsubseteq> y; x \<in> carrier L\<rbrakk> \<Longrightarrow> x \<in> Lower L A"
       
   238   by (unfold Lower_def) blast
       
   239 
       
   240 lemma Lower_antimono:
       
   241   "A \<subseteq> B \<Longrightarrow> Lower L B \<subseteq> Lower L A"
       
   242   by (unfold Lower_def) blast
       
   243 
       
   244 lemma (in weak_partial_order) Lower_is_closed [simp]:
       
   245   "A \<subseteq> carrier L \<Longrightarrow> is_closed (Lower L A)"
       
   246   by (rule is_closedI) (blast intro: Lower_memI dest: sym)+
       
   247 
       
   248 lemma (in weak_partial_order) Lower_mem_cong:
       
   249   assumes "a' \<in> carrier L"  "A \<subseteq> carrier L" "a .= a'" "a \<in> Lower L A"
       
   250   shows "a' \<in> Lower L A"
       
   251   by (meson assms Lower_closed Lower_is_closed is_closed_eq subsetCE)
       
   252 
       
   253 lemma (in weak_partial_order) Lower_cong:
       
   254   assumes "A \<subseteq> carrier L" "A' \<subseteq> carrier L" "A {.=} A'"
       
   255   shows "Lower L A = Lower L A'"
       
   256   unfolding Upper_dual [symmetric]
       
   257   by (rule weak_partial_order.Upper_cong [OF dual_weak_order]) (simp_all add: assms)
       
   258 
       
   259 text \<open>Jacobson: Theorem 8.1\<close>
       
   260 
       
   261 lemma Lower_empty [simp]:
       
   262   "Lower L {} = carrier L"
       
   263   by (unfold Lower_def) simp
       
   264 
       
   265 lemma Upper_empty [simp]:
       
   266   "Upper L {} = carrier L"
       
   267   by (unfold Upper_def) simp
       
   268 
       
   269 
       
   270 subsubsection \<open>Least and greatest, as predicate\<close>
       
   271 
       
   272 definition
       
   273   least :: "[_, 'a, 'a set] => bool"
       
   274   where "least L l A \<longleftrightarrow> A \<subseteq> carrier L \<and> l \<in> A \<and> (\<forall>x\<in>A. l \<sqsubseteq>\<^bsub>L\<^esub> x)"
       
   275 
       
   276 definition
       
   277   greatest :: "[_, 'a, 'a set] => bool"
       
   278   where "greatest L g A \<longleftrightarrow> A \<subseteq> carrier L \<and> g \<in> A \<and> (\<forall>x\<in>A. x \<sqsubseteq>\<^bsub>L\<^esub> g)"
       
   279 
       
   280 text (in weak_partial_order) \<open>Could weaken these to @{term "l \<in> carrier L \<and> l .\<in> A"} and @{term "g \<in> carrier L \<and> g .\<in> A"}.\<close>
       
   281 
       
   282 lemma least_dual [simp]:
       
   283   "least (inv_gorder L) x A = greatest L x A"
       
   284   by (simp add:least_def greatest_def)
       
   285 
       
   286 lemma greatest_dual [simp]:
       
   287   "greatest (inv_gorder L) x A = least L x A"
       
   288   by (simp add:least_def greatest_def)
       
   289 
       
   290 lemma least_closed [intro, simp]:
       
   291   "least L l A \<Longrightarrow> l \<in> carrier L"
       
   292   by (unfold least_def) fast
       
   293 
       
   294 lemma least_mem:
       
   295   "least L l A \<Longrightarrow> l \<in> A"
       
   296   by (unfold least_def) fast
       
   297 
       
   298 lemma (in weak_partial_order) weak_least_unique:
       
   299   "\<lbrakk>least L x A; least L y A\<rbrakk> \<Longrightarrow> x .= y"
       
   300   by (unfold least_def) blast
       
   301 
       
   302 lemma least_le:
       
   303   fixes L (structure)
       
   304   shows "\<lbrakk>least L x A; a \<in> A\<rbrakk> \<Longrightarrow> x \<sqsubseteq> a"
       
   305   by (unfold least_def) fast
       
   306 
       
   307 lemma (in weak_partial_order) least_cong:
       
   308   "\<lbrakk>x .= x'; x \<in> carrier L; x' \<in> carrier L; is_closed A\<rbrakk> \<Longrightarrow> least L x A = least L x' A"
       
   309   unfolding least_def
       
   310   by (meson is_closed_eq is_closed_eq_rev le_cong local.refl subset_iff)
       
   311 
       
   312 abbreviation is_lub :: "[_, 'a, 'a set] => bool"
       
   313 where "is_lub L x A \<equiv> least L x (Upper L A)"
       
   314 
       
   315 text (in weak_partial_order) \<open>@{const least} is not congruent in the second parameter for
       
   316   @{term "A {.=} A'"}\<close>
       
   317 
       
   318 lemma (in weak_partial_order) least_Upper_cong_l:
       
   319   assumes "x .= x'"
       
   320     and "x \<in> carrier L" "x' \<in> carrier L"
       
   321     and "A \<subseteq> carrier L"
       
   322   shows "least L x (Upper L A) = least L x' (Upper L A)"
       
   323   apply (rule least_cong) using assms by auto
       
   324 
       
   325 lemma (in weak_partial_order) least_Upper_cong_r:
       
   326   assumes "A \<subseteq> carrier L" "A' \<subseteq> carrier L" "A {.=} A'"
       
   327   shows "least L x (Upper L A) = least L x (Upper L A')"
       
   328   using Upper_cong assms by auto
       
   329 
       
   330 lemma least_UpperI:
       
   331   fixes L (structure)
       
   332   assumes above: "!! x. x \<in> A \<Longrightarrow> x \<sqsubseteq> s"
       
   333     and below: "!! y. y \<in> Upper L A \<Longrightarrow> s \<sqsubseteq> y"
       
   334     and L: "A \<subseteq> carrier L"  "s \<in> carrier L"
       
   335   shows "least L s (Upper L A)"
       
   336 proof -
       
   337   have "Upper L A \<subseteq> carrier L" by simp
       
   338   moreover from above L have "s \<in> Upper L A" by (simp add: Upper_def)
       
   339   moreover from below have "\<forall>x \<in> Upper L A. s \<sqsubseteq> x" by fast
       
   340   ultimately show ?thesis by (simp add: least_def)
       
   341 qed
       
   342 
       
   343 lemma least_Upper_above:
       
   344   fixes L (structure)
       
   345   shows "\<lbrakk>least L s (Upper L A); x \<in> A; A \<subseteq> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> s"
       
   346   by (unfold least_def) blast
       
   347 
       
   348 lemma greatest_closed [intro, simp]:
       
   349   "greatest L l A \<Longrightarrow> l \<in> carrier L"
       
   350   by (unfold greatest_def) fast
       
   351 
       
   352 lemma greatest_mem:
       
   353   "greatest L l A \<Longrightarrow> l \<in> A"
       
   354   by (unfold greatest_def) fast
       
   355 
       
   356 lemma (in weak_partial_order) weak_greatest_unique:
       
   357   "\<lbrakk>greatest L x A; greatest L y A\<rbrakk> \<Longrightarrow> x .= y"
       
   358   by (unfold greatest_def) blast
       
   359 
       
   360 lemma greatest_le:
       
   361   fixes L (structure)
       
   362   shows "\<lbrakk>greatest L x A; a \<in> A\<rbrakk> \<Longrightarrow> a \<sqsubseteq> x"
       
   363   by (unfold greatest_def) fast
       
   364 
       
   365 lemma (in weak_partial_order) greatest_cong:
       
   366   "\<lbrakk>x .= x'; x \<in> carrier L; x' \<in> carrier L; is_closed A\<rbrakk> \<Longrightarrow>
       
   367   greatest L x A = greatest L x' A"
       
   368   unfolding greatest_def
       
   369   by (meson is_closed_eq_rev le_cong_r local.sym subset_eq)
       
   370 
       
   371 abbreviation is_glb :: "[_, 'a, 'a set] => bool"
       
   372 where "is_glb L x A \<equiv> greatest L x (Lower L A)"
       
   373 
       
   374 text (in weak_partial_order) \<open>@{const greatest} is not congruent in the second parameter for
       
   375   @{term "A {.=} A'"} \<close>
       
   376 
       
   377 lemma (in weak_partial_order) greatest_Lower_cong_l:
       
   378   assumes "x .= x'"
       
   379     and "x \<in> carrier L" "x' \<in> carrier L"
       
   380   shows "greatest L x (Lower L A) = greatest L x' (Lower L A)"
       
   381 proof -
       
   382   have "\<forall>A. is_closed (Lower L (A \<inter> carrier L))"
       
   383     by simp
       
   384   then show ?thesis
       
   385     by (simp add: Lower_def assms greatest_cong)
       
   386 qed
       
   387 
       
   388 lemma (in weak_partial_order) greatest_Lower_cong_r:
       
   389   assumes "A \<subseteq> carrier L" "A' \<subseteq> carrier L" "A {.=} A'"
       
   390   shows "greatest L x (Lower L A) = greatest L x (Lower L A')"
       
   391   using Lower_cong assms by auto
       
   392 
       
   393 lemma greatest_LowerI:
       
   394   fixes L (structure)
       
   395   assumes below: "!! x. x \<in> A \<Longrightarrow> i \<sqsubseteq> x"
       
   396     and above: "!! y. y \<in> Lower L A \<Longrightarrow> y \<sqsubseteq> i"
       
   397     and L: "A \<subseteq> carrier L"  "i \<in> carrier L"
       
   398   shows "greatest L i (Lower L A)"
       
   399 proof -
       
   400   have "Lower L A \<subseteq> carrier L" by simp
       
   401   moreover from below L have "i \<in> Lower L A" by (simp add: Lower_def)
       
   402   moreover from above have "\<forall>x \<in> Lower L A. x \<sqsubseteq> i" by fast
       
   403   ultimately show ?thesis by (simp add: greatest_def)
       
   404 qed
       
   405 
       
   406 lemma greatest_Lower_below:
       
   407   fixes L (structure)
       
   408   shows "\<lbrakk>greatest L i (Lower L A); x \<in> A; A \<subseteq> carrier L\<rbrakk> \<Longrightarrow> i \<sqsubseteq> x"
       
   409   by (unfold greatest_def) blast
       
   410 
   495 
   411 
   496 subsubsection \<open>Intervals\<close>
   412 subsubsection \<open>Intervals\<close>
   497 
   413 
   498 definition
   414 definition
   499   at_least_at_most :: "('a, 'c) gorder_scheme \<Rightarrow> 'a => 'a => 'a set" ("(1\<lbrace>_.._\<rbrace>\<index>)")
   415   at_least_at_most :: "('a, 'c) gorder_scheme \<Rightarrow> 'a => 'a => 'a set" ("(1\<lbrace>_.._\<rbrace>\<index>)")
   512 
   428 
   513   lemma at_least_at_most_closed: "\<lbrace>a..b\<rbrace> \<subseteq> carrier L"
   429   lemma at_least_at_most_closed: "\<lbrace>a..b\<rbrace> \<subseteq> carrier L"
   514     by (auto simp add: at_least_at_most_def)
   430     by (auto simp add: at_least_at_most_def)
   515 
   431 
   516   lemma at_least_at_most_member [intro]: 
   432   lemma at_least_at_most_member [intro]: 
   517     "\<lbrakk> x \<in> carrier L; a \<sqsubseteq> x; x \<sqsubseteq> b \<rbrakk> \<Longrightarrow> x \<in> \<lbrace>a..b\<rbrace>"
   433     "\<lbrakk>x \<in> carrier L; a \<sqsubseteq> x; x \<sqsubseteq> b\<rbrakk> \<Longrightarrow> x \<in> \<lbrace>a..b\<rbrace>"
   518     by (simp add: at_least_at_most_def)
   434     by (simp add: at_least_at_most_def)
   519 
   435 
   520 end
   436 end
   521 
   437 
   522 
   438 
   530 
   446 
   531 lemma isotoneI [intro?]:
   447 lemma isotoneI [intro?]:
   532   fixes f :: "'a \<Rightarrow> 'b"
   448   fixes f :: "'a \<Rightarrow> 'b"
   533   assumes "weak_partial_order L1"
   449   assumes "weak_partial_order L1"
   534           "weak_partial_order L2"
   450           "weak_partial_order L2"
   535           "(\<And>x y. \<lbrakk> x \<in> carrier L1; y \<in> carrier L1; x \<sqsubseteq>\<^bsub>L1\<^esub> y \<rbrakk> 
   451           "(\<And>x y. \<lbrakk>x \<in> carrier L1; y \<in> carrier L1; x \<sqsubseteq>\<^bsub>L1\<^esub> y\<rbrakk> 
   536                    \<Longrightarrow> f x \<sqsubseteq>\<^bsub>L2\<^esub> f y)"
   452                    \<Longrightarrow> f x \<sqsubseteq>\<^bsub>L2\<^esub> f y)"
   537   shows "isotone L1 L2 f"
   453   shows "isotone L1 L2 f"
   538   using assms by (auto simp add:isotone_def)
   454   using assms by (auto simp add:isotone_def)
   539 
   455 
   540 abbreviation Monotone :: "('a, 'b) gorder_scheme \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> bool" ("Mono\<index>")
   456 abbreviation Monotone :: "('a, 'b) gorder_scheme \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> bool" ("Mono\<index>")
   565 definition idempotent :: 
   481 definition idempotent :: 
   566   "('a, 'b) gorder_scheme \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> bool" ("Idem\<index>") where
   482   "('a, 'b) gorder_scheme \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> bool" ("Idem\<index>") where
   567   "idempotent L f \<equiv> \<forall>x\<in>carrier L. f (f x) .=\<^bsub>L\<^esub> f x"
   483   "idempotent L f \<equiv> \<forall>x\<in>carrier L. f (f x) .=\<^bsub>L\<^esub> f x"
   568 
   484 
   569 lemma (in weak_partial_order) idempotent:
   485 lemma (in weak_partial_order) idempotent:
   570   "\<lbrakk> Idem f; x \<in> carrier L \<rbrakk> \<Longrightarrow> f (f x) .= f x"
   486   "\<lbrakk>Idem f; x \<in> carrier L\<rbrakk> \<Longrightarrow> f (f x) .= f x"
   571   by (auto simp add: idempotent_def)
   487   by (auto simp add: idempotent_def)
   572 
   488 
   573 
   489 
   574 subsubsection \<open>Order embeddings\<close>
   490 subsubsection \<open>Order embeddings\<close>
   575 
   491 
   595 begin
   511 begin
   596 
   512 
   597 declare weak_le_antisym [rule del]
   513 declare weak_le_antisym [rule del]
   598 
   514 
   599 lemma le_antisym [intro]:
   515 lemma le_antisym [intro]:
   600   "[| x \<sqsubseteq> y; y \<sqsubseteq> x; x \<in> carrier L; y \<in> carrier L |] ==> x = y"
   516   "\<lbrakk>x \<sqsubseteq> y; y \<sqsubseteq> x; x \<in> carrier L; y \<in> carrier L\<rbrakk> \<Longrightarrow> x = y"
   601   using weak_le_antisym unfolding eq_is_equal .
   517   using weak_le_antisym unfolding eq_is_equal .
   602 
   518 
   603 lemma lless_eq:
   519 lemma lless_eq:
   604   "x \<sqsubset> y \<longleftrightarrow> x \<sqsubseteq> y \<and> x \<noteq> y"
   520   "x \<sqsubset> y \<longleftrightarrow> x \<sqsubseteq> y \<and> x \<noteq> y"
   605   unfolding lless_def by (simp add: eq_is_equal)
   521   unfolding lless_def by (simp add: eq_is_equal)
   626   rewrites "carrier (inv_gorder A) = carrier A"
   542   rewrites "carrier (inv_gorder A) = carrier A"
   627   and   "le (inv_gorder A)      = (\<lambda> x y. le A y x)"
   543   and   "le (inv_gorder A)      = (\<lambda> x y. le A y x)"
   628   and   "eq (inv_gorder A)      = eq A"
   544   and   "eq (inv_gorder A)      = eq A"
   629     by (simp_all)
   545     by (simp_all)
   630   show "partial_order A"
   546   show "partial_order A"
   631     apply (unfold_locales, simp_all)
   547     apply (unfold_locales, simp_all add: po.sym)
   632     apply (metis po.sym, metis po.trans)
   548     apply (metis po.trans)
   633     apply (metis po.weak_le_antisym, metis po.le_trans)
   549     apply (metis po.weak_le_antisym, metis po.le_trans)
   634     apply (metis (full_types) po.eq_is_equal, metis po.eq_is_equal)
   550     apply (metis (full_types) po.eq_is_equal, metis po.eq_is_equal)
   635   done
   551   done
   636 next
   552 next
   637   assume "partial_order A"
   553   assume "partial_order A"
   640 qed
   556 qed
   641 
   557 
   642 text \<open>Least and greatest, as predicate\<close>
   558 text \<open>Least and greatest, as predicate\<close>
   643 
   559 
   644 lemma (in partial_order) least_unique:
   560 lemma (in partial_order) least_unique:
   645   "[| least L x A; least L y A |] ==> x = y"
   561   "\<lbrakk>least L x A; least L y A\<rbrakk> \<Longrightarrow> x = y"
   646   using weak_least_unique unfolding eq_is_equal .
   562   using weak_least_unique unfolding eq_is_equal .
   647 
   563 
   648 lemma (in partial_order) greatest_unique:
   564 lemma (in partial_order) greatest_unique:
   649   "[| greatest L x A; greatest L y A |] ==> x = y"
   565   "\<lbrakk>greatest L x A; greatest L y A\<rbrakk> \<Longrightarrow> x = y"
   650   using weak_greatest_unique unfolding eq_is_equal .
   566   using weak_greatest_unique unfolding eq_is_equal .
   651 
   567 
   652 
   568 
   653 subsection \<open>Bounded Orders\<close>
   569 subsection \<open>Bounded Orders\<close>
   654 
   570 
   708 
   624 
   709 
   625 
   710 subsection \<open>Total Orders\<close>
   626 subsection \<open>Total Orders\<close>
   711 
   627 
   712 locale weak_total_order = weak_partial_order +
   628 locale weak_total_order = weak_partial_order +
   713   assumes total: "\<lbrakk> x \<in> carrier L; y \<in> carrier L \<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   629   assumes total: "\<lbrakk>x \<in> carrier L; y \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   714 
   630 
   715 text \<open>Introduction rule: the usual definition of total order\<close>
   631 text \<open>Introduction rule: the usual definition of total order\<close>
   716 
   632 
   717 lemma (in weak_partial_order) weak_total_orderI:
   633 lemma (in weak_partial_order) weak_total_orderI:
   718   assumes total: "!!x y. \<lbrakk> x \<in> carrier L; y \<in> carrier L \<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   634   assumes total: "!!x y. \<lbrakk>x \<in> carrier L; y \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   719   shows "weak_total_order L"
   635   shows "weak_total_order L"
   720   by unfold_locales (rule total)
   636   by unfold_locales (rule total)
   721 
   637 
   722 
   638 
   723 subsection \<open>Total orders where \<open>eq\<close> is the Equality\<close>
   639 subsection \<open>Total orders where \<open>eq\<close> is the Equality\<close>
   724 
   640 
   725 locale total_order = partial_order +
   641 locale total_order = partial_order +
   726   assumes total_order_total: "\<lbrakk> x \<in> carrier L; y \<in> carrier L \<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   642   assumes total_order_total: "\<lbrakk>x \<in> carrier L; y \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   727 
   643 
   728 sublocale total_order < weak?: weak_total_order
   644 sublocale total_order < weak?: weak_total_order
   729   by unfold_locales (rule total_order_total)
   645   by unfold_locales (rule total_order_total)
   730 
   646 
   731 text \<open>Introduction rule: the usual definition of total order\<close>
   647 text \<open>Introduction rule: the usual definition of total order\<close>
   732 
   648 
   733 lemma (in partial_order) total_orderI:
   649 lemma (in partial_order) total_orderI:
   734   assumes total: "!!x y. \<lbrakk> x \<in> carrier L; y \<in> carrier L \<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   650   assumes total: "!!x y. \<lbrakk>x \<in> carrier L; y \<in> carrier L\<rbrakk> \<Longrightarrow> x \<sqsubseteq> y \<or> y \<sqsubseteq> x"
   735   shows "total_order L"
   651   shows "total_order L"
   736   by unfold_locales (rule total)
   652   by unfold_locales (rule total)
   737 
   653 
   738 end
   654 end