PBES Instantiation in pbesinst
Jeroen Keiren, Maurice Laveaux, Anna Stramaglia, Wieger Wesselink and Tim Willemse
This document describes instantiation algorithms for PBESs that
are used in the tool pbesinst.
Finite algorithm
In this section we describe an implementation of the finite instantiation
algorithm that eliminates data parameters with
finite sorts. It is implemented in the tool
pbesinst. Let
be a PBES. We assume that all data sorts
are finite and all data
sorts
are infinite. Let
be a data rewriter, and let
be an injective function that creates a unique predicate variable
from a predicate variable name and a data value according to
,
where
is finite and
is infinite and
.
Note that
and
may be multi-dimensional sorts.
with a rewriter on PBES expressions that is defined as follows:
where ,
a data expression,
and
PBES expressions, and
the set of free
variables appearing in
.
Lazy algorithm
In this section we describe an implementation of the lazy instantiation
algorithm that uses instantiation to compute a BES. It
is implemented in the tool
pbesinst. It takes two extra parameters,
an injective function that renames predicate variables to
proposition variables, and a rewriter
that eliminates quantifiers from
predicate formulae. Let
be a PBES, and
an initial state.
where is extended from predicate variables to quantifier-free
predicate formulae using
Generic lazy algorithms
In this section two generic variants of lazy PBES instantiation are
described that report all discovered BES equations using a callback
function . These versions are later extended to
compute structure graphs.
The first version maintains a collection
, that contains all BES variables for which an equation has
been computed.
The second version maintains a set
instead of
. This set contains BES
variables that have been discovered, but for which the corresponding
equation may not have been computed yet. The sets are related via
.
It turned out that the second version has slightly better performance for some larger use cases.
To support breadth first and depth first search, the implementation stores
the set as a double ended queue. New elements are always
appended to
. In the case of breadth first search always the
first element is chosen, and in the case of depth first search the last
element.