GENEric Presburger programming Interface

The GENEPI library gathers a set of routines that can be used in place of Presburger solver. GENEPI is not a real solver but rather an abstraction layer of a solver. The decision procedures are not implemented into the GENEPI library; the necessary functions are imported from dynamically loaded plugins. Each plugin must furnish a set of functions specified by the plugin API.

GENEPI is useful at both sides of the programming interface:

  • On one side, applications that require the resolution of Presburger formulas can take advantage of the abstraction that allows to use dynamically loaded solvers and thus, to postpone the choice of the actually used solver at run-time.
  • On the other side, solver developers can use any GENEPI-based application to benchmark their solver and compare it to other solvers.


The API documentation is available here.


Several implementations of the GENEPI Plugin API have been developed. Each one is a simple encapsulation of an existing solver library.

  • Plugins over natural numbers
    • The automaton data-structure (DFA library) of MONA is used to encode binary automata.
    • The Shared Automata data-structure is used to implement the plugin PresTAF.
  • Plugins over integers
    • The LASH (Liège Automata-based Symbolic Handler) is used to implement a solver over integers; the NDD (Number Decision Diagrams) are used to implement it.
    • One of the plugins not based on binary automata uses the Omega library (formula transformations).
  • Plugins over real numbers
    • The PPL (Parma Polyhedra Library) plugin is another plugin not based on the automaton representation.
  • Plugins mixing real and integer variables
    • The LIRA (Linear Integer/Real Arithmetic Solver) plugin is based on weak deterministic Büchi automata.
    • The LASH (Liège Automata-based Symbolic Handler) is also used to implement a solver over reals and integers; the RVA (Real Vector Automata) library is used to implement it.