<!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>Extending the SMT-Lib Standard with Theory of Nominative Data</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Kyiv</institution>
          ,
          <addr-line>03680</addr-line>
          <country country="UA">Ukraine</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Taras Shevchenko National University of Kyiv</institution>
          ,
          <addr-line>Akademika Hlushkova Ave, 4d</addr-line>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2019</year>
      </pub-date>
      <abstract>
        <p>We describe the theory of nominative data, formulate the basic principles of the composition-nominative approach, and define the class of nominative data and functions. By using nominative data, we can increase the level of adequacy of representation data structures, functions, and compositions that are used in programming languages. Thus, in terms of composition-nominative approach, we can build systems of verification of programs based on a unified conceptual basis. Computer-aided verification of computer programs often uses SMT (satisfiability modulo theories) solvers. A common technique is to translate preconditions, postconditions, and assertions into SMT formulas in order to determine if required properties can hold. The SMT-LIB Standard was created for forming a common standard and library for solving SMT problems. Now, it is one of the most used libraries for SMT systems. Formulas in SMT-LIB format are accepted by the great majority of current SMT solvers. The theory of nominative data is of interest for software modelling and verification, but currently lacks support in the SMT-LIB format. In the article, we propose the declaration for the theory of nominative data for the SMT-LIB Standard 2.6. The goal is the development of SMT solvers with nominative data support.</p>
      </abstract>
      <kwd-group>
        <kwd>SMT solver</kwd>
        <kwd>partial logic</kwd>
        <kwd>nominative data</kwd>
        <kwd>composition programming</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        Composition programming studies the systems at different levels of abstraction –
abstract, Boolean, and nominative (attribute) levels. Systems of the last level, based
on the composition-nominative methods [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], are rather expressible for a quite
adequate representation of the models of data structures and programs. Thus, the
composition-nominative approach provides a unified methodological basis to formalize the
concept of program specification. By using nominative data, we can increase the level
of adequacy of representation data structures, functions, and compositions that are
used in programming languages. The axiomatic theory of nominative data [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] is
developed in the spirit of the theory of admissible sets (S. Kripke, R. Platek, J. Barwise,
Yu.L. Yershov). This theory has a number of advantages with respect to the adequacy
of programming: on the one hand, it is strong enough to generate computable
functions over different data structures, on the other hand, it is not so restrictive as
different versions of constructive logic, but it is not excessively powerful and does not
allow, for example, the use of axiom of constructing the set of all subsets (compared
with theory of sets by Zermelo-Frankel). Moreover, this theory uses basic data
corresponding to the methods of constructing data in programming. In terms of
composition-nominative approach, while using nominative data one can increase the adequacy
of representation data structures, functions, and compositions used in programming
languages and build the systems of program specifications based on the single
conceptual framework. Basic data types of programming languages were specified in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ],
in addition, the functions over nominative data were specified in [
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4">1-4</xref>
        ].
      </p>
      <p>It is therefore natural to expect program analysis and verification tools to be able to
reason about programs, by means of deciding the validity of formulas containing
variables of such types. Application of such tools requires a standard exchange format for
these types of formulas.</p>
      <p>
        Dafny [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] is one of the formal verification languages. It is a hybrid language, with
functional and object-oriented features, which can automatically check programs
against specifications. Behind the scenes, Dafny converts programs for its users into
the mathematical expressions of Hoare logic with the aid of an intermediate
verification language called Boogie, and then it sends the code to an automatic proving
program called Z3 [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. Z3 input format is an extension of the one defined by the
SMTLIB 2 standard [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ]. This conversion process benefits Dafny users in eliminating the
need to write out long proofs in confusing notation while still being able to verify
their programs. As a result, Dafny requires that programmers use a strict form of
syntax in order to properly convert their code into mathematical expressions.
      </p>
      <p>
        The standardization of formats in logic has played a major role in accelerating
research in the past. Examples for successful standardization efforts are the DIMACS
format for Boolean formulas in conjunctive normal form (CNF), and the SMT-LIB
format [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] dedicated to various first-order theories that are used in verification.
      </p>
      <p>SMT-LIB was created in 2003 with the expectation that the availability of common
standards and a library of benchmarks would greatly facilitate the evaluation and the
comparison of SMT (satisfiability modulo theories) systems. Now, SMT-LIB contains
more than 100,000 benchmarks and continues to grow. Formulas in SMT-LIB format
are accepted by the great majority of current SMT solvers.</p>
      <p>In computer science and mathematical logic, the satisfiability modulo theories
problem is a decision problem for logical formulas with respect to combinations of
background theories expressed in classical first-order logic with equality. Examples of
theories typically used in computer science are the theory of real numbers, the theory
of integers, and the theories of various data structures such as lists, arrays, bit vectors
and so on. SMT can be thought of as a form of the constraint satisfaction problem and
thus a certain formalized approach to constraint programming.</p>
      <p>
        The following systems (listed alphabetically) were under active development in
2018: Alt-Ergo, AProVE, Boolector, CVC4, MathSAT 5, OpenSMT 2, raSAT,
SMTInterpol, SMT-RAT, STP, veriT, Yices 2, Z3 [
        <xref ref-type="bibr" rid="ref6 ref7 ref8">6-8</xref>
        ].
      </p>
      <p>
        A new sublogic, or simply logic, is defined in the SMT-LIB language by a logic
declaration. Logic declarations have a similar format to theory declarations. Attributes
with the following predefined keywords are predefined attributes, with prescribed
usage and semantics in logic declarations [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]:
:theories :language :extensions :notes :values .
      </p>
      <p>
        Additionally a logic declaration can contain any number of user-defined attributes.
&lt;logic_attribute&gt; := :theories ( &lt;symbol&gt; + )
| :language &lt;string&gt;
| :extensions &lt;string&gt;
| :values &lt;string&gt;
| :notes &lt;string&gt;
| &lt;attribute&gt;
&lt;logic&gt; ::= ( logic &lt;symbol&gt; &lt;logic_attribute&gt; + )
SMT-LIB logics refer to one or more theories:
 Functional arrays with extensionality (ArraysEx),
 Bit vectors with arbitrary size (FixedSizeBitVectors),
 Core theory, defining the basic Boolean operators (Core),
 Floating point numbers (FloatingPoint),
 Integer numbers (Ints),
 Real numbers (Reals),
 Real and integer numbers (Reals_Ints) [
        <xref ref-type="bibr" rid="ref6 ref7 ref8">6-8</xref>
        ].
      </p>
      <p>We propose to add a theory of nominative data to SMT-LIB, serving as a standard
format for formulas that include operations on nominative data.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Composition-Nominative Approach</title>
      <p>
        One of the approaches to software specification is composition programming [
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4">1-4</xref>
        ].
Composition programming studies the systems at different levels of abstraction –
abstract, Boolean and nominative (attribute) levels. Systems of the last level based on
the composition-nominative methods [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] are rather expressive for adequate
representation of the models of data structures and programs.
      </p>
      <p>
        Thus, the composition-nominative approach provides a single methodological basis
to formalize the concept of program specification, bringing their features and their
further specification to programming languages of the lower level. This approach is
based on the following principles [
        <xref ref-type="bibr" rid="ref1 ref4">1, 4</xref>
        ]:
      </p>
      <p>Development principle (from abstract to concrete): program notions should be
introduced as a process of their development that starts from abstract understanding,
capturing essential program properties, and proceeds to more concrete considerations.</p>
      <p>The principle of priority of semantics over syntax: program semantic and syntactic
aspects should be first studied separately, then in their integrity in which semantic
aspects prevail over syntactic ones.
3</p>
      <sec id="sec-2-1">
        <title>Class  where</title>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Nominative Data</title>
      <p>of nominative data is constructed by the following recursive definition

→ 
),</p>
      <p>Compositionality principle: programs can be constructed from simpler programs
(functions) with the help of special operations, called compositions, which form a
kernel of program semantics structures.</p>
      <p>Nominativity principle: nominative (naming) relations are basic ones in
constructing data and programs.</p>
      <p>
        Here we have formulated only principles relevant to the topic of the article. A
richer system of principles is developed in [
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4">1-4</xref>
        ].
under compositions {° ,  ,∗ ,  }.
      </p>
      <p>
        It is demonstrated [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] that an arbitrary partial recursive function can be represented
by nominative computable functions over the set of natural numbers by modelling in
the class of nominative data. In addition, it is shown in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] that each nominative
funcby using the compositions.
based on some sets of names of 
and values of  : 
= 
∪ (

→
      </p>
      <p>is the class of partial multi-valued (non-deterministic) functions.</p>
      <p>For nominative data representation we use the form 
= [  ↦   |  ∈  ], where 
is some set of indices. Nominative membership relation is denoted by ∈ . Thus,
  ↦   ∈</p>
      <p>means that the value of   in  is defined and is equal to   ; this can be
written in another form as  (  ) ↓=   . The class 
\ is called the class of proper
nominative data, or hierarchical nominative data; data from the class 
will be

→ 
called flat nominative data, or nominative sets</p>
      <p>Main functions over the nominative data are the following functions: naming  
and denaming of  </p>
      <p>with a parameter  ∈  , and binary operations and predicates,
such as: union ∪D, subtraction \ , equality (= ) on  . The function of
construction of the empty nominative data [ ] , predicate of membership on  : ∈   are

also defined. Operation of renaming    for the nominative data ([ 1 ↦  1, … ,  ↦
  , … ]) yields [ 1 ↦  1, … ,</p>
      <p>↦   , … ]. The main compositions of functions over
nominative data are binary compositions: multiplication ° , iteration ∗ , merging 

and branching ternary composition  . It is shown that the composition of
multiplication corresponds to the consecutive application of functions, composition of
branching – to the conditional operator if-then-else of programming languages, composition
of iteration ∗ – to operator until-do, and composition of merging  connecs
nominative data resulting from function-arguments.</p>
      <p>
        The special kind of computability – nominative computability – is introduced for
consideration and studied in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Nominative functions are the functions over the
nominative data obtained by closing of functions
      </p>
      <p>
{0, 1, [ ] ,  ,∪ , (= ) , 

 ,   , ∈   }</p>
      <p>
        Axiomatic theory of nominative data [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] is developed in the spirit of the theory of
admissible sets (S. Kripke, R. Platek, J. Barwise, Yu.L. Yershov). This theory has a
number of advantages with respect to the adequacy of the programming: on the one
hand, it is quite powerful to generate computable functions over the different data
structures, on the other hand, it is not so restrictive as different versions of
constructive logic, but it is not excessively powerful and does not allow, for example, the use
of axiom of constructing the set of all subsets (compared with theory of sets by
Zermelo-Frankel). Moreover, this theory uses the basic data (elements) corresponding to
the methods of constructing data in programming. The unary predicate  is used, true
on the elements of the basic set  ; the structure 〈 , ∈ , =,  〉 is considered. The
theory of nominative data is constructed as the axiomatic theory of the first-order logic
with equality and ternary nominative membership relation (predicate) of the that
written in the infix form  ↦ y ∈  (or ( , y) ∈  ).
      </p>
      <p>The class of 0 - formulas is the smallest class  , containing the basic formulas
and closed under the following rules:
1) if  ∈  , then also ¬ ∈  ,
2) if,  ,  ∈  , then   ∈  and   ∈  ,
3) if  ∈  , then  ↦    , ∃ →     ∈ Y for all variables  ,  ,  .</p>
      <p>Class of -formulas is the smallest class  , containing 0-formulas and closed in
relation to the conditions 2) and 3) determining the class of 0-formulas and further
conditions of existential quantification: if  ∈  , then ∃ ∈  .
4</p>
    </sec>
    <sec id="sec-4">
      <title>The Domain of Nominative Data</title>
      <p>
        The theory of nominative data is of interest for software modelling and verification,
but currently lacks support in the SMT-LIB format. Therefore, we propose the theory
of nominative data for the SMT-LIB Standard 2.6 [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ].
      </p>
      <p>For convenience, the definition of nominative data in the SMT-LIB Standard is
presented via the concepts of nominative pair ( ↦ y) and nominative set ([ 1 ↦
 1, … ,  ↦   , … ]). Nominative pair of two typed elements are the most basic
collection datatype that we propose for an SMT-LIB theory. Semantically, assuming that
the type  1 denotes the non-empty domain (name)  and the type  2 denotes the
domain (value)  , the type     denotes the domain  ↦  . Table 1 contains
all proposed operations on nominative pairs in mathematical and in concrete
SMTLIB notation.</p>
      <p>This table gives a signature of the proposed SMT-LIB theory of nominative pairs.
In the first column of Table 1, we specify a mathematical notation for the functions
used with nominative pairs. In the mathematical notation, we use the following
notation:   or  are names in the nominative pairs,   is the value in the nominative pair,
and  is the nominative pair. In the second column of Table 1, we specify a proposed
SMT-LIB notation for each operation. In the third column of Table 1, we specify a
signature for each operation. In the signature definition, we use the following
notation:  is a set of names in nominative pairs, and  is a set of values in nominative
pairs.
:sorts ((Int 1) (NdPair 2)))
:funs (</p>
      <p>Note, that the type of an  -ary predicate SMT-LIB is in specified by an  −tuple
( 1 …   ), while the type of an  -ary function with result type  0 is given by an
A Declaration for a nominative pair for theory of nominative data for the SMT-LIB
(par (X Y) (ndpair X Y (NdPair X Y)))
(par (X Y) (naming X Y (NdPair X Y)))
(par (X Y) (pairrenaming</p>
      <p>(NdPair X Y) X (NdPair X Y)))
(par (X Y) (pairnameequal (NdPair X Y) (NdPair X Y) Bool))
(par (X Y) (pairvalueequal (NdPair X Y) (NdPair X Y) Bool))
(par (X Y) (pairequal (NdPair X Y) (NdPair X Y) Bool))))
:definition
"Let Q be a set of sort symbols including NdPair and Bool, and let S
be the set of all (ground) sort terms over Q. For any s in S and any
function symbol f, let [[s]] and [[f]] respectively denote the
interpretation of s and f in some given structure.</p>
      <p>For any S like the above, NominativePair(S) is the theory consisting
of all structures satisfying the following restrictions for all s, s'
in S:
- [[(NdPair s s')]] is the pair from [[s]] to [[s']].
- For all name n and data d</p>
      <p>[[naming]](n, d) = [[(NdPair n d)]].
- For all nominative pair p from [[n]] to [[v]] and all name x
[[paitrenaming]](p, x) = [[(NdPair x v)]].</p>
      <p>- For all nominative pairs a from [[n1]] to [[v1]] and nominative
pair b from [[n2]] to [[v2]],</p>
      <p>Nominative set of nominative pairs is the collection datatype that we propose for
SMT-LIB theory. Semantically, the nominative set types denote sets NdSet(A, B) of
finite partial functions. The Table 2 contains all proposed operations on nominative
sets in mathematical and in concrete SMT-LIB notation. This table gives a signature
of the proposed SMT-LIB theory of nominative set.</p>
      <p>In the first column of Table 2, we specify a mathematical notation for the functions
used with nominative data. In the mathematical notation, we use the following
notation:   or  are names in the nominative pairs,   is the value in the nominative pair,
and  is the nominative set. In the second column of Table 2, we specify a proposed
SMT-LIB notation for each operation. In the third column of Table 2, we specify a
signature for each operation. In the signature definition, we use the following
notation:  is a set of names in nominative pairs,  is a set of values in nominative pairs,
and  is a set of nominative pairs.
:sorts ((Int 1) (NDSet 2))
:funs (((par (X) (emptyNdSet (NdSet X)))
(par X) (naming X X (NdSet X) (NdSet X) :right_assoc)
(par X) (denaming X (NdSet X) (NdSet X) :right_assoc)
(par (X) (ndin (NdPair(X Y)) (NdSet Z) Bool))
(par (X) (ndsubset (NdSet X) (NdSet X) Bool :chainable))
(par (X) (ndunion (NdSet X) (NdSet X) (NdSet X) :right_assoc))
(par (X) (ndoverlay (NdSet X) (NdSet X) (NdSet X) :right_assoc))
(par (X) (ndsetminus (NdSet X) (NdSet X) (NdSet X) :right_assoc))
(par (X) (ndequal (NdSet X) (NdSet X) Bool :chainable))
(par (X (renaming X X (NdSet X) (NdSet X) :right_assoc))
:definition
"Let Q be a set of sort symbols including Set, Int, and Bool, and
let S be the set of all (ground) sort terms over Q. For any s in S
and any function symbol f, let [[s]] and [[f]] respectively denote the
Interpretation of s and f in some given structure.</p>
      <p>For any S like the above, NominativeSet(S) is the theory
consisting of all structures satisfying the following restrictions for all s
in S:
- [[(Set s)]] is the set of all finite subsets of [[s]].
- [[f]] is as expected if f is in {subset, in}.</p>
      <p>- [[(NdSet s s')]] is the nominative set of all finite partial
maps from [[s]] to [[s']].</p>
      <p>- [[emptyNdSet]] is the function from [[s]] to [[s']] undefined
everywhere.</p>
      <p>- For all nominative sets m and name x,</p>
      <p>[[naming]](x, m) = [[(NdPair x m)]] is the nominative set of all
finite partial maps from [[x]] to [[m]].</p>
      <p>- For all n &gt; 0, nominative set a and nominative set b of [[b1]],
..., [[bn]],
[[ndsubset]](b, a) =
true if bi ndin a for all i = 1, ..., n
false otherwise.</p>
      <p>- For all n, m &gt; 0, nominative set a of [[a1]], ..., [[an]] and
nominative set b of [[b1]], ..., [[bm]],</p>
      <p>[[ndunion]](b, a) = [[a1],…[an],[b1],…,[bm]].</p>
      <p>- For all n, m &gt; 0, nominative set a of [[(NdPair a1 b1)],…[(
NdPair an bn)]] and nominative set b,
[[ndoverlay]](a, b) = [[ndunion](b,
{ x indn [[(NdPair a1 b1)],…[( NdPair an bn)]] |
there in not any d (NdPair ai d) ndin b })].</p>
      <p>- For all k &gt; 0, nominative set a of [[a1]], ..., [[an]] and
nominative set b of [[b1]], ..., [[bm]],
[[ndsetminus]](a, b) = {x ndin [[s1],…[sk]] |
for all i &lt;=k si idin a and not (si indin b)}.</p>
      <p>- For all nominative set a of [[(NdPair a1 b1)],…[( NdPair an
bn)]] and name x,
[[renaming]](x, y, a) ={x ndin [[(NdPair a1 b1)],…
[( NdPair am bm)]] | for all i&lt;=m
([(NdPair ai bi)] dnin [[(NdPair a1 b1)],…
[( NdPair an bn)]]) and (not ai = x) } ndunion
{ [[(NdPair y bj)] | [[(NdPair x bj)] ndin
[[(NdPair a1 b1)],…[( NdPair an bn)]]}.</p>
      <p>- For all k &gt; 0, nominative set a [[a1]], ..., [[an]] and
nominative set b,
[[ndsubset]](a, b) =
true
false
if for all i &lt;=n ai idin b
otherwise.
- For all nominative sets a, b</p>
      <p>[[ndequal]](a, b) = (a ndsubset b) and (b ndsubset a).
- [[n]] is as expected if n is a numeral.
- [[(NdSet s)]] is the set of all finite subsets of [[s]].
- [[f]] is as expected if f is in
{ emptyNdSet, naming, denaming, ndin, ndsubsetm ndunion,
ndoverlay, ndsetminus, ndsubset, ndequal, renaming}.
")</p>
      <p>Using proposed by the authors the SMT-LIB theory of nominative data, we can
adequately determine the structure of programming data and operations on them.</p>
      <p>For example, the following statement in terms of the theory of nominative data:
∀ ∃ ( ∈  )
can be specified in the form of the following SMT- LIB notation:</p>
      <p>(forall ((a (NdPair Int))) (exists ((s (NdSet Int))) (ndin a s)))</p>
      <sec id="sec-4-1">
        <title>Z3, which is one of the SMT solvers.</title>
        <p>
          The link to https://sites.google.com/knu.ua/nominative-data contains information
that relates the description of Extended SMT-Lib Standard with Theory of
Nominative Data [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>In the article, we have proposed the extension of the SMT-LIB Standard with theory
of nominative data. This theory is of interest for software modelling and verification.
At the same time, the declaration for the SMT-LIB Standard for the theory of
nominative data has not yet been proposed.</p>
      <p>
        To construct the extension of the SMT-LIB Standard for the constructed theory of
nominative data, we have described the main principles of the
compositionnominative approach and the definition of the class of nominative data. Such data
form a basis for adequate definition of data structures, functions, and compositions of
programming languages [
        <xref ref-type="bibr" rid="ref2 ref3 ref4">2-4</xref>
        ].
      </p>
      <p>We are developing SMT solvers with nominative data support. In the forthcoming
articles we will demonstrate applications of the proposed theory.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Nikitchenko</surname>
          </string-name>
          , N.:
          <article-title>A Composition Nominative Approach to Program Semantics</article-title>
          . Techn.
          <string-name>
            <surname>Report</surname>
          </string-name>
          IT-TR. Technical University of Denmark, Lyngby (
          <year>1998</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Omelchuk</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          :
          <article-title>Aksiomatychni systemy specyfikacij program nad nominatyvnymy danymy [Axiomatic Systems of Specifications of Programs over Nominative Data]</article-title>
          .
          <source>Candidate's thesis</source>
          . Kyiv [in Ukrainian] (
          <year>2007</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Nikitchenko</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Omelchuk</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shkilniak</surname>
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Formalisms for Specification of Programs over Nominative Data. Electronic computers and informatics (ECI 2006)</article-title>
          . Košice, Herl'any, Slovakia,
          <fpage>134</fpage>
          -
          <lpage>139</lpage>
          (
          <year>2006</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Kryvolap</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Nikitchenko</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Schreiner</surname>
          </string-name>
          , W.:
          <article-title>“Extending Floyd-Hoare logic for partial pre-</article-title>
          and
          <source>postconditions”</source>
          ,
          <source>CCIS 412</source>
          , Springer, Heidelberg, pp.
          <fpage>355</fpage>
          -
          <lpage>378</lpage>
          . (
          <year>2013</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Leino</surname>
            ,
            <given-names>K.R.M.:</given-names>
          </string-name>
          <article-title>Dafny: An Automatic Program Verifier for Functional Correctness</article-title>
          . In LPAR-
          <volume>16</volume>
          ,
          <issue>6355</issue>
          :
          <fpage>348</fpage>
          -
          <lpage>370</lpage>
          . LNCS. Springer. (
          <year>2010</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Moura</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bjørner</surname>
          </string-name>
          , N.:
          <article-title>Z3: An efficient smt solver</article-title>
          .
          <source>In In Conference on Tools and Algorithms for the Construction and Analysis of Systems (TACAS)</source>
          .
          <article-title>(</article-title>
          <year>2008</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Barrett</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fontaine</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tinelli</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>The SMT-LIB Standard: Version 2.6</article-title>
          . Publishing house of Department of Computer Science, The University of Iowa. (
          <year>2017</year>
          ). Homepage, http://www.SMT-LIB.org ,
          <source>last accessed</source>
          <year>2019</year>
          /03/11.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Nieuwenhuis</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Oliveras</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tinelli</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Solving SAT and SAT Modulo Theories: From an Abstract Davis-Putnam-Logemann-Loveland Procedure to DPLL(T)</article-title>
          .
          <source>Journal of the ACM. Т. 53</source>
          , vol.
          <volume>6</volume>
          , pp.
          <fpage>937</fpage>
          -
          <lpage>977</lpage>
          . (
          <year>2006</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Sutcliffe</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Suttner</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>The TPTP problem library-CNF release v1.2.1</article-title>
          .
          <string-name>
            <given-names>J.</given-names>
            <surname>Autom</surname>
          </string-name>
          .
          <source>Reasoning</source>
          ,
          <volume>21</volume>
          (
          <issue>2</issue>
          ). pp.
          <fpage>177</fpage>
          -
          <lpage>203</lpage>
          . (
          <year>1998</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10. Theory of Nominative Data, https://sites.google.com/knu.ua/nominative-data,
          <source>last accessed</source>
          <year>2019</year>
          /04/21.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>