Upper bound property and intermediate values theorem

Require Import Stdlib.Arith.Arith.
Require Import Init.Nat.

Require Import Utf8 Core Misc.

Class excl_midd := { em_prop : ∀ P, P + notT P }.

Definition forall_or_exists_not {T} (P : T → Prop) :=
  {∀ x, P x} + {∃ x, ¬ P x}.

Theorem rl_forall_or_exists_not {em : excl_midd} {T} :
  ∀ (P : T → Prop), forall_or_exists_not P.

Theorem rl_not_forall_exists {em : excl_midd} {T} :
  ∀ (P : T → Prop), ¬ (∀ x, ¬ P x) → ∃ x, P x.

Section a.

Context {T : Type}.
Context {ro : ring_like_op T}.
Context {rp : ring_like_prop T}.
Context {em : excl_midd}.


Definition is_bound (le : T → T → Prop) (P : T → Type) c :=
  rl_forall_or_exists_not (λ x : T, P x → le x c).

Arguments is_bound le P c%_L.

Definition is_upper_bound := is_bound (λ a b, (a ≤ b)%L).
Definition is_lower_bound := is_bound (λ a b, (b ≤ a)%L).

Definition is_extremum le (Q : T → Type) c :=
  bool_of_sumbool (is_bound le Q c) = true ∧
  ∀ c', if is_bound le Q c' then le c c' else True.

Definition is_supremum := is_extremum (λ a b, (a ≤ b)%L).
Definition is_infimum := is_extremum (λ a b, (b ≤ a)%L).

Arguments is_extremum le Q c%_L.
Arguments is_supremum Q c%_L.
Arguments is_infimum Q c%_L.

Fixpoint bisection (P : T → bool) lb ub n :=
  match n with
  | 0 ⇒ lb
  | S n' ⇒
      let x := ((lb + ub) / 2)%L in
      if P x then bisection P x ub n'
      else bisection P lb x n'
  end.

Fixpoint AnBn (P : T → Type) (an bn : T) n :=
  match n with
  | 0 ⇒ (an, bn)
  | S n' ⇒
      let a := ((an + bn) / 2)%L in
      if is_upper_bound P a then AnBn P an a n'
      else AnBn P a bn n'
  end.

Theorem rngl_middle_in_middle :
  rngl_has_opp T = true →
  rngl_has_inv T = true →
  rngl_is_totally_ordered T = true →
  ∀ a b, (a ≤ b → a ≤ (a + b) / 2 ≤ b)%L.
Theorem AnBn_interval :
  rngl_has_opp T = true →
  rngl_has_inv T = true →
  rngl_is_totally_ordered T = true →
  ∀ a b, (a ≤ b)%L →
  ∀ P n an bn,
  AnBn P a b n = (an, bn)
  → (a ≤ an ≤ bn ≤ b)%L ∧
    bn = (an + (b - a) / 2 ^ n)%L.
Theorem AnBn_le :
  rngl_has_opp T = true →
  rngl_has_inv T = true →
  rngl_is_totally_ordered T = true →
  ∀ a b, (a ≤ b)%L →
  ∀ P p q ap bp aq bq,
  p ≤ q
  → AnBn P a b p = (ap, bp)
  → AnBn P a b q = (aq, bq)
  → (ap ≤ aq ∧ bq ≤ bp)%L.
Theorem rngl_abs_AnBn_sub_AnBn_le :
  rngl_has_opp T = true →
  rngl_has_inv T = true →
  rngl_is_totally_ordered T = true →
  ∀ a b, (a ≤ b)%L →
  ∀ P p q, p ≤ q →
  ∀ ap bp aq bq,
  AnBn P a b p = (ap, bp)
  → AnBn P a b q = (aq, bq)
  → (rngl_abs (ap - aq) ≤ (b - a) / 2 ^ p)%L ∧
    (rngl_abs (bp - bq) ≤ (b - a) / 2 ^ p)%L.
Context {Hop : rngl_has_opp T = true}.
Context {Hto : rngl_is_totally_ordered T = true}.
Let Hor := rngl_is_totally_ordered_is_ordered Hto.

Definition rngl_distance :=
  {| d_dist := rngl_dist; d_prop := rngl_dist_is_dist Hop Hto |}.

Theorem An_Bn_are_Cauchy_sequences :
  rngl_has_inv T = true →
  rngl_is_archimedean T = true →
  ∀ P a b, (a ≤ b)%L →
  is_Cauchy_sequence rngl_dist (λ n : nat, fst (AnBn P a b n)) ∧
  is_Cauchy_sequence rngl_dist (λ n : nat, snd (AnBn P a b n)).
Theorem rngl_abs_An_Bn_le :
  rngl_has_inv T = true →
  ∀ a b, (a ≤ b)%L →
  ∀ P n an bn,
  AnBn P a b n = (an, bn)
  → (rngl_abs (an - bn) ≤ (b - a) / 2 ^ n)%L.

Theorem limit_opp :
  ∀ u lim,
  is_limit_when_seq_tends_to_inf rngl_dist u lim
  → is_limit_when_seq_tends_to_inf rngl_dist (λ n, (- u n)%L) (- lim)%L.

Theorem gen_limit_ext_in :
  ∀ {A} (da : A → A → T) u v lim,
  (∀ n, u n = v n)
  → is_limit_when_seq_tends_to_inf da u lim
  → is_limit_when_seq_tends_to_inf da v lim.

Theorem limit_between_An_and_Bn :
  rngl_has_inv T = true →
  ∀ a b lim P,
  (a ≤ b)%L
  → is_limit_when_seq_tends_to_inf rngl_dist (λ n, fst (AnBn P a b n)) lim
  → is_limit_when_seq_tends_to_inf rngl_dist (λ n, snd (AnBn P a b n)) lim
  → ∀ n an bn, AnBn P a b n = (an, bn) → (an ≤ lim ≤ bn)%L.
Theorem AnBn_exists_P :
  ∀ (P : _ → Prop) a b x,
  (∀ x : T, P x → (x ≤ b)%L)
  → (a ≤ x)%L
  → P x
  → ∀ n an bn,
  AnBn P a b n = (an, bn)
  → ∃ y, (an ≤ y ≤ bn)%L ∧ P y.
Theorem in_AnBn :
  ∀ (P : _ → Prop) a b,
  P a
  → (∀ x, P x → (x ≤ b)%L)
  → ∀ n an bn,
  AnBn P a b n = (an, bn)
  → ∃ y : T, (an ≤ y ≤ bn)%L ∧ P y.

Theorem AnBn_not_P :
  ∀ (P : _ → Prop) a b n an bn,
  (∀ x : T, P x → (x ≤ b)%L)
  → AnBn P a b n = (an, bn)
  → ∀ y, (bn < y → ¬ P y)%L.
Theorem after_AnBn :
  ∀ (P : _ → Prop) a b,
  P a
  → (∀ x : T, P x → (x ≤ b)%L)
  → ∀ n an bn,
  AnBn P a b n = (an, bn)
  → ∀ y, (bn < y)%L
  → ¬ P y.

Theorem intermediate_value_prop_1 :
  rngl_has_inv T = true →
  ∀ f,
  is_continuous rngl_le rngl_dist rngl_dist f →
  ∀ a b c u,
  (a < b)%L
  → (f a < u)%L
  → (∀ x, (a ≤ x ≤ b)%L ∧ (f x < u)%L → (x ≤ c)%L)
  → c ≠ a.

Theorem intermediate_value_prop_2 :
  rngl_has_inv T = true →
  ∀ f, is_continuous rngl_le rngl_dist rngl_dist f →
  ∀ a b c u,
  (a < b)%L
  → (u < f b)%L
  → (∀ c',
       if is_upper_bound (λ x : T, (a ≤ x ≤ b)%L ∧ (f x < u)%L) c' then
         (c ≤ c')%L
       else True)
  → c ≠ b.

Theorem rngl_not_le_le : ∀ a b, ¬ (a ≤ b)%L → (b ≤ a)%L.

Theorem exists_supremum :
  rngl_has_inv T = true →
  rngl_is_archimedean T = true →
  is_complete T rngl_dist →
  ∀ (P : T → Prop) a b,
  P a
  → (∀ x, P x → (x ≤ b)%L)
  → ∃ c, is_supremum P c ∧ (c ≤ b)%L ∧
    is_limit_when_seq_tends_to_inf rngl_dist (λ n, fst (AnBn P a b n)) c ∧
    is_limit_when_seq_tends_to_inf rngl_dist (λ n, snd (AnBn P a b n)) c.
Theorem intermediate_value_le :
  rngl_has_inv T = true →
  rngl_is_archimedean T = true →
  is_complete T rngl_dist →
  ∀ f, is_continuous rngl_le rngl_dist rngl_dist f
  → ∀ a b u, (a ≤ b)%L
  → (f a ≤ u ≤ f b)%L
  → ∃ c : T, (a ≤ c ≤ b)%L ∧ f c = u.
Theorem supremum_opp :
  ∀ (P Q : _ → Prop) c,
  (∀ x, P x ↔ Q (- x)%L)
  → is_supremum P c
  → is_infimum Q (- c).


Theorem upper_bound_property :
  rngl_has_inv T = true →
  rngl_is_archimedean T = true →
  is_complete T rngl_dist →
  ∀ (P : T → Prop) a b,
  P a
  → (∀ x, P x → (x ≤ b)%L)
  → ∃ c, is_supremum P c ∧ (c ≤ b)%L.

Theorem lower_bound_property :
  rngl_has_inv T = true →
  rngl_is_archimedean T = true →
  is_complete T rngl_dist →
  ∀ (P : T → Prop) a b,
  P b
  → (∀ x, P x → (a ≤ x)%L)
  → ∃ c, is_infimum P c ∧ (a ≤ c)%L.

Theorem intermediate_value :
  rngl_has_inv T = true →
  rngl_is_archimedean T = true →
  is_complete T rngl_dist →
  ∀ f, is_continuous rngl_le rngl_dist rngl_dist f
  → ∀ a b u, (a ≤ b)%L
  → (rngl_min (f a) (f b) ≤ u ≤ rngl_max (f a) (f b))%L
  → ∃ c, (a ≤ c ≤ b)%L ∧ f c = u.

End a.

Arguments is_infimum {T ro em} Q c%_L.
Arguments is_lower_bound {T ro em} P c%_L.
Arguments upper_bound_property {T ro rp} _ Hop Hto Hiv Har Hco P (a b)%_L.

This page has been generated by coqdoc