Documentation

Mathlib.ModelTheory.Arithmetic.Presburger.Basic

Presburger arithmetic #

This file defines the first-order language of Presburger arithmetic as (0,1,+).

Main Definitions #

TODO #

inductive FirstOrder.presburgerFunc :
Type

The type of Presburger arithmetic functions, defined as (0, 1, +).

Instances For
    @[implicit_reducible]
    instance FirstOrder.instDecidableEqPresburgerFunc {a✝ : } :
    DecidableEq (presburgerFunc a✝)
    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]
        @[simp]
        theorem FirstOrder.Language.presburger.natCast_succ {α : Type u_1} (n : ) :
        (n + 1) = n + 1
        @[implicit_reducible]
        @[simp]
        theorem FirstOrder.Language.presburger.zero_nsmul {α : Type u_1} {t : presburger.Term α} :
        0 t = 0
        @[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]
          instance FirstOrder.Language.presburger.instStructure {M : Type u_2} [Zero M] [One M] [Add M] :
          @[simp]
          theorem FirstOrder.Language.presburger.funMap_zero {M : Type u_2} [Zero M] [One M] [Add M] {v : Fin 0M} :
          @[simp]
          theorem FirstOrder.Language.presburger.funMap_one {M : Type u_2} [Zero M] [One M] [Add M] {v : Fin 0M} :
          @[simp]
          theorem FirstOrder.Language.presburger.funMap_add {M : Type u_2} [Zero M] [One M] [Add M] {v : Fin 2M} :
          @[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) = is, Term.realize v (f i)