Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Eliminating one integer coordinate

Abstract

Coefficient normalization and finite periodic tests preserve existential semantics.

Affine.substHead replaces the first coordinate by an affine expression on the remaining coordinates. eval_head decomposes a value as head*x+tail.eval(xs). Both affine and atom substitution preserve evaluation at replacement.eval(xs)::xs.

Cooper.commonCoefficient is a positive common multiple of the nonzero head coefficient magnitudes. Normalization replaces x by y=L*x and scales each nonzero coefficient to its sign. Divisibility moduli scale by the same positive quotient; zero head coefficients retain their fixed values. normalizeClause adds the atom L divides y, so the reverse direction can recover an integer x. Normal inequalities have head coefficient -1, 0 or 1.

A normalized clause splits into fixed atoms, affine lower bounds, affine upper bounds and periodic divisibility atoms. The period is a positive common multiple of the moduli. Adding this period to the head value preserves all periodic atoms, including nondivisibility. eval_normalizedClause_iff states the conjunction of the fixed test, all lower bounds, all upper bounds and the periodic test. Empty lists are handled by their ordinary all/any semantics.

boundedPair enumerates k in List.range m and checks lo+k<=hi together with the periodic clause at lo+k. elimVariable uses the one-sided residue disjunction when a bound list is empty and the conjunction of pair tests otherwise. elimNormalizedClause also retains fixed atoms. elimClause first normalizes; eliminate distributes this procedure over positive DNF. The finite residue enumeration is the upstream Cooper algorithm.

Theorem 1.1 (Normalization preserves existence).

Proof. Machine-checked in Lean as D5/S0/Computability/PresburgerElimination.normalizeClause_exists_iff (✓ std3). ∎

Citation. Vladimir Reshetnikov (2026). ProveIt executable integer Presburger arithmetic. URL: https://github.com/VladimirReshetnikov/ProveIt/tree/ec9ab2ffd49f8861022d6f3d4c30205545a3386d/Logic/PresburgerArithmetic/Lean/PresburgerArithmetic.

Commentary.

The forward proof substitutes y=Lx. The reverse proof uses the added divisibility atom to write y=Lx, then cancels the positive scaling factors in each inequality or divisibility test.

Theorem 1.2 (Clause elimination).

Proof. Machine-checked in Lean as D5/S0/Computability/PresburgerElimination.elimClause_correct (✓ std3). ∎

Citation. Vladimir Reshetnikov (2026). ProveIt executable integer Presburger arithmetic. URL: https://github.com/VladimirReshetnikov/ProveIt/tree/ec9ab2ffd49f8861022d6f3d4c30205545a3386d/Logic/PresburgerArithmetic/Lean/PresburgerArithmetic.

Commentary.

Normalization equivalence combines with elimNormalizedClause_correct. Fixed constraints are independent of the eliminated head; the periodic finite criterion supplies that head when the remaining tests hold.

Theorem 1.3 (Quantifier-free elimination).

Proof. Machine-checked in Lean as D5/S0/Computability/PresburgerElimination.eliminate_correct (✓ std3). ∎

Citation. Vladimir Reshetnikov (2026). ProveIt executable integer Presburger arithmetic. URL: https://github.com/VladimirReshetnikov/ProveIt/tree/ec9ab2ffd49f8861022d6f3d4c30205545a3386d/Logic/PresburgerArithmetic/Lean/PresburgerArithmetic.

Commentary.

Polarity conversion identifies a satisfied clause in either direction. Applying elimClause_correct to that clause removes exactly one existential integer coordinate; the remaining valuation is unrestricted.

References