<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Solving B Constraints with Goal-directed Answer Set Programming</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Alexandros Efremidis</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institut fur Informatik, Heinrich-Heine-Universitat Dusseldorf Universitatsstra e 1</institution>
          ,
          <addr-line>40225 Dusseldorf</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>In this paper I explore a further option for solving B constraints. In particular, I develop a framework translating B predicates to s(CASP), a goal-directed form of Answer Set Programming. Furthermore, the presented framework implements an interface enabling B predicates to be solved by the s(CASP) engine within the ProB tool as an additional backend. This paper particularly focuses on the translation process and on empirically evaluating the framework's performance by comparing it to the native, Kodkod and Z3 backend of ProB. This work poses a foundation for future development regarding the translation of B predicates to goal-directed Answer Set Programming and s(CASP) speci cally. Further, this framework can be used to aid the veri cation of other solvers' correctness.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        This work's fundamental motivation is to develop zero-defect software with the
help of formal methods. For instance, this is achievable by specifying a system's
desired behavior with B abstract machines [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] to then be validated by a software
veri cation tool such as ProB [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ]. ProB is an automated analysis toolkit for
the B-method enabling for animation, model checking and constraint solving,
which allows for unveiling possible errors of the underlying speci cation. In
order to model check a machine and verify its correctness, predicates are usually
evaluated along the way. Therefore, constraint solvers such as the native ProB,
Kodkod [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] and Z3 [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] backend are employed to support the overall veri cation
process. As they all come with their respective strengths and weaknesses [
        <xref ref-type="bibr" rid="ref11 ref12 ref6">6,11,12</xref>
        ]
it seems natural to explore further options.
      </p>
      <p>
        In this paper I aim towards extending the existing base of constraint solvers
for the B-Method, used in the ProB tool, by providing an additional constraint
solving backend. In particular, this work implements a Prolog framework
translating B predicates to Answer Set Programming [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] to then be solved by s(CASP) [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]
within ProB. Furthermore, this paper focuses on the translation process and
on empirically evaluating the framework's performance by comparing it to the
aforementioned backends of ProB.
      </p>
      <p>Copyright c 2021 for this paper by its authors. Use permitted under Creative
Commons License Attribution 4.0 International (CC BY 4.0).</p>
    </sec>
    <sec id="sec-2">
      <title>Answer Set Programming and s(CASP)</title>
      <p>
        Answer Set Programming (ASP) is a form of declarative logic programming,
which is primarily oriented towards NP-hard search problems [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. Due to its
declarative nature ASP poses an attractive alternative to already well-established
constraint solving oriented methodologies and is a paradigm of growing interest
in the recent years. An ASP program P is a nite set of clauses, where each rule
r 2 P is of the form
h
t1 ^
^ tm ^ not tm+1 ^
^ not tn
(1)
with the head h and the body's literals t1; : : : ; tn being compound terms.
The keyword not expresses default negation. Generally, ASP is concerned with
nding stable models also referred to as answer sets for the underlying problem.
In typical ASP applications an initial grounding phase is introduced in order to
be able to search for answer sets. The grounding phase succeeds only if every
clause of P is safe. A rule is considered as safe in case every variable in its body
occurs in some positive literal thereby specifying the variable's nite domain. A
rule is deemed unsafe otherwise. However, for this work an ASP implementation
is chosen, which is free of grounding.
      </p>
      <p>
        s(CASP) [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] is a novel Answer Set Programming implementation coalescing
stable model semantics and Constraint Logic Programming (CLP). It is build
upon the s(ASP) [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] execution model, an ASP interpreter written in Prolog.
s(CASP) inherits and generalizes s(ASP) while remaining parametric with respect
to CLP. In particular, s(CASP) is a query-driven implementation of Answer Set
Programming. Unlike common ASP systems, s(CASP) does not employ any SAT
based methodology and is not relying on a grounding phase either prior or during
execution. Hence, s(CASP) allows for declaring variables without specifying
their respective domains, whereas classical ASP approaches would consider the
program as unsafe. s(CASP) deploys a top-down, query-driven procedure virtually
an extended version of SLDNF resolution for evaluating programs under the
ASP semantics. By virtue of s(CASP) being goal-directed the engine computes a
partial stable model, which is the portion required for answering the underlying
query.
3
      </p>
    </sec>
    <sec id="sec-3">
      <title>A Constraint Solving Framework</title>
      <p>
        This framework consists of a translator and an interface. The translator obtains
an abstract syntax tree (AST) representing a B predicate emitted by ProB and
generates semantically equivalent s(CASP) code. It is written in SICStus Prolog [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]
to ensure compatibility and is constructed as a loadable extension package of
ProB. The interface establishes the connection between the translator and the
s(CASP) engine. s(CASP) is written in Ciao Prolog [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], hence an interface links
the two Prolog implementations together enabling for solving a B predicate by
s(CASP) within ProB.
      </p>
      <p>The overall work ow is illustrated in Figure 1. An AST is expected as input
by the framework, hence ProB parses the predicate prior to the translation.
This initial process is depicted as a black box in the owchart. Thereafter, the
translator generates a s(CASP) le containing executable code. The translator
gradually walks over the AST and computes for each encountered B node a
semantically equivalent s(CASP) component. Through this process a s(CASP)
program is recursively build. When the generation of the translation is completed,
the interface calls the s(CASP) engine and obtains the result. Lastly, some
post-processing is applied and the result is returned back to ProB.
In this section I give an overview of the translation process. The following
designations are used for B code throughout this translation. Designations P, Q
denote predicates; E, F denote expressions; x, y denote single variables; z denotes
a list of variables; S, D denote set expressions; U denotes a set of sets and m,
n denote integer expressions. Furthermore, for any B code A, TA denotes the
translation of A in s(CASP). For the sake of simplicity the designations of B
identi ers are also used for their s(CASP) representatives. For a B expression E
the variable VE is uni ed with the evaluation of TE. Lastly, Tmp denotes a fresh
internal temporary variable.</p>
      <p>The vast majority of B predicates is covered. However, a few restrictions are
introduced as this framework is still under development. Predicates such as set
summation, set product, iteration, closure, projection, lambda abstraction and
the support of sequences are not incorporated. Furthermore, in nite domains of
the form a 2 N or b 2 Z are not considered. Lastly, in pure logic the order of P
and Q is irrelevant for the semantics of a conjunction. However, conjunctions are
currently straightforwardly translated. Therefore, the case that a ground value is
needed for evaluating TP, which remains unbound until TQ is evaluated, is
generally not supported. Nevertheless, s(CASP)'s CLP library allows for supporting
arithmetical expressions.</p>
      <p>Primitive expressions: Identi ers, booleans, integers and strings are
straightforwardly translated.</p>
      <p>Conjunction: P &amp; Q is translated to TP, TQ.</p>
      <p>Disjunction: P or Q introduces a goal subconst(x1,...,xk) with x1,...,xk
being the variables occurring in P and Q. For both predicates a new rule is added
to the code with the aforementioned goal as its head and with TP, TQ as its body
respectively. Hence, the new goal establishes a choice point, e ectively creating a
disjunction.</p>
      <p>Negation: Let x1,...,xk be the variables occurring in P. not P introduces the
goal not subconst(x1,...,xk) with the rule of the form
subconst(x1,...,xk) :- TP.</p>
      <p>Implication: P =&gt; Q is resolved as not P or Q.</p>
      <p>Equivalence: P &lt;=&gt; Q is resolved as P =&gt; Q &amp; Q =&gt; P.</p>
      <p>Existential quanti cation: By virtue of s(CASP) operating query-driven,
#(z).(P &amp; Q) can be resolved as P &amp; Q.</p>
      <p>Equality, inequality and comparison operators: This translation applies
to the operators =; 6=; &lt;; &gt;; ; . Without loss of generality, equality is selected
to describe how the aforementioned operators are translated. As E = F may
contain nested expressions or function calls the translator analyzes the AST to
gather information about E and F. The translator operates with a look-ahead of
one and introduces an internal temporary variable Ve if necessary. Depending on
E and F the framework distinguishes between the following cases.
1. If E and F are primitive: TE = TF.
2. If E is primitive and F is not: TF, TE = VF.
3. If E is non-primitive and F is primitive: TE, VE = TF.
4. If E and F are both non-primitive: TE, TF, VE = VF.</p>
      <p>Furthermore, the operators 6=; &lt;; &gt;; ; are translated to \=, #&lt;, #&gt;, #=&lt;,
#&gt;= respectively. Thus, in case of arithmetical expressions s(CASP)'s CLP backend
takes care of the aforementioned temporal challenges related to conjunctions.
Empty set: Sets are represented by lists, hence fg is translated to [].
Singelton set: Similar to equality, for a singleton set of the form fEg the
translator analyzes E to decide whether the expression is primitive. Consequently,
the translator produces Tmp = [TE] if E is primitive and TE, Tmp = [VE] vice
versa. Via uni cation the framework takes care to link the freshly introduced
temporary variable to the identi er or expression it is meant to be assigned to.
Set enumeration: A set of arbitrary cardinality of the form fE, F, ...g follows
the pattern of the singleton set, which is expressed by recursive application.
Ordered pair: The framework distinguishes between four cases for an ordered
pair E |-&gt; F.
1. If E and F are primitive: Tmp = t(TE, TF).
2. If E is primitive and F is not: TF, Tmp = t(TE, VF).
3. If E is non-primitive and F is primitive: TE, Tmp = t(VE, TF).
4. If E and F are both non-primitive: TE, TF, Tmp = t(VE, VF).
Set comprehension: Let x1,...,xi be all variables occurring in P and let z =
z1,...,zj be the list of variables constrained by P. Let y1,...,yk with i = j+k
denote external variables that occur in P but not in z. The set comprehension
fz|Pg is the set of every value of z that satis es P and is translated to the
goal subconst1(Tmp, y1,...,yk). Figure 2 shows the two introduced rules.
subconst1/k+1 creates a local scope, where the variables of z are unable to clash
with the variables of the parent scope. s(CASP)'s built-in predicate findall/3
is used to store in Tmp every instance of satisfying the condition TP. is an
ordered pair of the form t(z1, t(z2, t(..., zj))) or scalar if |z| = 1.
s u b c o n s t 1 (Tmp, y1,...,yk ) :</p>
      <p>f i n d a l l ( , s u b c o n s t 2 ( x1,...,xi ) , Tmp) .</p>
      <p>s u b c o n s t 2 ( x1,...,xi ) : TP .
Universal quanti cation: Let z = z1,...,zk be the list of variables
constrained by P. Further, let p1,...,pi and q1,...,qj be the external variables
that occur in P and Q respectively but do not occur in z. The predicate !(z).(P
=&gt; Q) is translated to subconst1(p1,...,pi, q1,...,qj). As this framework
is restricted to nite domain declarations, it allows for using set comprehensions
to express that Q is satis ed for each value of z satisfying P. Figure 3 depicts
the three freshly introduced rules, where 's de nition is the same as for set
comprehensions.</p>
      <p>Fig. 3: The three introduced rules for the universal quanti cation predicate.
Arithmetical evaluation: This translation applies to the arithmetical operators
+; ; ; =; mod . Without loss of generality, addition is selected to describe how the
aforementioned operators are translated. s(CASP)'s CLP library is used in order
to omit temporal restraints of conjunctions. The predicate #=/2, which subsumes
and extends is/2, is used instead. The framework distinguishes between four
cases for m + n.
1. If m and n are primitive: Tmp #= Tm + Tn.
2. If m is primitive and n is not: Tn, Tmp #= Tm + Vn.
3. If m is non-primitive and n is primitive: Tm, Tmp #= Vm + Tn.
4. If m and n are both non-primitive: Tm, Tn, Tmp #= Vm + Vn.</p>
      <p>Union: S \/ D is translated to TS, TD, union(VS, VD, Tmp). Except for the
predicates genreal union and general intersection all other predicates are
translated in the same way as union, i.e. intersection, di erence, cartesian product,
powerset, cardinality, (not) member, (not) (strict) subset, minimum, maximum,
interval, relations, domain, range, composition, identity, domain/range
restriction/subtraction, inverse, relational image, override, direct/parallel product,
partial/total functions/injections/surjections, bijections and function application.
For predicates of arity two, merely the translation of one of the arguments is
omitted. The corresponding predicates are provided in an external le1.
General union &amp; general intersection: Essentially, the translator stacks
successively as many union/3 calls as necessary to compute the generalized union
of the form union(U). The code for a general intersection inter(U) is generated
analogously. The framework distinguishes between three cases.
1. If U = fSg, then resolve S as a singleton set.
2. If U = fS, Dg, then treat it as S \/ D.
3. If n 3, then resolve S1, S2 2 U as S1 \/ S2 obtaining Tmp1 and continue
resolving Tmpi and the next set Si+2 with i &lt; n-1 as TSi+2 , union(Tmpi,
VSi+2 , Tmpi+1) until the nal result Tmpn-1 is computed.
5</p>
    </sec>
    <sec id="sec-4">
      <title>Empirical Evaluation</title>
      <p>In this section I aim towards empirically evaluating the presented framework's
capabilities by comparing benchmark performances of the new backend to the
native ProB, Kodkod and Z3 backend. Regarding the translation's correctness
test cases are embedded in ProB consisting of numerous exemplary expressions,
which cover the supported predicates. For each test the s(CASP) backend rst
solves the underlying predicate obtaining a result, which is afterwards validated
by ProB. Of course, this does not prove the backend's correctness.</p>
      <p>In Figure 4 the runtime performances for the supported B predicates are
presented. The result for a benchmark is obtained by solving and measuring the
1 https://github.com/Alexandros31/B-to-sCASP/blob/main/preliminaries.pl
runtime of three separate synthetic B expressions on each backend (if available)
via the ProB REPL. Additionally, the runtime of the plain s(CASP) engine
is measured to gain more insight into s(CASP)'s performance by omitting the
surrounding overhead introduced by the framework's processes. Each computation
is executed three times with a one minute threshold on a freshly initialized
REPL to counter inaccuracies in the measurements. The environment of this
evaluation is a macOS 10.14.6 machine operating on a 7th generation i5 Intel
processor at 3.1GHz. The displayed value representing a predicate's performance
in milliseconds is obtained by averaging over the results of all three exemplary
expressions, where every individual value is rounded half away from zero. The
designation n.a. indicates that either a timeout or an \unsupported predicate
exception" occurred. The benchmarks along with all performance measures for
each run can be found on GitHub2.</p>
      <p>The performance measurements of Figure 4 indicate that the native ProB,
Kodkod and Z3 backend perform better compared to the s(CASP) backend, as
their runtimes are generally faster. However, s(CASP) is able to obtain a result
in some cases where Kodkod and Z3 are unable to follow. Furthermore, the plain
s(CASP) engine's performances seem to be reasonable, as the corresponding
runtimes are noticeably low in many cases. This suggests that the framework's
overhead is considerably prevalent. On my machine I recorded an average startup
time of 130 milliseconds for the Ciao engine. Compared to the best performing
predicates the time of initialization renders roughly half of the entire process.
However, these benchmarks are rather small compared to real-world examples.
Hence, the time loss of the Ciao engine's initialization is more apparent.</p>
      <p>In the following I express my thoughts on the gathered results. Note that
these performances are heavily dependent on the e ciency of the custom
predicates that are used for this translation, for instance member/2 or union/3. The
predicates set comprehension, universal quanti er, cartesian product, cardinality,
domain/range, composition, identity, domain/range restriction/subtraction,
inverse, relational image, direct product, parallel product and function application
share the fastest runtimes among this evaluation as they succeed in under 300
milliseconds. Cartesian product, cardinality, composition, identity, inverse,
relational image, direct product, parallel product and function application merely
iterate over a list without any demanding additional task along the way, which
presumably leads to consuming less time. The predicates domain/range and
domain/range restriction/subtraction make use of member/2 and set
comprehension and universal quanti cation use s(CASP)'s built-in findall/3 predicate. I
assume that these speci c benchmarks are not particularly challenging as further
analysis suggests that the usage of member/2 and findall/3 leads to weaker
performances.</p>
      <p>Since s(CASP) lacks the cut operator, additional rules containing the goal
not member/2 are needed to correctly express some predicate's behavior such
as union/3 in this implementation. Consequently, in the instance of an element
not being a member of the underlying list the rule invoking the negated goal is
called nevertheless. This may induce further loss of time, especially for large lists.
The other predicates, which mainly rely on member/2 are union, intersection,
di erence, general union, general intersection and override. These predicates
perform solidly relative to the aforementioned better performing ones.</p>
      <p>The remaining predicates, i.e. powerset, relations, partial functions, total
functions, partial injections, total injections, partial surjections, total surjections and
bijections all invoke findall/3. These results show that the usage of findall/3
poses a considerable bottleneck for this framework's performance. The asterisk
indicates that the benchmark's largest expression is not succeeding for the given
threshold of one minute. For these particular benchmarks only the remaining
two expressions are used including ProB. Considering the lacking e ciency
the framework o ers a run option called \optimize", which lets ProB evaluate
ground expressions before passing them to the framework.
Predicate
4-Queens
5-Queens
6-Queens
7-Queens
s(CASP) Plain s(CASP)
369 31
438 37
4927 3101
30507 5190</p>
      <p>Figure 5 shows the performances of various ProB backends dealing with
di erent sizes of the n-queens problem. Since this implementation seems to
struggle with the computation of functions, these measurements are supported
by ProB with the \optimize" feature enabled.</p>
      <p>Overall, the s(CASP) backend's performance is not on par with the other ones.
In particular, the s(CASP) backend is outclassed by the native ProB, Kodkod
and Z3 backend in every single benchmark. Nevertheless, in some cases s(CASP)
succeeds while Kodkod and Z3 are unable to solve the given constraint. Yet, even
in those instances the native ProB backend poses a superior option. However,
one needs to consider that this framework hardly incorporates any optimizations,
i.e. predicates are straightforwardly translated in most cases.
6</p>
    </sec>
    <sec id="sec-5">
      <title>Future Work and Conclusion</title>
      <p>Even though the presented framework is capable of translating a large portion
of the B realm to s(CASP), there are some predicates left to be supported.
Predicates such as iteration, closure, projection, lambda abstraction and the
support of sequences should be included. Also enabling one to assign variables to
in nite domains is imperative to be able to express more complex constraints. As
s(CASP) o ers a CLP backend and shares similarities with Prolog, this probably
could be done similarly to how ProB handles those instances. Furthermore,
it is desirable to extend this framework so that the order of predicates in a
conjunction is irrelevant. This could be done by analyzing the underlying AST
within the framework, and thus generate appropriate code that is solely reliant
on already evaluated predicates. Moreover, this work's evaluation indicates that
improving the framework as a whole to reduce its surrounding overhead may
lead to better performances. Reimplementing parts of the custom predicates that
utilize findall/3 in a more e cient way should also lead to a more promising
backend in general.</p>
      <p>In conclusion, this work poses a foundation for translating B constraints to
s(CASP). The empirical results indicate that the implemented backend is not
quite on par with the other ones. However, I assume that this backend could be
rendered more bene cial with further development. Furthermore, the presented
backend can be used for veri cation of other employed solvers. Similar to how the
s(CASP) backend is tested by ProB, ProB's and other solver's answers could
thus be veri ed by s(CASP). Especially, for predicates that are solely supported
by the native backend, the s(CASP) backend can be applied.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Abrial</surname>
            ,
            <given-names>J.R.</given-names>
          </string-name>
          :
          <string-name>
            <surname>The B-Book</surname>
          </string-name>
          : Assigning Programs to Meanings. Cambridge University Press, New York, NY, USA (
          <year>1996</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Arias</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Carro</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Salazar</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Marple</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gupta</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          :
          <article-title>Constraint answer set programming without grounding</article-title>
          .
          <source>Theory and Practice of Logic Programming</source>
          <volume>18</volume>
          (
          <issue>3-4</issue>
          ),
          <volume>337</volume>
          {
          <fpage>354</fpage>
          (
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Bueno</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cabeza</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Carro</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hermenegildo</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lopez-Garc</surname>
            <given-names>a</given-names>
          </string-name>
          , P.,
          <string-name>
            <surname>Puebla</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          :
          <article-title>The Ciao prolog system</article-title>
          .
          <source>Reference Manual. The Ciao System Documentation Series{TR CLIP3/97.1</source>
          , School of Computer Science, Technical University of Madrid (UPM)
          <volume>95</volume>
          ,
          <issue>96</issue>
          (
          <year>1997</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Carlsson</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Widen</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Andersson</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Andersson</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Boortz</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Nilsson</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          , Sjoland, T.:
          <article-title>SICStus Prolog User's Manual</article-title>
          , vol.
          <volume>3</volume>
          . Swedish Institute of Computer Science, Kista, Sweden (
          <year>1988</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>De Moura</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bj</surname>
            <given-names>rner</given-names>
          </string-name>
          , N.:
          <article-title>Z3: An e cient SMT solver</article-title>
          .
          <source>In: International conference on Tools and Algorithms for the Construction and Analysis of Systems</source>
          . pp.
          <volume>337</volume>
          {
          <fpage>340</fpage>
          . Springer (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Krings</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leuschel</surname>
            ,
            <given-names>M.:</given-names>
          </string-name>
          <article-title>SMT solvers for validation of B and Event-B models</article-title>
          .
          <source>In: International Conference on Integrated Formal Methods</source>
          . pp.
          <volume>361</volume>
          {
          <fpage>375</fpage>
          . Springer (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Leuschel</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Butler</surname>
            ,
            <given-names>M.:</given-names>
          </string-name>
          <article-title>ProB: A model checker for B</article-title>
          . In: FME 2003:
          <article-title>Formal Methods</article-title>
          . vol.
          <volume>2805</volume>
          , pp.
          <volume>855</volume>
          {
          <fpage>874</fpage>
          . Springer, Berlin, Heidelberg (Sep
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Leuschel</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Butler</surname>
            ,
            <given-names>M.:</given-names>
          </string-name>
          <article-title>ProB: An automated analysis toolset for the B method</article-title>
          .
          <source>International Journal on Software Tools for Technology Transfer</source>
          <volume>10</volume>
          (
          <issue>2</issue>
          ),
          <volume>185</volume>
          {203 (Mar
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Lifschitz</surname>
          </string-name>
          , V.:
          <article-title>Answer set programming</article-title>
          . Springer Berlin (
          <year>2019</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Marple</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Salazar</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gupta</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          :
          <article-title>The s(ASP) predicate answer set programming system. The Association for Logic Programming Newsletter (</article-title>
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Plagge</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leuschel</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <string-name>
            <surname>Validating</surname>
            <given-names>B</given-names>
          </string-name>
          ,
          <article-title>Z and TLA+ using ProB and Kodkod</article-title>
          .
          <source>In: International Symposium on Formal Methods</source>
          . pp.
          <volume>372</volume>
          {
          <fpage>386</fpage>
          . Springer (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Schmidt</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leuschel</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Improving SMT solver integrations for the validation of B and Event-B models</article-title>
          .
          <source>In: International Conference on Formal Methods for Industrial Critical Systems</source>
          . pp.
          <volume>107</volume>
          {
          <fpage>125</fpage>
          . Springer (
          <year>2021</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Torlak</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jackson</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          :
          <article-title>Kodkod: A relational model nder</article-title>
          .
          <source>In: International Conference on Tools and Algorithms for the Construction and Analysis of Systems</source>
          . pp.
          <volume>632</volume>
          {
          <fpage>647</fpage>
          . Springer (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>