Library Coq.FSets.FSetProperties
Finite sets library
This functor derives additional properties from
FSetInterface.S.
Contrary to the functor in
FSetEqProperties it uses
predicates over sets instead of sets operations, i.e.
In x s instead of
mem x s=true,
Equal s s´ instead of
equal s s´=true, etc.
First, a functor for Weak Sets in functorial version.
Conversions between lists and sets
Alternative specification via fold_right
Induction principles for fold (contributed by S. Lescuyer)
In the following lemma, the step hypothesis is deliberately restricted
to the precise set s we are considering.
Same, with empty and add instead of Empty and Add. In this
case, P must be compatible with equality of sets
fold_rec_weak is a weaker principle than fold_rec_bis :
the step hypothesis must here be applicable to any x.
At the same time, it looks more like an induction principle,
and hence can be easier to use.
From the induction principle on fold, we can deduce some general
induction principles on sets.
fold can be used to reconstruct the same initial set.
Alternative (weaker) specifications for fold
When
FSets was first designed, the order in which Ocaml's
Set.fold
takes the set elements was unspecified. This specification reflects
this fact:
An alternate (and previous) specification for fold was based on
the recursive structure of a set. It is now lemmas fold_1 and
fold_2.
In fact, fold on empty sets is more than equivalent to
the initial element, it is Leibniz-equal to it.
Fold and other set operators
Lemma fold_empty :
forall i,
fold f empty i = i.
Lemma fold_add :
forall i s x,
~In x s ->
eqA (
fold f (
add x s)
i) (
f x (
fold f s i)).
Lemma add_fold :
forall i s x,
In x s ->
eqA (
fold f (
add x s)
i) (
fold f s i).
Lemma remove_fold_1:
forall i s x,
In x s ->
eqA (
f x (
fold f (
remove x s)
i)) (
fold f s i).
Lemma remove_fold_2:
forall i s x,
~In x s ->
eqA (
fold f (
remove x s)
i) (
fold f s i).
Lemma fold_union_inter :
forall i s s´,
eqA (
fold f (
union s s´) (
fold f (
inter s s´)
i))
(
fold f s (
fold f s´ i)).
Lemma fold_diff_inter :
forall i s s´,
eqA (
fold f (
diff s s´) (
fold f (
inter s s´)
i)) (
fold f s i).
Lemma fold_union:
forall i s s´,
(
forall x,
~(In x s/\In x s´)) ->
eqA (
fold f (
union s s´)
i) (
fold f s (
fold f s´ i)).
End Fold_More.
Lemma fold_plus :
forall s p,
fold (
fun _ =>
S)
s p = fold (
fun _ =>
S)
s 0
+ p.
End Fold.
Cardinal
Characterization of cardinal in terms of fold
Old specifications for cardinal.
Cardinal and (non-)emptiness
Cardinal and set operators
Lemma empty_cardinal :
cardinal empty = 0.
Hint Immediate empty_cardinal cardinal_1 :
set.
Lemma singleton_cardinal :
forall x,
cardinal (
singleton x)
= 1.
Hint Resolve singleton_cardinal:
set.
Lemma diff_inter_cardinal :
forall s s´,
cardinal (
diff s s´)
+ cardinal (
inter s s´)
= cardinal s .
Lemma union_cardinal:
forall s s´, (
forall x,
~(In x s/\In x s´)) ->
cardinal (
union s s´)
=cardinal s+cardinal s´.
Lemma subset_cardinal :
forall s s´,
s[<=]s´ ->
cardinal s <= cardinal s´ .
Lemma subset_cardinal_lt :
forall s s´ x,
s[<=]s´ ->
In x s´ ->
~In x s ->
cardinal s < cardinal s´.
Theorem union_inter_cardinal :
forall s s´,
cardinal (
union s s´)
+ cardinal (
inter s s´)
= cardinal s + cardinal s´ .
Lemma union_cardinal_inter :
forall s s´,
cardinal (
union s s´)
= cardinal s + cardinal s´ - cardinal (
inter s s´).
Lemma union_cardinal_le :
forall s s´,
cardinal (
union s s´)
<= cardinal s + cardinal s´.
Lemma add_cardinal_1 :
forall s x,
In x s ->
cardinal (
add x s)
= cardinal s.
Lemma add_cardinal_2 :
forall s x,
~In x s ->
cardinal (
add x s)
= S (
cardinal s).
Lemma remove_cardinal_1 :
forall s x,
In x s ->
S (
cardinal (
remove x s))
= cardinal s.
Lemma remove_cardinal_2 :
forall s x,
~In x s ->
cardinal (
remove x s)
= cardinal s.
Hint Resolve subset_cardinal union_cardinal add_cardinal_1 add_cardinal_2.
End WProperties_fun.
Now comes variants for self-contained weak sets and for full sets.
For these variants, only one argument is necessary. Thanks to
the subtyping WS<=S, the Properties functor which is meant to be
used on modules (M:S) can simply be an alias of WProperties.
Now comes some properties specific to the element ordering,
invalid for Weak Sets.
First, a specialized version of SortA_equivlistA_eqlistA:
Lemma sort_equivlistA_eqlistA :
forall l l´ :
list elt,
sort E.lt l ->
sort E.lt l´ ->
equivlistA E.eq l l´ ->
eqlistA E.eq l l´.
Definition gtb x y :=
match E.compare x y with GT _ =>
true |
_ =>
false end.
Definition leb x :=
fun y =>
negb (
gtb x y).
Definition elements_lt x s :=
List.filter (
gtb x) (
elements s).
Definition elements_ge x s :=
List.filter (
leb x) (
elements s).
Lemma gtb_1 :
forall x y,
gtb x y = true <-> E.lt y x.
Lemma leb_1 :
forall x y,
leb x y = true <-> ~E.lt y x.
Lemma gtb_compat :
forall x,
Proper (
E.eq==>Logic.eq) (
gtb x).
Lemma leb_compat :
forall x,
Proper (
E.eq==>Logic.eq) (
leb x).
Hint Resolve gtb_compat leb_compat.
Lemma elements_split :
forall x s,
elements s = elements_lt x s ++ elements_ge x s.
Lemma elements_Add :
forall s s´ x,
~In x s ->
Add x s s´ ->
eqlistA E.eq (
elements s´) (
elements_lt x s ++ x :: elements_ge x s).
Definition Above x s :=
forall y,
In y s ->
E.lt y x.
Definition Below x s :=
forall y,
In y s ->
E.lt x y.
Lemma elements_Add_Above :
forall s s´ x,
Above x s ->
Add x s s´ ->
eqlistA E.eq (
elements s´) (
elements s ++ x::nil).
Lemma elements_Add_Below :
forall s s´ x,
Below x s ->
Add x s s´ ->
eqlistA E.eq (
elements s´) (
x::elements s).
Two other induction principles on sets: we can be more restrictive
on the element we add at each step.
Lemma set_induction_max :
forall P :
t ->
Type,
(
forall s :
t,
Empty s ->
P s) ->
(
forall s s´,
P s ->
forall x,
Above x s ->
Add x s s´ ->
P s´) ->
forall s :
t,
P s.
Lemma set_induction_min :
forall P :
t ->
Type,
(
forall s :
t,
Empty s ->
P s) ->
(
forall s s´,
P s ->
forall x,
Below x s ->
Add x s s´ ->
P s´) ->
forall s :
t,
P s.
More properties of fold : behavior with respect to Above/Below
The following results have already been proved earlier,
but we can now prove them with one hypothesis less:
no need for (transpose eqA f).
An alternative version of choose_3