Skip to content

Commit a3166c1

Browse files
strubfdupress
authored andcommitted
WIP: bigop on fset
1 parent 3877abe commit a3166c1

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

theories/algebra/Bigop.eca

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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().
591591
qed.
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

Comments
 (0)