Theory Linear_Orders
subsection ‹Linear Orders›
theory Linear_Orders
  imports
    Binary_Relations_Connected
    Partial_Orders
begin
definition "linear_order_on ≡ partial_order_on ⊓ connected_on"
lemma linear_order_onI [intro]:
  assumes "partial_order_on P R"
  and "connected_on P R"
  shows "linear_order_on P R"
  using assms unfolding linear_order_on_def by auto
lemma linear_order_onE [elim]:
  assumes "linear_order_on P R"
  obtains "partial_order_on P R" "connected_on P R"
  using assms unfolding linear_order_on_def by auto
consts linear_order :: "'a ⇒ bool"
overloading
  linear_order ≡ "linear_order :: ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "(linear_order :: ('a ⇒ 'a ⇒ bool) ⇒ bool) ≡ linear_order_on (⊤ :: 'a ⇒ bool)"
end
lemma linear_order_eq_linear_order_on:
  "(linear_order :: ('a ⇒ 'a ⇒ bool) ⇒ bool) = linear_order_on (⊤ :: 'a ⇒ bool)"
  unfolding linear_order_def ..
lemma linear_order_eq_linear_order_on_uhint [uhint]:
  assumes "P ≡ ⊤ :: 'a ⇒ bool"
  shows "(linear_order :: ('a ⇒ 'a ⇒ bool) ⇒ bool) ≡ linear_order_on P"
  using assms by (simp add: linear_order_eq_linear_order_on)
context
  fixes R :: "'a ⇒ 'a ⇒ bool"
begin
lemma linear_orderI [intro]:
  assumes "partial_order R"
  and "connected R"
  shows "linear_order R"
  using assms by (urule linear_order_onI)
lemma linear_orderE [elim]:
  assumes "linear_order R"
  obtains "partial_order R" "connected R"
  using assms by (urule (e) linear_order_onE)
lemma linear_order_on_if_linear_order:
  fixes P :: "'a ⇒ bool"
  assumes "linear_order R"
  shows "linear_order_on P R"
  using assms by (elim linear_orderE)
  (intro linear_order_onI partial_order_on_if_partial_order connected_on_if_connected)
end
end