Module docstring
{"# Products (respectively, sums) over a finset or a multiset.
The regular Finset.prod and Multiset.prod require [CommMonoid α].
Often, there are collections s : Finset α where [Monoid α] and we know,
in a dependent fashion, that for all the terms ∀ (x ∈ s) (y ∈ s), Commute x y.
This allows to still have a well-defined product over s.
Main definitions
Finset.noncommProd, requiring a proof of commutativity of held termsMultiset.noncommProd, requiring a proof of commutativity of held terms
Implementation details
While List.prod is defined via List.foldl, noncommProd is defined via
Multiset.foldr for neater proofs and definitions. By the commutativity assumption,
the two must be equal.
TODO: Tidy up this file by using the fact that the submonoid generated by commuting
elements is commutative and using the Finset.prod versions of lemmas to prove the noncommProd
version.
"}