Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
(** * The fan theorem *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Truncations.Core.Require Import Spaces.Nat.Core.Require Import Misc.UStructures BarInduction.Require Import Spaces.NatSeq.Core Spaces.NatSeq.UStructure.Require Import Spaces.List.Core Spaces.List.Theory.LocalOpen Scope nat_scope.LocalOpen Scope type_scope.LocalOpen Scope list_scope.DefinitionDecidableFanTheorem (A : Type) :=
forall (B : list A -> Type)
(dec : foralll : list A, Decidable (B l))
(bar : IsBar B),
IsUniformBar B.DefinitionMonotoneFanTheorem (A : Type) :=
forall (B : list A -> Type)
(mon : IsMonotone B)
(bar : IsBar B),
IsUniformBar B.DefinitionFanTheorem (A : Type) :=
forall (B : list A -> Type)
(bar : IsBar B),
IsUniformBar B.
FanTheorem Empty
FanTheorem Empty
B: list Empty -> Type bB: IsBar B
IsUniformBar B
B: list Empty -> Type bB: IsBar B
foralls : nat -> Empty,
{n : nat & (n <= 0) * B (list_restrict s n)}
B: list Empty -> Type bB: IsBar B s: nat -> Empty
{n : nat & (n <= 0) * B (list_restrict s n)}
contradiction (s 0).Defined.
A: Type Contr0: Contr A
FanTheorem A
A: Type Contr0: Contr A
FanTheorem A
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B
IsUniformBar B
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A
IsUniformBar B
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A
foralls : nat -> A,
{n : nat & (n <= (bB c).1) * B (list_restrict s n)}
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A
{n : nat & (n <= (bB c).1) * B (list_restrict s n)}
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A
foralln : nat, list_restrict s n = list_restrict c n
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A p: foralln : nat,
list_restrict s n = list_restrict c n
{n : nat & (n <= (bB c).1) * B (list_restrict s n)}
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A
foralln : nat, list_restrict s n = list_restrict c n
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A n: nat
list_restrict s n = list_restrict c n
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A n: nat
length (list_restrict s n) =
length (list_restrict c n)
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A n: nat
forall (n0 : nat)
(H : n0 < length (list_restrict s n)),
nth' (list_restrict s n) n0 H =
nth' (list_restrict c n) n0 (transport (lt n0) ?p H)
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A n: nat
forall (n0 : nat)
(H : n0 < length (list_restrict s n)),
nth' (list_restrict s n) n0 H =
nth' (list_restrict c n) n0
(transport (lt n0)
(internal_paths_rew_r
(funn1 : nat =>
n1 = length (list_restrict c n))
(internal_paths_rew_r
(funn1 : nat => n = n1) 1
(length_list_restrict c n))
(length_list_restrict s n)) H)
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A n, m: nat h: m < length (list_restrict s n)
nth' (list_restrict s n) m h =
nth' (list_restrict c n) m
(transport (lt m)
(internal_paths_rew_r
(funn0 : nat =>
n0 = length (list_restrict c n))
(internal_paths_rew_r
(funn0 : nat => n = n0) 1
(length_list_restrict c n))
(length_list_restrict s n)) h)
byapply path_contr.
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A p: foralln : nat,
list_restrict s n = list_restrict c n
{n : nat & (n <= (bB c).1) * B (list_restrict s n)}
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A p: foralln : nat,
list_restrict s n = list_restrict c n
(bB c).1 <= (bB c).1
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A p: foralln : nat,
list_restrict s n = list_restrict c n
B (list_restrict s (bB c).1)
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A p: foralln : nat,
list_restrict s n = list_restrict c n
(bB c).1 <= (bB c).1
reflexivity.
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A p: foralln : nat,
list_restrict s n = list_restrict c n
B (list_restrict s (bB c).1)
A: Type Contr0: Contr A B: list A -> Type bB: IsBar B c:= fun_ : nat => center A: nat -> A s: nat -> A p: foralln : nat,
list_restrict s n = list_restrict c n
B (list_restrict c (bB c).1)
exact (bB c).2.Defined.(** The family we use when applying the fan theorem in our proof that continuity implies uniform continuity. *)Definitionuc_theorem_family {A : Type} (p : (nat -> A) -> Bool)
: list A -> Type
:= funl =>
forall (uv : nat -> A) (h : list_restrict u (length l) = l)
(h' : list_restrict v (length l) = l), p u = p v.
A: Type p: (nat -> A) -> Bool cont: IsContinuous p
IsBar (uc_theorem_family p)
A: Type p: (nat -> A) -> Bool cont: IsContinuous p
IsBar (uc_theorem_family p)
A: Type p: (nat -> A) -> Bool cont: IsContinuous p s: nat -> A
{n : nat & uc_theorem_family p (list_restrict s n)}
A: Type p: (nat -> A) -> Bool s: nat -> A n: nat H: forallv : nat -> A, s =[n] v -> p s =[0] p v
{n : nat & uc_theorem_family p (list_restrict s n)}
A: Type p: (nat -> A) -> Bool s: nat -> A n: nat H: forallv : nat -> A, s =[n] v -> p s =[0] p v
uc_theorem_family p (list_restrict s n)
A: Type p: (nat -> A) -> Bool s: nat -> A n: nat H: forallv : nat -> A, s =[n] v -> p s =[0] p v u, v: nat -> A h: list_restrict u (length (list_restrict s n)) =
list_restrict s n t: list_restrict v (length (list_restrict s n)) =
list_restrict s n
p u = p v
A: Type p: (nat -> A) -> Bool s: nat -> A n: nat H: forallv : nat -> A, s =[n] v -> p s =[0] p v u, v: nat -> A h: list_restrict s n =
list_restrict u (length (list_restrict s n)) t: list_restrict s n =
list_restrict v (length (list_restrict s n))
p u = p v
A: Type p: (nat -> A) -> Bool s: nat -> A n: nat H: forallv : nat -> A, s =[n] v -> p s =[0] p v u, v: nat -> A h: list_restrict s n = list_restrict u n t: list_restrict s n = list_restrict v n
p u = p v
A: Type p: (nat -> A) -> Bool s: nat -> A n: nat H: forallv : nat -> A, s =[n] v -> p s =[0] p v u, v: nat -> A h: s =[n] u t: s =[n] v
p u = p v
exact ((H _ h)^ @ (H _ t)).Defined.(** The fan theorem implies that every continuous function is uniformly continuous. The current proof uses the full fan theorem. Less powerful versions might be enough. *)
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p
uniformly_continuous p
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p
uniformly_continuous p
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p fan': IsUniformBar (uc_theorem_family p)
uniformly_continuous p
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n: nat ub: foralls : nat -> A,
{n0 : nat &
(n0 <= n) *
uc_theorem_family p (list_restrict s n0)}
uniformly_continuous p
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n: nat ub: foralls : nat -> A,
{n0 : nat &
(n0 <= n) *
uc_theorem_family p (list_restrict s n0)} m: nat
{n : nat &
foralluv : nat -> A, u =[n] v -> p u =[m] p v}
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n: nat ub: foralls : nat -> A,
{n0 : nat &
(n0 <= n) *
uc_theorem_family p (list_restrict s n0)} m: nat
foralluv : nat -> A, u =[n] v -> p u =[m] p v
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n: nat ub: foralls : nat -> A,
{n0 : nat &
(n0 <= n) *
uc_theorem_family p (list_restrict s n0)} m: nat u, v: nat -> A h: u =[n] v
p u =[m] p v
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n, m: nat u, v: nat -> A h: u =[n] v k: nat bound: k <= n uctf: uc_theorem_family p (list_restrict v k)
p u =[m] p v
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n, m: nat u, v: nat -> A h: u =[n] v k: nat bound: k <= n uctf: uc_theorem_family p (list_restrict v k)
list_restrict u (length (list_restrict v k)) =
list_restrict v k
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n, m: nat u, v: nat -> A h: u =[n] v k: nat bound: k <= n uctf: uc_theorem_family p (list_restrict v k)
list_restrict v (length (list_restrict v k)) =
list_restrict v k
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n, m: nat u, v: nat -> A h: u =[n] v k: nat bound: k <= n uctf: uc_theorem_family p (list_restrict v k)
list_restrict u (length (list_restrict v k)) =
list_restrict v k
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n, m: nat u, v: nat -> A h: u =[n] v k: nat bound: k <= n uctf: uc_theorem_family p (list_restrict v k)
list_restrict u k = list_restrict v k
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n, m: nat u, v: nat -> A h: u =[n] v k: nat bound: k <= n uctf: uc_theorem_family p (list_restrict v k)
u =[k] v
apply (us_rel_leq bound h).
A: Type fan: FanTheorem A p: (nat -> A) -> Bool c: IsContinuous p n, m: nat u, v: nat -> A h: u =[n] v k: nat bound: k <= n uctf: uc_theorem_family p (list_restrict v k)
list_restrict v (length (list_restrict v k)) =
list_restrict v k