/// Introduces `FlatWeightedSumLeq`, `FlatWeightedSumGeq`, `FlatSumLeq`, FlatSumGeq` constraints.
/// If the input is a weighted sum, the weighted sum constraints are used, otherwise the standard
/// Cases 6 and 7 could potentially be a normalising rule `-e ~> -1*e`. However, I think that we
// e can either be an atom, the rest of the product to be flattened, or an other expression that needs
/// because implications can be expressed as a `reifyimply` constraint, which takes a constraint as
/// This rule has lower priority than boolean_literal_to_wliteral so that we can assume that the