@@ -589,3 +589,49 @@ have: forall (i : int), exists j, i = 2 * j \/ i = 2 * j + 1 by smt().
589589- case/(_ x) => y [] ->>; [left | right]; apply/mapP=> /=;
590590 by exists y; (split; first apply/mem_range); smt().
591591qed.
592+
593+ (* -------------------------------------------------------------------- *)
594+ require import FSet.
595+
596+ (* -------------------------------------------------------------------- *)
597+ abbrev bigs ['a] (P : 'a -> bool) (F : 'a -> t) (s : 'a fset) =
598+ big P F (elems s).
599+
600+ (* -------------------------------------------------------------------- *)
601+ section BigFSet.
602+ declare type a.
603+
604+ lemma bigs0 (P : a -> bool) (F : a -> t) : bigs P F fset0 = idm.
605+ proof. by rewrite elems_fset0 big_nil. qed.
606+
607+ lemma bigs1 (F : a -> t) (x : a) : bigs predT F (fset1 x) = F x.
608+ proof. by rewrite elems_fset1 big_seq1. qed.
609+
610+ lemma bigsU (P : a -> bool) (F : a -> t) (s1 s2 : a fset) : disjoint s1 s2 =>
611+ bigs P F (s1 `|` s2) = (bigs P F s1) + (bigs P F s2).
612+ proof.
613+ move=> djt; rewrite -big_cat &(eq_big_perm) &(uniq_perm_eq).
614+ - by apply: uniq_elems.
615+ - rewrite uniq_catC &(cat_uniq) !uniq_elems /=.
616+ by apply/hasPn=> x; rewrite -!memE &(disjointP).
617+ - by move=> x; rewrite mem_cat -!memE in_fsetU.
618+ qed.
619+
620+ lemma bigsU1 (F : a -> t) (x : a) (s : a fset) :
621+ x \notin s => bigs predT F (s `|` fset1 x) = F x + bigs predT F s.
622+ proof.
623+ move=> x_notin_s; rewrite bigsU.
624+ - by rewrite fsetIC; apply/disjointP=> a /in_fset1 ->.
625+ - by rewrite bigs1 addmC.
626+ qed.
627+
628+ lemma bigsD1 (F : a -> t) (x : a) (s : a fset) :
629+ x \in s => bigs predT F s = F x + bigs predT F (s `\` fset1 x).
630+ proof.
631+ move=> x_in_s; suff {1}->: s = (s `\` fset1 x) `|` fset1 x.
632+ - rewrite bigsU; last by rewrite bigs1 addmC.
633+ by apply/disjointP=> a; rewrite in_fsetD1 in_fset1.
634+ by apply/fsetP=> a; rewrite in_fsetU1 in_fsetD1 /#.
635+ qed.
636+
637+ end section BigFSet.
0 commit comments