Skip to content

Commit dbb6b54

Browse files
committed
add refined lemmas for set folding
1 parent 5480f45 commit dbb6b54

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

theories/datatypes/FSet.ec

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,7 @@ qed.
723723
(* -------------------------------------------------------------------- *)
724724
op [opaque] fold (f : 'a -> 'b -> 'b) (z : 'b) (A : 'a fset) : 'b =
725725
foldr f z (elems A).
726+
726727
lemma foldE (f : 'a -> 'b -> 'b) z A: fold f z A = foldr f z (elems A).
727728
proof. by rewrite/fold. qed.
728729
@@ -733,20 +734,29 @@ lemma fold1 (f : 'a -> 'b -> 'b) (z : 'b) (a : 'a):
733734
fold f z (fset1 a) = f a z.
734735
proof. by rewrite foldE elems_fset1. qed.
735736

736-
lemma foldC (a : 'a) (f : 'a -> 'b -> 'b) (z : 'b) (A : 'a fset):
737-
(forall a a' b, f a (f a' b) = f a' (f a b)) =>
738-
mem A a =>
737+
lemma foldC_in (a : 'a) (f : 'a -> 'b -> 'b) (z : 'b) (A : 'a fset):
738+
(forall a a' b, a \in A => a' \in A => f a (f a' b) = f a' (f a b)) =>
739+
a \in A =>
739740
fold f z A = f a (fold f z (A `\` fset1 a)).
740741
proof.
741-
move=> f_commutative a_in_A; rewrite !foldE (foldr_rem a)// 1:-memE//.
742-
congr; apply/foldr_perm=> //.
743-
rewrite setDE rem_filter 1:uniq_elems//.
744-
have ->: predC (mem (fset1 a)) = predC1 a (* FIXME: views *)
745-
by apply/fun_ext=> x; rewrite /predC /predC1 in_fset1.
746-
rewrite -{1}(undup_id (filter (predC1 a) (elems A))) 2:oflistK//.
747-
by apply/filter_uniq/uniq_elems.
742+
move=> f_commutative a_in_A; rewrite !foldE (foldr_rem_in a) //.
743+
+ by move=> z0 x y; rewrite -!memE; exact:f_commutative.
744+
+ by rewrite -memE.
745+
congr; apply/foldr_perm_in=> //.
746+
+ move=> z0 x y /mem_rem + /mem_rem; rewrite -!memE; exact:f_commutative.
747+
rewrite setDE rem_filter 1:uniq_elems//.
748+
have ->: predC (mem (fset1 a)) = predC1 a (* FIXME: views *)
749+
by apply/fun_ext=> x; rewrite /predC /predC1 in_fset1.
750+
rewrite -{1}(undup_id (filter (predC1 a) (elems A))) 2:oflistK//.
751+
by apply/filter_uniq/uniq_elems.
748752
qed.
749753

754+
lemma foldC (a : 'a) (f : 'a -> 'b -> 'b) (z : 'b) (A : 'a fset):
755+
(forall a a' b, f a (f a' b) = f a' (f a b)) =>
756+
a \in A =>
757+
fold f z A = f a (fold f z (A `\` fset1 a)).
758+
proof. by move=> f_commutative; apply: foldC_in=> + + + _ _. qed.
759+
750760
(* -------------------------------------------------------------------- *)
751761

752762
op rangeset (m n : int) = oflist (range m n).

theories/datatypes/List.ec

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2881,6 +2881,12 @@ proof.
28812881
by rewrite Hlci.
28822882
qed.
28832883

2884+
lemma foldr_rem_in ['b 'a] x o z (s : 'a list) :
2885+
(forall (z : 'b) , left_commutative_in o z s) =>
2886+
x \in s =>
2887+
foldr o z s = o x (foldr o z (rem x s)).
2888+
proof. by move=> fAC /perm_to_rem peq; rewrite (@foldr_perm_in o _ _ fAC peq z). qed.
2889+
28842890
op right_commutative_in ['a 'b] o (x : 'a) (s : 'b list) =
28852891
forall y z ,
28862892
y \in s =>

0 commit comments

Comments
 (0)