The Fourier-Motzkin elimination procedure #
The Fourier-Motzkin procedure is a variable elimination method for linear inequalities. https://en.wikipedia.org/wiki/Fourier%E2%80%93Motzkin_elimination
Given a set of linear inequalities comps = {tᵢ Rᵢ 0}
,
we aim to eliminate a single variable a
from the set.
We partition comps
into comps_pos
, comps_neg
, and comps_zero
,
where comps_pos
contains the comparisons tᵢ Rᵢ 0
in which
the coefficient of a
in tᵢ
is positive, and similar.
For each pair of comparisons tᵢ Rᵢ 0 ∈ comps_pos
, tⱼ Rⱼ 0 ∈ comps_neg
,
we compute coefficients vᵢ, vⱼ ∈ ℕ
such that vᵢ*tᵢ + vⱼ*tⱼ
cancels out a
.
We collect these sums vᵢ*tᵢ + vⱼ*tⱼ R' 0
in a set S
and set comps' = S ∪ comps_zero
,
a new set of comparisons in which a
has been eliminated.
Theorem: comps
and comps'
are equisatisfiable.
We recursively eliminate all variables from the system. If we derive an empty clause 0 < 0
,
we conclude that the original system was unsatisfiable.
Datatypes #
The comp_source
and pcomp
datatypes are specific to the FM elimination routine;
they are not shared with other components of linarith
.
- assump : ℕ → linarith.comp_source
- add : linarith.comp_source → linarith.comp_source → linarith.comp_source
- scale : ℕ → linarith.comp_source → linarith.comp_source
comp_source
tracks the source of a comparison.
The atomic source of a comparison is an assumption, indexed by a natural number.
Two comparisons can be added to produce a new comparison,
and one comparison can be scaled by a natural number to produce a new comparison.
Formats a comp_source
for printing.