mirror of
https://github.com/powdr-labs/powdr.git
synced 2026-01-08 21:58:00 -05:00
I got confused before about what is an expression and what is a constraint. For example, in boolean extraction, we return an expression which I thought was the boolean. But it turns out the expression is the new constraint. Similarly, there are some things that we can do for constraints which wouldn't work for expression: for example, `2 * x == 0` can be replaced by `x == 0`. But `2 * x` as an expression cannot be replaced by `x`. This PR introduces a wrapper and uses it where possible. Some caveats: - This PR implements `Deref` and `DerefMut` for the constraint, which means that we can call any function which takes a reference to an expression by passing a constraint. This partially defeats the purpose of the change, as we can by mistake call a function which would only be meant for expressions. This is fixed in #3220 - This PR keeps the `solve` functions as before, where they run on expressions, not constraints. This does not make sense in my opinion, as solving should be for constraints only, however here's an example which would break if we made this change: if we are solving the constraint `a * b = 0` we want to solve the constraint `a = 0`. This would require creating a constraint out of `a` on the fly, which is not implemented in this PR. This is fixed in #3220