Theory Complete_Non_Orders.Continuity
theory Continuity
  imports Complete_Relations
begin
subsection ‹Scott Continuity, $\omega$-Continuity›
text ‹In this Section, we formalize Scott continuity and $\omega$-continuity.
We then prove that a Scott continuous map is $\omega$-continuous and that an $\omega$-continuous 
map is ``nearly'' monotone.›
definition continuous (‹_-continuous› [1000]1000) where
  "𝒞-continuous A (⊑) B (⊴) f ≡
   f ` A ⊆ B ∧
   (∀X s. 𝒞 X (⊑) ⟶ X ≠ {} ⟶ X ⊆ A ⟶ extreme_bound A (⊑) X s ⟶ extreme_bound B (⊴) (f`X) (f s))"
  for leA (infix ‹⊑› 50) and leB (infix ‹⊴› 50)
lemmas continuousI[intro?] =
  continuous_def[unfolded atomize_eq, THEN iffD2, unfolded conj_imp_eq_imp_imp, rule_format]
lemmas continuousE =
  continuous_def[unfolded atomize_eq, THEN iffD1, elim_format, unfolded conj_imp_eq_imp_imp, rule_format]
lemma
  fixes prec_eq (infix ‹≼› 50) and less_eq (infix ‹⊑› 50)
  assumes "𝒞-continuous I (≼) A (⊑) f"
  shows continuous_carrierD[dest]: "f ` I ⊆ A"
    and continuousD: "𝒞 X (≼) ⟹ X ≠ {} ⟹ X ⊆ I ⟹ extreme_bound I (≼) X b ⟹ extreme_bound A (⊑) (f ` X) (f b)"
  using assms by (auto elim!: continuousE)
lemma continuous_comp:
  fixes leA (infix ‹⊑⇩A› 50) and leB (infix ‹⊑⇩B› 50) and leC (infix ‹⊑⇩C› 50)
  assumes KfL: "∀X ⊆ A. 𝒦 X (⊑⇩A) ⟶ ℒ (f ` X) (⊑⇩B)"
  assumes f: "𝒦-continuous A (⊑⇩A) B (⊑⇩B) f" and g: "ℒ-continuous B (⊑⇩B) C (⊑⇩C) g"
  shows "𝒦-continuous A (⊑⇩A) C (⊑⇩C) (g ∘ f)"
  apply (intro continuousI)
proof -
  from f g have fAB: "f ` A ⊆ B" and gBC: "g ` B ⊆ C" by auto
  then show "(g ∘ f) ` A ⊆ C" by auto
  fix X s
  assume XA: "X ⊆ A" and X0: "X ≠ {}" and XK: "𝒦 X (⊑⇩A)" and Xs: "extreme_bound A (⊑⇩A) X s"
  from fAB XA have fXB: "f ` X ⊆ B" by auto
  from X0 have fX0: "f ` X ≠ {}" by auto
  from KfL XA XK have fXL: "ℒ (f ` X) (⊑⇩B)" by auto
  from continuousD[OF f XK X0 XA Xs]
  have "extreme_bound B (⊑⇩B) (f ` X) (f s)".
  from continuousD[OF g fXL fX0 fXB this]
  show "extreme_bound C (⊑⇩C) ((g∘f)`X) ((g∘f) s)" by (auto simp: image_comp)
qed
lemma continuous_comp_top:
  fixes leA (infix ‹⊑⇩A› 50) and leB (infix ‹⊑⇩B› 50) and leC (infix ‹⊑⇩C› 50)
  assumes f: "𝒦-continuous A (⊑⇩A) B (⊑⇩B) f" and g: "⊤-continuous B (⊑⇩B) C (⊑⇩C) g"
  shows "𝒦-continuous A (⊑⇩A) C (⊑⇩C) (g ∘ f)"
  by (rule continuous_comp[OF _ f g], auto)
lemma id_continuous:
  fixes leA (infix ‹⊑⇩A› 50)
  shows "𝒦-continuous A (⊑⇩A) A (⊑⇩A) (λx. x)"
  by (auto intro: continuousI)
lemma cst_continuous:
  fixes leA (infix ‹⊑⇩A› 50) and leB (infix ‹⊑⇩B› 50)
  assumes "b ∈ B" and bb: "b ⊑⇩B b"
  shows "𝒦-continuous A (⊑⇩A) B (⊑⇩B) (λx. b)"
  apply (intro continuousI)
  using assms(1) apply auto
  using assms extreme_bound_singleton_refl[of B "(⊑⇩B)" b] by blast
lemma continuous_cmono:
  assumes CD: "𝒞 ≤ 𝒟" shows "𝒟-continuous ≤ 𝒞-continuous"
proof (safe intro!: le_funI le_boolI)
  fix I A f and prec_eq (infix ‹≼› 50) and less_eq (infix ‹⊑› 50)
  assume cont: "𝒟-continuous I (≼) A (⊑) f"
  show "𝒞-continuous I (≼) A (⊑) f"
  proof (rule continuousI)
    from cont show "f ` I ⊆ A" by auto
    fix X s assume X: "𝒞 X (≼)" and X0: "X ≠ {}" and XI: "X ⊆ I" and Xs: "extreme_bound I (≼) X s"
    from CD X have "𝒟 X (≼)" by auto
    from continuousD[OF cont, OF this X0 XI Xs]
    show "extreme_bound A (⊑) (f ` X) (f s)".
  qed
qed
context
  fixes prec_eq :: "'i ⇒ 'i ⇒ bool" (infix ‹≼› 50) and less_eq :: "'a ⇒ 'a ⇒ bool" (infix ‹⊑› 50)
begin
lemma continuous_subclass:
  assumes CD: "∀X⊆I. X ≠ {} ⟶ 𝒞 X (≼) ⟶ 𝒟 X (≼)" and cont: "𝒟-continuous I (≼) A (⊑) f"
  shows "𝒞-continuous I (≼) A (⊑) f"
  using cont by (auto simp: continuous_def CD[rule_format])
lemma chain_continuous_imp_well_continuous:
  assumes cont: "connex-continuous I (≼) A (⊑) f"
  shows "well_related_set-continuous I (≼) A (⊑) f"
  by (rule continuous_subclass[OF _ cont], auto simp: well_related_set.connex)
lemma well_continuous_imp_omega_continous:
  assumes cont: "well_related_set-continuous I (≼) A (⊑) f"
  shows "omega_chain-continuous I (≼) A (⊑) f"
  by (rule continuous_subclass[OF _ cont], auto simp: omega_chain_imp_well_related)
end
abbreviation "scott_continuous I (≼) ≡ directed_set-continuous I (≼)"
  for prec_eq (infix ‹≼› 50)
lemma scott_continuous_imp_well_continuous:
  fixes prec_eq :: "'i ⇒ 'i ⇒ bool" (infix ‹≼› 50) and less_eq :: "'a ⇒ 'a ⇒ bool" (infix ‹⊑› 50)
  assumes cont: "scott_continuous I (≼) A (⊑) f"
  shows "well_related_set-continuous I (≼) A (⊑) f"
  by (rule continuous_subclass[OF _ cont], auto simp: well_related_set.directed_set)
lemmas scott_continuous_imp_omega_continuous =
  scott_continuous_imp_well_continuous[THEN well_continuous_imp_omega_continous]
subsubsection ‹Continuity implies monotonicity›
lemma continuous_imp_mono_refl:
  fixes prec_eq (infix ‹≼› 50) and less_eq (infix ‹⊑› 50)
  assumes cont: "𝒞-continuous I (≼) A (⊑) f" and xyC: "𝒞 {x,y} (≼)"
    and xy: "x ≼ y" and yy: "y ≼ y"
    and x: "x ∈ I" and y: "y ∈ I"
  shows "f x ⊑ f y"
proof-
  have fboy: "extreme_bound A (⊑) (f ` {x,y}) (f y)"
  proof (intro continuousD[OF cont] xyC)
    from x y show CI: "{x,y} ⊆ I" by auto
    show Cy: "extreme_bound I (≼) {x,y} y" using xy yy x y by auto
  qed auto
  then show ?thesis by auto
qed
lemma omega_continuous_imp_mono_refl:
  fixes prec_eq (infix ‹≼› 50) and less_eq (infix ‹⊑› 50)
  assumes cont: "omega_chain-continuous I (≼) A (⊑) f"
    and xx: "x ≼ x" and xy: "x ≼ y" and yy: "y ≼ y"
    and x: "x ∈ I" and y: "y ∈ I"
  shows "f x ⊑ f y"
  apply (rule continuous_imp_mono_refl[OF cont, OF pair_omega_chain])
  using assms by auto
context reflexive begin
lemma continuous_imp_monotone_on:
  fixes leB (infix ‹⊴› 50)
  assumes cont: "𝒞-continuous A (⊑) B (⊴) f"
    and II: "∀i ∈ A. ∀ j ∈ A. i ⊑ j ⟶ 𝒞 {i,j} (⊑)"
  shows "monotone_on A (⊑) (⊴) f"
proof-
  show ?thesis
    apply (intro monotone_onI continuous_imp_mono_refl[OF cont])
    using II by auto
qed
lemma well_complete_imp_monotone_on:
  fixes leB (infix ‹⊴› 50)
  assumes cont: "well_related_set-continuous A (⊑) B (⊴) f"
  shows "monotone_on A (⊑) (⊴) f"                       
  by (auto intro!: continuous_imp_monotone_on cont pair_well_related)
end
end