Presburger arithmetic #
This file defines the first-order language of Presburger arithmetic as (0,1,+).
Main Definitions #
FirstOrder.Language.presburger: the language of Presburger arithmetic.
TODO #
- Generalize
presburger.sum(maybe alsoNatCastandSMul) for classes likeFirstOrder.Language.IsOrdered. - Define the theory of Presburger arithmetic and prove its properties (quantifier elimination, completeness, etc).
The type of Presburger arithmetic functions, defined as (0, 1, +).
- zero : presburgerFunc 0
- one : presburgerFunc 0
- add : presburgerFunc 2
Instances For
@[implicit_reducible]
def
FirstOrder.instDecidableEqPresburgerFunc.decEq
{a✝ : ℕ}
(x✝ x✝¹ : presburgerFunc a✝)
:
Decidable (x✝ = x✝¹)
Instances For
The language of Presburger arithmetic, defined as (0, 1, +).
Instances For
@[implicit_reducible]
@[implicit_reducible]
@[implicit_reducible]
@[implicit_reducible]
@[implicit_reducible]
@[simp]
@[simp]
@[implicit_reducible]
@[simp]
@[simp]
theorem
FirstOrder.Language.presburger.succ_nsmul
{α : Type u_1}
{t : presburger.Term α}
{n : ℕ}
:
(n + 1) • t = n • t + t
noncomputable def
FirstOrder.Language.presburger.sum
{α : Type u_1}
{β : Type u_2}
(s : Finset β)
(f : β → presburger.Term α)
:
Summation over a finite set of terms in Presburger arithmetic.
It is defined via choice, so the result only makes sense when the structure satisfies
commutativity (see realize_sum).
Instances For
@[implicit_reducible]
@[simp]
theorem
FirstOrder.Language.presburger.funMap_zero
{M : Type u_2}
[Zero M]
[One M]
[Add M]
{v : Fin 0 → M}
:
@[simp]
theorem
FirstOrder.Language.presburger.funMap_one
{M : Type u_2}
[Zero M]
[One M]
[Add M]
{v : Fin 0 → M}
:
@[simp]
theorem
FirstOrder.Language.presburger.funMap_add
{M : Type u_2}
[Zero M]
[One M]
[Add M]
{v : Fin 2 → M}
:
Structure.funMap presburgerFunc.add v = v 0 + v 1
@[simp]
theorem
FirstOrder.Language.presburger.realize_zero
{α : Type u_1}
{M : Type u_2}
{v : α → M}
[Zero M]
[One M]
[Add M]
:
Term.realize v 0 = 0
@[simp]
theorem
FirstOrder.Language.presburger.realize_one
{α : Type u_1}
{M : Type u_2}
{v : α → M}
[Zero M]
[One M]
[Add M]
:
Term.realize v 1 = 1
@[simp]
theorem
FirstOrder.Language.presburger.realize_add
{α : Type u_1}
{t₁ t₂ : presburger.Term α}
{M : Type u_2}
{v : α → M}
[Zero M]
[One M]
[Add M]
:
Term.realize v (t₁ + t₂) = Term.realize v t₁ + Term.realize v t₂
@[simp]
theorem
FirstOrder.Language.presburger.realize_natCast
{α : Type u_1}
{M : Type u_2}
{v : α → M}
[AddMonoidWithOne M]
{n : ℕ}
:
Term.realize v ↑n = ↑n
@[simp]
theorem
FirstOrder.Language.presburger.realize_nsmul
{α : Type u_1}
{t : presburger.Term α}
{M : Type u_2}
{v : α → M}
[AddMonoidWithOne M]
{n : ℕ}
:
Term.realize v (n • t) = n • Term.realize v t
@[simp]
theorem
FirstOrder.Language.presburger.realize_sum
{α : Type u_1}
{M : Type u_2}
{v : α → M}
[AddCommMonoidWithOne M]
{β : Type u_3}
{s : Finset β}
{f : β → presburger.Term α}
:
Term.realize v (sum s f) = ∑ i ∈ s, Term.realize v (f i)