Built with
Alectryon , running Coq+SerAPI v8.15.0+0.15.0. 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 .
(* mathcomp analysis (c) 2017 Inria and AIST. License: CeCILL-C. *)
From mathcomp Require Import all_ssreflect ssralg matrix finmap order ssrnum.Notation "[ predI _ & _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ predU _ & _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ predD _ & _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ predC _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ preim _ of _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "_ + _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ - _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ < _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ > _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ * _" was already used in scope nat_scope.
[notation-overridden,parsing]New coercion path [GRing.subring_closedM;
GRing.smulr_closedN] : GRing.subring_closed >-> GRing.oppr_closed is ambiguous with existing
[GRing.subring_closedB; GRing.zmod_closedN] : GRing.subring_closed >-> GRing.oppr_closed.
[ambiguous-paths,typechecker] New coercion path [GRing.subring_closed_semi;
GRing.semiring_closedM] : GRing.subring_closed >-> GRing.mulr_closed is ambiguous with existing
[GRing.subring_closedM; GRing.smulr_closedM] : GRing.subring_closed >-> GRing.mulr_closed.
New coercion path [GRing.subring_closed_semi;
GRing.semiring_closedD] : GRing.subring_closed >-> GRing.addr_closed is ambiguous with existing
[GRing.subring_closedB; GRing.zmod_closedD] : GRing.subring_closed >-> GRing.addr_closed.
[ambiguous-paths,typechecker] New coercion path [GRing.sdivr_closed_div;
GRing.divr_closedM] : GRing.sdivr_closed >-> GRing.mulr_closed is ambiguous with existing
[GRing.sdivr_closedM; GRing.smulr_closedM] : GRing.sdivr_closed >-> GRing.mulr_closed.
[ambiguous-paths,typechecker] New coercion path [GRing.subalg_closedBM;
GRing.subring_closedB] : GRing.subalg_closed >-> GRing.zmod_closed is ambiguous with existing
[GRing.subalg_closedZ; GRing.submod_closedB] : GRing.subalg_closed >-> GRing.zmod_closed.
[ambiguous-paths,typechecker] New coercion path [GRing.divring_closed_div;
GRing.sdivr_closedM] : GRing.divring_closed >-> GRing.smulr_closed is ambiguous with existing
[GRing.divring_closedBM; GRing.subring_closedM] : GRing.divring_closed >-> GRing.smulr_closed.
[ambiguous-paths,typechecker] New coercion path [GRing.divalg_closedBdiv;
GRing.divring_closedBM] : GRing.divalg_closed >-> GRing.subring_closed is ambiguous with existing
[GRing.divalg_closedZ; GRing.subalg_closedBM] : GRing.divalg_closed >-> GRing.subring_closed.
[ambiguous-paths,typechecker] New coercion path [GRing.Pred.subring_smul;
GRing.Pred.smul_mul] : GRing.Pred.subring >-> GRing.Pred.mul is ambiguous with existing
[GRing.Pred.subring_semi; GRing.Pred.semiring_mul] : GRing.Pred.subring >-> GRing.Pred.mul.
[ambiguous-paths,typechecker]
From mathcomp Require Import ssrint interval.
Require Import mathcomp_extra boolp.Notation "_ \* _" was already used in scope
ring_scope. [notation-overridden,parsing]Notation "\- _" was already used in scope ring_scope.
[notation-overridden,parsing]
(******************************************************************************)
(* This file develops a basic theory of sets and types equipped with a *)
(* canonical inhabitant (pointed types). *)
(* *)
(* --> A decidable equality is defined for any type. It is thus possible to *)
(* define an eqType structure for any type using the mixin gen_eqMixin. *)
(* --> This file adds the possibility to define a choiceType structure for *)
(* any type thanks to an axiom gen_choiceMixin giving a choice mixin. *)
(* --> We chose to have generic mixins and no global instances of the eqType *)
(* and choiceType structures to let the user choose which definition of *)
(* equality to use and to avoid conflict with already declared instances. *)
(* *)
(* * Sets: *)
(* set T == type of sets on T. *)
(* (x \in P) == boolean membership predicate from ssrbool *)
(* for set P, available thanks to a canonical *)
(* predType T structure on sets on T. *)
(* [set x : T | P] == set of points x : T such that P holds. *)
(* [set x | P] == same as before with T left implicit. *)
(* [set E | x in A] == set defined by the expression E for x in *)
(* set A. *)
(* [set E | x in A & y in B] == same as before for E depending on 2 *)
(* variables x and y in sets A and B. *)
(* setT == full set. *)
(* set0 == empty set. *)
(* range f == the range of f, i.e. [set f x | x in setT] *)
(* [set a] == set containing only a. *)
(* [set a : T] == same as before with the type of a made *)
(* explicit. *)
(* A `|` B == union of A and B. *)
(* a |` A == A extended with a. *)
(* [set a1; a2; ..; an] == set containing only the n elements ai. *)
(* A `&` B == intersection of A and B. *)
(* A `*` B == product of A and B, i.e. set of pairs (a,b) *)
(* such that A a and B b. *)
(* A.`1 == set of points a such that there exists b so *)
(* that A (a, b). *)
(* A.`2 == set of points a such that there exists b so *)
(* that A (b, a). *)
(* ~` A == complement of A. *)
(* [set~ a] == complement of [set a]. *)
(* A `\` B == complement of B in A. *)
(* A `\ a == A deprived of a. *)
(* `I_n := [set k | k < n] *)
(* \bigcup_(i in P) F == union of the elements of the family F whose *)
(* index satisfies P. *)
(* \bigcup_(i : T) F == union of the family F indexed on T. *)
(* \bigcup_(i < n) F := \bigcup_(i in `I_n) F *)
(* \bigcup_i F == same as before with T left implicit. *)
(* \bigcap_(i in P) F == intersection of the elements of the family *)
(* F whose index satisfies P. *)
(* \bigcap_(i : T) F == union of the family F indexed on T. *)
(* \bigcap_(i < n) F := \bigcap_(i in `I_n) F *)
(* \bigcap_i F == same as before with T left implicit. *)
(* smallest C G := \bigcap_(A in [set M | C M /\ G `<=` M]) A *)
(* A `<=` B <-> A is included in B. *)
(* A `<=>` B <-> double inclusion A `<=` B and B `<=` A. *)
(* f @^-1` A == preimage of A by f. *)
(* f @` A == image of A by f. Notation for `image A f`. *)
(* A !=set0 := exists x, A x. *)
(* [set` p] == a classical set corresponding to the *)
(* predType p *)
(* `[a, b] := [set` `[a, b]], i.e., a classical set *)
(* corresponding to the interval `[a, b]. *)
(* `]a, b] := [set` `]a, b]] *)
(* `[a, b[ := [set` `[a, b[] *)
(* `]a, b[ := [set` `]a, b[] *)
(* `]-oo, b] := [set` `]-oo, b]] *)
(* `]-oo, b[ := [set` `]-oo, b[] *)
(* `[a, +oo[ := [set` `[a, +oo[] *)
(* `]a, +oo[ := [set` `]a, +oo[] *)
(* `]-oo, +oo[ := [set` `]-oo, +oo[] *)
(* is_subset1 A <-> A contains only 1 element. *)
(* is_fun f <-> for each a, f a contains only 1 element. *)
(* is_total f <-> for each a, f a is non empty. *)
(* is_totalfun f <-> conjunction of is_fun and is_total. *)
(* xget x0 P == point x in P if it exists, x0 otherwise; *)
(* P must be a set on a choiceType. *)
(* fun_of_rel f0 f == function that maps x to an element of f x *)
(* if there is one, to f0 x otherwise. *)
(* F `#` G <-> intersections beween elements of F an G are *)
(* all non empty. *)
(* *)
(* * Pointed types: *)
(* pointedType == interface type for types equipped with a *)
(* canonical inhabitant. *)
(* PointedType T m == packs the term m : T to build a *)
(* pointedType; T must have a choiceType *)
(* structure. *)
(* [pointedType of T for cT] == T-clone of the pointedType structure cT. *)
(* [pointedType of T] == clone of a canonical pointedType structure *)
(* on T. *)
(* point == canonical inhabitant of a pointedType. *)
(* get P == point x in P if it exists, point otherwise; *)
(* P must be a set on a pointedType. *)
(* *)
(* --> Thanks to this basic set theory, we proved Zorn's Lemma, which states *)
(* that any ordered set such that every totally ordered subset admits an *)
(* upper bound has a maximal element. We also proved an analogous version *)
(* for preorders, where maximal is replaced with premaximal: t is *)
(* premaximal if whenever t < s we also have s < t. *)
(* *)
(* $| T | == T : Type is inhabited *)
(* squash x == proof of $| T | (with x : T) *)
(* unsquash s == extract a witness from s : $| T | *)
(* --> Tactic: *)
(* - squash x: *)
(* solves a goal $| T | by instantiating with x or [the T of x] *)
(* *)
(* trivIset D F == the sets F i, where i ranges over D : set I,*)
(* are pairwise-disjoint *)
(* cover D F := \bigcup_(i in D) F i *)
(* partition D F A == the non-empty sets F i,where i ranges over *)
(* D : set I, form a partition of A *)
(* pblock_index D F x == index i such that i \in D and x \in F i *)
(* pblock D F x := F (pblock_index D F x) *)
(* *)
(* * Upper and lower bounds: *)
(* ubound A == the set of upper bounds of the set A *)
(* lbound A == the set of lower bounds of the set A *)
(* Predicates to express existence conditions of supremum and infimum of *)
(* sets of real numbers: *)
(* has_ubound A := ubound A != set0 *)
(* has_sup A := A != set0 /\ has_ubound A *)
(* has_lbound A := lbound A != set0 *)
(* has_inf A := A != set0 /\ has_lbound A *)
(* *)
(* isLub A m := m is a least upper bound of the set A *)
(* supremums A := set of supremums of the set A *)
(* supremum x0 A == supremum of A or x0 if A is empty *)
(* infimums A := set of infimums of the set A *)
(* infimum x0 A == infimum of A or x0 if A is empty *)
(* *)
(* F `#` G := the classes of sets F and G intersect *)
(* *)
(* * sections: *)
(* xsection A x == with A : set (T1 * T2) and x : T1 is the *)
(* x-section of A *)
(* ysection A y == with A : set (T1 * T2) and y : T2 is the *)
(* y-section of A *)
(* *)
(* * About the naming conventions in this file: *)
(* - use T, T', T1, T2, etc., aT (domain type), rT (return type) for names of *)
(* variables in Type (or choiceType/pointedType/porderType) *)
(* + use the same suffix or prefix for the sets as their containing type *)
(* (e.g., A1 in T1, etc.) *)
(* + as a consequence functions are rather of type aT -> rT *)
(* - use I, J when the type corresponds to an index *)
(* - sets are named A, B, C, D, etc., or Y when it is ostensibly an image set *)
(* (i.e., of type set rT) *)
(* - indexed sets are rather named F *)
(* *)
(* * Composition of relations: *)
(* A \; B == [set x | exists z, A (x.1, z) & B (z, x.2)] *)
(* *)
(******************************************************************************)
Set Implicit Arguments .
Unset Strict Implicit .
Unset Printing Implicit Defensive .
Declare Scope classical_set_scope.
Reserved Notation "[ 'set' x : T | P ]"
(at level 0 , x at level 99 , only parsing ).The only parsing modifier has no effect in Reserved
Notation .
[irrelevant-reserved-notation-only -parsing,parsing]
Reserved Notation "[ 'set' x | P ]"
(at level 0 , x, P at level 99 , format "[ 'set' x | P ]" ).
Reserved Notation "[ 'set' E | x 'in' A ]" (at level 0 , E, x at level 99 ,
format "[ '[hv' 'set' E '/ ' | x 'in' A ] ']'" ).
Reserved Notation "[ 'set' E | x 'in' A & y 'in' B ]"
(at level 0 , E, x at level 99 ,
format "[ '[hv' 'set' E '/ ' | x 'in' A & y 'in' B ] ']'" ).
Reserved Notation "[ 'set' a ]"
(at level 0 , a at level 99 , format "[ 'set' a ]" ).
Reserved Notation "[ 'set' : T ]" (at level 0 , format "[ 'set' : T ]" ).
Reserved Notation "[ 'set' a : T ]"
(at level 0 , a at level 99 , format "[ 'set' a : T ]" ).
Reserved Notation "A `|` B" (at level 52 , left associativity ).
Reserved Notation "a |` A" (at level 52 , left associativity ).
Reserved Notation "[ 'set' a1 ; a2 ; .. ; an ]"
(at level 0 , a1 at level 99 , format "[ 'set' a1 ; a2 ; .. ; an ]" ).
Reserved Notation "A `&` B" (at level 48 , left associativity ).
Reserved Notation "A `*` B" (at level 46 , left associativity ).
Reserved Notation "A `*`` B" (at level 46 , left associativity ).
Reserved Notation "A ``*` B" (at level 46 , left associativity ).
Reserved Notation "A .`1" (at level 2 , left associativity , format "A .`1" ).
Reserved Notation "A .`2" (at level 2 , left associativity , format "A .`2" ).
Reserved Notation "~` A" (at level 35 , right associativity ).
Reserved Notation "[ 'set' ~ a ]" (at level 0 , format "[ 'set' ~ a ]" ).
Reserved Notation "A `\` B" (at level 50 , left associativity ).
Reserved Notation "A `\ b" (at level 50 , left associativity ).
(*
Reserved Notation "A `+` B" (at level 54, left associativity).
Reserved Notation "A +` B" (at level 54, left associativity).
*)
Reserved Notation "\bigcup_ ( i 'in' P ) F"
(at level 41 , F at level 41 , i, P at level 50 ,
format "'[' \bigcup_ ( i 'in' P ) '/ ' F ']'" ).
Reserved Notation "\bigcup_ ( i : T ) F"
(at level 41 , F at level 41 , i at level 50 ,
format "'[' \bigcup_ ( i : T ) '/ ' F ']'" ).Notation "\bigcup_ ( _ : _ ) _" was already defined
with a different format .
[notation-incompatible-format ,parsing]
Reserved Notation "\bigcup_ ( i < n ) F"
(at level 41 , F at level 41 , i, n at level 50 ,
format "'[' \bigcup_ ( i < n ) '/ ' F ']'" ).
Reserved Notation "\bigcup_ i F"
(at level 41 , F at level 41 , i at level 0 ,
format "'[' \bigcup_ i '/ ' F ']'" ).
Reserved Notation "\bigcap_ ( i 'in' P ) F"
(at level 41 , F at level 41 , i, P at level 50 ,
format "'[' \bigcap_ ( i 'in' P ) '/ ' F ']'" ).
Reserved Notation "\bigcap_ ( i : T ) F"
(at level 41 , F at level 41 , i at level 50 ,
format "'[' \bigcap_ ( i : T ) '/ ' F ']'" ).Notation "\bigcap_ ( _ : _ ) _" was already defined
with a different format .
[notation-incompatible-format ,parsing]
Reserved Notation "\bigcap_ ( i < n ) F"
(at level 41 , F at level 41 , i, n at level 50 ,
format "'[' \bigcap_ ( i < n ) '/ ' F ']'" ).
Reserved Notation "\bigcap_ i F"
(at level 41 , F at level 41 , i at level 0 ,
format "'[' \bigcap_ i '/ ' F ']'" ).
Reserved Notation "A `<` B" (at level 70 , no associativity ).
Reserved Notation "A `<=` B" (at level 70 , no associativity ).
Reserved Notation "A `<=>` B" (at level 70 , no associativity ).
Reserved Notation "f @^-1` A" (at level 24 ).
Reserved Notation "f @` A" (at level 24 ).
Reserved Notation "A !=set0" (at level 80 ).
Reserved Notation "[ 'set`' p ]" (at level 0 , format "[ 'set`' p ]" ).
Reserved Notation "[ 'disjoint' A & B ]" (at level 0 ,
format "'[hv' [ 'disjoint' '/ ' A '/' & B ] ']'" ).
Reserved Notation "F `#` G"
(at level 48 , left associativity , format "F `#` G" ).
Reserved Notation "'`I_' n" (at level 8 , n at level 2 , format "'`I_' n" ).
Definition set T := T -> Prop .
(* we use fun x => instead of pred to prevent inE from working *)
(* we will then extend inE with in_setE to make this work *)
Definition in_set T (A : set T) : pred T := (fun x => `[<A x>]).
Canonical set_predType T := @PredType T (set T) (@in_set T).
Lemma in_setE T (A : set T) x : x \in A = A x :> Prop .T : Type A : set Tx : T
(x \in A) = A x
Proof .6
by rewrite propeqE; split => [] /asboolP. Qed .
Definition inE := (inE, in_setE).
Bind Scope classical_set_scope with set .
Local Open Scope classical_set_scope.
Delimit Scope classical_set_scope with classic.
Definition mkset {T } (P : T -> Prop ) : set T := P.
Arguments mkset _ _ _ /.
Notation "[ 'set' x : T | P ]" := (mkset (fun x : T => P)) : classical_set_scope.
Notation "[ 'set' x | P ]" := [set x : _ | P] : classical_set_scope.
Definition image {T rT } (A : set T) (f : T -> rT) :=
[set y | exists2 x, A x & f x = y].
Arguments image _ _ _ _ _ /.
Notation "[ 'set' E | x 'in' A ]" :=
(image A (fun x => E)) : classical_set_scope.
Definition image2 {TA TB rT } (A : set TA) (B : set TB) (f : TA -> TB -> rT) :=
[set z | exists2 x, A x & exists2 y, B y & f x y = z].
Arguments image2 _ _ _ _ _ _ _ /.
Notation "[ 'set' E | x 'in' A & y 'in' B ]" :=
(image2 A B (fun x y => E)) : classical_set_scope.
Section basic_definitions .
Context {T rT : Type }.
Implicit Types (T : Type ) (A B : set T) (f : T -> rT) (Y : set rT).
Definition preimage f Y : set T := [set t | Y (f t)].
Definition setT := [set _ : T | True ].
Definition set0 := [set _ : T | False ].
Definition set1 (t : T) := [set x : T | x = t].
Definition setI A B := [set x | A x /\ B x].
Definition setU A B := [set x | A x \/ B x].
Definition nonempty A := exists a , A a.
Definition setC A := [set a | ~ A a].
Definition setD A B := [set x | A x /\ ~ B x].
Definition setM T1 T2 (A1 : set T1) (A2 : set T2) := [set z | A1 z.1 /\ A2 z.2 ].
Definition fst_set T1 T2 (A : set (T1 * T2)) := [set x | exists y , A (x, y)].
Definition snd_set T1 T2 (A : set (T1 * T2)) := [set y | exists x , A (x, y)].
Definition setMR T1 T2 (A1 : set T1) (A2 : T1 -> set T2) :=
[set z | A1 z.1 /\ A2 z.1 z.2 ].
Definition setML T1 T2 (A1 : T2 -> set T1) (A2 : set T2) :=
[set z | A1 z.2 z.1 /\ A2 z.2 ].
Lemma mksetE (P : T -> Prop ) x : [set x | P x] x = P x.T, rT : Type P : T -> Prop b
[set x | P x] x = P x
Proof .f
by []. Qed .
Definition bigcap T I (P : set I) (F : I -> set T) :=
[set a | forall i , P i -> F i a].
Definition bigcup T I (P : set I) (F : I -> set T) :=
[set a | exists2 i, P i & F i a].
Definition subset A B := forall t , A t -> B t.
Local Notation "A `<=` B" := (subset A B).
Definition disj_set A B := setI A B == set0.
Definition proper A B := A `<=` B /\ ~ (B `<=` A).
End basic_definitions .
Arguments preimage T rT f Y t /.
Arguments set0 _ _ /.
Arguments setT _ _ /.
Arguments set1 _ _ _ /.
Arguments setI _ _ _ _ /.
Arguments setU _ _ _ _ /.
Arguments setC _ _ _ /.
Arguments setD _ _ _ _ /.
Arguments setM _ _ _ _ _ /.
Arguments setMR _ _ _ _ _ /.
Arguments setML _ _ _ _ _ /.
Arguments fst_set _ _ _ _ /.
Arguments snd_set _ _ _ _ /.
Notation range F := [set F i | i in setT].
Notation "[ 'set' a ]" := (set1 a) : classical_set_scope.
Notation "[ 'set' a : T ]" := [set (a : T)] : classical_set_scope.
Notation "[ 'set' : T ]" := (@setT T) : classical_set_scope.
Notation "A `|` B" := (setU A B) : classical_set_scope.
Notation "a |` A" := ([set a] `|` A) : classical_set_scope.
Notation "[ 'set' a1 ; a2 ; .. ; an ]" :=
(setU .. (a1 |` [set a2]) .. [set an]) : classical_set_scope.
Notation "A `&` B" := (setI A B) : classical_set_scope.
Notation "A `*` B" := (setM A B) : classical_set_scope.
Notation "A .`1" := (fst_set A) : classical_set_scope.
Notation "A .`2" := (snd_set A) : classical_set_scope.
Notation "A `*`` B" := (setMR A B) : classical_set_scope.
Notation "A ``*` B" := (setML A B) : classical_set_scope.
Notation "~` A" := (setC A) : classical_set_scope.
Notation "[ 'set' ~ a ]" := (~` [set a]) : classical_set_scope.
Notation "A `\` B" := (setD A B) : classical_set_scope.
Notation "A `\ a" := (A `\` [set a]) : classical_set_scope.
Notation "[ 'disjoint' A & B ]" := (disj_set A B) : classical_set_scope.
Notation "'`I_' n" := [set k | is_true (k < n)%N].
Notation "\bigcup_ ( i 'in' P ) F" :=
(bigcup P (fun i => F)) : classical_set_scope.
Notation "\bigcup_ ( i : T ) F" :=
(\bigcup_(i in @setT T) F) : classical_set_scope.
Notation "\bigcup_ ( i < n ) F" :=
(\bigcup_(i in `I_n) F) : classical_set_scope.
Notation "\bigcup_ i F" := (\bigcup_(i : _) F) : classical_set_scope.
Notation "\bigcap_ ( i 'in' P ) F" :=
(bigcap P (fun i => F)) : classical_set_scope.
Notation "\bigcap_ ( i : T ) F" :=
(\bigcap_(i in @setT T) F) : classical_set_scope.
Notation "\bigcap_ ( i < n ) F" :=
(\bigcap_(i in `I_n) F) : classical_set_scope.
Notation "\bigcap_ i F" := (\bigcap_(i : _) F) : classical_set_scope.
Notation "A `<=` B" := (subset A B) : classical_set_scope.
Notation "A `<` B" := (proper A B) : classical_set_scope.
Notation "A `<=>` B" := ((A `<=` B) /\ (B `<=` A)) : classical_set_scope.
Notation "f @^-1` A" := (preimage f A) : classical_set_scope.
Notation "f @` A" := (image A f) (only parsing ) : classical_set_scope.
Notation "A !=set0" := (nonempty A) : classical_set_scope.
Notation "[ 'set`' p ]" := [set x | is_true (x \in p)] : classical_set_scope.
Notation pred_set := (fun i => [set ` i]).
Notation "`[ a , b ]" :=
[set ` Interval (BLeft a) (BRight b)] : classical_set_scope.
Notation "`] a , b ]" :=
[set ` Interval (BRight a) (BRight b)] : classical_set_scope.
Notation "`[ a , b [" :=
[set ` Interval (BLeft a) (BLeft b)] : classical_set_scope.
Notation "`] a , b [" :=
[set ` Interval (BRight a) (BLeft b)] : classical_set_scope.
Notation "`] '-oo' , b ]" :=
[set ` Interval -oo%O (BRight b)] : classical_set_scope.
Notation "`] '-oo' , b [" :=
[set ` Interval -oo%O (BLeft b)] : classical_set_scope.
Notation "`[ a , '+oo' [" :=
[set ` Interval (BLeft a) +oo%O] : classical_set_scope.
Notation "`] a , '+oo' [" :=
[set ` Interval (BRight a) +oo%O] : classical_set_scope.
Notation "`] -oo , '+oo' [" :=
[set ` Interval -oo%O +oo%O] : classical_set_scope.
Lemma preimage_itv T (d : unit) (rT : porderType d) (f : T -> rT) (i : interval rT) (x : T) :
((f @^-1 ` [set ` i]) x) = (f x \in i).9 d : unit rT : porderType d f : T -> rT i : interval rT b
(f @^-1 ` [set ` i]) x = (f x \in i)
Proof .17
by rewrite inE. Qed .
Lemma preimage_itv_o_infty T (d : unit) (rT : porderType d) (f : T -> rT) y :
f @^-1 ` `]y, +oo[%classic = [set x | (y < f x)%O].9 1a 1b 1c y : rT
f @^-1 ` `]y, +oo[ = [set x | (y < f x)%O]
Proof .21
by rewrite predeqE => t; split => [|?]; rewrite /= in_itv/= andbT.
Qed .
Lemma preimage_itv_c_infty T (d : unit) (rT : porderType d) (f : T -> rT) y :
f @^-1 ` `[y, +oo[%classic = [set x | (y <= f x)%O].23 f @^-1 ` `[y, +oo[ = [set x | (y <= f x)%O]
Proof .28
by rewrite predeqE => t; split => [|?]; rewrite /= in_itv/= andbT.
Qed .
Lemma preimage_itv_infty_o T (d : unit) (rT : orderType d) (f : T -> rT) y :
f @^-1 ` `]-oo, y[%classic = [set x | (f x < y)%O].9 1a rT : orderType d 1c 24
f @^-1 ` `]-oo, y[ = [set x | (f x < y)%O]
Proof .2d
by rewrite predeqE => t; split => [|?]; rewrite /= in_itv. Qed .
Lemma preimage_itv_infty_c T (d : unit) (rT : orderType d) (f : T -> rT) y :
f @^-1 ` `]-oo, y]%classic = [set x | (f x <= y)%O].2f f @^-1 ` `]-oo, y] = [set x | (f x <= y)%O]
Proof .34
by rewrite predeqE => t; split => [|?]; rewrite /= in_itv. Qed .
Lemma eq_set T (P Q : T -> Prop ) : (forall x : T, P x = Q x) ->
[set x | P x] = [set x | Q x].9 P, Q : T -> Prop
(forall x : T, P x = Q x) ->
[set x | P x] = [set x | Q x]
Proof .39
by move => /funext->. Qed .
Coercion set_type T (A : set T) := {x : T | x \in A}.
Definition SigSub {T } {pT : predType T} {P : pT} x : x \in P -> {x | x \in P} :=
exist (fun x => x \in P) x.
Lemma set0fun {P T : Type } : @set0 T -> P. Proof .40
by case => x; rewrite inE. Qed .
Lemma pred_oappE {T : Type } (D : {pred T}) :
pred_oapp D = mem (some @` D)%classic.9 D : {pred T}
pred_oapp D = mem [set Some x | x in fun x : T => D x]
Proof .47
apply /funext=> -[x|]/=; apply /idP/idP; rewrite /pred_oapp/= inE //=.9 4a b
x \in D ->
ex2 (fun x : T => D x)
(fun x0 : T => Some x0 = Some x)
- 4e
by move => xD; exists x .
- 59
by move => [// + + [<-]].
- 5e
by case .
Qed .
Lemma pred_oapp_set {T : Type } (D : set T) :
pred_oapp (mem D) = mem (some @` D)%classic.9 D : set T
pred_oapp (mem D) = mem [set Some x | x in D]
Proof .62
by rewrite pred_oappE; apply /funext => x/=; apply /idP/idP; rewrite ?inE ;
move => [y/= ]; rewrite ?in_setE ; exists y ; rewrite ?in_setE .
Qed .
Section basic_lemmas .
Context {T : Type }.
Implicit Types A B C D : set T.
Lemma mem_set {A } {u : T} : A u -> u \in A. Proof .69
by rewrite inE. Qed .
Lemma set_mem {A } {u : T} : u \in A -> A u. Proof .70
by rewrite inE. Qed .
Lemma mem_setT (u : T) : u \in [set : T]. Proof .75
by rewrite inE. Qed .
Lemma mem_setK {A } {u : T} : cancel (@mem_set A u) set_mem. Proof .7b
by []. Qed .
Lemma set_memK {A } {u : T} : cancel (@set_mem A u) mem_set. Proof .80
by []. Qed .
Lemma memNset (A : set T) (u : T) : ~ A u -> u \in A = false.6b ~ A u -> (u \in A) = false
Proof .85
by apply : contra_notF; rewrite inE. Qed .
Lemma notin_set (A : set T) x : (x \notin A : Prop ) = ~ (A x).8 (x \notin A : Prop ) = (~ A x)
Proof .8a
by apply /propext; split => /asboolPn. Qed .
Lemma setTPn (A : set T) : A != setT <-> exists t , ~ A t.9 a
A != [set : T] <-> (exists t : T, ~ A t)
Proof .8f
split => [/negP|[t]]; last by apply : contra_notP => /negP/negPn/eqP ->.91 ~ A == [set : T] -> exists t : T, ~ A t
apply : contra_notP => /forallNP h.9 a h : forall x : T, ~ ~ A x
A == [set : T]
by apply /eqP; rewrite predeqE => t; split => // _; apply : contrapT.
Qed .
#[deprecated(note="Use setTPn instead" )]
Notation setTP := setTPn.
Lemma in_set0 (x : T) : (x \in set0) = false. Proof .9f
by rewrite memNset. Qed .
Lemma in_setT (x : T) : x \in setT. Proof .a5
by rewrite mem_set. Qed .
Lemma in_setC (x : T) A : (x \in ~` A) = (x \notin A).9 b a
(x \in ~` A) = (x \notin A)
Proof .aa
by apply /idP/idP; rewrite inE notin_set. Qed .
Lemma in_setI (x : T) A B : (x \in A `&` B) = (x \in A) && (x \in B).9 b A, B : set T
(x \in A `&` B) = (x \in A) && (x \in B)
Proof .b0
by apply /idP/andP; rewrite !inE. Qed .
Lemma in_setD (x : T) A B : (x \in A `\` B) = (x \in A) && (x \notin B).b2 (x \in A `\` B) = (x \in A) && (x \notin B)
Proof .b7
by apply /idP/andP; rewrite !inE notin_set. Qed .
Lemma in_setU (x : T) A B : (x \in A `|` B) = (x \in A) || (x \in B).b2 (x \in A `|` B) = (x \in A) || (x \in B)
Proof .bc
by apply /idP/orP; rewrite !inE. Qed .
Lemma in_setM T' (x : T * T') A E : (x \in A `*` E) = (x.1 \in A) && (x.2 \in E).T, T' : Type x : (T * T')%type a E : set T'
(x \in A `*` E) = (x.1 \in A) && (x.2 \in E)
Proof .c1
by apply /idP/andP; rewrite !inE. Qed .
Lemma set_valP {A } (x : A) : A (val x).
Proof .ca
by apply : set_mem; apply : valP. Qed .
Lemma eqEsubset A B : (A = B) = (A `<=>` B).
Proof .d1
rewrite propeqE; split => [->|[AB BA]]; [by split |].9 b3 AB : A `<=` B BA : B `<=` A
A = B
by rewrite predeqE => t; split => [/AB|/BA].
Qed .
Lemma seteqP A B : (A = B) <-> (A `<=>` B). Proof .de
by rewrite eqEsubset. Qed .
Lemma set_true : [set ` predT] = setT :> set T.
Proof .e3
by apply /seteqP; split . Qed .
Lemma set_false : [set ` pred0] = set0 :> set T.
Proof .e9
by apply /seteqP; split . Qed .
Lemma set_andb (P Q : {pred T}) : [set ` predI P Q] = [set ` P] `&` [set ` Q].9 P, Q : {pred T}
[set ` predI P Q] = [set ` P] `&` [set ` Q]
Proof .ee
by apply /predeqP => x; split ; rewrite /= inE => /andP. Qed .
Lemma set_orb (P Q : {pred T}) : [set ` predU P Q] = [set ` P] `|` [set ` Q].f0 [set ` predU P Q] = [set ` P] `|` [set ` Q]
Proof .f5
by apply /predeqP => x; split ; rewrite /= inE => /orP. Qed .
Lemma fun_true : (fun => true) = setT :> set T.e5 (fun => true) = [set : T]
Proof .fa
by rewrite [LHS]set_true. Qed .
Lemma fun_false : (fun => false) = set0 :> set T.
Proof .ff
by rewrite [LHS]set_false. Qed .
Lemma set_mem_set A : [set ` A] = A.
Proof .104
by apply /seteqP; split => x/=; rewrite inE. Qed .
Lemma mem_setE (P : pred T) : mem [set ` P] = mem P.9 P : pred T
mem [set ` P] = mem P
Proof .109
by congr Mem; apply /funext=> x; apply /asboolP/idP. Qed .
Lemma subset_refl A : A `<=` A. Proof .110
by []. Qed .
Lemma subset_trans B A C : A `<=` B -> B `<=` C -> A `<=` C.9 B, A, C : set T
A `<=` B -> B `<=` C -> A `<=` C
Proof .115
by move => sAB sBC ? ?; apply /sBC/sAB. Qed .
Lemma sub0set A : set0 `<=` A. Proof .11c
by []. Qed .
Lemma setC0 : ~` set0 = setT :> set T.
Proof .121
by rewrite predeqE; split => ?. Qed .
Lemma setCK : involutive (@setC T).
Proof .126
by move => A; rewrite funeqE => t; rewrite /setC; exact : notLR. Qed .
Lemma setCT : ~` setT = set0 :> set T. Proof .12b
by rewrite -setC0 setCK. Qed .
Definition setC_inj := can_inj setCK.
Lemma setIC : commutative (@setI T).
Proof .130
by move => A B; rewrite predeqE => ?; split => [[]|[]]. Qed .
Lemma setIS C A B : A `<=` B -> C `&` A `<=` C `&` B.9 C, A, B : set T
A `<=` B -> C `&` A `<=` C `&` B
Proof .135
by move => sAB t [Ct At]; split => //; exact : sAB. Qed .
Lemma setSI C A B : A `<=` B -> A `&` C `<=` B `&` C.137 A `<=` B -> A `&` C `<=` B `&` C
Proof .13c
by move => sAB; rewrite -!(setIC C); apply setIS. Qed .
Lemma setISS A B C D : A `<=` C -> B `<=` D -> A `&` B `<=` C `&` D.9 A, B, C, D : set T
A `<=` C -> B `<=` D -> A `&` B `<=` C `&` D
Proof .141
by move => /(@setSI B) /subset_trans sAC /(@setIS C) /sAC. Qed .
Lemma setIT : right_id setT (@setI T).
Proof .148
by move => A; rewrite predeqE => ?; split => [[]|]. Qed .
Lemma setTI : left_id setT (@setI T).
Proof .14d
by move => A; rewrite predeqE => ?; split => [[]|]. Qed .
Lemma setI0 : right_zero set0 (@setI T).
Proof .152
by move => A; rewrite predeqE => ?; split => [[]|]. Qed .
Lemma set0I : left_zero set0 (@setI T).
Proof .157
by move => A; rewrite setIC setI0. Qed .
Lemma setICl : left_inverse set0 setC (@setI T).e5 left_inverse set0 setC setI
Proof .15c
by move => A; rewrite predeqE => ?; split => // -[]. Qed .
Lemma setICr : right_inverse set0 setC (@setI T).e5 right_inverse set0 setC setI
Proof .161
by move => A; rewrite setIC setICl. Qed .
Lemma setIA : associative (@setI T).
Proof .166
by move => A B C; rewrite predeqE => ?; split => [[? []]|[[]]]. Qed .
Lemma setICA : left_commutative (@setI T).
Proof .16b
by move => A B C; rewrite setIA [A `&` _]setIC -setIA. Qed .
Lemma setIAC : right_commutative (@setI T).
Proof .170
by move => A B C; rewrite setIC setICA setIA. Qed .
Lemma setIACA : @interchange (set T) setI setI.
Proof .175
by move => A B C D; rewrite -setIA [B `&` _]setICA setIA. Qed .
Lemma setIid : idempotent (@setI T).
Proof .17a
by move => A; rewrite predeqE => ?; split => [[]|]. Qed .
Lemma setIIl A B C : A `&` B `&` C = (A `&` C) `&` (B `&` C).9 A, B, C : set T
A `&` B `&` C = A `&` C `&` (B `&` C)
Proof .17f
by rewrite setIA !(setIAC _ C) -(setIA _ C) setIid. Qed .
Lemma setIIr A B C : A `&` (B `&` C) = (A `&` B) `&` (A `&` C).181 A `&` (B `&` C) = A `&` B `&` (A `&` C)
Proof .186
by rewrite !(setIC A) setIIl. Qed .
Lemma setUC : commutative (@setU T).
Proof .18b
move => p q; rewrite /setU/mkset predeqE => a; tauto . Qed .
Lemma setUS C A B : A `<=` B -> C `|` A `<=` C `|` B.137 A `<=` B -> C `|` A `<=` C `|` B
Proof .190
by move => sAB t [Ct|At]; [left |right ; exact : sAB]. Qed .
Lemma setSU C A B : A `<=` B -> A `|` C `<=` B `|` C.137 A `<=` B -> A `|` C `<=` B `|` C
Proof .195
by move => sAB; rewrite -!(setUC C); apply setUS. Qed .
Lemma setUSS A B C D : A `<=` C -> B `<=` D -> A `|` B `<=` C `|` D.143 A `<=` C -> B `<=` D -> A `|` B `<=` C `|` D
Proof .19a
by move => /(@setSU B) /subset_trans sAC /(@setUS C) /sAC. Qed .
Lemma setTU : left_zero setT (@setU T).e5 left_zero [set : T] setU
Proof .19f
by move => A; rewrite predeqE => t; split ; [case |left ]. Qed .
Lemma setUT : right_zero setT (@setU T).e5 right_zero [set : T] setU
Proof .1a4
by move => A; rewrite predeqE => t; split ; [case |right ]. Qed .
Lemma set0U : left_id set0 (@setU T).
Proof .1a9
by move => A; rewrite predeqE => t; split ; [case |right ]. Qed .
Lemma setU0 : right_id set0 (@setU T).
Proof .1ae
by move => A; rewrite predeqE => t; split ; [case |left ]. Qed .
Lemma setUCl : left_inverse setT setC (@setU T).e5 left_inverse [set : T] setC setU
Proof .1b3
move => A.
by rewrite predeqE => t; split => // _; case : (pselect (A t)); [right |left ].
Qed .
Lemma setUCr : right_inverse setT setC (@setU T).e5 right_inverse [set : T] setC setU
Proof .1bc
by move => A; rewrite setUC setUCl. Qed .
Lemma setUA : associative (@setU T).
Proof .1c1
move => p q r; rewrite /setU/mkset predeqE => a; tauto . Qed .
Lemma setUCA : left_commutative (@setU T).
Proof .1c6
by move => A B C; rewrite setUA [A `|` _]setUC -setUA. Qed .
Lemma setUAC : right_commutative (@setU T).
Proof .1cb
by move => A B C; rewrite setUC setUCA setUA. Qed .
Lemma setUACA : @interchange (set T) setU setU.
Proof .1d0
by move => A B C D; rewrite -setUA [B `|` _]setUCA setUA. Qed .
Lemma setUid : idempotent (@setU T).
Proof .1d5
move => p; rewrite /setU/mkset predeqE => a; tauto . Qed .
Lemma setUUl A B C : A `|` B `|` C = (A `|` C) `|` (B `|` C).181 A `|` B `|` C = A `|` C `|` (B `|` C)
Proof .1da
by rewrite setUA !(setUAC _ C) -(setUA _ C) setUid. Qed .
Lemma setUUr A B C : A `|` (B `|` C) = (A `|` B) `|` (A `|` C).181 A `|` (B `|` C) = A `|` B `|` (A `|` C)
Proof .1df
by rewrite !(setUC A) setUUl. Qed .
Lemma setDE A B : A `\` B = A `&` ~` B. Proof .1e4
by []. Qed .
Lemma setDUK A B : A `<=` B -> A `|` (B `\` A) = B.d3 A `<=` B -> A `|` B `\` A = B
Proof .1e9
move => AB; apply /seteqP; split => [x [/AB//|[//]]|x Bx].9 b3 da b Bx : B x
(A `|` B `\` A) x
by have [Ax|nAx] := pselect (A x); [left |right ].
Qed .
Lemma setDKU A B : A `<=` B -> (B `\` A) `|` A = B.d3 A `<=` B -> B `\` A `|` A = B
Proof .1f4
by move => /setDUK; rewrite setUC. Qed .
Lemma setDv A : A `\` A = set0.
Proof .1f9
by rewrite predeqE => t; split => // -[]. Qed .
Lemma setUv A : A `|` ~` A = setT.
Proof .1fe
by apply /predeqP => x; split => //= _; apply : lem. Qed .
Lemma setvU A : ~` A `|` A = setT.1b8
Proof .1b8
by rewrite setUC setUv. Qed .
Lemma setUCK A B : (A `|` B) `|` ~` B = setT.d3 A `|` B `|` ~` B = [set : T]
Proof .205
by rewrite -setUA setUv setUT. Qed .
Lemma setUKC A B : ~` A `|` (A `|` B) = setT.d3 ~` A `|` (A `|` B) = [set : T]
Proof .20a
by rewrite setUA setvU setTU. Qed .
Lemma setICK A B : (A `&` B) `&` ~` B = set0.d3 A `&` B `&` ~` B = set0
Proof .20f
by rewrite -setIA setICr setI0. Qed .
Lemma setIKC A B : ~` A `&` (A `&` B) = set0.d3 ~` A `&` (A `&` B) = set0
Proof .214
by rewrite setIA setICl set0I. Qed .
Lemma setDIK A B : A `&` (B `\` A) = set0.
Proof .219
by rewrite setDE setICA -setDE setDv setI0. Qed .
Lemma setDKI A B : (B `\` A) `&` A = set0.
Proof .21e
by rewrite setIC setDIK. Qed .
Lemma setD1K a A : A a -> a |` A `\ a = A.9 a : T a
A a -> a |` A `\ a = A
Proof .223
by move => Aa; rewrite setDUK//= => x ->. Qed .
Lemma setI1 A a : A `&` [set a] = if a \in A then [set a] else set0.9 a 226
A `&` [set a] = (if a \in A then [set a] else set0)
Proof .22a
by apply /predeqP => b; case : ifPn; rewrite (inE, notin_set) => Aa;
split => [[]|]//; [move => -> //|move => /[swap ] -> /Aa].
Qed .
Lemma set1I A a : [set a] `&` A = if a \in A then [set a] else set0.22c [set a] `&` A = (if a \in A then [set a] else set0)
Proof .230
by rewrite setIC setI1. Qed .
Lemma subset0 A : (A `<=` set0) = (A = set0).91 (A `<=` set0) = (A = set0)
Proof .235
by rewrite eqEsubset propeqE; split => [A0|[]//]; split . Qed .
Lemma subTset A : (setT `<=` A) = (A = setT).91 ([set : T] `<=` A) = (A = [set : T])
Proof .23a
by rewrite eqEsubset propeqE; split => [|[]]. Qed .
Lemma sub1set x A : ([set x] `<=` A) = (x \in A).ac ([set x] `<=` A) = (x \in A)
Proof .23f
by apply /propext; split => [|/[!inE] xA _ ->//]; rewrite inE; exact . Qed .
Lemma subsetT A : A `<=` setT. Proof .244
by []. Qed .
Lemma subsetW {A B } : A = B -> A `<=` B. Proof .249
by move ->. Qed .
Definition subsetCW {A B } : A = B -> B `<=` A := subsetW \o esym.
Lemma disj_set2E A B : [disjoint A & B] = (A `&` B == set0).d3 [disjoint A & B] = (A `&` B == set0)
Proof .24e
by []. Qed .
Lemma disj_set2P {A B } : reflect (A `&` B = set0) [disjoint A & B]%classic.d3 reflect (A `&` B = set0) [disjoint A & B]%classic
Proof .253
exact /eqP. Qed .
Lemma disj_setPS {A B } : reflect (A `&` B `<=` set0) [disjoint A & B]%classic.d3 reflect (A `&` B `<=` set0) [disjoint A & B]%classic
Proof .258
by rewrite subset0; apply : disj_set2P. Qed .
Lemma disj_set_sym A B : [disjoint B & A] = [disjoint A & B].d3 [disjoint B & A] = [disjoint A & B]
Proof .25d
by rewrite !disj_set2E setIC. Qed .
Lemma disj_setPCl {A B } : reflect (A `<=` B) [disjoint A & ~` B]%classic.d3 reflect (A `<=` B) [disjoint A & ~` B]%classic
Proof .262
apply : (iffP disj_setPS) => [P t ?|P t [/P//]].9 b3 P : A `&` ~` B `<=` set0 t : T _Hyp_ : A t
B t
by apply : contrapT => ?; apply : (P t).
Qed .
Lemma disj_setPCr {A B } : reflect (A `<=` B) [disjoint ~` B & A]%classic.d3 reflect (A `<=` B) [disjoint ~` B & A]%classic
Proof .26f
by rewrite disj_set_sym; apply : disj_setPCl. Qed .
Lemma disj_setPLR {A B } : reflect (A `<=` ~` B) [disjoint A & B]%classic.d3 reflect (A `<=` ~` B) [disjoint A & B]%classic
Proof .274
by apply : (equivP idP); rewrite (rwP disj_setPCl) setCK. Qed .
Lemma disj_setPRL {A B } : reflect (B `<=` ~` A) [disjoint A & B]%classic.d3 reflect (B `<=` ~` A) [disjoint A & B]%classic
Proof .279
by apply : (equivP idP); rewrite (rwP disj_setPCr) setCK. Qed .
Lemma subsets_disjoint A B : A `<=` B <-> A `&` ~` B = set0.d3 A `<=` B <-> A `&` ~` B = set0
Proof .27e
by rewrite (rwP disj_setPCl) (rwP eqP). Qed .
Lemma disjoints_subset A B : A `&` B = set0 <-> A `<=` ~` B.d3 A `&` B = set0 <-> A `<=` ~` B
Proof .283
by rewrite subsets_disjoint setCK. Qed .
Lemma subsetC1 x A : (A `<=` [set ~ x]) = (x \in ~` A).ac (A `<=` [set ~ x]) = (x \in ~` A)
Proof .288
rewrite !inE; apply /propext; split ; first by move /[apply ]; apply .ac (~` A) x -> A `<=` [set ~ x]
by move => NAx y; apply : contraPnot => ->.
Qed .
Lemma setSD C A B : A `<=` B -> A `\` C `<=` B `\` C.137 A `<=` B -> A `\` C `<=` B `\` C
Proof .291
by rewrite !setDE; apply : setSI. Qed .
Lemma setTD A : setT `\` A = ~` A.
Proof .296
by rewrite predeqE => t; split => // -[]. Qed .
Lemma set0P A : (A != set0) <-> (A !=set0).
Proof .29b
split => [/negP A_neq0|[t tA]]; last by apply /negP => /eqP A0; rewrite A0 in tA.9 a A_neq0 : ~ A == set0
A !=set0
apply : contrapT => /asboolPn/forallp_asboolPn A0; apply /A_neq0/eqP.9 a 2a3 A0 : forall x : T, ~ A x
A = set0
by rewrite eqEsubset; split .
Qed .
Lemma setF_eq0 : (T -> False ) -> all_equal_to (set0 : set T).e5 (T -> False ) -> all_equal_to (set0 : set T)
Proof .2ac
by move => TF A; rewrite -subset0 => x; have := TF x. Qed .
Lemma subset_nonempty A B : A `<=` B -> A !=set0 -> B !=set0.d3 A `<=` B -> A !=set0 -> B !=set0
Proof .2b1
by move => sAB [x Ax]; exists x ; apply : sAB. Qed .
Lemma subsetC A B : A `<=` B -> ~` B `<=` ~` A.d3 A `<=` B -> ~` B `<=` ~` A
Proof .2b6
by move => sAB ? nBa ?; apply /nBa/sAB. Qed .
Lemma subsetCl A B : ~` A `<=` B -> ~` B `<=` A.d3 ~` A `<=` B -> ~` B `<=` A
Proof .2bb
by move => /subsetC; rewrite setCK. Qed .
Lemma subsetCr A B : A `<=` ~` B -> B `<=` ~` A.d3 A `<=` ~` B -> B `<=` ~` A
Proof .2c0
by move => /subsetC; rewrite setCK. Qed .
Lemma subsetC2 A B : ~` A `<=` ~` B -> B `<=` A.d3 ~` A `<=` ~` B -> B `<=` A
Proof .2c5
by move => /subsetC; rewrite !setCK. Qed .
Lemma subsetCP A B : ~` A `<=` ~` B <-> B `<=` A.d3 ~` A `<=` ~` B <-> B `<=` A
Proof .2ca
by split => /subsetC; rewrite ?setCK . Qed .
Lemma subsetCPl A B : ~` A `<=` B <-> ~` B `<=` A.d3 ~` A `<=` B <-> ~` B `<=` A
Proof .2cf
by split => /subsetC; rewrite ?setCK . Qed .
Lemma subsetCPr A B : A `<=` ~` B <-> B `<=` ~` A.d3 A `<=` ~` B <-> B `<=` ~` A
Proof .2d4
by split => /subsetC; rewrite ?setCK . Qed .
Lemma subsetUl A B : A `<=` A `|` B. Proof .2d9
by move => x; left . Qed .
Lemma subsetUr A B : B `<=` A `|` B. Proof .2de
by move => x; right . Qed .
Lemma subUset A B C : (B `|` C `<=` A) = ((B `<=` A) /\ (C `<=` A)).181 (B `|` C `<=` A) = (B `<=` A /\ C `<=` A)
Proof .2e3
rewrite propeqE; split => [|[BA CA] x]; last by case ; [exact : BA | exact : CA].181 B `|` C `<=` A -> B `<=` A /\ C `<=` A
by move => sBC_A; split => x ?; apply sBC_A; [left | right ].
Qed .
Lemma setIidPl A B : A `&` B = A <-> A `<=` B.d3 A `&` B = A <-> A `<=` B
Proof .2ec
rewrite predeqE; split => [AB t /AB [] //|AB t].9 b3 da 26b
(A `&` B) t <-> A t
by split => [[]//|At]; split => //; exact : AB.
Qed .
Lemma setIidPr A B : A `&` B = B <-> B `<=` A.d3 A `&` B = B <-> B `<=` A
Proof .2f6
by rewrite setIC setIidPl. Qed .
Lemma setIidl A B : A `<=` B -> A `&` B = A.d3 A `<=` B -> A `&` B = A
Proof .2fb
by rewrite setIidPl. Qed .
Lemma setIidr A B : B `<=` A -> A `&` B = B.d3 B `<=` A -> A `&` B = B
Proof .300
by rewrite setIidPr. Qed .
Lemma setUidPl A B : A `|` B = A <-> B `<=` A.d3 A `|` B = A <-> B `<=` A
Proof .305
split => [<- ? ?|BA]; first by right .
rewrite predeqE => t; split => [[//|/BA//]|?]; by left .
Qed .
Lemma setUidPr A B : A `|` B = B <-> A `<=` B.d3 A `|` B = B <-> A `<=` B
Proof .30f
by rewrite setUC setUidPl. Qed .
Lemma setUidl A B : B `<=` A -> A `|` B = A.d3 B `<=` A -> A `|` B = A
Proof .314
by rewrite setUidPl. Qed .
Lemma setUidr A B : A `<=` B -> A `|` B = B.d3 A `<=` B -> A `|` B = B
Proof .319
by rewrite setUidPr. Qed .
Lemma subsetI A B C : (A `<=` B `&` C) = ((A `<=` B) /\ (A `<=` C)).181 (A `<=` B `&` C) = (A `<=` B /\ A `<=` C)
Proof .31e
rewrite propeqE; split => [H|[y z ??]]; split ; by [move => ?/H[]|apply y|apply z].
Qed .
Lemma setDidPl A B : A `\` B = A <-> A `&` B = set0.d3 A `\` B = A <-> A `&` B = set0
Proof .323
rewrite setDE disjoints_subset predeqE; split => [AB t|AB t].9 b3 AB : forall x : T, (A `&` ~` B) x <-> A x26b
A t -> (~` B) t
by rewrite -AB => -[].
by split => [[]//|At]; move : (AB t At).
Qed .
Lemma setDidl A B : A `&` B = set0 -> A `\` B = A.d3 A `&` B = set0 -> A `\` B = A
Proof .336
by move => /setDidPl. Qed .
Lemma subIset A B C : A `<=` C \/ B `<=` C -> A `&` B `<=` C.181 A `<=` C \/ B `<=` C -> A `&` B `<=` C
Proof .33b
case => sub a; by [move => [/sub] | move => [_ /sub]]. Qed .
Lemma subIsetl A B : A `&` B `<=` A. Proof .340
by move => x []. Qed .
Lemma subIsetr A B : A `&` B `<=` B. Proof .345
by move => x []. Qed .
Lemma subDsetl A B : A `\` B `<=` A.
Proof .34a
by rewrite setDE; apply : subIsetl. Qed .
Lemma subDsetr A B : A `\` B `<=` ~` B.
Proof .34f
by rewrite setDE; apply : subIsetr. Qed .
Lemma subsetI_neq0 A B C D :
A `<=` B -> C `<=` D -> A `&` C !=set0 -> B `&` D !=set0.143 A `<=` B ->
C `<=` D -> A `&` C !=set0 -> B `&` D !=set0
Proof .354
by move => AB CD [x [/AB Bx /CD Dx]]; exists x . Qed .
Lemma subsetI_eq0 A B C D :
A `<=` B -> C `<=` D -> B `&` D = set0 -> A `&` C = set0.143 A `<=` B ->
C `<=` D -> B `&` D = set0 -> A `&` C = set0
Proof .359
by move => AB /(subsetI_neq0 AB); rewrite -!set0P => /contra_eq. Qed .
Lemma setD_eq0 A B : (A `\` B = set0) = (A `<=` B).d3 (A `\` B = set0) = (A `<=` B)
Proof .35e
rewrite propeqE; split => [ADB0 a|sAB].9 b3 ADB0 : A `\` B = set0 226
A a -> B a
by apply : contraPP => nBa xA; rewrite -[False ]/(set0 a) -ADB0.
by rewrite predeqE => ?; split => // - [?]; apply ; apply : sAB.
Qed .
Lemma properEneq A B : (A `<` B) = (A != B /\ A `<=` B).d3 (A `<` B) = (A != B /\ A `<=` B)
Proof .371
rewrite /proper andC propeqE; split => [[BA AB]|[/eqP]].9 b3 BA : ~ B `<=` A da
A != B /\ A `<=` B
by split => //; apply /negP; apply : contra_not BA => /eqP ->.
by rewrite eqEsubset => AB BA; split => //; exact : contra_not AB.
Qed .
Lemma nonsubset A B : ~ (A `<=` B) -> A `&` ~` B !=set0.d3 ~ A `<=` B -> A `&` ~` B !=set0
Proof .382
by rewrite -setD_eq0 setDE -set0P => /eqP. Qed .
Lemma setU_eq0 A B : (A `|` B = set0) = ((A = set0) /\ (B = set0)).d3 (A `|` B = set0) = (A = set0 /\ B = set0)
Proof .387
by rewrite -!subset0 subUset. Qed .
Lemma setCS A B : (~` A `<=` ~` B) = (B `<=` A).d3 (~` A `<=` ~` B) = (B `<=` A)
Proof .38c
rewrite propeqE; split => [|BA].
by move /subsets_disjoint; rewrite setCK setIC => /subsets_disjoint.
by apply /subsets_disjoint; rewrite setCK setIC; apply /subsets_disjoint.
Qed .
Lemma setDT A : A `\` setT = set0.
Proof .399
by rewrite setDE setCT setI0. Qed .
Lemma set0D A : set0 `\` A = set0.
Proof .39e
by rewrite setDE set0I. Qed .
Lemma setD0 A : A `\` set0 = A.
Proof .3a3
by rewrite setDE setC0 setIT. Qed .
Lemma setDS C A B : A `<=` B -> C `\` B `<=` C `\` A.137 A `<=` B -> C `\` B `<=` C `\` A
Proof .3a8
by rewrite !setDE -setCS; apply : setIS. Qed .
Lemma setDSS A B C D : A `<=` C -> D `<=` B -> A `\` B `<=` C `\` D.143 A `<=` C -> D `<=` B -> A `\` B `<=` C `\` D
Proof .3ad
by move => /(@setSD B) /subset_trans sAC /(@setDS C) /sAC. Qed .
Lemma setCU A B : ~`(A `|` B) = ~` A `&` ~` B.d3 ~` (A `|` B) = ~` A `&` ~` B
Proof .3b2
rewrite predeqE => z.9 b3 z : T
(~` (A `|` B)) z <-> (~` A `&` ~` B) z
by apply : asbool_eq_equiv; rewrite asbool_and !asbool_neg asbool_or negb_or.
Qed .
Lemma setCI A B : ~` (A `&` B) = ~` A `|` ~` B.d3 ~` (A `&` B) = ~` A `|` ~` B
Proof .3bd
by rewrite -[in LHS](setCK A) -[in LHS](setCK B) -setCU setCK. Qed .
Lemma setDUr A B C : A `\` (B `|` C) = (A `\` B) `&` (A `\` C).181 A `\` (B `|` C) = (A `\` B) `&` (A `\` C)
Proof .3c2
by rewrite !setDE setCU setIIr. Qed .
Lemma setIUl : left_distributive (@setI T) (@setU T).e5 left_distributive setI setU
Proof .3c7
move => A B C; rewrite predeqE => t; split .9 182 26b
((A `|` B) `&` C) t -> (A `&` C `|` B `&` C) t
by move => [[At|Bt] Ct]; [left |right ].
by move => [[At Ct]|[Bt Ct]]; split => //; [left |right ].
Qed .
Lemma setIUr : right_distributive (@setI T) (@setU T).e5 right_distributive setI setU
Proof .3d7
by move => A B C; rewrite ![A `&` _]setIC setIUl. Qed .
Lemma setUIl : left_distributive (@setU T) (@setI T).e5 left_distributive setU setI
Proof .3dc
move => A B C; rewrite predeqE => t; split .3ce (A `&` B `|` C) t -> ((A `|` C) `&` (B `|` C)) t
by move => [[At Bt]|Ct]; split ; by [left |right ].
by move => [[At|Ct] [Bt|Ct']]; by [left |right ].
Qed .
Lemma setUIr : right_distributive (@setU T) (@setI T).e5 right_distributive setU setI
Proof .3eb
by move => A B C; rewrite ![A `|` _]setUC setUIl. Qed .
Lemma setUK A B : (A `|` B) `&` A = A.
Proof .3f0
by rewrite eqEsubset; split => [t []//|t ?]; split => //; left . Qed .
Lemma setKU A B : A `&` (B `|` A) = A.
Proof .3f5
by rewrite eqEsubset; split => [t []//|t ?]; split => //; right . Qed .
Lemma setIK A B : (A `&` B) `|` A = A.
Proof .3fa
by rewrite eqEsubset; split => [t [[]//|//]|t At]; right . Qed .
Lemma setKI A B : A `|` (B `&` A) = A.
Proof .3ff
by rewrite eqEsubset; split => [t [//|[]//]|t At]; left . Qed .
Lemma setDUl : left_distributive setD (@setU T).e5 left_distributive setD setU
Proof .404
by move => A B C; rewrite !setDE setIUl. Qed .
Lemma setUKD A B : A `&` B `<=` set0 -> (A `|` B) `\` A = B.d3 A `&` B `<=` set0 -> (A `|` B) `\` A = B
Proof .409
by move => AB0; rewrite setDUl setDv set0U setDidl// -subset0 setIC. Qed .
Lemma setUDK A B : A `&` B `<=` set0 -> (B `|` A) `\` A = B.d3 A `&` B `<=` set0 -> (B `|` A) `\` A = B
Proof .40e
by move => *; rewrite setUC setUKD. Qed .
Lemma setIDA A B C : A `&` (B `\` C) = (A `&` B) `\` C.181 A `&` (B `\` C) = A `&` B `\` C
Proof .413
by rewrite !setDE setIA. Qed .
Lemma setDD A B : A `\` (A `\` B) = A `&` B.d3 A `\` (A `\` B) = A `&` B
Proof .418
by rewrite 2 !setDE setCI setCK setIUr setICr set0U. Qed .
Lemma setDDl A B C : (A `\` B) `\` C = A `\` (B `|` C).181 A `\` B `\` C = A `\` (B `|` C)
Proof .41d
by rewrite !setDE setCU setIA. Qed .
Lemma setDDr A B C : A `\` (B `\` C) = (A `\` B) `|` (A `&` C).181 A `\` (B `\` C) = A `\` B `|` A `&` C
Proof .422
by rewrite !setDE setCI setIUr setCK. Qed .
Lemma setDIr A B C : A `\` B `&` C = (A `\` B) `|` (A `\` C).181 A `\` B `&` C = A `\` B `|` A `\` C
Proof .427
by rewrite !setDE setCI setIUr. Qed .
Lemma setUIDK A B : (A `&` B) `|` A `\` B = A.d3 A `&` B `|` A `\` B = A
Proof .42c
by rewrite setUC -setDDr setDv setD0. Qed .
Lemma setM0 T' (A : set T) : A `*` set0 = set0 :> set (T * T').
Proof .431
by rewrite predeqE => -[t u]; split => // -[]. Qed .
Lemma set0M T' (A : set T') : set0 `*` A = set0 :> set (T * T').c4 A : set T'
set0 `*` A = set0
Proof .437
by rewrite predeqE => -[t u]; split => // -[]. Qed .
Lemma setMTT T' : setT `*` setT = setT :> set (T * T').c4
[set : T] `*` [set : T'] = [set : T * T']
Proof .43e
exact /predeqP. Qed .
Lemma setMT T1 T2 (A : set T1) : A `*` @setT T2 = fst @^-1 ` A.T, T1, T2 : Type A : set T1
A `*` [set : T2] = fst @^-1 ` A
Proof .444
by rewrite predeqE => -[x y]; split => //= -[]. Qed .
Lemma setTM T1 T2 (B : set T2) : @setT T1 `*` B = snd @^-1 ` B.447 B : set T2
[set : T1] `*` B = snd @^-1 ` B
Proof .44c
by rewrite predeqE => -[x y]; split => //= -[]. Qed .
Lemma setMI T1 T2 (X1 : set T1) (X2 : set T2) (Y1 : set T1) (Y2 : set T2) :
(X1 `&` Y1) `*` (X2 `&` Y2) = X1 `*` X2 `&` Y1 `*` Y2.447 X1 : set T1X2 : set T2Y1 : set T1Y2 : set T2
(X1 `&` Y1) `*` (X2 `&` Y2) = X1 `*` X2 `&` Y1 `*` Y2
Proof .453
by rewrite predeqE => -[x y]; split => [[[? ?] [*]//]|[] [? ?] [*]]. Qed .
Lemma setSM T1 T2 (C D : set T1) (A B : set T2) :
A `<=` B -> C `<=` D -> C `*` A `<=` D `*` B.447 C, D : set T1A, B : set T2
A `<=` B -> C `<=` D -> C `*` A `<=` D `*` B
Proof .45d
by move => AB CD x [] /CD Dx1 /AB Bx2. Qed .
Lemma setM_bigcupr T1 T2 I (F : I -> set T2) (P : set I) (A : set T1) :
A `*` \bigcup_(i in P) F i = \bigcup_(i in P) (A `*` F i).T, T1, T2, I : Type F : I -> set T2 P : set I448
A `*` \bigcup_(i in P) F i =
\bigcup_(i in P) (A `*` F i)
Proof .465
rewrite predeqE => -[x y]; split ; first by move => [/= Ax [n Pn Fny]]; exists n .468 469 46a 448 x : T1 y : T2
(\bigcup_(i in P) (A `*` F i)) (x, y) ->
(A `*` \bigcup_(i in P) F i) (x, y)
by move => [n Pn [/= Ax Fny]]; split => //; exists n .
Qed .
Lemma setM_bigcupl T1 T2 I (F : I -> set T2) (P : set I) (A : set T1) :
\bigcup_(i in P) F i `*` A = \bigcup_(i in P) (F i `*` A).467 \bigcup_(i in P) F i `*` A =
\bigcup_(i in P) (F i `*` A)
Proof .475
rewrite predeqE => -[x y]; split ; first by move => [[n Pn Fnx] Ax]; exists n .468 469 46a 448 x : T2 y : T1
(\bigcup_(i in P) (F i `*` A)) (x, y) ->
(\bigcup_(i in P) F i `*` A) (x, y)
by move => [n Pn [/= Ax Fny]]; split => //; exists n .
Qed .
Lemma bigcupM1l T1 T2 (A1 : set T1) (A2 : T1 -> set T2) :
\bigcup_(i in A1) ([set i] `*` (A2 i)) = A1 `*`` A2.447 A1 : set T1A2 : T1 -> set T2
\bigcup_(i in A1) ([set i] `*` A2 i) = A1 `*`` A2
Proof .481
by apply /predeqP => -[i j]; split => [[? ? [/= -> //]]|[]]; exists i . Qed .
Lemma bigcupM1r T1 T2 (A1 : T2 -> set T1) (A2 : set T2) :
\bigcup_(i in A2) (A1 i `*` [set i]) = A1 ``*` A2.447 A1 : T2 -> set T1 A2 : set T2
\bigcup_(i in A2) (A1 i `*` [set i]) = A1 ``*` A2
Proof .489
by apply /predeqP => -[i j]; split => [[? ? [? /= -> //]]|[]]; exists j . Qed .
End basic_lemmas .
#[global ]
Hint Resolve subsetUl subsetUr subIsetl subIsetr subDsetl subDsetr : core.
#[deprecated(since="mathcomp-analysis 0.6" , note="Use setICl instead." )]
Notation setvI := setICl.
#[deprecated(since="mathcomp-analysis 0.6" , note="Use setICr instead." )]
Notation setIv := setICr.
Lemma image2E {TA TB rT : Type } (A : set TA) (B : set TB) (f : TA -> TB -> rT) :
[set f x y | x in A & y in B] = uncurry f @` (A `*` B).TA, TB, rT : Type A : set TAB : set TBf : TA -> TB -> rT
[set f x y | x in A & y in B] =
[set uncurry f x | x in A `*` B]
Proof .491
apply /predeqP => x; split => [[a ? [b ? <-]]|[[a b] [? ? <-]]]/=;
by [exists (a , b) | exists a => //; exists b ].
Qed .
Lemma set_nil (T : choiceType) : [set ` [::]] = @set0 T.T : choiceType
[set ` [::]] = set0
Proof .49b
by rewrite predeqP. Qed .
Lemma set_seq_eq0 (T : eqType) (S : seq T) : ([set ` S] == set0) = (S == [::]).T : eqType S : seq T
([set ` S] == set0) = (S == [::])
Proof .4a2
apply /eqP/eqP=> [|->]; rewrite predeqE //; case : S => // h t /(_ h).4a5 h : T t : seq T
[set ` h :: t] h <-> set0 h -> h :: t = [::]
by rewrite /= mem_head => -[/(_ erefl)].
Qed .
Lemma set_fset_eq0 (T : choiceType) (S : {fset T}) :
([set ` S] == set0) = (S == fset0).49e S : {fset T}
([set ` S] == set0) = (S == fset0)
Proof .4b1
by rewrite set_seq_eq0. Qed .
Section InitialSegment .
Lemma II0 : `I_0 = set0. Proof .4b8
by rewrite predeqE. Qed .
Lemma II1 : `I_1 = [set 0 ]. Proof .4bd
by rewrite predeqE; case . Qed .
Lemma IIn_eq0 n : `I_n = set0 -> n = 0 .n : nat
`I_n = set0 -> n = 0
Proof .4c2
by case : n => // n; rewrite predeqE; case /(_ 0 %N); case . Qed .
Lemma IIS n : `I_n.+1 = `I_n `|` [set n].4c4 `I_n.+1 = `I_n `|` [set n]
Proof .4c9
rewrite /mkset predeqE => i; split => [|[|->//]].n, i : nat
i < n.+1 -> ((fun k : nat => k < n) `|` [set n]) i
by rewrite ltnS leq_eqVlt => /orP[/eqP ->|]; by [left |right ].
by move /ltn_trans; apply .
Qed .
Lemma IISl n : `I_n.+1 = n |` `I_n.
Proof .4da
by rewrite setUC IIS. Qed .
Lemma IIDn n : `I_n.+1 `\ n = `I_n.
Proof .4df
by rewrite IIS setUDK// => x [->/=]; rewrite ltnn. Qed .
Lemma setI_II m n : `I_m `&` `I_n = `I_(minn m n).m, n : nat
`I_m `&` `I_n = `I_(minn m n)
Proof .4e4
by case : leqP => mn; [rewrite setIidl// | rewrite setIidr//]
=> k /= /leq_trans; apply => //; apply : ltnW.
Qed .
Lemma setU_II m n : `I_m `|` `I_n = `I_(maxn m n).4e6 `I_m `|` `I_n = `I_(maxn m n)
Proof .4eb
by case : leqP => mn; [rewrite setUidr// | rewrite setUidl//]
=> k /= /leq_trans; apply => //; apply : ltnW.
Qed .
Lemma Iiota (n : nat) : [set ` iota 0 n] = `I_n.4c4 [set ` iota 0 n] = `I_n
Proof .4f0
by apply /seteqP; split => [|] ?; rewrite /= mem_iota add0n. Qed .
Definition ordII {n } (k : 'I_n) : `I_n := SigSub (@mem_set _ `I_n _ (ltn_ord k)).
Definition IIord {n } (k : `I_n) := Ordinal (set_valP k).
Definition ordIIK {n } : cancel (@ordII n) IIord.
Proof .4f5
by move => k; apply /val_inj. Qed .
Lemma IIordK {n } : cancel (@IIord n) ordII.
Proof .4fa
by move => k; apply /val_inj. Qed .
End InitialSegment .
Lemma setT_unit : [set : unit] = [set tt].
Proof .4ff
by apply /seteqP; split => // -[]. Qed .
Lemma set_unit (A : set unit) : A = set0 \/ A = setT.A : set unit
A = set0 \/ A = [set : unit]
Proof .504
have [->|/set0P[[] Att]] := eqVneq A set0; [by left |right ].507 Att : A tt
A = [set : unit]
by apply /seteqP; split => [|] [].
Qed .
Lemma setT_bool : [set : bool] = [set true; false].[set : bool] = [set true; false]
Proof .511
by rewrite eqEsubset; split => // [[]] // _; [left |right ]. Qed .
Lemma set_bool (B : set bool) :
[\/ B == [set true], B == [set false], B == set0 | B == setT].B : set bool
[\/ B == [set true], B == [set false], B == set0
| B == [set : bool]]
Proof .516
have [Bt|Bt] := boolP (true \in B); have [Bf|Bf] := boolP (false \in B).519 Bt : true \in B Bf : false \in B
51a
- 51d
have -> : B = setT by apply /seteqP; split => // -[] _; exact : set_mem.51f [\/ [set : bool] == [set true],
[set : bool] == [set false], [set : bool] == set0
| [set : bool] == [set : bool]]
522
by apply /or4P; rewrite eqxx/= !orbT.
- 531
suff : B = [set true] by move => ->; apply /or4P; rewrite eqxx.
apply /seteqP; split => -[]// /mem_set; last by move => _; exact : set_mem.524 false \in B -> [set true] false
533
by rewrite (negbTE Bf).
- 53e
suff : B = [set false] by move => ->; apply /or4P; rewrite eqxx/= orbT.
apply /seteqP; split => -[]// /mem_set; last by move => _; exact : set_mem.527 true \in B -> [set false] true
540
by rewrite (negbTE Bt).
- 54b
suff : B = set0 by move => ->; apply /or4P; rewrite eqxx/= !orbT.
by apply /seteqP; split => -[]//=; rewrite 2 !notin_set in Bt, Bf.
Qed .
(* TODO: other lemmas that relate fset and classical sets *)
Lemma fdisjoint_cset (T : choiceType) (A B : {fset T}) :
[disjoint A & B]%fset = [disjoint [set ` A] & [set ` B]].49e A, B : {fset T}
[disjoint A & B]%fset = [disjoint [set ` A] & [set ` B]]
Proof .553
rewrite -fsetI_eq0; apply /idP/idP; apply : contraLR.555 ~~ [disjoint [set ` A] & [set ` B]]%classic ->
(A `&` B)%fset != fset0
by move => /set0P[t [tA tB]]; apply /fset0Pn; exists t ; rewrite inE; apply /andP.
by move => /fset0Pn[t]; rewrite inE => /andP[tA tB]; apply /set0P; exists t .
Qed .
Section SetFset .
Context {T : choiceType}.
Implicit Types (x y : T) (A B : {fset T}).
Lemma set_fset0 : [set y : T | y \in fset0] = set0.
Proof .564
by rewrite -subset0 => x. Qed .
Lemma set_fset1 x : [set y | y \in [fset x]%fset] = [set x].49e b
[set ` [fset x]%fset] = [set x]
Proof .569
by rewrite predeqE => y; split ; rewrite /= inE => /eqP. Qed .
Lemma set_fsetI A B : [set ` (A `&` B)%fset] = [set ` A] `&` [set ` B].555 [set ` (A `&` B)%fset] = [set ` A] `&` [set ` B]
Proof .56f
by rewrite predeqE => x; split ; rewrite /= !inE; [case /andP|case => -> ->].
Qed .
Lemma set_fsetIr (P : {pred T}) (A : {fset T}) :
[set ` [fset x | x in A & P x]%fset] = [set ` A] `&` [set ` P].49e P : {pred T} A : {fset T}
[set ` [fset x | x in A & P x]%fset] =
[set ` A] `&` [set ` P]
Proof .574
by apply /predeqP => x /=; split ; rewrite 2 !inE/= => /andP. Qed .
Lemma set_fsetU A B :
[set ` (A `|` B)%fset] = [set ` A] `|` [set ` B].555 [set ` (A `|` B)%fset] = [set ` A] `|` [set ` B]
Proof .57c
rewrite predeqE => x; split ; rewrite /= !inE.49e 556 b
(x \in A) || (x \in B) -> x \in A \/ x \in B
by case /orP; [left |right ].
by move => []->; rewrite ?orbT .
Qed .
Lemma set_fsetU1 x A : [set y | y \in (x |` A)%fset] = x |` [set ` A].49e b 578
[set ` (x |` A)%fset] = x |` [set ` A]
Proof .58c
by rewrite set_fsetU set_fset1. Qed .
Lemma set_fsetD A B :
[set ` (A `\` B)%fset] = [set ` A] `\` [set ` B].555 [set ` (A `\` B)%fset] = [set ` A] `\` [set ` B]
Proof .592
rewrite predeqE => x; split ; rewrite /= !inE; last by move => [-> /negP ->].583 (x \notin B) && (x \in A) -> x \in A /\ ~ x \in B
by case /andP => /negP xNB xA.
Qed .
Lemma set_fsetD1 A x : [set y | y \in (A `\ x)%fset] = [set ` A] `\ x.49e 578 b
[set ` (A `\ x)%fset] = [set ` A] `\ x
Proof .59b
by rewrite set_fsetD set_fset1. Qed .
Lemma set_imfset (key : unit) [K : choiceType] (f : T -> K) (p : finmempred T) :
[set ` imfset key f p] = f @` [set ` p].49e key : unit K : choiceType f : T -> K p : finmempred T
[set ` imfset key f p] = [set f x | x in [set ` p]]
Proof .5a1
apply /predeqP => x; split => [/imfsetP[i ip -> /=]|]; first by exists i .49e 5a4 5a5 5a6 5a7 x : K
[set f x | x in [set ` p]] x -> [set ` imfset key f p] x
by move => [i ip <-]; apply : in_imfset.
Qed .
End SetFset .
Section SetMonoids .
Variable (T : Type ).
Import Monoid.
Canonical setU_monoid := Law (@setUA T) (@set0U T) (@setU0 T).
Canonical setU_comoid := ComLaw (@setUC T).
Canonical setU_mul_monoid := MulLaw (@setTU T) (@setUT T).
Canonical setI_monoid := Law (@setIA T) (@setTI T) (@setIT T).
Canonical setI_comoid := ComLaw (@setIC T).
Canonical setI_mul_monoid := MulLaw (@set0I T) (@setI0 T).
Canonical setU_add_monoid := AddLaw (@setUIl T) (@setUIr T).
Canonical setI_add_monoid := AddLaw (@setIUl T) (@setIUr T).
End SetMonoids .
Section base_image_lemmas .
Context {aT rT : Type }.
Implicit Types (A B : set aT) (f : aT -> rT) (Y : set rT).
Lemma imageP f A a : A a -> (f @` A) (f a).aT, rT : Type f : aT -> rT A : set aTa : aT
A a -> [set f x | x in A] (f a)
Proof .5b1
by exists a . Qed .
Lemma imageT (f : aT -> rT) (a : aT) : range f (f a).
Proof .5bb
by apply : imageP. Qed .
End base_image_lemmas .
#[global ]
Hint Extern 0 ((?f @` _) (?f _)) => solve [apply : imageP; assumption ] : core.
#[global ] Hint Extern 0 ((?f @` setT) _) => solve [apply : imageT] : core.
Section image_lemmas .
Context {aT rT : Type }.
Implicit Types (A B : set aT) (f : aT -> rT) (Y : set rT).
Lemma image_inj {f A a } : injective f -> (f @` A) (f a) = A a.5b3 injective f -> [set f x | x in A] (f a) = A a
Proof .5c1
by move => f_inj; rewrite propeqE; split => [[b Ab /f_inj <-]|/(imageP f)//].
Qed .
Lemma image_id A : id @` A = A.5b4 5b6
[set x | x in A] = A
Proof .5c6
by rewrite eqEsubset; split => a; [case => /= x Ax <-|exists a ]. Qed .
Lemma homo_setP {A Y f } :
{homo f : x / x \in A >-> x \in Y} <-> {homo f : x / A x >-> Y x}.5b4 5b6 Y : set rT5b5
{homo f : x / x \in A >-> x \in Y} <->
{homo f : x / A x >-> Y x}
Proof .5cc
by split => fAY x; have := fAY x; rewrite !inE. Qed .
Lemma image_subP {A Y f } : f @` A `<=` Y <-> {homo f : x / A x >-> Y x}.5ce [set f x | x in A] `<=` Y <->
{homo f : x / A x >-> Y x}
Proof .5d3
by split => fAY x => [Ax|[y + <-]]; apply : fAY=> //; exists x . Qed .
Lemma image_sub {f : aT -> rT} {A : set aT} {B : set rT} :
(f @` A `<=` B) = (A `<=` f @^-1 ` B).5b4 5b5 5b6 B : set rT
([set f x | x in A] `<=` B) = (A `<=` f @^-1 ` B)
Proof .5d8
by apply /propext; rewrite image_subP; split => AB a /AB. Qed .
Lemma image_setU f A B : f @` (A `|` B) = f @` A `|` f @` B.5b4 5b5 A, B : set aT
[set f x | x in A `|` B] =
[set f x | x in A] `|` [set f x | x in B]
Proof .5df
rewrite eqEsubset; split => b.5b4 5b5 5e2 b : rT
[set f x | x in A `|` B] b ->
([set f x | x in A] `|` [set f x | x in B]) b
- 5e6
by case => a [] Ha <-; [left | right ]; apply imageP.
- 5f0
by case => -[] a Ha <-; apply imageP; [left | right ].
Qed .
Lemma image_set0 f : f @` set0 = set0.5b4 5b5
[set f x | x in set0] = set0
Proof .5f4
by rewrite eqEsubset; split => b // -[]. Qed .
Lemma image_set0_set0 A f : f @` A = set0 -> A = set0.5b4 5b6 5b5
[set f x | x in A] = set0 -> A = set0
Proof .5fa
move => fA0; rewrite predeqE => t; split => // At.5b4 5b6 5b5 fA0 : [set f x | x in A] = set0 t : aT At : A t
set0 t
by have : set0 (f t) by rewrite -fA0; exists t .
Qed .
Lemma image_set1 f t : f @` [set t] = [set f t].5b4 5b5 604
[set f x | x in [set t]] = [set f t]
Proof .608
by rewrite eqEsubset; split => [b [a' -> <-] //|b ->]; exact /imageP. Qed .
Lemma subset_set1 A a : A `<=` [set a] -> A = set0 \/ A = [set a].5b4 5b6 5b7
A `<=` [set a] -> A = set0 \/ A = [set a]
Proof .60e
move => Aa; have [/eqP|/set0P[t At]] := boolP (A == set0); first by left .5b4 5b6 5b7 Aa : A `<=` [set a] 604 605
A = set0 \/ A = [set a]
by right ; rewrite eqEsubset; split => // ? ->; rewrite -(Aa _ At).
Qed .
Lemma subset_set2 A a b : A `<=` [set a; b] ->
[\/ A = set0, A = [set a], A = [set b] | A = [set a; b]].5b4 5b6 a, b : aT
A `<=` [set a; b] ->
[\/ A = set0, A = [set a], A = [set b]
| A = [set a; b]]
Proof .61a
have [<-|ab Aab] := pselect (a = b).61c A `<=` [set a; a] ->
[\/ A = set0, A = [set a], A = [set a]
| A = [set a; a]]
by rewrite setUid => /subset_set1[]->; [apply : Or41|apply : Or42].
have [|/nonsubset[x [/[dup] /Aab []// -> Ab _]]] := pselect (A `<=` [set a]).626 A `<=` [set a] ->
[\/ A = set0, A = [set a], A = [set b]
| A = [set a; b]]
by move => /subset_set1[]->; [apply : Or41|apply : Or42].
have [|/nonsubset[y [/[dup] /Aab []// -> Aa _]]] := pselect (A `<=` [set b]).633 A `<=` [set b] ->
[\/ A = set0, A = [set a], A = [set b]
| A = [set a; b]]
by move => /subset_set1[]->; [apply : Or41|apply : Or43].
by apply : Or44; apply /seteqP; split => // z /= [] ->.
Qed .
Lemma sub_image_setI f A B : f @` (A `&` B) `<=` f @` A `&` f @` B.5e1 [set f x | x in A `&` B]
`<=` [set f x | x in A] `&` [set f x | x in B]
Proof .646
by move => b [x [Aa Ba <-]]; split ; apply : imageP. Qed .
Lemma nonempty_image f A : f @` A !=set0 -> A !=set0.5b4 5b5 5b6
[set f x | x in A] !=set0 -> A !=set0
Proof .64b
by case => b [a]; exists a . Qed .
Lemma image_subset f A B : A `<=` B -> f @` A `<=` f @` B.5e1 A `<=` B -> [set f x | x in A] `<=` [set f x | x in B]
Proof .651
by move => AB _ [a Aa <-]; exists a => //; apply /AB. Qed .
Lemma preimage_set0 f : f @^-1 ` set0 = set0. Proof .656
exact /predeqP. Qed .
Lemma preimage_setT f : f @^-1 ` setT = setT.5f6 f @^-1 ` [set : rT] = [set : aT]
Proof .65b
by []. Qed .
Lemma nonempty_preimage f Y : f @^-1 ` Y !=set0 -> Y !=set0.5b4 5b5 5cf
f @^-1 ` Y !=set0 -> Y !=set0
Proof .660
by case => [t ?]; exists (f t ). Qed .
Lemma preimage_image f A : A `<=` f @^-1 ` (f @` A).64d A `<=` f @^-1 ` [set f x | x in A]
Proof .666
by move => a Aa; exists a . Qed .
Lemma preimage_range {A B : Type } (f : A -> B) : f @^-1 ` (range f) = [set : A].aT, rT, A, B : Type f : A -> B
f @^-1 ` range f = [set : A]
Proof .66b
by rewrite eqEsubset; split => x // _; exists x . Qed .
Lemma image_preimage_subset f Y : f @` (f @^-1 ` Y) `<=` Y.662 [set f x | x in f @^-1 ` Y] `<=` Y
Proof .673
by move => _ [t /= Yft <-]. Qed .
Lemma image_preimage f Y : f @` setT = setT -> f @` (f @^-1 ` Y) = Y.662 range f = [set : rT] -> [set f x | x in f @^-1 ` Y] = Y
Proof .678
move => fsurj; rewrite predeqE => x; split ; first by move => [? ? <-].5b4 5b5 5cf fsurj : range f = [set : rT] x : rT
Y x -> [set f x | x in f @^-1 ` Y] x
move => Yx; have : setT x by [].5b4 5b5 5cf 680 681 Yx : Y x
[set : rT] x -> [set f x | x in f @^-1 ` Y] x
by rewrite -fsurj => - [y _ fy_eqx]; exists y => //=; rewrite fy_eqx.
Qed .
Lemma eq_imagel T1 T2 (A : set T1) (f f' : T1 -> T2) :
(forall x , A x -> f x = f' x) -> f @` A = f' @` A.aT, rT, T1, T2 : Type 448 f, f' : T1 -> T2
(forall x : T1, A x -> f x = f' x) ->
[set f x | x in A] = [set f' x | x in A]
Proof .68a
by move => h; rewrite predeqE=> y; split => [][x ? <-]; exists x => //; rewrite h.
Qed .
Lemma eq_image_id g A : (forall x , A x -> g x = x) -> g @` A = A.5b4 g : aT -> aT 5b6
(forall x : aT, A x -> g x = x) ->
[set g x | x in A] = A
Proof .692
by move => /eq_imagel->; rewrite image_id. Qed .
Lemma preimage_setU f Y1 Y2 : f @^-1 ` (Y1 `|` Y2) = f @^-1 ` Y1 `|` f @^-1 ` Y2.5b4 5b5 Y1, Y2 : set rT
f @^-1 ` (Y1 `|` Y2) = f @^-1 ` Y1 `|` f @^-1 ` Y2
Proof .699
exact /predeqP. Qed .
Lemma preimage_setI f Y1 Y2 : f @^-1 ` (Y1 `&` Y2) = f @^-1 ` Y1 `&` f @^-1 ` Y2.69b f @^-1 ` (Y1 `&` Y2) = f @^-1 ` Y1 `&` f @^-1 ` Y2
Proof .6a0
exact /predeqP. Qed .
Lemma preimage_setC f Y : ~` (f @^-1 ` Y) = f @^-1 ` (~` Y).662 ~` f @^-1 ` Y = f @^-1 ` (~` Y)
Proof .6a5
by rewrite predeqE => a; split => nAfa ?; apply : nAfa. Qed .
Lemma preimage_subset f Y1 Y2 : Y1 `<=` Y2 -> f @^-1 ` Y1 `<=` f @^-1 ` Y2.69b Y1 `<=` Y2 -> f @^-1 ` Y1 `<=` f @^-1 ` Y2
Proof .6aa
by move => Y12 t /Y12. Qed .
Lemma nonempty_preimage_setI f Y1 Y2 :
(f @^-1 ` (Y1 `&` Y2)) !=set0 <-> (f @^-1 ` Y1 `&` f @^-1 ` Y2) !=set0.69b f @^-1 ` (Y1 `&` Y2) !=set0 <->
f @^-1 ` Y1 `&` f @^-1 ` Y2 !=set0
Proof .6af
by split ; case => t ?; exists t . Qed .
Lemma preimage_bigcup {I } (P : set I) f (F : I -> set rT) :
f @^-1 ` (\bigcup_ (i in P) F i) = \bigcup_(i in P) (f @^-1 ` F i).aT, rT, I : Type 46a 5b5 F : I -> set rT
f @^-1 ` (\bigcup_(i in P) F i) =
\bigcup_(i in P) f @^-1 ` F i
Proof .6b4
exact /predeqP. Qed .
Lemma preimage_bigcap {I } (P : set I) f (F : I -> set rT) :
f @^-1 ` (\bigcap_ (i in P) F i) = \bigcap_(i in P) (f @^-1 ` F i).6b6 f @^-1 ` (\bigcap_(i in P) F i) =
\bigcap_(i in P) f @^-1 ` F i
Proof .6bc
exact /predeqP. Qed .
Lemma eq_preimage {I T : Type } (D : set I) (A : set T) (F G : I -> T) :
{in D, F =1 G} -> D `&` F @^-1 ` A = D `&` G @^-1 ` A.aT, rT, I, T : Type D : set Ia F, G : I -> T
{in D, F =1 G} -> D `&` F @^-1 ` A = D `&` G @^-1 ` A
Proof .6c1
move => eqFG; apply /predeqP => i.6c4 6c5 a 6c6 eqFG : {in D, F =1 G} i : I
(D `&` F @^-1 ` A) i <-> (D `&` G @^-1 ` A) i
by split => [] [Di FAi]; split ; rewrite /preimage//= (eqFG,=^~eqFG) ?inE .
Qed .
Lemma notin_setI_preimage T R D (f : T -> R) i :
i \notin f @` D -> D `&` f @^-1 ` [set i] = set0.aT, rT, T, R : Type 65 f : T -> R i : R
i \notin [set f x | x in D] ->
D `&` f @^-1 ` [set i] = set0
Proof .6d1
by rewrite notin_set/=; apply : contra_notP => /eqP/set0P[t [Dt fit]]; exists t .
Qed .
Lemma comp_preimage T1 T2 T3 (A : set T3) (g : T1 -> T2) (f : T2 -> T3) :
(f \o g) @^-1 ` A = g @^-1 ` (f @^-1 ` A).aT, rT, T1, T2, T3 : Type A : set T3g : T1 -> T2 f : T2 -> T3
(f \o g) @^-1 ` A = g @^-1 ` (f @^-1 ` A)
Proof .6da
by []. Qed .
Lemma preimage_id T (A : set T) : id @^-1 ` A = A.aT, rT, T : Type a
id @^-1 ` A = A
Proof .6e4
by []. Qed .
Lemma preimage_comp T1 T2 (g : T1 -> rT) (f : T2 -> rT) (C : set T1) :
f @^-1 ` [set g x | x in C] = [set x | f x \in g @` C].68d g : T1 -> rT f : T2 -> rT C : set T1
f @^-1 ` [set g x | x in C] =
[set x | f x \in [set g x | x in C]]
Proof .6eb
rewrite predeqE => t; split => /=.68d 6ee 6ef 6f0 t : T2
(exists2 x : T1, C x & g x = f t) ->
f t \in [set g x | x in C]
by move => -[r Cr <-]; rewrite inE; exists r .
by rewrite inE => -[r Cr <-]; exists r .
Qed .
Lemma preimage_setI_eq0 (f : aT -> rT) (Y1 Y2 : set rT) :
f @^-1 ` (Y1 `&` Y2) = set0 <-> f @^-1 ` Y1 `&` f @^-1 ` Y2 = set0.69b f @^-1 ` (Y1 `&` Y2) = set0 <->
f @^-1 ` Y1 `&` f @^-1 ` Y2 = set0
Proof .700
by split ; apply : contraPP => /eqP/set0P/(nonempty_preimage_setI f _ _).2 /set0P/eqP.
Qed .
Lemma preimage0eq (f : aT -> rT) (Y : set rT) : Y = set0 -> f @^-1 ` Y = set0.662 Y = set0 -> f @^-1 ` Y = set0
Proof .705
by move => ->; rewrite preimage_set0. Qed .
Lemma preimage0 {T R } {f : T -> R} {A : set R} :
A `&` range f `<=` set0 -> f @^-1 ` A = set0.6d4 6d5 A : set R
A `&` range f `<=` set0 -> f @^-1 ` A = set0
Proof .70a
by rewrite -subset0 => + x /= Afx => /(_ (f x))[]; split . Qed .
Lemma preimage10P {T R } {f : T -> R} {x } : ~ range f x <-> f @^-1 ` [set x] = set0.6d4 6d5 x : R
~ range f x <-> f @^-1 ` [set x] = set0
Proof .711
split => [fx|]; first by rewrite preimage0// => ? [->].713 f @^-1 ` [set x] = set0 -> ~ range f x
by apply : contraPnot => -[t _ <-] /seteqP[+ _] => /(_ t) /=.
Qed .
Lemma preimage10 {T R } {f : T -> R} {x } : ~ range f x -> f @^-1 ` [set x] = set0.713 ~ range f x -> f @^-1 ` [set x] = set0
Proof .71c
by move /preimage10P. Qed .
End image_lemmas .
Arguments sub_image_setI {aT rT f A B} t _.
Lemma image2_subset {aT bT rT : Type } (f : aT -> bT -> rT)
(A B : set aT) (C D : set bT) : A `<=` B -> C `<=` D ->
[set f x y | x in A & y in C] `<=` [set f x y | x in B & y in D].aT, bT, rT : Type f : aT -> bT -> rT 5e2 C, D : set bT
A `<=` B ->
C `<=` D ->
[set f x y | x in A & y in C]
`<=` [set f x y | x in B & y in D]
Proof .721
by move => AB CD; rewrite !image2E; apply : image_subset; exact : setSM. Qed .
Lemma image_comp T1 T2 T3 (f : T1 -> T2) (g : T2 -> T3) A :
g @` (f @` A) = (g \o f) @` A.T1, T2, T3 : Type f : T1 -> T2 g : T2 -> T3 448
[set g x | x in [set f x | x in A]] =
[set (g \o f) x | x in A]
Proof .72a
by rewrite eqEsubset; split => [x [b [a Aa] <- <-]|x [a Aa] <-];
[apply /imageP |apply /imageP/imageP].
Qed .
Lemma subKimage {T T' } {P : set (set T')} (f : T -> T') (g : T' -> T) :
cancel f g -> [set A | P (f @` A)] `<=` [set g @` A | A in P].c4 P : set (set T')f : T -> T' g : T' -> T
cancel f g ->
[set A | P [set f x | x in A]]
`<=` [set [set g x | x in A] | A in P]
Proof .733
by move => ? A; exists (f @` A); rewrite ?image_comp ?eq_image_id /=. Qed .
Lemma subimageK T T' (P : set (set T')) (f : T -> T') (g : T' -> T) :
cancel g f -> [set g @` A | A in P] `<=` [set A | P (f @` A)].735 cancel g f ->
[set [set g x | x in A] | A in P]
`<=` [set A | P [set f x | x in A]]
Proof .73c
by move => gK _ [B /= ? <-]; rewrite image_comp eq_image_id/=. Qed .
Lemma eq_imageK {T T' } {P : set (set T')} (f : T -> T') (g : T' -> T) :
cancel f g -> cancel g f ->
[set g @` A | A in P] = [set A | P (f @` A)].735 cancel f g ->
cancel g f ->
[set [set g x | x in A] | A in P] =
[set A | P [set f x | x in A]]
Proof .741
by move => fK gK; apply /seteqP; split ; [apply : subimageK | apply : subKimage].
Qed .
Lemma some_set0 {T } : some @` set0 = set0 :> set (option T).e5 [set Some x | x in set0] = set0
Proof .746
by rewrite -subset0 => x []. Qed .
Lemma some_set1 {T } (x : T) : some @` [set x] = [set some x].a1 [set Some x | x in [set x]] = [set Some x]
Proof .74b
by apply /seteqP; split => [_ [_ -> <-]|_ ->]//=; exists x . Qed .
Lemma some_setC {T } (A : set T) : some @` (~` A) = [set ~ None] `\` (some @` A).91 [set Some x | x in ~` A] =
[set ~ None] `\` [set Some x | x in A]
Proof .750
apply /seteqP; split ; first by move => _ [x nAx <-]; split => // -[y /[swap ]-[->]].91 [set ~ None] `\` [set Some x | x in A]
`<=` [set Some x | x in ~` A]
by move => [x [_ exAx]|[/(_ erefl)//]]; exists x => // Ax; apply : exAx; exists x .
Qed .
Lemma some_setT {T } : some @` [set : T] = [set ~ None].e5 range Some = [set ~ None]
Proof .759
by rewrite -[setT]setCK some_setC setCT some_set0 setD0. Qed .
Lemma some_setI {T } (A B : set T) : some @` (A `&` B) = some @` A `&` some @` B.d3 [set Some x | x in A `&` B] =
[set Some x | x in A] `&` [set Some x | x in B]
Proof .75e
apply /seteqP; split ; first by move => _ [x [Ax Bx] <-]; split ; exists x .d3 [set Some x | x in A] `&` [set Some x | x in B]
`<=` [set Some x | x in A `&` B]
by move => _ [[x + <-] [y By []]] => /[swap ]<- Ay; exists y .
Qed .
Lemma some_setU {T } (A B : set T) : some @` (A `|` B) = some @` A `|` some @` B.d3 [set Some x | x in A `|` B] =
[set Some x | x in A] `|` [set Some x | x in B]
Proof .767
by rewrite -[_ `|` _]setCK setCU some_setC some_setI setDIr -!some_setC !setCK.
Qed .
Lemma some_setD {T } (A B : set T) : some @` (A `\` B) = (some @` A) `\` (some @` B).d3 [set Some x | x in A `\` B] =
[set Some x | x in A] `\` [set Some x | x in B]
Proof .76c
by rewrite some_setI some_setC setIDA setIidl// => _ [? _ <-]. Qed .
Lemma sub_image_some {T } (A B : set T) : some @` A `<=` some @` B -> A `<=` B.d3 [set Some x | x in A] `<=` [set Some x | x in B] ->
A `<=` B
Proof .771
by move => + x Ax => /(_ (Some x))[|y By [<-]]; first by exists x . Qed .
Lemma sub_image_someP {T } (A B : set T) : some @` A `<=` some @` B <-> A `<=` B.d3 [set Some x | x in A] `<=` [set Some x | x in B] <->
A `<=` B
Proof .776
by split => [/sub_image_some//|/image_subset]. Qed .
Lemma image_some_inj {T } (A B : set T) : some @` A = some @` B -> A = B.d3 [set Some x | x in A] = [set Some x | x in B] -> A = B
Proof .77b
by move => e; apply /seteqP; split ; apply : sub_image_some; rewrite e. Qed .
Lemma some_set_eq0 {T } (A : set T) : some @` A = set0 <-> A = set0.91 [set Some x | x in A] = set0 <-> A = set0
Proof .780
split => [|->]; last by rewrite some_set0.91 [set Some x | x in A] = set0 -> A = set0
by rewrite -!subset0 => A0 x Ax; apply : (A0 (some x)); exists x .
Qed .
Lemma some_preimage {aT rT } (f : aT -> rT) (A : set rT) :
some @` (f @^-1 ` A) = omap f @^-1 ` (some @` A).5b4 5b5 A : set rT
[set Some x | x in f @^-1 ` A] =
omap f @^-1 ` [set Some x | x in A]
Proof .789
apply /seteqP; split ; first by move => _ [a Afa <-]; exists (f a ).78b omap f @^-1 ` [set Some x | x in A]
`<=` [set Some x | x in f @^-1 ` A]
by move => [x|] [a Aa //= [afx]]; exists x ; rewrite // -afx.
Qed .
Lemma some_image {aT rT } (f : aT -> rT) (A : set aT) :
some @` (f @` A) = omap f @` (some @` A).64d [set Some x | x in [set f x | x in A]] =
[set omap f x | x in [set Some x | x in A]]
Proof .794
by rewrite !image_comp. Qed .
Lemma disj_set_some {T } {A B : set T} :
[disjoint some @` A & some @` B] = [disjoint A & B].d3 [disjoint
[set Some x | x in A]
& [set Some x | x in B]] = [disjoint A & B]
Proof .799
by apply /disj_setPS/disj_setPS; rewrite -some_setI -some_set0 sub_image_someP.
Qed .
Section bigop_lemmas .
Context {T I : Type }.
Implicit Types (A : set T) (i : I) (P : set I) (F G : I -> set T).
Lemma bigcup_sup i P F : P i -> F i `<=` \bigcup_(j in P) F j.T, I : Type 6ce 46a F : I -> set T
P i -> F i `<=` \bigcup_(j in P) F j
Proof .79e
by move => Pi a Fia; exists i . Qed .
Lemma bigcap_inf i P F : P i -> \bigcap_(j in P) F j `<=` F i.7a0 P i -> \bigcap_(j in P) F j `<=` F i
Proof .7a6
by move => Pi a /(_ i); apply . Qed .
Lemma subset_bigcup_r P : {homo (fun x : I -> set T => \bigcup_(i in P) x i)
: F G / [set F i | i in P] `<=` [set G i | i in P] >-> F `<=` G}.7a1 46a
{homo (fun x : I -> set T => \bigcup_(i in P) x i) : F G /
[set F i | i in P] `<=` [set G i | i in P] >-> F
`<=` G}
Proof .7ab
move => F G FG t [i Pi Fit]; have := FG (F i).7a1 46a F, G : I -> set T FG : [set F i | i in P] `<=` [set G i | i in P] 26b 6ce Pi : P i Fit : F i t
([set F i | i in P] (F i) -> [set G i | i in P] (F i)) ->
(\bigcup_(i in P) G i) t
by move => /(_ (ex_intro2 _ _ _ Pi erefl))[j Pj ji]; exists j => //; rewrite ji.
Qed .
Lemma subset_bigcap_r P : {homo (fun x : I -> set T => \bigcap_(i in P) x i)
: F G / [set F i | i in P] `<=` [set G i | i in P] >-> G `<=` F}.7ad {homo (fun x : I -> set T => \bigcap_(i in P) x i) : F G /
[set F i | i in P] `<=` [set G i | i in P] >-> G
`<=` F}
Proof .7ba
by move => F G FG t Gt i Pi; have [|j Pj <-] := FG (F i); [exists i |apply : Gt].
Qed .
Lemma eq_bigcupr P F G : (forall i , P i -> F i = G i) ->
\bigcup_(i in P) F i = \bigcup_(i in P) G i.7a1 46a 7b4
(forall i , P i -> F i = G i) ->
\bigcup_(i in P) F i = \bigcup_(i in P) G i
Proof .7bf
by move => FG; rewrite eqEsubset; split ; apply : subset_bigcup_r;
move => A [i ? <-]; exists i => //; rewrite FG.
Qed .
Lemma eq_bigcapr P F G : (forall i , P i -> F i = G i) ->
\bigcap_(i in P) F i = \bigcap_(i in P) G i.7c1 (forall i , P i -> F i = G i) ->
\bigcap_(i in P) F i = \bigcap_(i in P) G i
Proof .7c5
by move => FG; rewrite eqEsubset; split ; apply : subset_bigcap_r;
move => A [i ? <-]; exists i => //; rewrite FG.
Qed .
Lemma setC_bigcup P F : ~` (\bigcup_(i in P) F i) = \bigcap_(i in P) ~` F i.7a1 46a 7a2
~` (\bigcup_(i in P) F i) = \bigcap_(i in P) ~` F i
Proof .7ca
by rewrite eqEsubset; split => [t PFt i Pi ?|t PFt [i Pi ?]];
[apply PFt; exists i | exact : (PFt _ Pi)].
Qed .
Lemma setC_bigcap P F : ~` (\bigcap_(i in P) (F i)) = \bigcup_(i in P) ~` F i.7cc ~` (\bigcap_(i in P) F i) = \bigcup_(i in P) ~` F i
Proof .7d0
apply : setC_inj; rewrite setC_bigcup setCK.7cc \bigcap_(i in P) F i = \bigcap_(i in P) ~` ~` F i
by apply : eq_bigcapr => ?; rewrite setCK.
Qed .
Lemma image_bigcup rT P F (f : T -> rT) :
f @` (\bigcup_(i in P) (F i)) = \bigcup_(i in P) f @` F i.T, I, rT : Type 46a 7a2 1c
[set f x | x in \bigcup_(i in P) F i] =
\bigcup_(i in P) [set f x | x in F i]
Proof .7d9
apply /seteqP; split => [_/= [x [i Pi Fix <-]]|]; first by exists i .7db \bigcup_(i in P) [set f x | x in F i]
`<=` [set f x | x in \bigcup_(i in P) F i]
by move => _ [i Pi [x Fix <-]]; exists x => //; exists i .
Qed .
Lemma some_bigcap P F : some @` (\bigcap_(i in P) (F i)) =
[set ~ None] `&` \bigcap_(i in P) some @` F i.7cc [set Some x | x in \bigcap_(i in P) F i] =
[set ~ None]
`&` \bigcap_(i in P) [set Some x | x in F i]
Proof .7e4
apply /seteqP; split .7cc [set Some x | x in \bigcap_(i in P) F i]
`<=` [set ~ None]
`&` \bigcap_(i in P) [set Some x | x in F i]
by move => _ [x Fx <-]; split => // i; exists x => //; apply : Fx.
by move => [x|[//=]] [_ Fx]; exists x => //= i /Fx [y ? [<-]].
Qed .
Lemma bigcup_set_type P F : \bigcup_(i in P) F i = \bigcup_(j : P) F (val j).7cc \bigcup_(i in P) F i = \bigcup_j F (val j)
Proof .7f3
rewrite predeqE => x; split ; last by move => [[i/= /set_mem Pi] _ Fix]; exists i .7a1 46a 7a2 b
(\bigcup_(i in P) F i) x -> (\bigcup_j F (val j)) x
by move => [i Pi Fix]; exists (SigSub (mem_set Pi)).
Qed .
Lemma eq_bigcupl P Q F : P `<=>` Q ->
\bigcup_(i in P) F i = \bigcup_(i in Q) F i.7a1 P, Q : set I7a2
P `<=>` Q ->
\bigcup_(i in P) F i = \bigcup_(i in Q) F i
Proof .7fd
by move => /seteqP->. Qed .
Lemma eq_bigcapl P Q F : P `<=>` Q ->
\bigcap_(i in P) F i = \bigcap_(i in Q) F i.7ff P `<=>` Q ->
\bigcap_(i in P) F i = \bigcap_(i in Q) F i
Proof .804
by move => /seteqP->. Qed .
Lemma eq_bigcup P Q F G : P `<=>` Q -> (forall i , P i -> F i = G i) ->
\bigcup_(i in P) F i = \bigcup_(i in Q) G i.7a1 800 7b4
P `<=>` Q ->
(forall i , P i -> F i = G i) ->
\bigcup_(i in P) F i = \bigcup_(i in Q) G i
Proof .809
by move => /eq_bigcupl<- /eq_bigcupr->. Qed .
Lemma eq_bigcap P Q F G : P `<=>` Q -> (forall i , P i -> F i = G i) ->
\bigcap_(i in P) F i = \bigcap_(i in Q) G i.80b P `<=>` Q ->
(forall i , P i -> F i = G i) ->
\bigcap_(i in P) F i = \bigcap_(i in Q) G i
Proof .80f
by move => /eq_bigcapl<- /eq_bigcapr->. Qed .
Lemma bigcupU P F G : \bigcup_(i in P) (F i `|` G i) =
(\bigcup_(i in P) F i) `|` (\bigcup_(i in P) G i).7c1 \bigcup_(i in P) (F i `|` G i) =
\bigcup_(i in P) F i `|` \bigcup_(i in P) G i
Proof .814
apply /predeqP => x; split => [[i Pi [Fix|Gix]]|[[i Pi Fix]|[i Pi Gix]]];
by [left ; exists i |right ; exists i |exists i =>//; left |exists i =>//; right ].
Qed .
Lemma bigcapI P F G : \bigcap_(i in P) (F i `&` G i) =
(\bigcap_(i in P) F i) `&` (\bigcap_(i in P) G i).7c1 \bigcap_(i in P) (F i `&` G i) =
\bigcap_(i in P) F i `&` \bigcap_(i in P) G i
Proof .819
apply : setC_inj; rewrite !(setCI, setC_bigcap) -bigcupU.7c1 \bigcup_(i in P) ~` (F i `&` G i) =
\bigcup_(i in P) (~` F i `|` ~` G i)
by apply : eq_bigcupr => *; rewrite setCI.
Qed .
Lemma bigcup_const P A : P !=set0 -> \bigcup_(_ in P) A = A.7a1 46a a
P !=set0 -> \bigcup_(_ in P) A = A
Proof .822
by case => j ?; rewrite predeqE => x; split => [[i //]|Ax]; exists j . Qed .
Lemma bigcap_const P A : P !=set0 -> \bigcap_(_ in P) A = A.824 P !=set0 -> \bigcap_(_ in P) A = A
Proof .828
by move => PN0; apply : setC_inj; rewrite setC_bigcap bigcup_const. Qed .
Lemma bigcapIl P F A : P !=set0 ->
\bigcap_(i in P) (F i `&` A) = \bigcap_(i in P) F i `&` A.7a1 46a 7a2 a
P !=set0 ->
\bigcap_(i in P) (F i `&` A) =
\bigcap_(i in P) F i `&` A
Proof .82d
by move => PN0; rewrite bigcapI bigcap_const. Qed .
Lemma bigcapIr P F A : P !=set0 ->
\bigcap_(i in P) (A `&` F i) = A `&` \bigcap_(i in P) F i.82f P !=set0 ->
\bigcap_(i in P) (A `&` F i) =
A `&` \bigcap_(i in P) F i
Proof .833
by move => PN0; rewrite bigcapI bigcap_const. Qed .
Lemma bigcupUl P F A : P !=set0 ->
\bigcup_(i in P) (F i `|` A) = \bigcup_(i in P) F i `|` A.82f P !=set0 ->
\bigcup_(i in P) (F i `|` A) =
\bigcup_(i in P) F i `|` A
Proof .838
by move => PN0; rewrite bigcupU bigcup_const. Qed .
Lemma bigcupUr P F A : P !=set0 ->
\bigcup_(i in P) (A `|` F i) = A `|` \bigcup_(i in P) F i.82f P !=set0 ->
\bigcup_(i in P) (A `|` F i) =
A `|` \bigcup_(i in P) F i
Proof .83d
by move => PN0; rewrite bigcupU bigcup_const. Qed .
Lemma bigcup_set0 F : \bigcup_(i in set0) F i = set0.7a1 7a2
\bigcup_(i in set0) F i = set0
Proof .842
by rewrite eqEsubset; split => a // []. Qed .
Lemma bigcup_set1 F i : \bigcup_(j in [set i]) F j = F i.7a1 7a2 6ce
\bigcup_(j in [set i]) F j = F i
Proof .848
by rewrite eqEsubset; split => ? => [[] ? -> //|]; exists i . Qed .
Lemma bigcap_set0 F : \bigcap_(i in set0) F i = setT.844 \bigcap_(i in set0) F i = [set : T]
Proof .84e
by rewrite eqEsubset; split => a // []. Qed .
Lemma bigcap_set1 F i : \bigcap_(j in [set i]) F j = F i.84a \bigcap_(j in [set i]) F j = F i
Proof .853
by rewrite eqEsubset; split => ?; [exact |move => ? ? ->]. Qed .
Lemma bigcup_nonempty P F :
(\bigcup_(i in P) F i !=set0) <-> exists2 i, P i & F i !=set0.7cc \bigcup_(i in P) F i !=set0 <->
(exists2 i : I, P i & F i !=set0)
Proof .858
split => [[t [i ? ?]]|[j ? [t ?]]]; by [exists i => //; exists t | exists t , j].
Qed .
Lemma bigcup0 P F :
(forall i , P i -> F i = set0) -> \bigcup_(i in P) F i = set0.7cc (forall i , P i -> F i = set0) ->
\bigcup_(i in P) F i = set0
Proof .85d
by move => PF; rewrite -subset0 => t -[i /PF ->]. Qed .
Lemma bigcap0 P F :
(exists2 i, P i & F i = set0) -> \bigcap_(i in P) F i = set0.7cc (exists2 i : I, P i & F i = set0) ->
\bigcap_(i in P) F i = set0
Proof .862
by move => [i Pi]; rewrite -!subset0 => Fi t Ft; apply /Fi/Ft. Qed .
Lemma bigcapT P F :
(forall i , P i -> F i = setT) -> \bigcap_(i in P) F i = setT.7cc (forall i , P i -> F i = [set : T]) ->
\bigcap_(i in P) F i = [set : T]
Proof .867
by move => PF; rewrite -subTset => t -[i /PF ->]. Qed .
Lemma bigcupT P F :
(exists2 i, P i & F i = setT) -> \bigcup_(i in P) F i = setT.7cc (exists2 i : I, P i & F i = [set : T]) ->
\bigcup_(i in P) F i = [set : T]
Proof .86c
by move => [i Pi F0]; rewrite -subTset => t; exists i ; rewrite ?F0 . Qed .
Lemma bigcup0P P F :
(\bigcup_(i in P) F i = set0) <-> forall i , P i -> F i = set0.7cc \bigcup_(i in P) F i = set0 <->
(forall i , P i -> F i = set0)
Proof .871
split => [|/bigcup0//]; rewrite -subset0 => F0 i Pi; rewrite -subset0.7a1 46a 7a2 F0 : \bigcup_(i in P) F i `<=` set0 6ce 7b6
F i `<=` set0
by move => t Ft; apply : F0; exists i .
Qed .
Lemma bigcapTP P F :
(\bigcap_(i in P) F i = setT) <-> forall i , P i -> F i = setT.7cc \bigcap_(i in P) F i = [set : T] <->
(forall i , P i -> F i = [set : T])
Proof .87c
split => [|/bigcapT//]; rewrite -subTset => FT i Pi; rewrite -subTset.7a1 46a 7a2 FT : [set : T] `<=` \bigcap_(i in P) F i 6ce 7b6
[set : T] `<=` F i
by move => t _; apply : FT.
Qed .
Lemma setI_bigcupr F P A :
A `&` \bigcup_(i in P) F i = \bigcup_(i in P) (A `&` F i).7a1 7a2 46a a
A `&` \bigcup_(i in P) F i =
\bigcup_(i in P) (A `&` F i)
Proof .887
rewrite predeqE => t; split => [[At [k ? ?]]|[k ? [At ?]]];
by [exists k |split => //; exists k ].
Qed .
Lemma setI_bigcupl F P A :
\bigcup_(i in P) F i `&` A = \bigcup_(i in P) (F i `&` A).889 \bigcup_(i in P) F i `&` A =
\bigcup_(i in P) (F i `&` A)
Proof .88d
by rewrite setIC setI_bigcupr//; under eq_bigcupr do rewrite setIC. Qed .
Lemma setU_bigcapr F P A :
A `|` \bigcap_(i in P) F i = \bigcap_(i in P) (A `|` F i).889 A `|` \bigcap_(i in P) F i =
\bigcap_(i in P) (A `|` F i)
Proof .892
apply : setC_inj; rewrite setCU !setC_bigcap setI_bigcupr.889 \bigcup_(i in P) (~` A `&` ~` F i) =
\bigcup_(i in P) ~` (A `|` F i)
by under eq_bigcupr do rewrite -setCU.
Qed .
Lemma setU_bigcapl F P A :
\bigcap_(i in P) F i `|` A = \bigcap_(i in P) (F i `|` A).889 \bigcap_(i in P) F i `|` A =
\bigcap_(i in P) (F i `|` A)
Proof .89b
by rewrite setUC setU_bigcapr//; under eq_bigcapr do rewrite setUC. Qed .
Lemma bigcup_mkcond P F :
\bigcup_(i in P) F i = \bigcup_i if i \in P then F i else set0.7cc \bigcup_(i in P) F i =
\bigcup_i (if i \in P then F i else set0)
Proof .8a0
rewrite predeqE => x; split => [[i Pi Fix]|[i _]].7a1 46a 7a2 b 6ce 7b6 Fix : F i x
(\bigcup_i (if i \in P then F i else set0)) x
by exists i => //; case : ifPn; rewrite (inE, notin_set).
by case : ifPn; rewrite (inE, notin_set) => Pi Fix; exists i .
Qed .
Lemma bigcup_mkcondr P Q F :
\bigcup_(i in P `&` Q) F i = \bigcup_(i in P) if i \in Q then F i else set0.7ff \bigcup_(i in P `&` Q) F i =
\bigcup_(i in P) (if i \in Q then F i else set0)
Proof .8b2
rewrite bigcup_mkcond [RHS]bigcup_mkcond; apply : eq_bigcupr => i _.7a1 800 7a2 6ce
(if i \in P `&` Q then F i else set0) =
(if i \in P
then if i \in Q then F i else set0
else set0)
by rewrite in_setI; case : (i \in P) (i \in Q) => [] [].
Qed .
Lemma bigcup_mkcondl P Q F :
\bigcup_(i in P `&` Q) F i = \bigcup_(i in Q) if i \in P then F i else set0.7ff \bigcup_(i in P `&` Q) F i =
\bigcup_(i in Q) (if i \in P then F i else set0)
Proof .8bc
rewrite bigcup_mkcond [RHS]bigcup_mkcond; apply : eq_bigcupr => i _.8b9 (if i \in P `&` Q then F i else set0) =
(if i \in Q
then if i \in P then F i else set0
else set0)
by rewrite in_setI; case : (i \in P) (i \in Q) => [] [].
Qed .
Lemma bigcap_mkcond F P :
\bigcap_(i in P) F i = \bigcap_i if i \in P then F i else setT.7a1 7a2 46a
\bigcap_(i in P) F i =
\bigcap_i (if i \in P then F i else [set : T])
Proof .8c5
apply : setC_inj; rewrite !setC_bigcap bigcup_mkcond; apply : eq_bigcupr => i _.7a1 7a2 46a 6ce
(if i \in P then ~` F i else set0) =
~` (if i \in P then F i else [set : T])
by case : ifP; rewrite ?setCT .
Qed .
Lemma bigcap_mkcondr P Q F :
\bigcap_(i in P `&` Q) F i = \bigcap_(i in P) if i \in Q then F i else setT.7ff \bigcap_(i in P `&` Q) F i =
\bigcap_(i in P) (if i \in Q then F i else [set : T])
Proof .8d0
rewrite bigcap_mkcond [RHS]bigcap_mkcond; apply : eq_bigcapr => i _.8b9 (if i \in P `&` Q then F i else [set : T]) =
(if i \in P
then if i \in Q then F i else [set : T]
else [set : T])
by rewrite in_setI; case : (i \in P) (i \in Q) => [] [].
Qed .
Lemma bigcap_mkcondl P Q F :
\bigcap_(i in P `&` Q) F i = \bigcap_(i in Q) if i \in P then F i else setT.7ff \bigcap_(i in P `&` Q) F i =
\bigcap_(i in Q) (if i \in P then F i else [set : T])
Proof .8d9
rewrite bigcap_mkcond [RHS]bigcap_mkcond; apply : eq_bigcapr => i _.8b9 (if i \in P `&` Q then F i else [set : T]) =
(if i \in Q
then if i \in P then F i else [set : T]
else [set : T])
by rewrite in_setI; case : (i \in P) (i \in Q) => [] [].
Qed .
Lemma bigcup_imset1 P (f : I -> T) : \bigcup_(x in P) [set f x] = f @` P.7a1 46a f : I -> T
\bigcup_(x in P) [set f x] = [set f x | x in P]
Proof .8e2
by rewrite eqEsubset; split =>[a [i ?]->| a [i ?]<-]; [apply : imageP | exists i ].
Qed .
Lemma bigcup_setU F (X Y : set I) :
\bigcup_(i in X `|` Y) F i = \bigcup_(i in X) F i `|` \bigcup_(i in Y) F i.7a1 7a2 X, Y : set I
\bigcup_(i in (X `|` Y)) F i =
\bigcup_(i in X) F i `|` \bigcup_(i in Y) F i
Proof .8e9
rewrite predeqE => t; split => [[z]|].7a1 7a2 8ec 26b z : I
(X `|` Y) z ->
F z t ->
(\bigcup_(i in X) F i `|` \bigcup_(i in Y) F i) t
by move => [Xz|Yz]; [left |right ]; exists z .
by move => [[z Xz Fzy]|[z Yz Fxz]]; exists z => //; [left |right ].
Qed .
Lemma bigcap_setU F (X Y : set I) :
\bigcap_(i in X `|` Y) F i = \bigcap_(i in X) F i `&` \bigcap_(i in Y) F i.8eb \bigcap_(i in (X `|` Y)) F i =
\bigcap_(i in X) F i `&` \bigcap_(i in Y) F i
Proof .8fd
by apply : setC_inj; rewrite !(setCI, setC_bigcap) bigcup_setU. Qed .
Lemma bigcup_setU1 F (x : I) (X : set I) :
\bigcup_(i in x |` X) F i = F x `|` \bigcup_(i in X) F i.7a1 7a2 x : I X : set I
\bigcup_(i in (x |` X)) F i =
F x `|` \bigcup_(i in X) F i
Proof .902
by rewrite bigcup_setU bigcup_set1. Qed .
Lemma bigcap_setU1 F (x : I) (X : set I) :
\bigcap_(i in x |` X) F i = F x `&` \bigcap_(i in X) F i.904 \bigcap_(i in (x |` X)) F i =
F x `&` \bigcap_(i in X) F i
Proof .90a
by rewrite bigcap_setU bigcap_set1. Qed .
Lemma bigcup_setD1 (x : I) F (X : set I) : X x ->
\bigcup_(i in X) F i = F x `|` \bigcup_(i in X `\ x) F i.7a1 905 7a2 906
X x ->
\bigcup_(i in X) F i =
F x `|` \bigcup_(i in X `\ x) F i
Proof .90f
by move => Xx; rewrite -bigcup_setU1 setD1K. Qed .
Lemma bigcap_setD1 (x : I) F (X : set I) : X x ->
\bigcap_(i in X) F i = F x `&` \bigcap_(i in X `\ x) F i.911 X x ->
\bigcap_(i in X) F i =
F x `&` \bigcap_(i in X `\ x) F i
Proof .915
by move => Xx; rewrite -bigcap_setU1 setD1K. Qed .
Lemma setC_bigsetU U (s : seq T) (f : T -> set U) (P : pred T) :
(~` \big[setU/set0]_(t <- s | P t) f t) = \big[setI/setT]_(t <- s | P t) ~` f t.T, I, U : Type s : seq T f : T -> set U 10c
~` (\big[setU/set0]_(t <- s | P t) f t) =
\big[setI/[set : U]]_(t <- s | P t) ~` f t
Proof .91a
by elim /big_rec2: _ => [|i X Y Pi <-]; rewrite ?setC0 ?setCU . Qed .
Lemma setC_bigsetI U (s : seq T) (f : T -> set U) (P : pred T) :
(~` \big[setI/setT]_(t <- s | P t) f t) = \big[setU/set0]_(t <- s | P t) ~` f t.91c ~` (\big[setI/[set : U]]_(t <- s | P t) f t) =
\big[setU/set0]_(t <- s | P t) ~` f t
Proof .923
by elim /big_rec2: _ => [|i X Y Pi <-]; rewrite ?setCT ?setCI . Qed .
Lemma bigcupDr (F : I -> set T) (P : set I) (A : set T) : P !=set0 ->
\bigcap_(i in P) (A `\` F i) = A `\` \bigcup_(i in P) F i.889 P !=set0 ->
\bigcap_(i in P) (A `\` F i) =
A `\` \bigcup_(i in P) F i
Proof .928
by move => PN0; rewrite setDE setC_bigcup -bigcapIr. Qed .
Lemma setD_bigcupl (F : I -> set T) (P : set I) (A : set T) :
\bigcup_(i in P) F i `\` A = \bigcup_(i in P) (F i `\` A).889 \bigcup_(i in P) F i `\` A =
\bigcup_(i in P) (F i `\` A)
Proof .92d
by rewrite setDE setI_bigcupl; under eq_bigcupr do rewrite -setDE. Qed .
Lemma bigcup_bigcup_dep {J : Type } (F : I -> J -> set T) (P : set I) (Q : I -> set J) :
\bigcup_(i in P) \bigcup_(j in Q i) F i j =
\bigcup_(k in P `*`` Q) F k.1 k.2 .T, I, J : Type F : I -> J -> set T 46a Q : I -> set J
\bigcup_(i in P) \bigcup_(j in Q i) F i j =
\bigcup_(k in P `*`` Q) F k.1 k.2
Proof .932
apply /predeqP => x; split => [[i Pi [j Pj Fijx]]|]; first by exists (i , j).935 936 46a 937 b
(\bigcup_(k in P `*`` Q) F k.1 k.2 ) x ->
(\bigcup_(i in P) \bigcup_(j in Q i) F i j) x
by move => [[/= i j] [Pi Qj] Fijx]; exists i => //; exists j .
Qed .
Lemma bigcup_bigcup {J : Type } (F : I -> J -> set T) (P : set I) (Q : set J) :
\bigcup_(i in P) \bigcup_(j in Q) F i j =
\bigcup_(k in P `*` Q) F k.1 k.2 .935 936 46a Q : set J
\bigcup_(i in P) \bigcup_(j in Q) F i j =
\bigcup_(k in P `*` Q) F k.1 k.2
Proof .940
exact : bigcup_bigcup_dep. Qed .
Lemma bigcupID (Q : set I) (F : I -> set T) (P : set I) :
\bigcup_(i in P) F i =
(\bigcup_(i in P `&` Q) F i) `|` (\bigcup_(i in P `&` ~` Q) F i).7a1 Q : set I7a2 46a
\bigcup_(i in P) F i =
\bigcup_(i in P `&` Q) F i
`|` \bigcup_(i in P `&` ~` Q) F i
Proof .947
by rewrite -bigcup_setU -setIUr setUv setIT. Qed .
Lemma bigcapID (Q : set I) (F : I -> set T) (P : set I) :
\bigcap_(i in P) F i =
(\bigcap_(i in P `&` Q) F i) `&` (\bigcap_(i in P `&` ~` Q) F i).949 \bigcap_(i in P) F i =
\bigcap_(i in P `&` Q) F i
`&` \bigcap_(i in P `&` ~` Q) F i
Proof .94e
by rewrite -bigcap_setU -setIUr setUv setIT. Qed .
End bigop_lemmas .
Arguments bigcup_setD1 {T I} x.
Arguments bigcap_setD1 {T I} x.
Definition bigcup2 T (A B : set T) : nat -> set T :=
fun i => if i == 0 then A else if i == 1 then B else set0.
Arguments bigcup2 T A B n /.
Lemma bigcup2E T (A B : set T) : \bigcup_i (bigcup2 A B) i = A `|` B.d3 \bigcup_i bigcup2 A B i = A `|` B
Proof .953
rewrite predeqE => t; split => [|[At|Bt]]; [|by exists 0 |by exists 1 ].9 b3 26b
(\bigcup_i bigcup2 A B i) t -> (A `|` B) t
by case => -[_ At|[_ Bt|//]]; [left |right ].
Qed .
Lemma bigcup2inE T (A B : set T) : \bigcup_(i < 2 ) (bigcup2 A B) i = A `|` B.d3 \bigcup_(i < 2 ) bigcup2 A B i = A `|` B
Proof .95d
rewrite predeqE => t; split => [|[At|Bt]]; [|by exists 0 |by exists 1 ].95a (\bigcup_(i < 2 ) bigcup2 A B i) t -> (A `|` B) t
by case => -[_ At|[_ Bt|//]]; [left |right ].
Qed .
Definition bigcap2 T (A B : set T) : nat -> set T :=
fun i => if i == 0 then A else if i == 1 then B else setT.
Arguments bigcap2 T A B n /.
Lemma bigcap2E T (A B : set T) : \bigcap_i (bigcap2 A B) i = A `&` B.d3 \bigcap_i bigcap2 A B i = A `&` B
Proof .966
apply : setC_inj; rewrite setC_bigcap setCI -bigcup2E /bigcap2 /bigcup2.d3 \bigcup_i
~`
(if i == 0
then A
else if i == 1 then B else [set : T]) =
\bigcup_i
(if i == 0
then ~` A
else if i == 1 then ~` B else set0)
by apply : eq_bigcupr => -[|[|[]]]//=; rewrite setCT.
Qed .
Lemma bigcap2inE T (A B : set T) : \bigcap_(i < 2 ) (bigcap2 A B) i = A `&` B.d3 \bigcap_(i < 2 ) bigcap2 A B i = A `&` B
Proof .96f
apply : setC_inj; rewrite setC_bigcap setCI -bigcup2inE /bigcap2 /bigcup2.d3 \bigcup_(i < 2 )
~`
(if i == 0
then A
else if i == 1 then B else [set : T]) =
\bigcup_(i < 2 )
(if i == 0
then ~` A
else if i == 1 then ~` B else set0)
by apply : eq_bigcupr => // -[|[|[]]].
Qed .
Lemma bigcup_sub T I (F : I -> set T) (D : set T) (P : set I) :
(forall i , P i -> F i `<=` D) -> \bigcup_(i in P) F i `<=` D.7a1 7a2 65 46a
(forall i : I, P i -> F i `<=` D) ->
\bigcup_(i in P) F i `<=` D
Proof .978
by move => FD t [n Pn Fnt]; apply : (FD n). Qed .
Lemma sub_bigcap T I (F : I -> set T) (D : set T) (P : set I) :
(forall i , P i -> D `<=` F i) -> D `<=` \bigcap_(i in P) F i.97a (forall i : I, P i -> D `<=` F i) ->
D `<=` \bigcap_(i in P) F i
Proof .97e
by move => DF t Dt n Pn; apply : DF. Qed .
Lemma subset_bigcup T I [P : set I] [F G : I -> set T] :
(forall i , P i -> F i `<=` G i) ->
\bigcup_(i in P) F i `<=` \bigcup_(i in P) G i.7c1 (forall i : I, P i -> F i `<=` G i) ->
\bigcup_(i in P) F i `<=` \bigcup_(i in P) G i
Proof .983
by move => FG; apply : bigcup_sub => i Pi + /(FG _ Pi); apply : bigcup_sup.
Qed .
Lemma subset_bigcap T I [P : set I] [F G : I -> set T] :
(forall i , P i -> F i `<=` G i) ->
\bigcap_(i in P) F i `<=` \bigcap_(i in P) G i.7c1 (forall i : I, P i -> F i `<=` G i) ->
\bigcap_(i in P) F i `<=` \bigcap_(i in P) G i
Proof .988
move => FG; apply : sub_bigcap => i Pi x Fx; apply : FG => //.7a1 46a 7b4 6ce 7b6 b Fx : (\bigcap_(i in P) F i) x
F i x
exact : bigcap_inf Fx.
Qed .
Lemma bigcup_image {aT rT I } (P : set aT) (f : aT -> I) (F : I -> set rT) :
\bigcup_(x in f @` P) F x = \bigcup_(x in P) F (f x).6b7 P : set aTf : aT -> I 6b8
\bigcup_(x in [set f x | x in P]) F x =
\bigcup_(x in P) F (f x)
Proof .993
rewrite eqEsubset; split => x; first by case => j [] i pi <- Xfix; exists i .6b7 996 997 6b8 681
(\bigcup_(x in P) F (f x)) x ->
(\bigcup_(x in [set f x | x in P]) F x) x
by case => i Pi Ffix; exists (f i ); [exists i |].
Qed .
Lemma bigcap_set_type {I T } (P : set I) (F : I -> set T) :
\bigcap_(i in P) F i = \bigcap_(j : P) F (val j).I, T : Type 46a 7a2
\bigcap_(i in P) F i = \bigcap_j F (val j)
Proof .9a0
by apply : setC_inj; rewrite !setC_bigcap bigcup_set_type. Qed .
Lemma bigcap_image {aT rT I } (P : set aT) (f : aT -> I) (F : I -> set rT) :
\bigcap_(x in f @` P) F x = \bigcap_(x in P) F (f x).995 \bigcap_(x in [set f x | x in P]) F x =
\bigcap_(x in P) F (f x)
Proof .9a7
by apply : setC_inj; rewrite !setC_bigcap bigcup_image. Qed .
Lemma bigcup_fset {I : choiceType} {U : Type }
(F : I -> set U) (X : {fset I}) :
\bigcup_(i in [set i | i \in X]) F i = \big[setU/set0]_(i <- X) F i :> set U.I : choiceType U : Type F : I -> set U X : {fset I}
\bigcup_(i in [set ` X]) F i =
\big[setU/set0]_(i <- X) F i
Proof .9ac
elim /finSet_rect: X => X IHX; have [->|[x xX]] := fset_0Vmem X.9af 9b0 9b1 9b2 IHX : forall Y : {fset I},
(Y `<` X)%fset -> \bigcup_(i in [set ` Y]) F i = \big[setU/set0]_(i <- Y) F i
\bigcup_(i in [set ` fset0]) F i =
\big[setU/set0]_(i <- fset0) F i
by rewrite big_seq_fset0 -subset0 => x [].
rewrite -(fsetD1K xX) set_fsetU set_fset1 big_fsetU1 ?inE ?eqxx //=.9bd \bigcup_(i in (x |` [set ` (X `\ x)%fset])) F i =
F x `|` \big[setU/set0]_(i <- (X `\ x)%fset) F i
by rewrite bigcup_setU1 IHX// fproperD1.
Qed .
Lemma bigcap_fset {I : choiceType} {U : Type }
(F : I -> set U) (X : {fset I}) :
\bigcap_(i in [set i | i \in X]) F i = \big[setI/setT]_(i <- X) F i :> set U.9ae \bigcap_(i in [set ` X]) F i =
\big[setI/[set : U]]_(i <- X) F i
Proof .9c7
by apply : setC_inj; rewrite setC_bigcap setC_bigsetI bigcup_fset. Qed .
Lemma bigcup_fsetU1 {T U : choiceType} (F : T -> set U) (x : T) (X : {fset T}) :
\bigcup_(i in [set j | j \in x |` X]%fset) F i =
F x `|` \bigcup_(i in [set j | j \in X]) F i.T, U : choiceType F : T -> set U b X : {fset T}
\bigcup_(i in [set ` (x |` X)%fset]) F i =
F x `|` \bigcup_(i in [set ` X]) F i
Proof .9cc
by rewrite set_fsetU1 bigcup_setU1. Qed .
Lemma bigcap_fsetU1 {T U : choiceType} (F : T -> set U) (x : T) (X : {fset T}) :
\bigcap_(i in [set j | j \in x |` X]%fset) F i =
F x `&` \bigcap_(i in [set j | j \in X]) F i.9ce \bigcap_(i in [set ` (x |` X)%fset]) F i =
F x `&` \bigcap_(i in [set ` X]) F i
Proof .9d5
by rewrite set_fsetU1 bigcap_setU1. Qed .
Lemma bigcup_fsetD1 {T U : choiceType} (x : T) (F : T -> set U) (X : {fset T}) :
x \in X ->
\bigcup_(i in [set i | i \in X]%fset) F i =
F x `|` \bigcup_(i in [set i | i \in X `\ x]%fset) F i.9cf b 9d0 9d1
x \in X ->
\bigcup_(i in [set ` X]) F i =
F x `|` \bigcup_(i in [set ` (X `\ x)%fset]) F i
Proof .9da
by move => Xx; rewrite (bigcup_setD1 x)// set_fsetD1. Qed .
Arguments bigcup_fsetD1 {T U} x.
Lemma bigcap_fsetD1 {T U : choiceType} (x : T) (F : T -> set U) (X : {fset T}) :
x \in X ->
\bigcap_(i in [set i | i \in X]%fset) F i =
F x `&` \bigcap_(i in [set i | i \in X `\ x]%fset) F i.9dc x \in X ->
\bigcap_(i in [set ` X]) F i =
F x `&` \bigcap_(i in [set ` (X `\ x)%fset]) F i
Proof .9e0
by move => Xx; rewrite (bigcap_setD1 x)// set_fsetD1. Qed .
Arguments bigcup_fsetD1 {T U} x.
Section bigcup_set .
Variables (T : choiceType) (U : Type ).
Lemma bigcup_set_cond (s : seq T) (f : T -> set U) (P : pred T) :
\bigcup_(t in [set x | (x \in s) && P x]) (f t) =
\big[setU/set0]_(t <- s | P t) (f t).49e 9b0 91e 91f 10c
\bigcup_(t in [set x | (x \in s) && P x]) f t =
\big[setU/set0]_(t <- s | P t) f t
Proof .9e5
elim : s => [/=|h s ih]; first by rewrite set_nil bigcup_set0 big_nil.49e 9b0 91f 10c 4ad 91e ih : \bigcup_(t in [set x | (x \in s) && P x]) f t =
\big[setU/set0]_(t <- s | P t) f t
\bigcup_(t in [set x | (x \in h :: s) && P x]) f t =
\big[setU/set0]_(t <- (h :: s) | P t) f t
rewrite big_cons -ih predeqE => u; split => [[t /andP[]]|].49e 9b0 91f 10c 4ad 91e 9ee u : U 26b
t \in h :: s ->
P t ->
f t u ->
(if P h
then
f h
`|` \bigcup_(t in [set x | (x \in s) && P x]) f t
else \bigcup_(t in [set x | (x \in s) && P x]) f t) u
- 9f1
rewrite inE => /orP[/eqP ->{t} -> fhu|ts Pt ftu]; first by left .49e 9b0 91f 10c 4ad 91e 9ee 9f4 26b ts : t \in s Pt : P t ftu : f t u
(if P h
then
f h
`|` \bigcup_(t in [set x | (x \in s) && P x]) f t
else \bigcup_(t in [set x | (x \in s) && P x]) f t) u
9f6
case : ifPn => Ph; first by right ; exists t => //; apply /andP; split .49e 9b0 91f 10c 4ad 91e 9ee 9f4 26b 9ff a00 a01 Ph : ~~ P h
(\bigcup_(t in [set x | (x \in s) && P x]) f t) u
9f6
by exists t => //; apply /andP; split .
- a0a
case : ifPn => [Ph [fhu|[t /andP[ts Pt] ftu]]|Ph [t /andP[ts Pt ftu]]].49e 9b0 91f 10c 4ad 91e 9ee 9f4 Ph : P h fhu : f h u
(\bigcup_(t in [set x | (x \in h :: s) && P x]) f t) u
+ a0e
by exists h => //; apply /andP; split => //; rewrite mem_head.
+ a1b
by exists t => //; apply /andP; split => //; rewrite inE orbC ts.
+ a20
by exists t => //; apply /andP; split => //; rewrite inE orbC ts.
Qed .
Lemma bigcup_set (s : seq T) (f : T -> set U) :
\bigcup_(t in [set ` s]) (f t) = \big[setU/set0]_(t <- s) (f t).49e 9b0 91e 91f
\bigcup_(t in [set ` s]) f t =
\big[setU/set0]_(t <- s) f t
Proof .a24
rewrite -(bigcup_set_cond s f xpredT); congr (\bigcup_(t in mkset _) _).a26 (fun x : T => x \in s) =
(fun x : T => (x \in s) && true)
by rewrite funeqE => t; rewrite andbT.
Qed .
Lemma bigcap_set_cond (s : seq T) (f : T -> set U) (P : pred T) :
\bigcap_(t in [set x | (x \in s) && P x]) (f t) =
\big[setI/setT]_(t <- s | P t) (f t).9e7 \bigcap_(t in [set x | (x \in s) && P x]) f t =
\big[setI/[set : U]]_(t <- s | P t) f t
Proof .a2e
by apply : setC_inj; rewrite setC_bigcap setC_bigsetI bigcup_set_cond. Qed .
Lemma bigcap_set (s : seq T) (f : T -> set U) :
\bigcap_(t in [set ` s]) (f t) = \big[setI/setT]_(t <- s) (f t).a26 \bigcap_(t in [set ` s]) f t =
\big[setI/[set : U]]_(t <- s) f t
Proof .a33
by apply : setC_inj; rewrite setC_bigcap setC_bigsetI bigcup_set. Qed .
End bigcup_set .
Lemma bigcup_pred [T : finType] [U : Type ] (P : {pred T}) (f : T -> set U) :
\bigcup_(t in [set ` P]) f t = \big[setU/set0]_(t in P) f t.T : finType 9b0 577 91f
\bigcup_(t in [set ` P]) f t =
\big[setU/set0]_(t in P) f t
Proof .a38
apply /predeqP => u; split => [[x Px fxu]|]; first by rewrite (bigD1 x)//; left .a3b 9b0 577 91f 9f4
(\big[setU/set0]_(t in P) f t) u ->
(\bigcup_(t in [set ` P]) f t) u
move => /mem_set; rewrite (@big_morph _ _ (fun X => u \in X) false orb).a41 \big[orb/false]_(i in P) (u \in f i) ->
(\bigcup_(t in [set ` P]) f t) u
- a44
by rewrite big_has_cond => /hasP[x _ /andP[xP]]; rewrite inE => ufx; exists x .
- a4e
by move => /= x y; apply /idP/orP; rewrite !inE.
- a53
by rewrite in_set0.
Qed .
Section smallest .
Context {T } (C : set T -> Prop ) (G : set T).
Definition smallest := \bigcap_(A in [set M | C M /\ G `<=` M]) A.
Lemma sub_smallest X : X `<=` G -> X `<=` smallest.9 C : set T -> Prop G, X : set T
X `<=` G -> X `<=` smallest
Proof .a57
by move => XG A /XG GA Y /= [PY]; apply . Qed .
Lemma sub_gen_smallest : G `<=` smallest.9 a5a G : set T
G `<=` smallest
Proof .a5f
exact : sub_smallest. Qed .
Lemma smallest_sub X : C X -> G `<=` X -> smallest `<=` X.a59 C X -> G `<=` X -> smallest `<=` X
Proof .a66
by move => XC GX A; apply . Qed .
Lemma smallest_id : C G -> smallest = G.
Proof .a6b
by move => Cs; apply /seteqP; split ; [apply : smallest_sub|apply : sub_smallest].
Qed .
End smallest .
#[global ] Hint Resolve sub_gen_smallest : core.
Lemma sub_smallest2r {T } (C : set T-> Prop ) G1 G2 :
C (smallest C G2) -> G1 `<=` G2 -> smallest C G1 `<=` smallest C G2.9 a5a G1, G2 : set T
C (smallest C G2) ->
G1 `<=` G2 -> smallest C G1 `<=` smallest C G2
Proof .a70
by move => *; apply : smallest_sub=> //; apply : sub_smallest. Qed .
Lemma sub_smallest2l {T } (C1 C2 : set T -> Prop ) :
(forall G , C2 G -> C1 G) ->
forall G , smallest C1 G `<=` smallest C2 G.9 C1, C2 : set T -> Prop
(forall G : set T, C2 G -> C1 G) ->
forall G : set T, smallest C1 G `<=` smallest C2 G
Proof .a77
by move => C12 G X sX M [/C12 C1M GM]; apply : sX. Qed .
Section bigop_nat_lemmas .
Context {T : Type }.
Implicit Types (A : set T) (F : nat -> set T).
Lemma bigcup_mkord n F : \bigcup_(i < n) F i = \big[setU/set0]_(i < n) F i.9 4c5 F : nat -> set T
\bigcup_(i < n) F i = \big[setU/set0]_(i < n) F i
Proof .a7e
rewrite -(big_mkord xpredT F) -bigcup_set.a80 \bigcup_(i < n) F i =
\bigcup_(t in [set ` index_iota 0 n]) F t
by apply : eq_bigcupl; split => i; rewrite /= mem_index_iota leq0n.
Qed .
Lemma bigcap_mkord n F : \bigcap_(i < n) F i = \big[setI/setT]_(i < n) F i.a80 \bigcap_(i < n) F i = \big[setI/[set : T]]_(i < n) F i
Proof .a89
by apply : setC_inj; rewrite setC_bigsetI setC_bigcap bigcup_mkord. Qed .
Lemma bigsetU_sup i n F : (i < n)%N -> F i `<=` \big[setU/set0]_(j < n) F j.9 i, n : nat a81
i < n -> F i `<=` \big[setU/set0]_(j < n) F j
Proof .a8e
by move : n => // n ni; rewrite -bigcup_mkord; exact /bigcup_sup. Qed .
Lemma bigsetU_bigcup F n : \big[setU/set0]_(i < n) F i `<=` \bigcup_k F k.9 a81 4c5
\big[setU/set0]_(i < n) F i `<=` \bigcup_k F k
Proof .a95
by rewrite -bigcup_mkord => x [k _ Fkx]; exists k . Qed .
Lemma bigsetU_bigcup2 (A B : set T) :
\big[setU/set0]_(i < 2 ) bigcup2 A B i = A `|` B.d3 \big[setU/set0]_(i < 2 ) bigcup2 A B i = A `|` B
Proof .a9b
by rewrite -bigcup_mkord bigcup2inE. Qed .
Lemma bigsetI_bigcap2 (A B : set T) :
\big[setI/setT]_(i < 2 ) bigcap2 A B i = A `&` B.d3 \big[setI/[set : T]]_(i < 2 ) bigcap2 A B i = A `&` B
Proof .aa0
by rewrite -bigcap_mkord bigcap2inE. Qed .
Lemma bigcup_splitn n F :
\bigcup_i F i = \big[setU/set0]_(i < n) F i `|` \bigcup_i F (n + i).a80 \bigcup_i F i =
\big[setU/set0]_(i < n) F i `|` \bigcup_i F (n + i)
Proof .aa5
rewrite -bigcup_mkord -(bigcup_image _ (addn n)) -bigcup_setU.a80 \bigcup_i F i =
\bigcup_(i in (`I_n `|` range (addn n))) F i
apply : eq_bigcupl; split => // k _.9 4c5 a81 k : nat
(`I_n `|` range (addn n)) k
have [ltkn|lenk] := ltnP k n; [left => //|right ].9 4c5 a81 ab1 lenk : n <= k
range (addn n) k
by exists (k - n); rewrite // subnKC.
Qed .
Lemma bigcap_splitn n F :
\bigcap_i F i = \big[setI/setT]_(i < n) F i `&` \bigcap_i F (n + i).a80 \bigcap_i F i =
\big[setI/[set : T]]_(i < n) F i
`&` \bigcap_i F (n + i)
Proof .aba
by apply : setC_inj; rewrite setCI !setC_bigcap (bigcup_splitn n) setC_bigsetI.
Qed .
Lemma subset_bigsetU F :
{homo (fun n => \big[setU/set0]_(i < n) F i) : n m / (n <= m) >-> n `<=` m}.9 a81
{homo (fun n : nat => \big[setU/set0]_(i < n) F i) : n m /
n <= m >-> n `<=` m}
Proof .abf
move => m n mn; rewrite -!bigcup_mkord => x [i im Fix].9 a81 4e7 mn : m <= n b i : nat im : `I_m i 8a8
(\bigcup_(i < n) F i) x
by exists i => //=; rewrite (leq_trans im).
Qed .
Lemma subset_bigsetI F :
{homo (fun n => \big[setI/setT]_(i < n) F i) : n m / (n <= m) >-> m `<=` n}.ac1 {homo (fun n : nat => \big[setI/[set : T]]_(i < n) F i) : n m /
n <= m >-> m `<=` n}
Proof .acd
move => m n mn; rewrite -setCS !setC_bigsetI.9 a81 4e7 ac8
\big[setU/set0]_t ~` F t `<=` \big[setU/set0]_t ~` F t
exact : (@subset_bigsetU (setC \o F)).
Qed .
Lemma subset_bigsetU_cond (P : pred nat) F :
{homo (fun n => \big[setU/set0]_(i < n | P i) F i)
: n m / (n <= m) >-> n `<=` m}.9 P : pred nat a81
{homo (fun n : nat =>
\big[setU/set0]_(i < n | P i) F i) : n m /
n <= m >-> n `<=` m}
Proof .ad7
move => n m nm; rewrite big_mkcond [in X in _ `<=` X]big_mkcond/=.9 ada a81 n, m : nat nm : n <= m
\big[setU/set0]_(i < n) (if P i then F i else set0)
`<=` \big[setU/set0]_(i < m) (if P i
then F i
else set0)
exact : (@subset_bigsetU (fun i => if P i then F i else _)).
Qed .
Lemma subset_bigsetI_cond (P : pred nat) F :
{homo (fun n => \big[setI/setT]_(i < n | P i) F i)
: n m / (n <= m) >-> m `<=` n}.ad9 {homo (fun n : nat =>
\big[setI/[set : T]]_(i < n | P i) F i) : n m /
n <= m >-> m `<=` n}
Proof .ae5
move => n m nm; rewrite big_mkcond [in X in _ `<=` X]big_mkcond/=.ae0 \big[setI/[set : T]]_(i < m) (if P i
then F i
else [set : T])
`<=` \big[setI/[set : T]]_(i < n) (if P i
then F i
else [set : T])
exact : (@subset_bigsetI (fun i => if P i then F i else _)).
Qed .
End bigop_nat_lemmas .
Definition is_subset1 {T } (A : set T) := forall x y , A x -> A y -> x = y.
Definition is_fun {T1 T2 } (f : T1 -> T2 -> Prop ) := Logic.all (is_subset1 \o f).
Definition is_total {T1 T2 } (f : T1 -> T2 -> Prop ) := Logic.all (nonempty \o f).
Definition is_totalfun {T1 T2 } (f : T1 -> T2 -> Prop ) :=
forall x , f x !=set0 /\ is_subset1 (f x).
Definition xget {T : choiceType} x0 (P : set T) : T :=
if pselect (exists x : T, `[<P x>]) isn't left exP then x0
else projT1 (sigW exP).
CoInductive xget_spec {T : choiceType} x0 (P : set T) : T -> Prop -> Type :=
| XGetSome x of x = xget x0 P & P x : xget_spec x0 P x True
| XGetNone of (forall x , ~ P x) : xget_spec x0 P x0 False .
Lemma xgetP {T : choiceType} x0 (P : set T) :
xget_spec x0 P (xget x0 P) (P (xget x0 P)).49e x0 : T P : set T
xget_spec x0 P (xget x0 P) (P (xget x0 P))
Proof .aee
move : (erefl (xget x0 P)); set y := {2 }(xget x0 P).49e af1 af2 y := xget x0 P : T
xget x0 P = y ->
xget_spec x0 P (xget x0 P) (P (xget x0 P))
rewrite /xget; case : pselect => /= [?|neqP _].49e af1 af2 af9 _a_ : exists x : T, `[< P x >]
(@sval) T (fun x : T => `[< P x >]) (sigW _a_) = y ->
xget_spec x0 P
((@sval) T (fun x : T => `[< P x >]) (sigW _a_))
(P ((@sval) T (fun x : T => `[< P x >]) (sigW _a_)))
by case : sigW => x /= /asboolP Px; rewrite [P x]propT //; constructor .
suff NP x : ~ P x by rewrite [P x0]propF //; constructor .
by apply : contra_not neqP => Px; exists x ; apply /asboolP.
Qed .
Lemma xgetPex {T : choiceType} x0 (P : set T) : (exists x , P x) -> P (xget x0 P).af0 (exists x : T, P x) -> P (xget x0 P)
Proof .b0f
by case : xgetP=> // NP [x /NP]. Qed .
Lemma xgetI {T : choiceType} x0 (P : set T) (x : T): P x -> P (xget x0 P).49e af1 af2 b
P x -> P (xget x0 P)
Proof .b14
by move => Px; apply : xgetPex; exists x . Qed .
Lemma xget_subset1 {T : choiceType} x0 (P : set T) (x : T) :
P x -> is_subset1 P -> xget x0 P = x.b16 P x -> is_subset1 P -> xget x0 P = x
Proof .b1a
by move => Px /(_ _ _ (xgetI x0 Px) Px). Qed .
Lemma xget_unique {T : choiceType} x0 (P : set T) (x : T) :
P x -> (forall y , P y -> y = x) -> xget x0 P = x.b16 P x -> (forall y : T, P y -> y = x) -> xget x0 P = x
Proof .b1f
by move => /xget_subset1 gPx eqx; apply : gPx=> y z /eqx-> /eqx. Qed .
Lemma xgetPN {T : choiceType} x0 (P : set T) :
(forall x , ~ P x) -> xget x0 P = x0.af0 (forall x : T, ~ P x) -> xget x0 P = x0
Proof .b24
by case : xgetP => // x _ Px /(_ x). Qed .
Definition fun_of_rel {aT } {rT : choiceType} (f0 : aT -> rT)
(f : aT -> rT -> Prop ) := fun x => xget (f0 x) (f x).
Lemma fun_of_relP {aT } {rT : choiceType} (f : aT -> rT -> Prop ) (f0 : aT -> rT) a :
f a !=set0 -> f a (fun_of_rel f0 f a).aT : Type rT : choiceType f : aT -> rT -> Prop f0 : aT -> rT 5b7
f a !=set0 -> f a (fun_of_rel f0 f a)
Proof .b29
by move => [b fab]; rewrite /fun_of_rel; apply : xgetI fab. Qed .
Lemma fun_of_rel_uniq {aT } {rT : choiceType}
(f : aT -> rT -> Prop ) (f0 : aT -> rT) a :
is_subset1 (f a) -> forall b , f a b -> fun_of_rel f0 f a = b.b2b is_subset1 (f a) ->
forall b : rT, f a b -> fun_of_rel f0 f a = b
Proof .b33
by move => fa1 b /xget_subset1 xgeteq; rewrite /fun_of_rel xgeteq. Qed .
Lemma forall_sig T (A : set T) (P : {x | x \in A} -> Prop ) :
(forall u : {x | x \in A}, P u) =
(forall u : T, forall (a : A u), P (exist _ u (mem_set a))).9 a P : {x : T | x \in A} -> Prop
(forall u : {x : T | x \in A}, P u) =
(forall (u : T) (a : A u),
P (exist (fun x : T => x \in A) u (mem_set a)))
Proof .b38
rewrite propeqE; split => [+ u a|PA [u a]]; first exact .9 a b3b PA : forall (u : T) (a : A u),
P (exist (fun x : T => x \in A) u (mem_set a))6c a : u \in A
P (exist (fun x : T => x \in A) u a)
have Au : A u by rewrite inE in a.
by rewrite (Prop_irrelevance a (mem_set Au)); apply : PA.
Qed .
Lemma in_setP {U } (A : set U) (P : U -> Prop ) :
{in A, forall x , P x} <-> forall x , A x -> P x.9b0 A : set UP : U -> Prop
{in A, forall x : U, P x} <->
(forall x : U, A x -> P x)
Proof .b4b
by split => AP x; have := AP x; rewrite inE. Qed .
Lemma in_set2P {U V } (A : set U) (B : set V) (P : U -> V -> Prop ) :
{in A & B, forall x y , P x y} <-> (forall x y , A x -> B y -> P x y).U, V : Type b4e B : set VP : U -> V -> Prop
{in A & B, forall (x : U) (y : V), P x y} <->
(forall (x : U) (y : V), A x -> B y -> P x y)
Proof .b53
by split => AP x y; have := AP x y; rewrite !inE. Qed .
Lemma in1TT [T1] [P1 : T1 -> Prop ] :
{in [set : T1], forall x : T1, P1 x : Prop } -> forall x : T1, P1 x : Prop .T1 : Type P1 : T1 -> Prop
{in [set : T1], forall x : T1, P1 x : Prop } ->
forall x : T1, P1 x : Prop
Proof .b5c
by move => + *; apply ; rewrite !inE. Qed .
Lemma in2TT [T1 T2] [P2 : T1 -> T2 -> Prop ] :
{in [set : T1] & [set : T2], forall (x : T1) (y : T2), P2 x y : Prop } ->
forall (x : T1) (y : T2), P2 x y : Prop .T1, T2 : Type P2 : T1 -> T2 -> Prop
{in [set : T1] & [set : T2],
forall (x : T1) (y : T2), P2 x y : Prop } ->
forall (x : T1) (y : T2), P2 x y : Prop
Proof .b64
by move => + *; apply ; rewrite !inE. Qed .
Lemma in3TT [T1 T2 T3] [P3 : T1 -> T2 -> T3 -> Prop ] :
{in [set : T1] & [set : T2] & [set : T3], forall (x : T1) (y : T2) (z : T3), P3 x y z : Prop } ->
forall (x : T1) (y : T2) (z : T3), P3 x y z : Prop .72d P3 : T1 -> T2 -> T3 -> Prop
{in [set : T1] & [set : T2] & [set : T3],
forall (x : T1) (y : T2) (z : T3), P3 x y z : Prop } ->
forall (x : T1) (y : T2) (z : T3), P3 x y z : Prop
Proof .b6c
by move => + *; apply ; rewrite !inE. Qed .
Lemma inTT_bij [T1 T2 : Type ] [f : T1 -> T2] :
{in [set : T1], bijective f} -> bijective f.b67 72e
{in [set : T1], bijective f} -> bijective f
Proof .b73
by case => [g /in1TT + /in1TT +]; exists g . Qed .
Module Pointed .
Definition point_of (T : Type ) := T.
Record class_of (T : Type ) := Class {
base : Choice.class_of T;
mixin : point_of T
}.
Section ClassDef .
Structure type := Pack { sort; _ : class_of sort }.
Local Coercion sort : type >-> Sortclass .
Variables (T : Type ) (cT : type).
Definition class := let : Pack _ c := cT return class_of cT in c.
Definition clone c of phant_id class c := @Pack T c.
Let xT := let : Pack T _ := cT in T.
Notation xclass := (class : class_of xT).
Local Coercion base : class_of >-> Choice.class_of.
Definition pack m :=
fun bT b of phant_id (Choice .class bT) b => @Pack T (Class b m ).
Definition eqType := @Equality.Pack cT xclass.
Definition choiceType := @Choice.Pack cT xclass.
End ClassDef .
Module Exports .
Coercion sort : type >-> Sortclass .
Coercion base : class_of >-> Choice.class_of.
Coercion mixin : class_of >-> point_of.
Coercion eqType : type >-> Equality.type.
Canonical eqType .
Coercion choiceType : type >-> Choice.type.
Canonical choiceType .
Notation pointedType := type.
Notation PointedType T m := (@pack T m _ _ idfun).
Notation "[ 'pointedType' 'of' T 'for' cT ]" := (@clone T cT _ idfun)
(at level 0 , format "[ 'pointedType' 'of' T 'for' cT ]" ) : form_scope.
Notation "[ 'pointedType' 'of' T ]" := (@clone T _ _ id)
(at level 0 , format "[ 'pointedType' 'of' T ]" ) : form_scope.
End Exports .
End Pointed .
Export Pointed.Exports.
Definition point {M : pointedType} : M := Pointed.mixin (Pointed.class M).
Canonical arrow_pointedType (T : Type ) (T' : pointedType) :=
PointedType (T -> T') (fun => point).
Definition dep_arrow_pointedType (T : Type ) (T' : T -> pointedType) :=
Pointed.Pack
(Pointed.Class (dep_arrow_choiceClass T') (fun i => @point (T' i))).
Canonical unit_pointedType := PointedType unit tt.
Canonical bool_pointedType := PointedType bool false.
Canonical Prop_pointedType := PointedType Prop False .
Canonical nat_pointedType := PointedType nat 0 .
Canonical prod_pointedType (T T' : pointedType) :=
PointedType (T * T') (point, point).
Canonical matrix_pointedType m n (T : pointedType) :=
PointedType 'M[T]_(m, n) (\matrix_(_, _) point)%R.
Canonical option_pointedType (T : choiceType) := PointedType (option T) None.
Canonical pointed_fset {T : choiceType} := PointedType {fset T} fset0.
Notation get := (xget point).
Notation "[ 'get' x | E ]" := (get [set x | E])
(at level 0 , x name, format "[ 'get' x | E ]" , only printing ) : form_scope.
Notation "[ 'get' x : T | E ]" := (get (fun x : T => E))
(at level 0 , x name, format "[ 'get' x : T | E ]" , only parsing ) : form_scope.The format modifier has no effect for only -parsing
notations. [discarded-format -only -parsing,parsing]
Notation "[ 'get' x | E ]" := (get (fun x => E))
(at level 0 , x name, format "[ 'get' x | E ]" ) : form_scope.
Section PointedTheory .
Context {T : pointedType}.
Lemma getPex (P : set T) : (exists x , P x) -> P (get P).T : pointedType af2
(exists x : T, P x) -> P [get x : _ | P x]
Proof .b7a
exact : (xgetPex point). Qed .
Lemma getI (P : set T) (x : T): P x -> P (get P).b7d af2 b
P x -> P [get x : _ | P x]
Proof .b81
exact : (xgetI point). Qed .
Lemma get_subset1 (P : set T) (x : T) : P x -> is_subset1 P -> get P = x.b83 P x -> is_subset1 P -> [get x : _ | P x] = x
Proof .b87
exact : (xget_subset1 point). Qed .
Lemma get_unique (P : set T) (x : T) :
P x -> (forall y , P y -> y = x) -> get P = x.b83 P x ->
(forall y : T, P y -> y = x) -> [get x : _ | P x] = x
Proof .b8c
exact : (xget_unique point). Qed .
Lemma getPN (P : set T) : (forall x , ~ P x) -> get P = point.b7c (forall x : T, ~ P x) -> [get x : _ | P x] = point
Proof .b91
exact : (xgetPN point). Qed .
Lemma setT0 : setT != set0 :> set T.b7d
[set : T] != set0 :> set T
Proof .b96
by apply /eqP => /seteqP[] /(_ point) /(_ Logic.I). Qed .
End PointedTheory .
Variant squashed T : Prop := squash (x : T).
Arguments squash {T} x.
Notation "$| T |" := (squashed T) : form_scope.
Tactic Notation "squash" uconstr (x) := (exists ; refine x) ||
match goal with |- $| ?T | => exists ; refine [the T of x] end .
Definition unsquash {T } (s : $|T|) : T :=
projT1 (cid (let : squash x := s in @ex_intro T _ x isT)).
Lemma unsquashK {T } : cancel (@unsquash T) squash. Proof .b9c
by move => []. Qed .
(* Empty types *)
Module Empty .
Definition mixin_of T := T -> False .
Section EqMixin .
Variables (T : Type ) (m : mixin_of T).
Definition eq_op (x y : T) := true.
Lemma eq_opP : Equality.axiom eq_op.9 m : mixin_of T
Equality.axiom eq_op
Proof .ba1
by []. Qed .
Definition eqMixin := EqMixin eq_opP.
End EqMixin .
Section ChoiceMixin .
Variables (T : Type ) (m : mixin_of T).
Definition find of pred T & nat : option T := None.
Lemma findP (P : pred T) (n : nat) (x : T) : find P n = Some x -> P x.9 ba4 10c 4c5 b
find P n = Some x -> P x
Proof .ba8
by []. Qed .
Lemma ex_find (P : pred T) : (exists x : T, P x) -> exists n : nat, find P n.9 ba4 10c
(exists x : T, P x) -> exists n : nat, find P n
Proof .bae
by case . Qed .
Lemma eq_find (P Q : pred T) : P =1 Q -> find P =1 find Q.9 ba4 P, Q : pred T
P =1 Q -> find P =1 find Q
Proof .bb4
by []. Qed .
Definition choiceMixin := Choice.Mixin findP ex_find eq_find.
End ChoiceMixin .
Section CountMixin .
Variables (T : Type ) (m : mixin_of T).
Definition pickle : T -> nat := fun => 0 .
Definition unpickle : nat -> option T := fun => None.
Lemma pickleK : pcancel pickle unpickle.ba3 pcancel pickle unpickle
Proof .bbb
by []. Qed .
Definition countMixin := CountMixin pickleK.
End CountMixin .
Section FinMixin .
Variables (T : countType) (m : mixin_of T).
Lemma fin_axiom : Finite.axiom ([::] : seq T).T : countType ba4
Finite.axiom ([::] : seq T)
Proof .bc0
by []. Qed .
Definition finMixin := FinMixin fin_axiom.
End FinMixin .
Section ClassDef .
Set Primitive Projections .
Record class_of T := Class {
base : Finite.class_of T;
mixin : mixin_of T
}.
Unset Primitive Projections .
Local Coercion base : class_of >-> Finite.class_of.
Structure type : Type := Pack {sort; _ : class_of sort}.
Local Coercion sort : type >-> Sortclass .
Variables (T : Type ) (cT : type).
Definition class := let : Pack _ c as cT' := cT return class_of cT' in c.
Definition clone c of phant_id class c := @Pack T c.
Definition pack (m0 : mixin_of T) :=
fun bT b & phant_id (Finite.class bT) b =>
fun m & phant_id m0 m => Pack (@Class T b m ).
Definition eqType := @Equality.Pack cT class.
Definition choiceType := @Choice.Pack cT class.
Definition countType := @Countable.Pack cT class.
Definition finType := @Finite.Pack cT class.
End ClassDef .
Module Import Exports.
Coercion base : class_of >-> Finite.class_of.
Coercion mixin : class_of >-> mixin_of.
Coercion sort : type >-> Sortclass .
Coercion eqType : type >-> Equality.type.
Canonical eqType .
Coercion choiceType : type >-> Choice.type.
Canonical choiceType .
Coercion countType : type >-> Countable.type.
Canonical countType .
Coercion finType : type >-> Finite.type.
Canonical finType .
Notation emptyType := type.
Notation EmptyType T m := (@pack T m _ _ id _ id).
Notation "[ 'emptyType' 'of' T 'for' cT ]" := (@clone T cT _ idfun)
(at level 0 , format "[ 'emptyType' 'of' T 'for' cT ]" ) : form_scope.
Notation "[ 'emptyType' 'of' T ]" := (@clone T _ _ id)
(at level 0 , format "[ 'emptyType' 'of' T ]" ) : form_scope.
Coercion eqMixin : mixin_of >-> Equality.mixin_of.New coercion path [mixin; eqMixin] : class_of >-> Equality.mixin_of is ambiguous with existing
[base; Finite.base; Choice.base] : class_of >-> Equality.mixin_of.
[ambiguous-paths,typechecker]
Coercion choiceMixin : mixin_of >-> Choice.mixin_of.New coercion path [mixin; choiceMixin] : class_of >-> Choice.mixin_of is ambiguous with existing
[base; Finite.base; Choice.mixin] : class_of >-> Choice.mixin_of.
[ambiguous-paths,typechecker]
Coercion countMixin : mixin_of >-> Countable.mixin_of.New coercion path [mixin; countMixin] : class_of >-> Countable.mixin_of is ambiguous with existing
[base; Finite.mixin; Finite.mixin_base] : class_of >-> Countable.mixin_of.
[ambiguous-paths,typechecker]
End Exports .New coercion path [mixin; eqMixin] : class_of >-> Equality.mixin_of is ambiguous with existing
[base; Finite.base; Choice.base] : class_of >-> Equality.mixin_of.
[ambiguous-paths,typechecker] New coercion path [mixin; choiceMixin] : class_of >-> Choice.mixin_of is ambiguous with existing
[base; Finite.base; Choice.mixin] : class_of >-> Choice.mixin_of.
[ambiguous-paths,typechecker] New coercion path [mixin; countMixin] : class_of >-> Countable.mixin_of is ambiguous with existing
[base; Finite.mixin; Finite.mixin_base] : class_of >-> Countable.mixin_of.
[ambiguous-paths,typechecker]
End Empty .
Export Empty.Exports.New coercion path [Empty.mixin; Empty.eqMixin] : Empty.class_of >-> Equality.mixin_of is ambiguous with existing
[Empty.base; Finite.base; Choice.base] : Empty.class_of >-> Equality.mixin_of.
[ambiguous-paths,typechecker] New coercion path [Empty.mixin; Empty.choiceMixin] : Empty.class_of >-> Choice.mixin_of is ambiguous with existing
[Empty.base; Finite.base; Choice.mixin] : Empty.class_of >-> Choice.mixin_of.
[ambiguous-paths,typechecker] New coercion path [Empty.mixin; Empty.countMixin] : Empty.class_of >-> Countable.mixin_of is ambiguous with existing
[Empty.base; Finite.mixin; Finite.mixin_base] : Empty.class_of >-> Countable.mixin_of.
[ambiguous-paths,typechecker]
Definition False_emptyMixin : Empty.mixin_of False := id.
Canonical False_eqType := EqType False False_emptyMixin.
Canonical False_choiceType := ChoiceType False False_emptyMixin.
Canonical False_countType := CountType False False_emptyMixin.
Canonical False_finType := FinType False (Empty.finMixin False_emptyMixin).
Canonical False_emptyType := EmptyType False False_emptyMixin.
Definition void_emptyMixin : Empty.mixin_of void := @of_void _.
Canonical void_emptyType := EmptyType void void_emptyMixin.
Definition no {T : emptyType} : T -> False :=
let : Empty.Pack _ (Empty.Class _ f ) := T in f.
Definition any {T : emptyType} {U } : T -> U := @False_rect _ \o no.
Lemma empty_eq0 {T : emptyType} : all_equal_to (set0 : set T).T : emptyType
all_equal_to (set0 : set T)
Proof .bcc
by move => X; apply /setF_eq0/no. Qed .
Definition quasi_canonical_of T C (sort : C -> T) (alt : emptyType -> T):=
forall (G : T -> Type ), (forall s : emptyType, G (alt s)) -> (forall x , G (sort x)) ->
forall x , G x.
Notation quasi_canonical_ sort alt := (@quasi_canonical_of _ _ sort alt).
Notation quasi_canonical T C := (@quasi_canonical_of T C id id).
Lemma qcanon T C (sort : C -> T) (alt : emptyType -> T) :
(forall x , (exists y : emptyType, alt y = x) + (exists y , sort y = x)) ->
quasi_canonical_ sort alt.T, C : Type sort : C -> T alt : emptyType -> T
(forall x : T,
(exists y : emptyType, alt y = x) +
(exists y : C, sort y = x)) ->
quasi_canonical_ sort alt
Proof .bd3
by move => + G Cx Gs x => /(_ x)[/cid[y <-]|/cid[y <-]]. Qed .
Arguments qcanon {T C sort alt} x.
Lemma choicePpointed : quasi_canonical choiceType pointedType.quasi_canonical_ [eta Pointed.choiceType]
[eta Empty.choiceType]
Proof .bdc
apply : qcanon => T; have [/unsquash x|/(_ (squash _)) TF] := pselect $|T|.56b ((exists y : emptyType, y = T) +
(exists y : pointedType, y = T))%type
by right ; exists (PointedType T x ); case : T x.
left .be6 exists y : emptyType, y = T
pose cT := CountType _ (TF : Empty.mixin_of T).49e be7 cT := CountType T (TF : Empty.mixin_of T) : countType
bee
pose fM := Empty.finMixin (TF : Empty.mixin_of cT).49e be7 bf3 fM := Empty.finMixin (TF : Empty.mixin_of cT) : Finite.mixin_of cT
bee
exists (EmptyType (FinType _ fM) TF) => //=.
by case : T TF @cT @fM.
Qed .
Lemma eqPpointed : quasi_canonical eqType pointedType.quasi_canonical_ [eta Pointed.eqType]
[eta Empty.eqType]
Proof .bfe
by apply : qcanon; elim /eqPchoice; elim /choicePpointed => [[T F]|T];
[left ; exists (Empty .Pack F) | right ; exists T ].
Qed .
Lemma Ppointed : quasi_canonical Type pointedType.quasi_canonical_ [eta Pointed.sort] [eta Empty.sort]
Proof .c03
by apply : qcanon; elim /Peq; elim /eqPpointed => [[T F]|T];
[left ; exists (Empty .Pack F) | right ; exists T ].
Qed .
Section partitions .
Definition trivIset T I (D : set I) (F : I -> set T) :=
forall i j : I, D i -> D j -> F i `&` F j !=set0 -> i = j.
Lemma trivIset_mkcond T I (D : set I) (F : I -> set T) :
trivIset D F <-> trivIset setT (fun i => if i \in D then F i else set0).7a1 6c5 7a2
trivIset D F <->
trivIset [set : I]
(fun i : I => if i \in D then F i else set0)
Proof .c08
split => [tA i j _ _|tA i j Di Dj]; last first .7a1 6c5 7a2 tA : trivIset [set : I]
(fun i : I => if i \in D then F i else set0) i, j : I Di : D i Dj : D j
F i `&` F j !=set0 -> i = j
by have := tA i j Logic.I Logic.I; rewrite !mem_set.
case : ifPn => iD; last by rewrite set0I => -[].7a1 6c5 7a2 c19 c12 iD : i \in D
F i `&` (if j \in D then F j else set0) !=set0 ->
i = j
by case : ifPn => [jD /tA|jD]; [apply ; exact : set_mem|rewrite setI0 => -[]].
Qed .
Lemma trivIset_set0 {I T } (D : set I) : trivIset D (fun => set0 : set T).9a3 6c5
trivIset D (fun => set0 : set T)
Proof .c25
by move => i j Di Dj; rewrite setI0 => /set0P; rewrite eqxx. Qed .
Lemma trivIsetP {T } {I : eqType} {D : set I} {F : I -> set T} :
trivIset D F <->
forall i j : I, D i -> D j -> i != j -> F i `&` F j = set0.9 I : eqType 6c5 7a2
trivIset D F <->
(forall i j : I,
D i -> D j -> i != j -> F i `&` F j = set0)
Proof .c2b
split => tDF i j Di Dj; first by apply : contraNeq => /set0P/tDF->.9 c2e 6c5 7a2 tDF : forall i j : I, D i -> D j -> i != j -> F i `&` F j = set0c12 c13 c14
c15
by move => /set0P; apply : contraNeq => /tDF->.
Qed .
Lemma trivIset_bigsetUI T (D : {pred nat}) (F : nat -> set T) : trivIset D F ->
forall n m , D m -> n <= m -> \big[setU/set0]_(i < n | D i) F i `&` F m = set0.9 D : {pred nat} a81
trivIset (fun x : nat => D x) F ->
forall n m : nat,
D m ->
n <= m ->
\big[setU/set0]_(i < n | D i) F i `&` F m = set0
Proof .c37
move => /trivIsetP tA; elim => [|n IHn] m Dm.9 c3a a81 tA : forall i j : nat_eqType,
D i -> D j -> i != j -> F i `&` F j = set0m : nat Dm : D m
0 <= m ->
\big[setU/set0]_(i < 0 | D i) F i `&` F m = set0
by move => _; rewrite big_ord0 set0I.
move => lt_nm; rewrite big_mkcond/= big_ord_recr -big_mkcond/=.9 c3a a81 c41 4c5 c48 c42 c43 lt_nm : n < m
(\big[setU/set0]_(i < n | D i) F i
`|` (if D n then F n else set0)) `&` F m = set0
rewrite setIUl IHn 1 ?ltnW // set0U.c50 (if D n then F n else set0) `&` F m = set0
by case : ifPn => [Dn|NDn]; rewrite ?set0I // tA// ltn_eqF.
Qed .
Lemma trivIset_setIl (T I : Type ) (D : set I) (F : I -> set T) (G : I -> set T) :
trivIset D F -> trivIset D (fun i => G i `&` F i).7a1 6c5 7b4
trivIset D F -> trivIset D (fun i : I => G i `&` F i)
Proof .c58
by move => tF i j Di Dj [x [[Gix Fix] [Gjx Fjx]]]; apply tF => //; exists x .
Qed .
Lemma trivIset_setIr (T I : Type ) (D : set I) (F : I -> set T) (G : I -> set T) :
trivIset D F -> trivIset D (fun i => F i `&` G i).c5a trivIset D F -> trivIset D (fun i : I => F i `&` G i)
Proof .c5e
by move => tF i j Di Dj [x [[Fix Gix] [Fjx Gjx]]]; apply tF => //; exists x .
Qed .
Lemma sub_trivIset I T (D D' : set I) (F : I -> set T) :
D `<=` D' -> trivIset D' F -> trivIset D F.9a3 D, D' : set I7a2
D `<=` D' -> trivIset D' F -> trivIset D F
Proof .c63
by move => DD' Ftriv i j /DD' + /DD' + /Ftriv->//. Qed .
Lemma trivIset_bigcup2 T (A B : set T) :
(A `&` B = set0) = trivIset setT (bigcup2 A B).d3 (A `&` B = set0) = trivIset [set : nat] (bigcup2 A B)
Proof .c6a
apply /propext; split => [AB0|/trivIsetP/(_ 0 1 Logic.I Logic.I erefl)//].9 b3 AB0 : A `&` B = set0
trivIset [set : nat] (bigcup2 A B)
apply /trivIsetP => -[/=|]; rewrite /bigcup2 /=.c71 forall j : nat,
True ->
True ->
0 != j ->
A
`&` (if j == 0 then A else if j == 1 then B else set0) =
set0
- c75
by move => [//|[_ _ _ //|j _ _ _]]; rewrite setI0.
- c7d
move => [[j _ _|]|i j _ _ _]; [by rewrite setIC| |by rewrite set0I].c71 forall n : nat,
True ->
True ->
1 != n.+1 ->
(if 1 == 1 then B else set0)
`&` (if n.+1 == 0
then A
else if n.+1 == 1 then B else set0) = set0
by move => [//|j _ _ _]; rewrite setI0.
Qed .
Lemma trivIset_image T I I' (D : set I) (f : I -> I') (F : I' -> set T) :
trivIset D (F \o f) -> trivIset (f @` D) F.T, I, I' : Type 6c5 f : I -> I' F : I' -> set T
trivIset D (F \o f) -> trivIset [set f x | x in D] F
Proof .c85
by move => trivF i j [{}i Di <-] [{}j Dj <-] Ffij; congr (f _); apply : trivF.
Qed .
Arguments trivIset_image {T I I'} D f F.
Lemma trivIset_comp T I I' (D : set I) (f : I -> I') (F : I' -> set T) :
{in D &, injective f} ->
trivIset D (F \o f) = trivIset (f @` D) F.c87 {in D &, injective f} ->
trivIset D (F \o f) = trivIset [set f x | x in D] F
Proof .c8e
move => finj; apply /propext; split ; first exact : trivIset_image.c88 6c5 c89 c8a finj : {in D &, injective f}
trivIset [set f x | x in D] F -> trivIset D (F \o f)
move => trivF i j Di Dj Ffij; apply : finj; rewrite ?in_setE //.c88 6c5 c89 c8a trivF : trivIset [set f x | x in D] F c12 c13 c14 Ffij : (F \o f) i `&` (F \o f) j !=set0
f i = f j
by apply : trivF => //=; [exists i | exists j ].
Qed .
Lemma trivIset_preimage1 {aT rT } D (f : aT -> rT) :
trivIset D (fun x => f @^-1 ` [set x]).5b4 D : set rT5b5
trivIset D (fun x : rT => f @^-1 ` [set x])
Proof .ca0
by move => y z _ _ [x [<- <-]]. Qed .
Lemma trivIset_preimage1_in {aT } {rT : choiceType} (D : set rT) (A : set aT)
(f : aT -> rT) : trivIset D (fun x => A `&` f @^-1 ` [set x]).b2c b2d ca3 5b6 5b5
trivIset D (fun x : rT => A `&` f @^-1 ` [set x])
Proof .ca7
by move => y z _ _ [x [[_ <-] [_ <-]]]. Qed .
Definition cover T I D (F : I -> set T) := \bigcup_(i in D) F i.
Lemma coverE T I D (F : I -> set T) : cover D F = \bigcup_(i in D) F i.c0a cover D F = \bigcup_(i in D) F i
Proof .cad
by []. Qed .
Lemma cover_restr T I D' D (F : I -> set T) :
D `<=` D' -> (forall i , D' i -> ~ D i -> F i = set0) ->
cover D F = cover D' F.7a1 D', D : set I7a2
D `<=` D' ->
(forall i : I, D' i -> ~ D i -> F i = set0) ->
cover D F = cover D' F
Proof .cb2
move => DD' D'DF; rewrite /cover eqEsubset; split => [r [i Di Fit]|r [i D'i Fit]].7a1 cb5 7a2 DD' : D `<=` D' D'DF : forall i : I, D' i -> ~ D i -> F i = set0r : T 6ce c13 Fit : F i r
(\bigcup_(i in D') F i) r
- cb9
by have [D'i|] := pselect (D' i); [exists i | have := DD' _ Di].
- cc8
by have [Di|Di] := pselect (D i); [exists i | move : Fit; rewrite (D'DF i)].
Qed .
Lemma eqcover_r T I D (F G : I -> set T) :
[set F i | i in D] = [set G i | i in D] ->
cover D F = cover D G.c5a [set F i | i in D] = [set G i | i in D] ->
cover D F = cover D G
Proof .ccc
move => FG.7a1 6c5 7b4 FG : [set F i | i in D] = [set G i | i in D]
cover D F = cover D G
rewrite eqEsubset; split => [t [i Di Fit]|t [i Di Git]].7a1 6c5 7b4 cd4 26b 6ce c13 7b7
cover D G t
have [j Dj GF] : [set G i | i in D] (F i) by rewrite -FG /mkset; exists i .7a1 6c5 7b4 cd4 26b 6ce c13 7b7 j : I c14 GF : G j = F i
cda cdb
by exists j => //; rewrite GF.
have [j Dj GF] : [set F i | i in D] (G i) by rewrite FG /mkset; exists i .7a1 6c5 7b4 cd4 26b 6ce c13 cde ce4 c14 GF : F j = G i
cdf
by exists j => //; rewrite GF.
Qed .
Definition partition T I D (F : I -> set T) (A : set T) :=
[/\ cover D F = A, trivIset D F & forall i , D i -> F i !=set0].
Definition pblock_index T (I : pointedType) D (F : I -> set T) (x : T) :=
[get i | D i /\ F i x].
Definition pblock T (I : pointedType) D (F : I -> set T) (x : T) :=
F (pblock_index D F x).
(* TODO: theory of trivIset, cover, partition, pblock_index and pblock *)
Notation trivIsets X := (trivIset X id).
Lemma trivIset_sets T I D (F : I -> set T) :
trivIset D F -> trivIsets [set F i | i in D].c0a trivIset D F -> trivIsets [set F i | i in D]
Proof .cef
exact : trivIset_image. Qed .
Lemma trivIset_widen T I D' D (F : I -> set T) :
(* D `<=` D' -> (forall i, D i -> ~ D' i -> F i !=set0) ->*)
D `<=` D' -> (forall i , D' i -> ~ D i -> F i = set0) ->
trivIset D F = trivIset D' F.cb4 D `<=` D' ->
(forall i : I, D' i -> ~ D i -> F i = set0) ->
trivIset D F = trivIset D' F
Proof .cf4
move => DD' DD'F.7a1 cb5 7a2 cbc DD'F : forall i : I, D' i -> ~ D i -> F i = set0
trivIset D F = trivIset D' F
rewrite propeqE; split => [DF i j D'i D'j FiFj0|D'F i j Di Dj FiFj0].7a1 cb5 7a2 cbc cfc DF : trivIset D F c12 cc4 D'j : D' j FiFj0 : F i `&` F j !=set0
i = j
have [Di|Di] := pselect (D i); last first .7a1 cb5 7a2 cbc cfc d02 c12 cc4 d03 d04 Di : ~ D i
d05
by move : FiFj0; rewrite (DD'F i) // set0I => /set0P; rewrite eqxx.
have [Dj|Dj] := pselect (D j).7a1 cb5 7a2 cbc cfc d02 c12 cc4 d03 d04 c13 c14
d05
- d16
exact : DF.
- d1f
by move : FiFj0; rewrite (DD'F j) // setI0 => /set0P; rewrite eqxx.
by apply D'F => //; apply DD'.
Qed .
Lemma perm_eq_trivIset {T : eqType} (s1 s2 : seq (set T)) (D : set nat) :
[set k | (k < size s1)] `<=` D -> perm_eq s1 s2 ->
trivIset D (fun i => nth set0 s1 i) -> trivIset D (fun i => nth set0 s2 i).4a5 s1, s2 : seq (set T) D : set nat
`I_(size s1) `<=` D ->
perm_eq s1 s2 ->
trivIset D [eta nth set0 s1] ->
trivIset D [eta nth set0 s2]
Proof .d26
move => s1D; rewrite perm_sym => /(perm_iotaP set0)[s ss1 s12] /trivIsetP ts1.4a5 d29 d2a s1D : `I_(size s1) `<=` D s : seq nat_eqType ss1 : perm_eq s (iota 0 (size s1)) s12 : s2 = [seq nth set0 s1 i | i <- s] ts1 : forall i j : nat_eqType,
D i -> D j -> i != j -> nth set0 s1 i `&` nth set0 s1 j = set0
trivIset D [eta nth set0 s2]
apply /trivIsetP => i j Di Dj ij.4a5 d29 d2a d31 d32 d33 d34 d35 i, j : nat_eqType c13 c14 ij : i != j
nth set0 s2 i `&` nth set0 s2 j = set0
rewrite {}s12 {s2}; have [si|si] := ltnP i (size s); last first .4a5 s1 : seq (set T) d2a d31 d32 d33 d35 d3b c13 c14 d3c si : size s <= i
nth set0 [seq nth set0 s1 i | i <- s] i
`&` nth set0 [seq nth set0 s1 i | i <- s] j = set0
by rewrite (nth_default set0) ?size_map // set0I.
rewrite (nth_map O) //; have [sj|sj] := ltnP j (size s); last first .4a5 d42 d2a d31 d32 d33 d35 d3b c13 c14 d3c d48 sj : size s <= j
nth set0 s1 (nth 0 s i)
`&` nth set0 [seq nth set0 s1 i | i <- s] j = set0
by rewrite (nth_default set0) ?size_map // setI0.
have nth_mem k : k < size s -> nth O s k \in iota 0 (size s1).4a5 d42 d2a d31 d32 d33 d35 d3b c13 c14 d3c d48 d55 ab1
k < size s -> nth 0 s k \in iota 0 (size s1)
by move => ?; rewrite -(perm_mem ss1) mem_nth.
rewrite (nth_map O)// ts1 ?(nth_uniq,(perm_uniq ss1),iota_uniq)//; apply /s1D.d60 `I_(size s1) (nth 0 s i)
- d66
by have := nth_mem _ si; rewrite mem_iota leq0n add0n.
- d70
by have := nth_mem _ sj; rewrite mem_iota leq0n add0n.
Qed .
End partitions .
#[deprecated(note="Use trivIset_setIl instead" )]
Notation trivIset_setI := trivIset_setIl.
Definition total_on T (A : set T) (R : T -> T -> Prop ) :=
forall s t , A s -> A t -> R s t \/ R t s.
Section ZL .
Variable (T : Type ) (t0 : T) (R : T -> T -> Prop ).
Hypothesis (Rrefl : forall t , R t t).
Hypothesis (Rtrans : forall r s t , R r s -> R s t -> R r t).
Hypothesis (Rantisym : forall s t , R s t -> R t s -> s = t).
Hypothesis (tot_lub : forall A : set T, total_on A R -> exists t ,
(forall s , A s -> R s t) /\ forall r , (forall s , A s -> R s r) -> R t r).
Hypothesis (Rsucc : forall s , exists t , R s t /\ s <> t /\
forall r , R s r -> R r t -> r = s \/ r = t).
Let Teq := @gen_eqMixin T.
Let Tch := @gen_choiceMixin T.
Let Tp := Pointed.Pack (Pointed.Class (Choice.Class Teq Tch ) t0).
Let lub := fun A : {A : set T | total_on A R} =>
[get t : Tp | (forall s , sval A s -> R s t) /\
forall r , (forall s , sval A s -> R s r) -> R t r].
Let succ := fun s => [get t : Tp | R s t /\ s <> t /\
forall r , R s r -> R r t -> r = s \/ r = t].
Inductive tower : set T :=
| Lub : forall A , sval A `<=` tower -> tower (lub A)
| Succ : forall t , tower t -> tower (succ t).
Lemma ZL' : False .9 t0 : T R : T -> T -> Prop Rrefl : forall t : T, R t tRtrans : forall r s t : T, R r s -> R s t -> R r tRantisym : forall s t : T, R s t -> R t s -> s = ttot_lub : forall A : set T,
total_on A R ->
exists t : T,
(forall s : T, A s -> R s t) /\
(forall r : T,
(forall s : T, A s -> R s r) -> R t r)Rsucc : forall s : T,
exists t : T,
R s t /\
s <> t /\
(forall r : T,
R s r -> R r t -> r = s \/ r = t)Teq := gen_eqMixin : Equality.mixin_of T Tch := gen_choiceMixin : choiceMixin T Tp := Pointed.Pack
{|
Pointed.base :=
{|
Choice.base := Teq; Choice.mixin := Tch
|};
Pointed.mixin := t0
|} : pointedType lub := fun A : {A : set T | total_on A R} =>
[get t : Tp | (forall s : T,
(@sval) (set T)
((total_on (T:=T))^~ R) A s ->
R s t) /\
(forall r : T,
(forall s : T,
(@sval)
(set T)
((total_on (T:=T))^~ R) A s ->
R s r) ->
R t r)]: {A : set T | total_on A R} -> Tp succ := fun s : T =>
[get t : Tp | R s t /\
s <> t /\
(forall r : T,
R s r -> R r t -> r = s \/ r = t)]: T -> Tp
False
Proof .d74
have lub_ub (A : {A : set T | total_on A R}) :
forall s , sval A s -> R s (lub A).9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 A : {A : set T | total_on A R}
forall s : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A s ->
R s (lub A)
suff /getPex [] : exists t : Tp, (forall s , sval A s -> R s t) /\
forall r , (forall s , sval A s -> R s r) -> R t r by [].d88 exists t : Tp,
(forall s : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A s ->
R s t) /\
(forall r : T,
(forall s : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A s ->
R s r) -> R t r)
d8b
by apply : tot_lub; apply : (svalP A).
have lub_lub (A : {A : set T | total_on A R}) :
forall t , (forall s , sval A s -> R s t) -> R (lub A) t.9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d89
forall t : T,
(forall s : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A s -> R s t) ->
R (lub A) t
suff /getPex [] : exists t : Tp, (forall s , sval A s -> R s t) /\
forall r , (forall s , sval A s -> R s r) -> R t r by [].
by apply : tot_lub; apply : (svalP A).
have RS s : R s (succ s) /\ s <> succ s.9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e s : T
R s (succ s) /\ s <> succ s
by have /getPex [? []] : exists t : Tp, R s t /\ s <> t /\
forall r , R s r -> R r t -> r = s \/ r = t by apply : Rsucc.
have succS s : forall t , R s t -> R t (succ s) -> t = s \/ t = succ s.9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae da9
forall t : T,
R s t -> R t (succ s) -> t = s \/ t = succ s
by have /getPex [? []] : exists t : Tp, R s t /\ s <> t /\
forall r , R s r -> R r t -> r = s \/ r = t by apply : Rsucc.
suff Twtot : total_on tower R.9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba Twtot : total_on tower R
d83
have [R_S] := RS (lub (exist _ tower Twtot)); apply .9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba dc2 R_S : R
(lub
(exist ((total_on (T:=T))^~ R) tower Twtot))
(succ
(lub
(exist ((total_on (T:=T))^~ R) tower
Twtot)))
lub (exist ((total_on (T:=T))^~ R) tower Twtot) =
succ (lub (exist ((total_on (T:=T))^~ R) tower Twtot))
dc3
by apply /Rantisym => //; apply /lub_ub/Succ/Lub.
move => s t Tws; elim : Tws t => {s} [A sATw ihA|s Tws ihs] t Twt.9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba d89 sATw : (@sval) (set T) ((total_on (T:=T))^~ R) A
`<=` tower ihA : forall t : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A t ->
forall t0 : T, tower t0 -> R t t0 \/ R t0 t26b Twt : tower t
R (lub A) t \/ R t (lub A)
have [?|/asboolP] := pselect (forall s , sval A s -> R s t).9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba d89 dd3 dd4 26b dd5 _a_ : forall s : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A s ->
R s t
dd6
by left ; apply : lub_lub.
rewrite asbool_neg => /existsp_asboolPn [s /asboolP].9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba d89 dd3 dd4 26b dd5 da9
`[< ~
((@sval) (set T) ((total_on (T:=T))^~ R) A s ->
R s t) >] -> R (lub A) t \/ R t (lub A)
dd7
rewrite asbool_neg => /imply_asboolPn [As nRst]; right .9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba d89 dd3 dd4 26b dd5 da9 As : (@sval) (set T) ((total_on (T:=T))^~ R) A s nRst : ~ R s t
R t (lub A)
dd7
by have /lub_ub := As ; apply : Rtrans; have [] := ihA _ As _ Twt.
suff /(_ _ Twt) [Rts|RSst] : forall r , tower r -> R r s \/ R (succ s) r.9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba da9 dda ddb 26b dd5 Rts : R t s
ddc
by right ; apply : Rtrans Rts _; have [] := RS s.
by left .
move => r; elim => {r} [A sATw ihA|r Twr ihr].9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba da9 dda ddb 26b dd5 d89 dd3 ihA : forall t : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A t ->
R t s \/ R (succ s) t
R (lub A) s \/ R (succ s) (lub A)
have [?|/asboolP] := pselect (forall r , sval A r -> R r s).9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba da9 dda ddb 26b dd5 d89 dd3 e0d _a_ : forall r : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A r ->
R r s
e0e
by left ; apply : lub_lub.
rewrite asbool_neg => /existsp_asboolPn [r /asboolP].9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba da9 dda ddb 26b dd5 d89 dd3 e0d cbe
`[< ~
((@sval) (set T) ((total_on (T:=T))^~ R) A r ->
R r s) >] -> R (lub A) s \/ R (succ s) (lub A)
e0f
rewrite asbool_neg => /imply_asboolPn [Ar nRrs]; right .9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba da9 dda ddb 26b dd5 d89 dd3 e0d cbe Ar : (@sval) (set T) ((total_on (T:=T))^~ R) A r nRrs : ~ R r s
R (succ s) (lub A)
e0f
by have /lub_ub := Ar; apply : Rtrans; have /ihA [] := Ar.
have [Rrs|RSsr] := ihr; last by right ; apply : Rtrans RSsr _; have [] := RS r.9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba da9 dda ddb 26b dd5 cbe e12 e13 Rrs : R r s
e14
have : tower (succ r) by apply : Succ.e32 tower (succ r) -> R (succ r) s \/ R (succ s) (succ r)
move => /ihs [RsSr|]; last by left .9 d77 d78 d79 d7a d7b d7c d7d d7e d7f d80 d81 d82 d8e d9e dae dba da9 dda ddb 26b dd5 cbe e12 e13 e33 RsSr : R s (succ r)
e14
by have [->|->] := succS _ _ Rrs RsSr; [right |left ]; apply : Rrefl.
Qed .
End ZL .
Lemma Zorn T (R : T -> T -> Prop ) :
(forall t , R t t) -> (forall r s t , R r s -> R s t -> R r t) ->
(forall s t , R s t -> R t s -> s = t) ->
(forall A : set T, total_on A R -> exists t , forall s , A s -> R s t) ->
exists t , forall s , R t s -> s = t.9 d78
(forall t : T, R t t) ->
(forall r s t : T, R r s -> R s t -> R r t) ->
(forall s t : T, R s t -> R t s -> s = t) ->
(forall A : set T,
total_on A R ->
exists t : T, forall s : T, A s -> R s t) ->
exists t : T, forall s : T, R t s -> s = t
Proof .e3e
move => Rrefl Rtrans Rantisym Rtot_max.9 d78 d79 d7a d7b Rtot_max : forall A : set T,
total_on A R ->
exists t : T, forall s : T, A s -> R s t
exists t : T, forall s : T, R t s -> s = t
set totR := ({A : set T | total_on A R}).9 d78 d79 d7a d7b e47 totR := {A : set T | total_on A R} : Type
e48
set R' := fun A B : totR => sval A `<=` sval B.9 d78 d79 d7a d7b e47 e4d R' := fun A B : totR =>
(@sval) (set T) ((total_on (T:=T))^~ R) A
`<=` (@sval) (set T) ((total_on (T:=T))^~ R) B: totR -> totR -> Prop
e48
have R'refl A : R' A A by [].9 d78 d79 d7a d7b e47 e4d e52 R'refl : forall A : totR, R' A A
e48
have R'trans A B C : R' A B -> R' B C -> R' A C by apply : subset_trans.9 d78 d79 d7a d7b e47 e4d e52 e57 R'trans : forall A B C : totR,
R' A B -> R' B C -> R' A C
e48
have R'antisym A B : R' A B -> R' B A -> A = B.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c A, B : totR
R' A B -> R' B A -> A = B
rewrite /R'; case : A; case : B => /= B totB A totA sAB sBA.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c B : set TtotB : total_on B R a totA : total_on A R 36b sBA : B `<=` A
exist ((total_on (T:=T))^~ R) A totA =
exist ((total_on (T:=T))^~ R) B totB
e63
by apply : eq_exist; rewrite predeqE=> ?; split => [/sAB|/sBA].
have R'tot_lub A : total_on A R' -> exists t , (forall s , A s -> R' s t) /\
forall r , (forall s , A s -> R' s r) -> R' t r.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 A : set totR
total_on A R' ->
exists t : totR,
(forall s : totR, A s -> R' s t) /\
(forall r : totR,
(forall s : totR, A s -> R' s r) -> R' t r)
move => Atot.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 e77 Atot : total_on A R'
exists t : totR,
(forall s : totR, A s -> R' s t) /\
(forall r : totR,
(forall s : totR, A s -> R' s r) -> R' t r)
e79
have AUtot : total_on (\bigcup_(B in A) (sval B)) R.e80 total_on
(\bigcup_(B in A)
(@sval) (set T) ((total_on (T:=T))^~ R) B) R
move => s t [B AB Bs] [C AC Ct].9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 e77 e81 s, t : T B : totR AB : A B Bs : (@sval) (set T) ((total_on (T:=T))^~ R) B s C : totR AC : A C Ct : (@sval) (set T) ((total_on (T:=T))^~ R) C t
R s t \/ R t s
e87
have [/(_ _ Bs) Cs|/(_ _ Ct) Bt] := Atot _ _ AB AC.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 e77 e81 e8f e90 e91 e92 e93 e94 e95 Cs : (@sval) (set T) ((total_on (T:=T))^~ R) C s
e96
by have /(_ _ _ Cs Ct) := svalP C.
by have /(_ _ _ Bs Bt) := svalP B.
exists (exist _ (\bigcup_(B in A) sval B) AUtot); split .e89 forall s : totR,
A s ->
R' s
(exist ((total_on (T:=T))^~ R)
(\bigcup_(B in A)
(@sval) (set T) ((total_on (T:=T))^~ R) B)
AUtot)
by move => B ???; exists B .
by move => B Bub ? /= [? /Bub]; apply .
apply : contrapT => nomax.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 e7c nomax : ~ (exists t : T, forall s : T, R t s -> s = t)
d83
have {}nomax t : exists s , R t s /\ s <> t.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 e7c eb7 26b
exists s : T, R t s /\ s <> t
have /asboolP := nomax; rewrite asbool_neg => /forallp_asboolPn /(_ t).ebb ~ (forall s : T, R t s -> s = t) ->
exists s : T, R t s /\ s <> t
ebd
move => /asboolP; rewrite asbool_neg => /existsp_asboolPn [s].9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 e7c eb7 t, s : T
~ (R t s -> s = t) -> exists s : T, R t s /\ s <> t
ebd
by move => /asboolP; rewrite asbool_neg => /imply_asboolPn []; exists s .
have tot0 : total_on set0 R by [].9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 e7c ec0 tot0 : total_on set0 R
d83
apply : (ZL' (exist _ set0 tot0)) R'tot_lub _ => // A.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 ec0 ed2 d89
exists t : {A : set T | total_on A R},
R' A t /\
A <> t /\
(forall r : {A : set T | total_on A R},
R' A r -> R' r t -> r = A \/ r = t)
have /Rtot_max [t tub] := svalP A; have [s [Rts snet]] := nomax t.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 ec0 ed2 d89 26b tub : forall s : T,
(@sval) (set T) ((total_on (T:=T))^~ R) A s ->
R s tda9 dfb snet : s <> t
ed7
have Astot : total_on (sval A `|` [set s]) R.edb total_on
((@sval) (set T) ((total_on (T:=T))^~ R) A
`|` [set s]) R
move => u v [Au|->]; last first .9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 ec0 ed2 d89 26b edc da9 dfb edd u, v : T
((@sval) (set T) ((total_on (T:=T))^~ R) A `|` [set s])
v -> R s v \/ R v s
by move => [/tub Rvt|->]; right => //; apply : Rtrans Rts.
move => [Av|->]; [apply : (svalP A)|left ] => //.
by apply : Rtrans Rts; apply : tub.
exists (exist _ (sval A `|` [set s]) Astot); split ; first by move => ??; left .ee4 A <>
exist ((total_on (T:=T))^~ R)
((@sval) (set T) ((total_on (T:=T))^~ R) A
`|` [set s]) Astot /\
(forall r : {A : set T | total_on A R},
R' A r ->
R' r
(exist ((total_on (T:=T))^~ R)
((@sval) (set T) ((total_on (T:=T))^~ R) A
`|` [set s]) Astot) ->
r = A \/
r =
exist ((total_on (T:=T))^~ R)
((@sval) (set T) ((total_on (T:=T))^~ R) A
`|` [set s]) Astot)
split => [AeAs|[B Btot] sAB sBAs].9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 ec0 ed2 d89 26b edc da9 dfb edd ee5 AeAs : A =
exist ((total_on (T:=T))^~ R)
((@sval) (set T) ((total_on (T:=T))^~ R) A
`|` [set s]) Astot
d83
have [/tub Rst|] := (pselect (sval A s)); first exact /snet/Rantisym.f02 ~ (@sval) (set T) ((total_on (T:=T))^~ R) A s -> False
f04
by rewrite AeAs /=; apply ; right .
have [Bs|nBs] := pselect (B s).9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 ec0 ed2 d89 26b edc da9 dfb edd ee5 e6b f07 f08 f09 Bs : B s
f0a
by right ; apply : eq_exist; rewrite predeqE => r; split => [/sBAs|[/sAB|->]].
left ; case : A tub Astot sBAs sAB => A Atot /= tub Astot sBAs sAB.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 ec0 ed2 ec9 dfb edd e6b f07 f1a a Atot : total_on A R tub : forall s : T, A s -> R s tAstot : total_on (A `|` [set s]) R sBAs : R' (exist ((total_on (T:=T))^~ R) B Btot)
(exist ((total_on (T:=T))^~ R)
(A `|` [set s]) Astot) sAB : R' (exist ((total_on (T:=T))^~ R) A Atot)
(exist ((total_on (T:=T))^~ R) B Btot)
exist ((total_on (T:=T))^~ R) B Btot =
exist ((total_on (T:=T))^~ R) A Atot
apply : eq_exist; rewrite predeqE => r; split => [Br|/sAB] //.9 d78 d79 d7a d7b e47 e4d e52 e57 e5c e66 ec0 ed2 ec9 dfb edd e6b f07 f1a a f22 f23 f24 f25 f26 cbe Br : B r
A r
by have /sBAs [|ser] // := Br; rewrite ser in Br.
Qed .
Definition premaximal T (R : T -> T -> Prop ) (t : T) :=
forall s , R t s -> R s t.
Lemma ZL_preorder T (t0 : T) (R : T -> T -> Prop ) :
(forall t , R t t) -> (forall r s t , R r s -> R s t -> R r t) ->
(forall A : set T, total_on A R -> exists t , forall s , A s -> R s t) ->
exists t , premaximal R t.9 d77 d78
(forall t : T, R t t) ->
(forall r s t : T, R r s -> R s t -> R r t) ->
(forall A : set T,
total_on A R ->
exists t : T, forall s : T, A s -> R s t) ->
exists t : T, premaximal R t
Proof .f2f
set Teq := @gen_eqMixin T; set Tch := @gen_choiceMixin T.
set Tp := Pointed.Pack (Pointed.Class (Choice.Class Teq Tch ) t0).
move => Rrefl Rtrans tot_max.9 d77 d78 d7e d7f d80 d79 d7a tot_max : forall A : set T,
total_on A R ->
exists t : T, forall s : T, A s -> R s t
exists t : T, premaximal R t
set eqR := fun s t => R s t /\ R t s; set ceqR := fun s => [set t | eqR s t].9 d77 d78 d7e d7f d80 d79 d7a f40 eqR := fun s t : T => R s t /\ R t s: T -> T -> Prop ceqR := fun s : T => [set t | eqR s t]: T -> set T
f41
have eqR_trans r s t : eqR r s -> eqR s t -> eqR r t.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 r, s, t : T
eqR r s -> eqR s t -> eqR r t
by move => [Rrs Rsr] [Rst Rts]; split ; [apply : Rtrans Rst|apply : Rtrans Rsr].
have ceqR_uniq s t : eqR s t -> ceqR s = ceqR t.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 e8f
eqR s t -> ceqR s = ceqR t
by rewrite predeqE => - [Rst Rts] r; split => [[Rr rR] | [Rr rR]]; split ;
try exact : Rtrans Rr; exact : Rtrans rR _.
set ceqRs := ceqR @` setT; set quotR := sig ceqRs.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d ceqRs := range ceqR : set (set T)quotR := {x : set T | ceqRs x} : Type
f41
have ceqRP t : ceqRs (ceqR t) by exists t .9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 ceqRP : forall t : T, ceqRs (ceqR t)
f41
set lift := fun t => exist _ (ceqR t) (ceqRP t).9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b lift := fun t : T => exist ceqRs (ceqR t) (ceqRP t): T -> {x : set T | ceqRs x}
f41
have lift_surj (A : quotR) : exists t : Tp, lift t = A.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 A : quotR
exists t : Tp, lift t = A
case : A => A [t Tt ctA]; exists t ; rewrite /lift; case : _ / ctA.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 a 26b Tt : [set : T] t
exist ceqRs (ceqR t) (ceqRP t) =
exist ceqRs (ceqR t)
(ex_intro2 [eta [set : T]]
(fun x : T => ceqR x = ceqR t) t Tt
(erefl (ceqR t)))
f77
exact /congr1/Prop_irrelevance.
have lift_inj s t : eqR s t -> lift s = lift t.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a e8f
eqR s t -> lift s = lift t
by move => eqRst; apply /eq_exist/ceqR_uniq.
have lift_eqR s t : lift s = lift t -> eqR s t.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c e8f
lift s = lift t -> eqR s t
move => cst; have ceqst : ceqR s = ceqR t by have := congr1 sval cst.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c e8f cst : lift s = lift t ceqst : ceqR s = ceqR t
eqR s t
f95
by rewrite [_ s]ceqst; split ; apply : Rrefl.
set repr := fun A : quotR => get [set t : Tp | lift t = A].9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 repr := fun A : quotR =>
[get x : _ | [set t | lift t = A] x]: quotR -> Tp
f41
have repr_liftE t : eqR t (repr (lift t))
by apply : lift_eqR; have -> := getPex (lift_surj (lift t)).9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 repr_liftE : forall t : T, eqR t (repr (lift t))
f41
set R' := fun A B : quotR => R (repr A) (repr B).9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac R' := fun A B : quotR => R (repr A) (repr B): quotR -> quotR -> Prop
f41
have R'refl A : R' A A by apply : Rrefl.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac fb1 R'refl : forall A : quotR, R' A A
f41
have R'trans A B C : R' A B -> R' B C -> R' A C by apply : Rtrans.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac fb1 fb6 R'trans : forall A B C : quotR,
R' A B -> R' B C -> R' A C
f41
have R'antisym A B : R' A B -> R' B A -> A = B.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac fb1 fb6 fbb A, B : quotR
e62
move => RAB RBA; have [t tA] := lift_surj A; have [s sB] := lift_surj B.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac fb1 fb6 fbb fc0 RAB : R' A B RBA : R' B A t : Tp tA : lift t = A s : Tp sB : lift s = B
dc fc1
rewrite -tA -sB; apply : lift_inj; apply (eqR_trans _ _ _ (repr_liftE t)).9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f98 fa7 fac fb1 fb6 fbb fc0 fc9 fca fcb fcc fcd fce
eqR (repr (lift t)) s
fc1
have eAB : eqR (repr A) (repr B) by [].9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f98 fa7 fac fb1 fb6 fbb fc0 fc9 fca fcb fcc fcd fce eAB : eqR (repr A) (repr B)
fd3 fc1
rewrite tA; apply : eqR_trans eAB _; rewrite -sB.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f5d f65 f66 f6b f70 f7a f98 fa7 fac fb1 fb6 fbb fc0 fc9 fca fcb fcc fcd fce
eqR (repr (lift s)) s
fc1
by have [] := repr_liftE s.
have [A Atot|A Amax] := Zorn R'refl R'trans R'antisym.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac fb1 fb6 fbb fc4 A : set quotRe81
exists t : quotR, forall s : quotR, A s -> R' s t
have /tot_max [t tmax] : total_on [set repr B | B in A] R.fe4 total_on [set repr B | B in A] R
by move => ?? [B AB <-] [C AC <-]; apply : Atot.
exists (lift t ) => B AB; have [Rt _] := repr_liftE t.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac fb1 fb6 fbb fc4 fe5 e81 26b ff2 B : quotR e91 Rt : R t (repr (lift t))
R' B (lift t)
fe7
by apply : Rtrans Rt; apply : tmax; exists B .
exists (repr A ) => t RAt.9 d77 d78 d7e d7f d80 d79 d7a f40 f46 f47 f51 f5d f65 f66 f6b f70 f7a f8c f98 fa7 fac fb1 fb6 fbb fc4 f75 fea 26b RAt : R (repr A) t
R t (repr A)
have /Amax <- : R' A (lift t).
by have [Rt _] := repr_liftE t; apply : Rtrans Rt.
by have [] := repr_liftE t.
Qed .
Section UpperLowerTheory .
Import Order.TTheory.
Variables (d : unit) (T : porderType d).
Implicit Types (A : set T) (x y z : T).
Definition ubound A : set T := [set y | forall x , A x -> (x <= y)%O].
Definition lbound A : set T := [set y | forall x , A x -> (y <= x)%O].
Lemma ubP A x : (forall y , A y -> (y <= x)%O) <-> ubound A x.1a T : porderType d a b
(forall y , A y -> (y <= x)%O) <-> ubound A x
Proof .1011
by []. Qed .
Lemma lbP A x : (forall y , A y -> (x <= y)%O) <-> lbound A x.1013 (forall y , A y -> (x <= y)%O) <-> lbound A x
Proof .1018
by []. Qed .
Lemma ub_set1 x y : ubound [set x] y = (x <= y)%O.1a 1014 x, y : T
ubound [set x] y = (x <= y)%O
Proof .101d
by rewrite propeqE; split => [/(_ x erefl)//|xy z ->]. Qed .
Lemma lb_set1 x y : lbound [set x] y = (x >= y)%O.101f lbound [set x] y = (y <= x)%O
Proof .1024
by rewrite propeqE; split => [/(_ x erefl)//|xy z ->]. Qed .
Lemma lb_ub_set1 x y : lbound (ubound [set x]) y -> (y <= x)%O.101f lbound (ubound [set x]) y -> (y <= x)%O
Proof .1029
by move /(_ x); apply ; rewrite ub_set1. Qed .
Lemma ub_lb_set1 x y : ubound (lbound [set x]) y -> (x <= y)%O.101f ubound (lbound [set x]) y -> (x <= y)%O
Proof .102e
by move /(_ x); apply ; rewrite lb_set1. Qed .
Lemma lb_ub_refl x : lbound (ubound [set x]) x.1a 1014 b
lbound (ubound [set x]) x
Proof .1033
by move => y; apply . Qed .
Lemma ub_lb_refl x : ubound (lbound [set x]) x.1035 ubound (lbound [set x]) x
Proof .1039
by move => y; apply . Qed .
Lemma ub_lb_ub A x y : ubound A y -> lbound (ubound A) x -> (x <= y)%O.1a 1014 a 1020
ubound A y -> lbound (ubound A) x -> (x <= y)%O
Proof .103e
by move => Ay; apply . Qed .
Lemma lb_ub_lb A x y : lbound A y -> ubound (lbound A) x -> (y <= x)%O.1040 lbound A y -> ubound (lbound A) x -> (y <= x)%O
Proof .1044
by move => Ey; apply . Qed .
(* down set (i.e., generated order ideal) *)
(* i.e. down A := { x | exists y, y \in A /\ x <= y} *)
Definition down A : set T := [set x | exists y , A y /\ (x <= y)%O].
Definition has_ubound A := ubound A !=set0.
Definition has_sup A := A !=set0 /\ has_ubound A.
Definition has_lbound A := lbound A !=set0.
Definition has_inf A := A !=set0 /\ has_lbound A.
Lemma has_ub_set1 x : has_ubound [set x].
Proof .1049
by exists x ; rewrite ub_set1. Qed .
Lemma has_inf0 : ~ has_inf (@set0 T).
Proof .104e
by rewrite /has_inf not_andP; left ; apply /set0P/negP/negPn. Qed .
Lemma has_sup0 : ~ has_sup (@set0 T).
Proof .1054
by rewrite /has_sup not_andP; left ; apply /set0P/negP/negPn. Qed .
Lemma has_sup1 x : has_sup [set x].
Proof .1059
by split ; [exists x | exists x => y ->]. Qed .
Lemma has_inf1 x : has_inf [set x].
Proof .105e
by split ; [exists x | exists x => y ->]. Qed .
Lemma subset_has_lbound A B : A `<=` B -> has_lbound B -> has_lbound A.1a 1014 b3
A `<=` B -> has_lbound B -> has_lbound A
Proof .1063
by move => AB [l Bl]; exists l => a Aa; apply /Bl/AB. Qed .
Lemma subset_has_ubound A B : A `<=` B -> has_ubound B -> has_ubound A.1065 A `<=` B -> has_ubound B -> has_ubound A
Proof .1069
by move => AB [l Bl]; exists l => a Aa; apply /Bl/AB. Qed .
Lemma downP A x : (exists2 y, A y & (x <= y)%O) <-> down A x.1013 (exists2 y : T, A y & (x <= y)%O) <-> down A x
Proof .106e
by split => [[y Ay xy]|[y [Ay xy]]]; [exists y | exists y ]. Qed .
Definition isLub A m := ubound A m /\ forall b , ubound A b -> (m <= b)%O.
Definition supremums A := ubound A `&` lbound (ubound A).
Lemma supremums1 x : supremums [set x] = [set x].1035 supremums [set x] = [set x]
Proof .1073
rewrite /supremums predeqE => y; split => [[]|->{y}]; last first .1035 (ubound [set x] `&` lbound (ubound [set x])) x
by split ; [rewrite ub_set1|exact : lb_ub_refl].
by rewrite ub_set1 => xy /lb_ub_set1 yx; apply /eqP; rewrite eq_le xy yx.
Qed .
Lemma is_subset1_supremums A : is_subset1 (supremums A).1a 1014 a
is_subset1 (supremums A)
Proof .1082
move => x y [Ax xA] [Ay yA]; apply /eqP.1a 1014 a 1020 Ax : ubound A x xA : lbound (ubound A) x Ay : ubound A y yA : lbound (ubound A) y
x == y
by rewrite eq_le (ub_lb_ub Ax yA) (ub_lb_ub Ay xA).
Qed .
Definition supremum x0 A := if A == set0 then x0 else xget x0 (supremums A).
Lemma supremum_out x0 A : ~ has_sup A -> supremum x0 A = x0.1a 1014 af1 a
~ has_sup A -> supremum x0 A = x0
Proof .1091
move => hsA; rewrite /supremum; case : ifPn => // /set0P[/= x Ax].1a 1014 af1 a hsA : ~ has_sup A b Ax : A x
xget x0 (supremums A) = x0
case : xgetP => //= _ -> [uA _]; exfalso .1a 1014 af1 a 109a b 109b uA : ubound A (xget x0 (supremums A))
d83
by apply : hsA; split ; [exists x |exists (xget x0 (supremums A))].
Qed .
Lemma supremum0 x0 : supremum x0 set0 = x0.1a 1014 af1
supremum x0 set0 = x0
Proof .10a3
by rewrite /supremum eqxx. Qed .
Lemma supremum1 x0 x : supremum x0 [set x] = x.1a 1014 x0, x : T
supremum x0 [set x] = x
Proof .10a9
rewrite /supremum ifF; last first .10ab ([set x] == set0) = false
by apply /eqP; rewrite predeqE => /(_ x)[+ _]; apply .
by rewrite supremums1; case : xgetP => // /(_ x) /(_ erefl).
Qed .
Definition infimums A := lbound A `&` ubound (lbound A).
Lemma infimums1 x : infimums [set x] = [set x].1035 infimums [set x] = [set x]
Proof .10ba
rewrite /infimums predeqE => y; split => [[]|->{y}]; last first .1035 (lbound [set x] `&` ubound (lbound [set x])) x
by split ; [rewrite lb_set1|apply ub_lb_refl].
by rewrite lb_set1 => xy /ub_lb_set1 yx; apply /eqP; rewrite eq_le xy yx.
Qed .
Lemma is_subset1_infimums A : is_subset1 (infimums A).1084 is_subset1 (infimums A)
Proof .10c9
move => x y [Ax xA] [Ay yA]; apply /eqP.1a 1014 a 1020 Ax : lbound A x xA : ubound (lbound A) x Ay : lbound A y yA : ubound (lbound A) y
108f
by rewrite eq_le (lb_ub_lb Ax yA) (lb_ub_lb Ay xA).
Qed .
Definition infimum x0 A := if A == set0 then x0 else xget x0 (infimums A).
End UpperLowerTheory .
Section UpperLowerOrderTheory .
Import Order.TTheory.
Variables (d : unit) (T : orderType d).
Implicit Types (A : set T) (x y z : T).
Lemma ge_supremum_Nmem x0 A t :
supremums A !=set0 -> A t -> (supremum x0 A >= t)%O.1a T : orderType d af1 a 26b
supremums A !=set0 -> A t -> (t <= supremum x0 A)%O
Proof .10d6
case => x Ax; rewrite /supremum; case : ifPn => [/eqP -> //|_].1a 10d9 af1 a t, x : T Ax : supremums A x
A t -> (t <= xget x0 (supremums A))%O
by case : xgetP => [y yA [uAy _]|/(_ x) //]; exact : uAy.
Qed .
Lemma le_infimum_Nmem x0 A t :
infimums A !=set0 -> A t -> (infimum x0 A <= t)%O.10d8 infimums A !=set0 -> A t -> (infimum x0 A <= t)%O
Proof .10e4
case => x Ex; rewrite /infimum; case : ifPn => [/eqP -> //|_].1a 10d9 af1 a 10e0 Ex : infimums A x
A t -> (xget x0 (infimums A) <= t)%O
by case : xgetP => [y yE [uEy _]|/(_ x) //]; exact : uEy.
Qed .
End UpperLowerOrderTheory .
Lemma nat_supremums_neq0 (A : set nat) : ubound A !=set0 -> supremums A !=set0.A : set nat
ubound A !=set0 -> supremums A !=set0
Proof .10ef
case => /=; elim => [A0|n ih]; first by exists O .10f2 4c5 ih : ubound A n -> supremums A !=set0
ubound A n.+1 -> supremums A !=set0
case : (pselect (ubound A n)) => [/ih //|An {ih}] An1.10f2 4c5 An : ~ ubound A n An1 : ubound A n.+1
supremums A !=set0
exists n .+1 ; split => // m Am; case /existsNP : An => k /not_implyP[Ak /negP].10f2 4c5 1100 m : Order.NatOrder.porderType Am : ubound A m k : Order.NatOrder.porderType Ak : A k
~~ (k <= n)%O -> (n.+1 <= m)%O
rewrite -Order.TotalTheory.ltNge => kn.10f2 4c5 1100 1106 1107 1108 1109 kn : (n < k)%O
(n.+1 <= m)%O
by rewrite (Order.POrderTheory.le_trans _ (Am _ Ak)).
Qed .
Definition meets T (F G : set (set T)) :=
forall A B , F A -> G B -> A `&` B !=set0.
Notation "F `#` G" := (meets F G) : classical_set_scope.
Section meets .
Lemma meetsC T (F G : set (set T)) : F `#` G = G `#` F.9 F, G : set (set T)
F `#` G = G `#` F
Proof .1112
gen have sFG : F G / F `#` G -> G `#` F.
by move => FG B A => /FG; rewrite setIC; apply .
by rewrite propeqE; split ; apply : sFG.
Qed .
Lemma sub_meets T (F F' G G' : set (set T)) :
F `<=` F' -> G `<=` G' -> F' `#` G' -> F `#` G.9 F, F', G, G' : set (set T)
F `<=` F' -> G `<=` G' -> F' `#` G' -> F `#` G
Proof .1124
by move => sF sG FG A B /sF FA /sG GB; apply : (FG A B). Qed .
Lemma meetsSr T (F G G' : set (set T)) :
G `<=` G' -> F `#` G' -> F `#` G.9 F, G, G' : set (set T)
G `<=` G' -> F `#` G' -> F `#` G
Proof .112b
exact : sub_meets. Qed .
Lemma meetsSl T (G F F' : set (set T)) :
F `<=` F' -> F' `#` G -> F `#` G.9 G, F, F' : set (set T)
F `<=` F' -> F' `#` G -> F `#` G
Proof .1132
by move => /sub_meets; apply . Qed .
End meets .
Fact set_display : unit. Proof .1139
by []. Qed .
Module SetOrder .
Module Internal .
Section SetOrder .
Context {T : Type }.
Implicit Types A B : set T.
Lemma le_def A B : `[< A `<=` B >] = (A `&` B == A).d3 `[< A `<=` B >] = (A `&` B == A)
Proof .113e
by apply /asboolP/eqP; rewrite setIidPl. Qed .
Lemma lt_def A B : `[< A `<` B >] = (B != A) && `[< A `<=` B >].d3 `[< A `<` B >] = (B != A) && `[< A `<=` B >]
Proof .1143
apply /idP/idP => [/asboolP|/andP[BA /asboolP AB]]; rewrite properEneq eq_sym;
by [move => [] -> /asboolP|apply /asboolP].
Qed .
Lemma joinKI B A : A `&` (A `|` B) = A.9 B, A : set T
A `&` (A `|` B) = A
Proof .1148
by rewrite setUC setKU. Qed .
Lemma meetKU B A : A `|` (A `&` B) = A.
Proof .114f
by rewrite setIC setKI. Qed .
Definition orderMixin := @MeetJoinMixin _ _ (fun A B => `[<proper A B>]) setI
setU le_def lt_def (@setIC _) (@setUC _) (@setIA _) (@setUA _) joinKI meetKU
(@setIUl _) setIid.
Local Canonical porderType := POrderType set_display (set T) orderMixin.
Local Canonical latticeType := LatticeType (set T) orderMixin.
Local Canonical distrLatticeType := DistrLatticeType (set T) orderMixin.
Lemma SetOrder_sub0set A : (set0 <= A)%O.
Proof .1154
by apply /asboolP; apply : sub0set. Qed .
Lemma SetOrder_setTsub A : (A <= setT)%O.
Proof .1159
exact /asboolP. Qed .
Local Canonical bLatticeType :=
BLatticeType (set T) (Order.BLattice.Mixin SetOrder_sub0set).
Local Canonical tbLatticeType :=
TBLatticeType (set T) (Order.TBLattice.Mixin SetOrder_setTsub).
Local Canonical bDistrLatticeType := [bDistrLatticeType of set T].
Local Canonical tbDistrLatticeType := [tbDistrLatticeType of set T].
Lemma subKI A B : B `&` (A `\` B) = set0.
Proof .115e
by rewrite setDE setICA setICr setI0. Qed .
Lemma joinIB A B : (A `&` B) `|` A `\` B = A.42c
Proof .42f by rewrite setUC -setDDr setDv setD0. Qed .
Local Canonical cbDistrLatticeType := CBDistrLatticeType (set T)
(@CBDistrLatticeMixin _ _ (fun A B => A `\` B) subKI joinIB).
Local Canonical ctbDistrLatticeType := CTBDistrLatticeType (set T)
(@CTBDistrLatticeMixin _ _ _ (fun A => ~` A) (fun x => esym (setTD x))).
End SetOrder .
End Internal .
Module Exports .
Canonical Internal .porderType.
Canonical Internal .latticeType.
Canonical Internal .distrLatticeType.
Canonical Internal .bLatticeType.
Canonical Internal .tbLatticeType.
Canonical Internal .bDistrLatticeType.
Canonical Internal .tbDistrLatticeType.
Canonical Internal .cbDistrLatticeType.
Canonical Internal .ctbDistrLatticeType.
Section exports .
Context {T : Type }.
Implicit Types A B : set T.
Lemma subsetEset A B : (A <= B)%O = (A `<=` B) :> Prop .d3 (A <= B)%O = (A `<=` B)
Proof .1164
by rewrite asboolE. Qed .
Lemma properEset A B : (A < B)%O = (A `<` B) :> Prop .
Proof .1169
by rewrite asboolE. Qed .
Lemma subEset A B : (A `\` B)%O = (A `\` B). Proof .116e
by []. Qed .
Lemma complEset A : (~` A)%O = ~` A. Proof .1173
by []. Qed .
Lemma botEset : 0 %O = @set0 T. Proof .1178
by []. Qed .
Lemma topEset : 1 %O = @setT T. Proof .117d
by []. Qed .
Lemma meetEset A B : (A `&` B)%O = (A `&` B). Proof .1182
by []. Qed .
Lemma joinEset A B : (A `|` B)%O = (A `|` B). Proof .1187
by []. Qed .
Lemma subsetPset A B : reflect (A `<=` B) (A <= B)%O.d3 reflect (A `<=` B) (A <= B)%O
Proof .118c
by apply : (iffP idP); rewrite subsetEset. Qed .
Lemma properPset A B : reflect (A `<` B) (A < B)%O.d3 reflect (A `<` B) (A < B)%O
Proof .1191
by apply : (iffP idP); rewrite properEset. Qed .
End exports .
End Exports .
End SetOrder .
Export SetOrder.Exports.
Section product .
Variables (T1 T2 : Type ).
Implicit Type A B : set (T1 * T2).
Lemma subset_fst_set : {homo @fst_set T1 T2 : A B / A `<=` B}.b67
{homo fst_set (T2:=T2) : A B / A `<=` B >-> A `<=` B}
Proof .1196
by move => A B AB x [y Axy]; exists y ; exact /AB. Qed .
Lemma subset_snd_set : {homo @snd_set T1 T2 : A B / A `<=` B}.1198 {homo snd_set (T2:=T2) : A B / A `<=` B >-> A `<=` B}
Proof .119c
by move => A B AB x [y Axy]; exists y ; exact /AB. Qed .
Lemma fst_set_fst A : A `<=` A.`1 \o fst.b67 A : set (T1 * T2)
A `<=` A.`1 \o fst
Proof .11a1
by move => [x y]; exists y . Qed .
Lemma snd_set_snd A : A `<=` A.`2 \o snd. Proof .11a8
by move => [x y]; exists x . Qed .
Lemma fst_setM (X : set T1) (Y : set T2) : (X `*` Y).`1 `<=` X.b67 X : set T1Y : set T2
(X `*` Y).`1 `<=` X
Proof .11ad
by move => x [y [//]]. Qed .
Lemma snd_setM (X : set T1) (Y : set T2) : (X `*` Y).`2 `<=` Y.
Proof .11b5
by move => x [y [//]]. Qed .
Lemma fst_setMR (X : set T1) (Y : T1 -> set T2) : (X `*`` Y).`1 `<=` X.b67 11b0 Y : T1 -> set T2
(X `*`` Y).`1 `<=` X
Proof .11ba
by move => x [y [//]]. Qed .
End product .
Section section .
Variables (T1 T2 : Type ).
Implicit Types (A : set (T1 * T2)) (x : T1) (y : T2).
Definition xsection A x := [set y | (x, y) \in A].
Definition ysection A y := [set x | (x, y) \in A].
Lemma xsection_snd_set A x : xsection A x `<=` A.`2 .b67 11a4 471
xsection A x `<=` A.`2
Proof .11c1
by move => y Axy; exists x ; rewrite /xsection/= inE in Axy. Qed .
Lemma ysection_fst_set A y : ysection A y `<=` A.`1 .b67 11a4 472
ysection A y `<=` A.`1
Proof .11c7
by move => x Axy; exists y ; rewrite /ysection/= inE in Axy. Qed .
Lemma mem_xsection x y A : (y \in xsection A x) = ((x, y) \in A).b67 471 472 11a4
(y \in xsection A x) = ((x, y) \in A)
Proof .11cd
by apply /idP/idP => [|]; [rewrite inE|rewrite /xsection !inE /= inE]. Qed .
Lemma mem_ysection x y A : (x \in ysection A y) = ((x, y) \in A).11cf (x \in ysection A y) = ((x, y) \in A)
Proof .11d3
by apply /idP/idP => [|]; [rewrite inE|rewrite /ysection !inE /= inE]. Qed .
Lemma xsection0 x : xsection set0 x = set0.b67 471
xsection set0 x = set0
Proof .11d8
by rewrite predeqE /xsection => y; split => //=; rewrite inE. Qed .
Lemma ysection0 y : ysection set0 y = set0.b67 472
ysection set0 y = set0
Proof .11de
by rewrite predeqE /ysection => x; split => //=; rewrite inE. Qed .
Lemma in_xsectionM X1 X2 x : x \in X1 -> xsection (X1 `*` X2) x = X2.b67 X1 : set_predType T1 457 471
x \in X1 -> xsection (X1 `*` X2) x = X2
Proof .11e4
move => xX1; apply /seteqP; split => [y /xsection_snd_set|]; first exact : snd_setM.b67 11e7 457 471 xX1 : x \in X1
X2 `<=` xsection (X1 `*` X2) x
by move => y X2y; rewrite /xsection/= inE; split => //=; rewrite inE in xX1.
Qed .
Lemma in_ysectionM X1 X2 y : y \in X2 -> ysection (X1 `*` X2) y = X1.b67 456 X2 : set_predType T2 472
y \in X2 -> ysection (X1 `*` X2) y = X1
Proof .11f1
move => yX2; apply /seteqP; split => [x /ysection_fst_set|]; first exact : fst_setM.b67 456 11f4 472 yX2 : y \in X2
X1 `<=` ysection (X1 `*` X2) y
by move => x X1x; rewrite /ysection/= inE; split => //=; rewrite inE in yX2.
Qed .
Lemma notin_xsectionM X1 X2 x : x \notin X1 -> xsection (X1 `*` X2) x = set0.11e6 x \notin X1 -> xsection (X1 `*` X2) x = set0
Proof .11fe
move => xX1; rewrite /xsection /= predeqE => y; split => //.b67 11e7 457 471 xX1 : x \notin X1 472
[set y | (x, y) \in X1 `*` X2] y -> set0 y
by rewrite /xsection/= inE => -[] /=; rewrite notin_set in xX1.
Qed .
Lemma notin_ysectionM X1 X2 y : y \notin X2 -> ysection (X1 `*` X2) y = set0.11f3 y \notin X2 -> ysection (X1 `*` X2) y = set0
Proof .1209
move => yX2; rewrite /xsection /= predeqE => x; split => //.b67 456 11f4 472 yX2 : y \notin X2 471
ysection (X1 `*` X2) y x -> set0 x
by rewrite /ysection/= inE => -[_]; rewrite notin_set in yX2.
Qed .
Lemma xsection_bigcup (F : nat -> set (T1 * T2)) x :
xsection (\bigcup_n F n) x = \bigcup_n xsection (F n) x.b67 F : nat -> set (T1 * T2) 471
xsection (\bigcup_n F n) x =
\bigcup_n xsection (F n) x
Proof .1214
rewrite predeqE /xsection => y; split => [|[n _]] /=; rewrite inE.b67 1217 471 472
(\bigcup_n F n) (x, y) ->
(\bigcup_n [set y | (x, y) \in F n]) y
by move => -[n _ Fnxy]; exists n => //=; rewrite inE.
by move => Fnxy; rewrite inE; exists n .
Qed .
Lemma ysection_bigcup (F : nat -> set (T1 * T2)) y :
ysection (\bigcup_n F n) y = \bigcup_n ysection (F n) y.b67 1217 472
ysection (\bigcup_n F n) y =
\bigcup_n ysection (F n) y
Proof .1227
rewrite predeqE /ysection => x; split => [|[n _]] /=; rewrite inE.b67 1217 472 471
(\bigcup_n F n) (x, y) ->
(\bigcup_n [set x | (x, y) \in F n]) x
by move => -[n _ Fnxy]; exists n => //=; rewrite inE.
by move => Fnxy; rewrite inE; exists n .
Qed .
Lemma trivIset_xsection (F : nat -> set (T1 * T2)) x : trivIset setT F ->
trivIset setT (fun n => xsection (F n) x).1216 trivIset [set : nat] F ->
trivIset [set : nat] (fun n : nat => xsection (F n) x)
Proof .1238
move => /trivIsetP h; apply /trivIsetP => i j _ _ ij.b67 1217 471 h : forall i j : nat_eqType,
[set : nat] i ->
[set : nat] j -> i != j -> F i `&` F j = set0d3b d3c
xsection (F i) x `&` xsection (F j) x = set0
rewrite /xsection /= predeqE => y; split => //= -[]; rewrite !inE => Fixy Fjxy.b67 1217 471 1240 d3b d3c 472 Fixy : F i (x, y) Fjxy : F j (x, y)
d83
by have := h i j Logic.I Logic.I ij; rewrite predeqE => /(_ (x, y))[+ _]; apply .
Qed .
Lemma trivIset_ysection (F : nat -> set (T1 * T2)) y : trivIset setT F ->
trivIset setT (fun n => ysection (F n) y).1229 trivIset [set : nat] F ->
trivIset [set : nat] (fun n : nat => ysection (F n) y)
Proof .1249
move => /trivIsetP h; apply /trivIsetP => i j _ _ ij.b67 1217 472 1240 d3b d3c
ysection (F i) y `&` ysection (F j) y = set0
rewrite /ysection /= predeqE => x; split => //= -[]; rewrite !inE => Fixy Fjxy.b67 1217 472 1240 d3b d3c 471 1246 1247
d83
by have := h i j Logic.I Logic.I ij; rewrite predeqE => /(_ (x, y))[+ _]; apply .
Qed .
Lemma le_xsection x : {homo xsection ^~ x : X Y / X `<=` Y >-> X `<=` Y}.11da {homo xsection^~ x : X Y / X `<=` Y >-> X `<=` Y}
Proof .1257
by move => X Y XY y; rewrite /xsection /= 2 !inE => /XY. Qed .
Lemma le_ysection y : {homo ysection ^~ y : X Y / X `<=` Y >-> X `<=` Y}.11e0 {homo ysection^~ y : X Y / X `<=` Y >-> X `<=` Y}
Proof .125c
by move => X Y XY x; rewrite /ysection /= 2 !inE => /XY. Qed .
Lemma xsectionI A B x : xsection (A `&` B) x = xsection A x `&` xsection B x.b67 A, B : set (T1 * T2)471
xsection (A `&` B) x = xsection A x `&` xsection B x
Proof .1261
by rewrite /xsection predeqE => y/=; split ; rewrite !inE => -[]. Qed .
Lemma ysectionI A B y : ysection (A `&` B) y = ysection A y `&` ysection B y.b67 1264 472
ysection (A `&` B) y = ysection A y `&` ysection B y
Proof .1268
by rewrite /ysection predeqE => x/=; split ; rewrite !inE => -[]. Qed .
Lemma xsectionD X Y x : xsection (X `\` Y) x = xsection X x `\` xsection Y x.b67 X, Y : set (T1 * T2)471
xsection (X `\` Y) x = xsection X x `\` xsection Y x
Proof .126e
by rewrite predeqE /xsection /= => y; split ; rewrite !inE. Qed .
Lemma ysectionD X Y y : ysection (X `\` Y) y = ysection X y `\` ysection Y y.b67 1271 472
ysection (X `\` Y) y = ysection X y `\` ysection Y y
Proof .1275
by rewrite predeqE /ysection /= => x; split ; rewrite !inE. Qed .
Lemma xsection_preimage_snd (B : set T2) x : xsection (snd @^-1 ` B) x = B.b67 44f 471
xsection (snd @^-1 ` B) x = B
Proof .127b
by apply /seteqP; split ; move => y/=; rewrite /xsection/= inE. Qed .
Lemma ysection_preimage_fst (A : set T1) y : ysection (fst @^-1 ` A) y = A.b67 448 472
ysection (fst @^-1 ` A) y = A
Proof .1281
by apply /seteqP; split ; move => x/=; rewrite /ysection/= inE. Qed .
End section .
Notation "B \; A" :=
([set xy | exists2 z, A (xy.1 , z) & B (z, xy.2 )]) : classical_set_scope.
Lemma set_compose_subset {X Y : Type } (A C : set (X * Y)) (B D : set (Y * X)) :
A `<=` C -> B `<=` D -> A \; B `<=` C \; D.X, Y : Type A, C : set (X * Y)B, D : set (Y * X)
A `<=` C -> B `<=` D -> A \; B `<=` C \; D
Proof .1287
by move => AsubC BD [x z] /= [y] Bxy Ayz; exists y ; [exact : BD | exact : AsubC].
Qed .
Lemma set_compose_diag {X : Type } (E : set (X * X)) :
E \; range (fun x => (x, x)) = E.X : Type E : set (X * X)
E \; range (fun x : X => (x, x)) = E
Proof .1290
rewrite eqEsubset; split => [[_ _] [_ [_ _ [<- <-//]]]|[x y] Exy]/=.1293 1294 x, y : X Exy : E (x, y)
exists2 z : X,
exists2 x0 : X, True & (x0, x0) = (x, z) & E (z, y)
by exists x => //; exists x .
Qed .