This functor derives additional properties from FSetInterface.S .
Contrary to the functor in FSetProperties 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.
|
Require
Omega.
Import
nat_scope.
Open Scope nat_scope.
Require
Export
FSetInterface.
Require
Export
Bool.
Require
Export
Sumbool.
Require
Export
Zerob.
Set Implicit Arguments.
Section
Misc.
Variable
A,B : Set.
Variable
eqA : A -> A -> Prop.
Variable
eqB : B -> B -> Prop.
Two-argument functions that allow to reorder its arguments. |
Definition
transpose := [f:A->B->B](x,y:A)(z:B)(eqB (f x (f y z)) (f y (f x z))).
Compatibility of a two-argument function with respect to two equalities. |
Definition
compat_op := [f:A->B->B](x,x':A)(y,y':B)(eqA x x') -> (eqB y y') ->
(eqB (f x y) (f x' y')).
Compatibility of a function upon natural numbers. |
Definition
compat_nat := [f:A->nat] (x,x':A)(eqA x x') -> (f x)=(f x').
End
Misc.
Hints
Unfold transpose compat_op compat_nat.
To prove (Setoid_Theory ? (eq ?))
|
Tactic
Definition
ST :=
Constructor; Intros;[ Trivial | Symmetry; Trivial | EApply trans_eq; EAuto ].
Hint
st : core := Extern 1 (Setoid_Theory ? (eq ?)) ST.
Definition
gen_st : (A:Set)(Setoid_Theory ? (eq A)).
Usual syntax for lists. CAVEAT: the Coq cast "::" will no longer be available. |
Notation
"[]" := (nil ?) (at level 1).
Notation
"a :: l" := (cons a l) (at level 1, l at next level).
Module
Properties [M:S].
Import
M.
Import
Logic.
Import
Peano.
Module
ME := MoreOrderedType E.
Alternative (weaker) specification for
based on |
Section
Old_Spec_Now_Properties.
Results about lists without duplicates |
Section
Unique_Remove.
Fixpoint
remove_list [x:elt;s:(list elt)] : (list elt) := Cases s of
nil => []
| (cons y l) => if (ME.eq_dec x y) then [_]l else [_]y::(remove_list x l)
end.
Lemma
remove_list_correct :
(s:(list elt))(x:elt)(Unique E.eq s) ->
(Unique E.eq (remove_list x s)) /\
((y:elt)(InList E.eq y (remove_list x s))<->(InList E.eq y s)/\~(E.eq x y)).
Local
ListEq := [l,l'](y:elt)(InList E.eq y l)<->(InList E.eq y l').
Local
ListAdd := [x,l,l'](y:elt)(InList E.eq y l')<->(E.eq y x)\/(InList E.eq y l).
Lemma
remove_list_equal :
(s,s':(list elt))(x:elt)(Unique E.eq x::s) -> (Unique E.eq s') ->
(ListEq x::s s') -> (ListEq s (remove_list x s')).
Lemma
remove_list_add :
(s,s':(list elt))(x,x':elt)(Unique E.eq s) -> (Unique E.eq x'::s') ->
~(E.eq x x') -> ~(InList E.eq x s) ->
(ListAdd x s x'::s') -> (ListAdd x (remove_list x' s) s').
Lemma
remove_list_fold_right :
(A:Set)(eqA:A->A->Prop)(st:(Setoid_Theory A eqA))
(i:A)(f:elt->A->A)(compat_op E.eq eqA f) -> (transpose eqA f) ->
(s:(list elt))(x:elt)(Unique E.eq s) -> (InList E.eq x s) ->
(eqA (fold_right f i s) (f x (fold_right f i (remove_list x s)))).
Lemma
fold_right_equal :
(A:Set)(eqA:A->A->Prop)(st:(Setoid_Theory A eqA))
(i:A)(f:elt->A->A)(compat_op E.eq eqA f) -> (transpose eqA f) ->
(s,s':(list elt))(Unique E.eq s) -> (Unique E.eq s') -> (ListEq s s') ->
(eqA (fold_right f i s) (fold_right f i s')).
Lemma
fold_right_add :
(A:Set)(eqA:A->A->Prop)(st:(Setoid_Theory A eqA))
(i:A)(f:elt->A->A)(compat_op E.eq eqA f) -> (transpose eqA f) ->
(s',s:(list elt))(x:elt)(Unique E.eq s) -> (Unique E.eq s') -> ~(InList E.eq x s) ->
(ListAdd x s s') ->
(eqA (fold_right f i s') (f x (fold_right f i s))).
End
Unique_Remove.
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 .
|
Lemma
fold_1:
(s:t)(A:Set)(eqA:A->A->Prop)(st:(Setoid_Theory A eqA))(i:A)(f:elt->A->A)
(Empty s) -> (eqA (fold f s i) i).
Lemma
fold_2 :
(s,s':t)(x:elt)(A:Set)(eqA:A->A->Prop)(st:(Setoid_Theory A eqA))
(i:A)(f:elt->A->A)(compat_op E.eq eqA f) -> (transpose eqA f) -> ~(In x s) ->
(Add
x s s') -> (eqA (fold f s' i) (f x (fold f s i))).
Similar specification for cardinal .
|
Lemma
cardinal_fold : (s:t)(cardinal s)=(fold [_]S s O).
Lemma
cardinal_1 : (s:t)(Empty s) -> (cardinal s)=O.
Lemma
cardinal_2 :
(s,s':t)(x:elt)~(In x s) -> (Add
x s s') -> (cardinal s') = (S (cardinal s)).
Hints
Resolve cardinal_1 cardinal_2.
End
Old_Spec_Now_Properties.
Induction principle over sets |
Lemma
Add_add :
(s:t)(x:elt)(Add
x s (add x s)).
Lemma
Add_remove : (s:t)(x:elt)(In x s) -> (Add
x (remove x s) s).
Hints
Resolve Add_add Add_remove.
Lemma
Equal_remove : (s,s':t)(x:elt)(In x s)->(Equal s s')->
(Equal (remove x s) (remove x s')).
Hints
Resolve Equal_remove.
Lemma
cardinal_inv_1 : (s:t)(cardinal s)=O -> (Empty s).
Hints
Resolve cardinal_inv_1.
Lemma
cardinal_inv_2 :
(s:t)(n:nat)(cardinal s)=(S n) -> (EX x:elt | (In x s)).
Lemma
Equal_cardinal_aux : (n:nat)(s,s':t)(cardinal s)=n ->
(Equal s s')->(cardinal s)=(cardinal s').
Lemma
Equal_cardinal : (s,s':t)(Equal s s')->(cardinal s)=(cardinal s').
Hints
Resolve Add_add Add_remove Equal_remove
cardinal_inv_1 Equal_cardinal.
Lemma
empty_cardinal: (cardinal empty)=O.
Lemma
empty_cardinal_2 : (s:t)(Empty s) -> (cardinal s)=O.
Hints
Immediate
empty_cardinal empty_cardinal_2 : set.
Lemma
cardinal_induction : (P : t -> Prop)
((s:t)(Empty s)->(P s)) ->
((s,s':t)(P s) -> (x:elt)~(In x s) -> (Add
x s s') -> (P s')) ->
(n:nat)(s:t)(cardinal s)=n -> (P s).
Lemma
set_induction : (P : t -> Prop)
((s:t)(Empty s)->(P s)) ->
((s,s':t)(P s) -> (x:elt)~(In x s) -> (Add
x s s') -> (P s')) ->
(s:t)(P s).
Other formulation of fold_1 and fold_2 .
|
Section
Fold.
Variable
s,s':t.
Variable
x:elt.
Variable
A:Set.
Variable
eqA:A->A->Prop.
Variable
st:(Setoid_Theory ? eqA).
Variable
i:A.
Variable
f:elt->A->A.
Variable
Comp:(compat_op E.eq eqA f).
Variable
Assoc:(transpose eqA f).
Lemma
fold_empty: (eqA (fold f empty i) i).
Lemma
fold_equal:
(Equal s s') -> (eqA (fold f s i) (fold f s' i)).
Lemma
fold_add:
~(In x s) -> (eqA (fold f (add x s) i) (f x (fold f s i))).
End
Fold.
properties of Equal
|
Lemma
equal_refl : (s:t)(Equal s s).
Lemma
equal_sym : (s,s':t)(Equal s s') -> (Equal s' s).
Lemma
equal_trans :
(s,u,v:t)(Equal s u) -> (Equal u v) -> (Equal s v).
Hints
Resolve equal_refl equal_trans : set.
Hints
Immediate
equal_sym : set.
properties of Subset
|
Lemma
subset_refl : (s:t)(Subset s s).
Lemma
subset_antisym :
(s,s':t)(Subset s s') -> (Subset s' s) -> (Equal s s').
Lemma
subset_trans :
(s,t_,u:t)(Subset s t_) -> (Subset t_ u) -> (Subset s u).
Lemma
subset_equal :
(s,s':t)(Equal s s') -> (Subset s s').
Lemma
subset_empty :
(s:t)(Subset empty s).
Lemma
subset_remove_3 :
(s1,s2:t)(x:elt)
(Subset s1 s2) -> (Subset (remove x s1) s2).
Lemma
subset_diff :
(s1,s2,s3:t)
(Subset s1 s3) -> (Subset (diff s1 s2) s3).
Lemma
subset_add_3 :
(s1,s2:t)(x:elt)
(In x s2) -> (Subset s1 s2) -> (Subset (add x s1) s2).
Lemma
subset_add_2 :
(s1,s2:t)(x:elt)
(Subset s1 s2) -> (Subset s1 (add x s2)).
Lemma
in_subset :
(s1,s2:t)(x:elt)
(In x s1) -> (Subset s1 s2) -> (In x s2).
Hints
Resolve subset_refl subset_equal subset_antisym
subset_trans subset_empty subset_remove_3
subset_diff subset_add_3 subset_add_2 in_subset
: set.
properties of empty
|
Lemma
empty_is_empty_1 : (s:t)(Empty s) -> (Equal s empty).
Lemma
empty_is_empty_2 : (s:t)(Equal s empty) -> (Empty s).
Hints
Resolve empty_is_empty_1 empty_is_empty_2 : set.
properties of add
|
Tactic
Definition
Add_ y x s :=
Generalize (!add_1 s x y) (!add_2 s x y) (!add_3 s x y).
Lemma
add_equal :
(s:t)(x:elt)(In x s) -> (Equal (add x s) s).
Hints
Resolve add_equal :set.
properties of remove
|
Tactic
Definition
Remove_ a x s :=
Generalize (!remove_1 s x a) (!remove_2 s x a) (!remove_3 s x a).
Lemma
remove_equal:
(s:t)(x:elt)~(In x s) -> (Equal (remove x s) s).
Hints
Resolve remove_equal : set.
properties of add and remove
|
Lemma
add_remove:
(s:t)(x:elt)(In x s) -> (Equal (add x (remove x s)) s).
Lemma
remove_add:
(s:t)(x:elt)~(In x s) -> (Equal (remove x (add x s)) s).
Hints
Immediate
add_remove remove_add :set.
properties of singleton
|
Tactic
Definition
Singleton a x :=
Generalize (!singleton_1 x a) (!singleton_2 x a).
Lemma
singleton_equal_add : (x:elt)
(Equal (singleton x) (add x empty)).
Lemma
singleton_cardinal: (x:elt)(cardinal (singleton x))=(S O).
Hints
Resolve singleton_equal_add singleton_cardinal : set.
properties of union
|
Tactic
Definition
Union a s s' :=
Generalize (!union_1 s s' a) (!union_2 s s' a) (!union_3 s s' a).
Lemma
union_sym :
(s,s':t)(Equal (union s s') (union s' s)).
Lemma
union_subset_equal :
(s,s':t)(Subset s s') -> (Equal (union s s') s').
Lemma
union_equal_1 :
(s,s',s'':t)(Equal s s') ->
(Equal (union s s'') (union s' s'')).
Lemma
union_equal_2 :
(s,s',s'':t)(Equal s' s'') ->
(Equal (union s s') (union s s'')).
Lemma
union_assoc :
(s,s',s'':t)
(Equal (union (union s s') s'') (union s (union s' s''))).
Hints
Resolve union_subset_equal union_equal_1 union_equal_2
union_assoc : set.
Hints
Immediate
union_sym.
Lemma
add_union_singleton:
(s:t)(x:elt)(Equal (add x s) (union (singleton x) s)).
Lemma
union_add:
(s,s':t)(x:elt)
(Equal (union (add x s) s') (add x (union s s'))).
Lemma
union_subset_1 :
(s,s':t)(Subset s (union s s')).
Lemma
union_subset_2:
(s,s':t)(Subset s' (union s s')).
Lemma
subset_union :
(s,s',s'':t)(Subset s s'') -> (Subset s' s'') ->
(Subset (union s s') s'').
Hints
Resolve add_union_singleton union_add union_subset_1
union_subset_2 subset_union : set.
properties of inter
|
Tactic
Definition
Inter a s s' :=
Generalize (!inter_1 s s' a) (!inter_2 s s' a) (!inter_3 s s' a).
Lemma
inter_sym:
(s,s':t)(Equal (inter s s') (inter s' s)).
Lemma
inter_subset_equal:
(s,s':t)(Subset s s') -> (Equal (inter s s') s).
Lemma
inter_equal_1:
(s,s',s'':t)(Equal s s') ->
(Equal (inter s s'') (inter s' s'')).
Lemma
inter_equal_2:
(s,s',s'':t)(Equal s' s'') ->
(Equal (inter s s') (inter s s'')).
Hints
Immediate
inter_sym : set.
Hints
Resolve inter_subset_equal inter_equal_1 inter_equal_2 : set.
Lemma
inter_assoc:
(s,s',s'':t)
(Equal (inter (inter s s') s'') (inter s (inter s' s''))).
Lemma
union_inter_1:
(s,s',s'':t)
(Equal (inter (union s s') s'') (union (inter s s'') (inter s' s''))).
Lemma
union_inter_2:
(s,s',s'':t)
(Equal (union (inter s s') s'') (inter (union s s'') (union s' s''))).
Lemma
inter_add_1:
(s,s':t)(x:elt)(In x s') ->
(Equal (inter (add x s) s') (add x (inter s s'))).
Lemma
inter_add_2:
(s,s':t)(x:elt)~(In x s') ->
(Equal (inter (add x s) s') (inter s s')).
Hints
Resolve inter_assoc union_inter_1 union_inter_2
inter_add_1 inter_add_2 : set.
properties of Subset
|
Lemma
inter_subset_1:
(s,s':t)(Subset (inter s s') s).
Lemma
inter_subset_2:
(s,s':t)(Subset (inter s s') s').
Lemma
inter_subset_3:
(s,s',s'':t)(Subset s'' s) -> (Subset s'' s') ->
(Subset s'' (inter s s')).
Hints
Resolve inter_subset_1 inter_subset_2 inter_subset_3 : set.
Properties of diff
|
Tactic
Definition
Diff a s s' :=
Generalize (!diff_1 s s' a) (!diff_2 s s' a) (!diff_3 s s' a).
Lemma
diff_subset:
(s,s':t)(Subset (diff s s') s).
Lemma
diff_subset_equal:
(s,s':t)(Subset s s') -> (Equal (diff s s') empty).
Lemma
remove_inter_singleton:
(s:t)(x:elt)(Equal (remove x s) (diff s (singleton x))).
Lemma
diff_inter_empty:
(s,s':t)(Equal (inter (diff s s') (inter s s')) empty).
Lemma
In_dec : (x:elt)(s:t){ (In x s) }+ { ~(In x s) }.
Lemma
diff_inter_all:
(s,s':t)(Equal (union (diff s s') (inter s s')) s).
Hints
Resolve diff_subset diff_subset_equal
remove_inter_singleton diff_inter_empty
diff_inter_all : set.
Lemma
fold_plus:
(s:t)(p:nat)(fold [_]S s p)=(fold [_]S s O)+p.
properties of cardinal
|
Lemma
empty_inter_1 : (s,s':t)(Empty s) -> (Empty (inter s s')).
Lemma
empty_inter_2 : (s,s':t)(Empty s') -> (Empty (inter s s')).
Lemma
empty_union_1 : (s,s':t)(Empty s) -> (Equal (union s s') s').
Lemma
empty_union_2 : (s,s':t)(Empty s) -> (Equal (union s' s) s').
Lemma
empty_diff_1 : (s,s':t)(Empty s) -> (Empty (diff s s')).
Lemma
empty_diff_2 : (s,s':t)(Empty s) -> (Equal (diff s' s) s').
Hints
Resolve empty_inter_1 empty_inter_2
empty_union_1 empty_union_2
empty_diff_1 empty_diff_2 : set.
Lemma
union_Add : (s,s',s'':t)(x:elt)
(Add
x s s') -> (Add
x (union s s'') (union s' s'')).
Lemma
inter_Add : (s,s',s'':t)(x:elt)
(In x s'') -> (Add
x s s') -> (Add
x (inter s s'') (inter s' s'')).
Lemma
union_Equal : (s,s',s'':t)(x:elt)
(In x s'') -> (Add
x s s') -> (Equal (union s s'') (union s' s'')).
Lemma
inter_Add_2 :(s,s',s'':t)(x:elt)
~(In x s'') -> (Add
x s s') -> (Equal (inter s s'') (inter s' s'')).
Lemma
not_in_union : (x:elt)(s,s':t)
~(In x s) -> ~(In x s') -> ~(In x (union s s')).
Hints
Resolve union_Add inter_Add union_Equal inter_Add_2
not_in_union : set.
Lemma
fold_commutes:
(A:Set)
(f:elt->A->A)(i:A)(compat_op E.eq (eq ?) f) -> (transpose (eq ?) f) -> (s:t)(x:elt)
(fold f s (f x i)) = (f x (fold f s i)).
Lemma
fold_union_inter:
(A:Set)
(f:elt->A->A)(i:A)(compat_op E.eq (eq ?) f) -> (transpose (eq ?) f) ->
(s,s':t)(fold f (union s s') (fold f (inter s s') i))
= (fold f s (fold f s' i)).
Lemma
fold_diff_inter:
(A:Set)(f:elt->A->A)(i:A)(compat_op E.eq (eq A) f) -> (transpose (eq A) f) ->
(s,s':t)(fold f (diff s s') (fold f (inter s s') i))=(fold f s i).
Lemma
diff_inter_cardinal:
(s,s':t)(cardinal (diff s s'))+(cardinal (inter s s'))=(cardinal s).
Lemma
subset_cardinal:
(s,s':t)(Subset s s') -> (le (cardinal s) (cardinal s')).
Lemma
union_inter_cardinal:
(s,s':t)(cardinal (union s s'))+(cardinal (inter s s'))
= (cardinal s)+(cardinal s').
Lemma
union_cardinal :
(s,s':t)(le (cardinal (union s s')) (plus (cardinal s) (cardinal s'))).
Lemma
add_cardinal_1:
(s:t)(x:elt)(In x s) -> (cardinal (add x s))=(cardinal s).
Lemma
add_cardinal_2:
(s:t)(x:elt)~(In x s) -> (cardinal (add x s))=(S (cardinal s)).
Hints
Resolve subset_cardinal union_cardinal
add_cardinal_1 add_cardinal_2.
End
Properties.