Top source

Module mathcomp.experimental_reals.discrete


From Corelib Require Setoid.
From HB Require Import structures.
From mathcomp Require Import boot order algebra.
From mathcomp.classical Require Import boolp.
From mathcomp Require Import xfinmap reals.

Unset SsrOldRewriteGoalsOrder.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.

Import GRing.Theory Num.Theory.

Local Open Scope ring_scope.
Local Open Scope real_scope.

Section ProofIrrelevantChoice.

Context { : choiceType}.

Lemma
existsTP
Source code
( : T -> Prop) : { : T | P x } + (forall , ~ P x).
Proof.
case: (boolP `[<exists : T, P x>]) => [/exists_asboolP | /asboolPn] h.
  by case/cid: h => w Pw; left; exists w; apply/asboolP.
by right=> x Px; apply/h; exists x.
Qed.

End ProofIrrelevantChoice.

Section PredSubtype.
Section Def.
Variable : Type.
Variable : pred T.

Record
pred_sub
Source code
: Type :=
  PSubSub { :> T; : rsval \in E }.

.
instance
Source code
Definition
Source code
for rsval].
End Def.

.
instance
Source code
Definition
Source code
() (E : pred T) :=
  [Equality of pred_sub E by <:].

.
instance
Source code
Definition
Source code
(
choiceType
Source code
) (E : pred T) :=
  [Choice of pred_sub E by <:].

.
instance
Source code
Definition
Source code
(
countType
Source code
) (E : pred T) :=
  [Countable of pred_sub E by <:].
End PredSubtype.

Notation
"[ 'psub' E ]"
Source code
:= (@pred_sub _ E)
  (format "[ 'psub' E ]").

Section PIncl.
Variables ( : Type) ( : pred T) ( : {subset E <= F}).

Definition
pincl

mkdistr : forall {R : realType} {T : choiceType} [mu : T -> R], isdistr mu -> distr R T mkdistr is not universe polymorphic Arguments mkdistr {R T} [mu]%_function_scope isd mkdistr is transparent Expands to: Constant mathcomp.experimental_reals.distr.mkdistr Declared in library mathcomp.experimental_reals.distr, line 164, characters 11-18


Source code
( : [psub E]) : [psub F] :=
  PSubSub (le (valP x)).
End PIncl.

Section Countable.
Variable ( : Type) ( : pred T).

Variant
countable
Source code
: Type :=
  
Countable
Source code

    ( : [psub E] -> nat)
    (
runpickle
Source code
: nat -> option [psub E])
    of pcancel rpickle runpickle.

Definition
rpickle

ispredistr : forall {R : realType} {T : choiceType}, (T -> R) -> Prop ispredistr is not universe polymorphic Arguments ispredistr {R T} mu%_function_scope ispredistr is transparent Expands to: Constant mathcomp.experimental_reals.distr.ispredistr Declared in library mathcomp.experimental_reals.distr, line 169, characters 11-21


Source code
( : countable) :=
  let: Countable p _ _ := c in p.

Definition
runpickle

mnull : forall {R : realType} {T : choiceType}, T -> R mnull is not universe polymorphic Arguments mnull {R T} x mnull is transparent Expands to: Constant mathcomp.experimental_reals.distr.mnull Declared in library mathcomp.experimental_reals.distr, line 192, characters 11-16


Source code
( : countable) :=
  let: Countable _ p _ := c in p.

Lemma
rpickleK
Source code
: pcancel (rpickle c) (runpickle c).
Proof.
by case: c. Qed.
End Countable.

Section CountableTheory.
Lemma
countable_countable
Source code
( : countType) ( : pred T) : countable E.
Proof.
by exists choice.pickle choice.unpickle; apply/choice.pickleK. Qed.

Section CanCountable.
Variables ( : Type) ( : countType) ( : pred T).
Variables ( : [psub E] -> U) ( : U -> [psub E]).

Lemma
can_countable
Source code
: cancel f g -> countable E.
Proof.
pose p := choice.pickle \o f; pose u := omap g (choice.unpickle n).
move=> can_fg; apply (@Countable _ E p u) => x.
by rewrite {}/u {}/p /= choice.pickleK /= can_fg.
Qed.
End CanCountable.

Section CountType.
Variables ( : eqType) ( : pred T) ( : countable E).

Definition
countable_countMixin

dnull : forall {R : realType} {T : choiceType}, distr R T dnull is not universe polymorphic Arguments dnull {R T} dnull is transparent Expands to: Constant mathcomp.experimental_reals.distr.dnull Declared in library mathcomp.experimental_reals.distr, line 197, characters 11-16


Source code
:= Countable.copy [psub E]
  (pcan_type (rpickleK c)).
Definition
countable_choiceMixin

mkdistrd : forall {R : realType} {T : choiceType}, (T -> R) -> {distr T / R} mkdistrd is not universe polymorphic Arguments mkdistrd {R T} mu%_function_scope mkdistrd is transparent Expands to: Constant mathcomp.experimental_reals.distr.mkdistrd Declared in library mathcomp.experimental_reals.distr, line 202, characters 11-19


Source code
:= Choice.copy [psub E]
  (pcan_type (rpickleK c)).
End CountType.
End CountableTheory.

Section Finite.
Variables ( : eqType).

CoInductive ( : pred T) : Type :=
| of uniq s & {subset E <= s}.
End Finite.

Section FiniteTheory.
Context { : choiceType}.


Lemma ( : pred T) : (exists : seq T, {subset E <= s}) -> finite E.
Proof.
case/cid=> s sEs; exists (undup s); first by rewrite undup_uniq.
by move=> x; rewrite mem_undup; exact: sEs.
Qed.


Lemma
finiteNP
Source code
( : pred T): (forall : seq T, ~ {subset E <= s}) ->
  forall , exists : seq T, [/\ size s = n, uniq s & {subset s <= E}].
Proof.
move=> finN; elim=> [|n [s] [<- uq_s sE]]; first by exists [::].
have [x sxN xE]: exists2 , x \notin s & x \in E.
  apply: contra_notP (finN (filter (mem E) s)) => /forall2NP finE x Ex.
  move/or_asboolP: (finE x).
  by rewrite !asbool_neg !asboolb negbK Ex mem_filter orbF [(mem E) x]Ex.
exists (x :: s) => /=; rewrite sxN; split=> // y.
by rewrite in_cons => /orP[/eqP->//|/sE].
Qed.

End FiniteTheory.

Section FiniteCountable.
Variables ( : eqType) ( : pred T).

Lemma
finite_countable
Source code
: finite E -> countable E.
Proof.
case=> s uqs Es; pose t := pmap (fun => (insub x : option [psub E])) s.
pose f := index x t; pose g := nth None [seq Some x | <- t] i.
apply (@Countable _ E f g) => x; rewrite {}/f {}/g /=.
have x_in_t: x \in t; first case: x => x h.
  by rewrite {}/t mem_pmap_sub /= Es.
by rewrite (nth_map x) ?index_mem ?nth_index.
Qed.
End FiniteCountable.

Section CountSub.
Variables ( : eqType) ( : pred T).

Lemma
countable_sub
Source code
: {subset E <= F} -> countable F -> countable E.
Proof.
move=> le_EF [f g fgK]; pose f' ( : [psub E]) := f (pincl le_EF x).
pose g' := obind (insub (sT := [psub E])) (omap val (g x)).
by exists f' g' => x; rewrite /f' /g' fgK /= valK.
Qed.
End CountSub.

Section CountableUnion.
Variables ( : eqType) ( : nat -> pred T).

Hypothesis : forall , countable (E i).

Lemma
cunion_countable
Source code
: countable [pred | `[< exists , x \in E i >]].
Proof.
pose Ci : countType := HB.pack [psub (E i)] (countable_countMixin (cE i)).
pose S := { : nat & Ci i }; set F := [pred | _].
have H: forall ( : [psub F]), exists : nat, val x \in E i.
  by case=> x /= /asboolP[i] Eix; exists i.
have G: forall ( : S), val (tagged x) \in F.
  by case=> i [x /= Eix]; apply/asboolP; exists i.
pose f ( : [psub F]) : S := Tagged (fun => [psub E i])
  (PSubSub (xchooseP (H x))).
pose g ( : S) := PSubSub (G x).
by have /can_countable: cancel f g by case=> x hx; apply/val_inj.
Qed.
End CountableUnion.