<!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 Smt-Lib v2 with -Terms and Polymorphism</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Richard Bonichon</string-name>
          <email>richard@dimap.ufrn.br</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>David Deharbe</string-name>
          <email>david@dimap.ufrn.br</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Claudia Tavares</string-name>
          <email>claudia@ppgsc.ufrn.br</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Universidade Federal do Rio Grande do Norte Natal</institution>
          ,
          <country country="BR">Brazil</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>This paper describes two syntactic extensions to Smt-Lib scripts: lambda-expressions and polymorphism. After extending the syntax to allow these expressions, we show how to update the typing rules of the Smt-Lib to check the validity of these new terms and commands. Since most Smt-solvers only deal with many-sorted rst-order formulas, we detail a monomorphization mechanism to allow to use polymorphism in Smt-Lib syntax while retaining a monomorphic solver core. Dissemination of Smt-solvers requires they are powerful, trustable and open (i.e. easy to interface). The Smt-Lib format [BST10] is an initiative from the Smt community to address the last aspect, by o ering both a common language to describe problems and a command language to interact with the solver. The Smt-Lib format has evolved in the recent years from version 1.2 to version 2.0 to simplify the de nition of the syntax for the part of the language that is responsible for problem descriptions (i.e. declaration of the signature and assertion of logic expressions) on the one hand, and to enrich the commands that allow third-party tools to interact with complying SMT solvers. veriT is an open-source solver jointly developed at INRIA and UFRN. Early versions of the veriT solver implemented several extensions to version 1.2 of the Smt-Lib format: macrode nitions, -expressions and -reduction. A later extension included polymorphic sorts, signatures and assertions. A successful application of these extensions has been to apply SMT solving to verify proof obligations stemming from set-based formalisms (namely, B and Event-B) using standard Smt-Lib logics (AUFLIA) [De10, DFGV12, De13]. The rationale of this application is essentially the following: A set is encoded as its characteristic predicate. For instance, fx 0 as: Set operations are encoded as higher-order functions. For instance, set intersection is encoded as a (polymorphic) macro called inter de ned as: (define fun (par (X) (inter (lambda ((f (X Bool)) (g (X Bool)) (x X)) (and (f x) (g x ))))) , and set membership by the macro named member and de ned as: (define fun (par (X) (member (lambda ((x X) (f (X Bool))) (f x ))))) , in both de nitions, X denotes a type variable, its scope being the de nition itself.</p>
      </abstract>
      <kwd-group>
        <kwd>(lambda ((x Int)) (and (&lt;= 0 x) (&lt;= x 9)))</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>To handle such expressions, veriT implements a processor that performs macro-expansion and
-reduction steps as well as type inference. For instance, the formula 0 2 (fx x 0g\fx x 0g)
would be encoded as (member 0 (union (lambda (x Int) (&gt;= x 0)) (lambda (x Int) (&lt;= x 0)))), and the result of
processing this expression is (and (&gt;= 0 0) (&lt;= 0 0)). In addition, this processor rewrites equalities
between lambda expressions as universal quanti cations. Once all steps have been applied, if
the goal is not rst-order logic, then veriT emits an error message and halts.</p>
      <p>Some of these extensions were included in the Smt-Lib format: polymorphic sorts , though
restricted to theory les, and macro-de nition (named function de nitions). In this paper,
we thus discuss modi cations to the Smt-Lib format 2.0 corresponding to the extensions to
Smt-Lib format 1.2 that were implemented in the solver veriT. It is noteworthy that these
modi cations maintain backward compatibility with the existing de nition of the Smt-Lib
format. Also we discuss how to rewrite a problem expressed with the proposed extensions to
plain Smt-Lib 2.0.</p>
      <p>This paper is organized as follows. Sec. 2 presents the extensions made to Smt-Lib,
introducing polymorphism at the Smt-Lib script level. This leads to an updated set of typing rules,
mainly for Smt-Lib terms, which is discussed in Sec. 3. Using these rules, we detail a strategy
to generate a monomorphic version of our target problem in Sec. 4. Finally, we discuss the pros
and cons of our solution in the context of related work in Sec. 5 and detail ongoing and further
work in Sec. 6.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Extensions to Smt-Lib</title>
      <sec id="sec-2-1">
        <title>We propose two extensions to the Smt-Lib format:</title>
        <p>anonymous functions (i.e., -abstractions) and their applications;
parametric polymorphism for assertions and function types.</p>
        <p>The Smt-Lib already features two avors of polymorphism:
parametric polymorphism for sorts and function signatures, but only for background
theories;
ad-hoc polymorphism because functions can be overloaded.</p>
        <p>The extension adds parametric polymorphism to assertions and function de nitions and
declarations. The additional introduction of gives a very functional, higher-order, avor to
this extended Smt-Lib. The typing rules presented in Sec. 3.1 even allow let-polymorphism
inside the Smt-Lib.</p>
        <p>However, -abstractions as we envision them will not add much expressiveness as we want
to be able to get a rst-order problem only through the application of -reduction. Thus, we
will not handle a reduced problem with residual higher-order or partial applications. We see
the addition of -abstractions as a convenient mechanism to encode certain problems.</p>
        <p>Also, the introduction of polymorphism at the syntactic level does not fundamentally change
the expressive power available for Smt-Lib scripts. Indeed, the combination of type schemes to
express background theories and overloading of functions permitted by the Smt-Lib standard
already covers most functionalities which ML-style let-polymorphism permits. Nonetheless, we
argue that polymorphism in scripts is syntactically more convenient than writing every ground
instances of the expressions we are interested in.</p>
        <p>The next section presents the concrete syntax for the two extensions mentioned above.
2.1</p>
        <sec id="sec-2-1-1">
          <title>Syntax extensions for Smt-Lib</title>
          <p>Anonymous functions are terms introduced using lambda, which becomes a keyword.
Polymorphic terms reuse the same par keyword as the polymorphic elements of the Smt-Lib theories.
The syntactic extensions are summarized in the BNF extract of Fig. 1.</p>
          <p>h p a r f u n c t i o n a r g s i : : = par ( hsymboli+ )
hpar commandi : : = ( define fun ( h p a r f u n c t i o n a r g s i ( hsymboli</p>
          <p>( h s o r t e d v a r i ) h s o r t i htermi ) ) )
j ( declare fun ( h p a r f u n c t i o n a r g s i ( hsymboli ( h s o r t i ) h s o r t i ) ) )
j ( assert ( h p a r f u n c t i o n a r g s i htermi ) )</p>
          <p>Function types are allowed as the return type of functions, due to the inclusion of -term.
The choice made is to declare a function type as a list of types. For example the function
declaration (declare fun f (Int Int ) Int ) is not the same as the function declaration (declare fun f ((Int Int )) Int ).
The former is a function which expects two integers and returns an integer, the latter expects
only one argument | a function from integer to integer | and returns an integer. Now, the
only possible problem is to distinguish in a sort expression (X Y) between a sort meant to express
a function type and a sort which is the application of a sort of arity 1 to its argument, like
(Array Int ). This is not a practical problem as sort arity is explicitly stated. Therefore, if the
arity of X is greater than 1, we say it is a sort application, otherwise it is a function type.
3</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Typing extended Smt-Lib</title>
      <p>This section details the rules for typing extended Smt-Lib scripts. These rules extend the
current set of rules for Smt-Lib1.</p>
      <p>Typing polymorphic terms is a necessary step towards uncovering monomorphic ground
instances of polymorphic terms. Various type instantiations of the same polymorphic functions
will lead in Sec. 4 to the generation of multiple monomorphic versions of the same function.
Fortunately, ad-hoc polymorphism through overloading is permitted by the Smt-Lib standard.
3.1</p>
      <sec id="sec-3-1">
        <title>Typing terms</title>
        <p>The type of polymorphism we introduce in the extended Smt-Lib is ML-style prenex
polymorphism [Pie02]. The typing rules of the system are described in Fig. 3. They can be seen as
an adaptation of a Damas-Hindley-Milner [Mil78, Hin69] type system to the Smt-Lib syntax.
These rules manipulates Smt-Lib sorts, type variables, tuple types and function types:
De nition 1 (Types). Let S be a set of sorts, V be a set of (type) variables. The set of
well-formed types T is de ned inductively as follows:
1. if s 2 S, then s 2 T
1Detailed in Section 4.2.2 of the Smt-Lib Standard [BST10]
( set logic AUFLIA )
( define fun ( par (X) ( empty ( ( e X ) ) Bool f a l s e ) ) )
( define fun ( par (Y)
( i n s e r t ( ( e Y) ( s (Y Bool ) ) ) (Y Bool )</p>
        <p>( lambda ( ( e1 Y ) ) ( or (= e e1 ) ( s e1 ) ) ) ) ) )
( declare fun ( par ( Z ) ( f l a t ( ( ( Z Bool ) Bool ) ) ( Z Bool ) ) ) )
( assert (= ( f l a t empty ) empty ) )
( assert ( par (X)
( f o r a l l ( ( ss ( ( X Bool ) Bool ) ) )
(= ( f l a t ( i n s e r t empty ss ) ) ( f l a t ss ) ) ) ) )
( assert ( par (X)
( f o r a l l ( ( e X) ( s (X Bool ) ) ( ss ( ( X Bool ) Bool ) ) )
(= ( f l a t ( i n s e r t ( i n s e r t e s ) ss ) )</p>
        <p>( i n s e r t e ( f l a t ( i n s e r t s ss ) ) ) ) ) ) )
( assert ( f o r a l l ( ( s ( I n t Bool ) ) ) (= ( f l a t ( i n s e r t s empty ) ) s ) ) )
( check sat )
2. if v 2 V, then v 2 T
Notations. Type variables will be denoted by . represent a set of type variables (possibly
empty). A type is said to be ground if it has no type variables. A type substitution is a mapping
from type variables to types (ground or not). The application of a type substitution is denoted
using := and extended to variable sets. Hence T [ := T 0] substitutes in T every member of
by a corresponding type in T . A typing environment is a mapping from identi ers to
types. Universal quanti cation over type variables is denoted 8T, in order to separate this
quanti cation from the universal quanti er ranging over term variable. For terms, x or xi will
stand for variables, t or ti will stand for any term.</p>
        <p>Typing rules. The rules of Fig. 3 use two additional functions:
a function to compute the set of free type variables of a type, denoted fvT ;
a generalization function Gen, which helps compute the most general type possible for a
let-bound variable. This function is de ned as follows:</p>
        <p>Gen(T; ) = 8T(fvT (T )nfvT ( )):T</p>
        <p>The rules distinguish between curried functions (! type), where partial application is
allowed, and uncurried functions, where the arguments are treated as a tuple, thus disallowing
partial application. Curried functions come from explicit -abstractions whereas the Smt-Lib's
define fun de ne functions which can only be totally applied.</p>
        <p>(x) = 8T :T
` x : T [ := T 0]</p>
        <p>Ax8
; x1 : T1; : : : ; xn : Tn ` t : bool</p>
        <p>Q 2 f8; 9g Qua
` Q x1 : : : xnt : bool
` x1 : T1
: : :</p>
        <p>` xn : Tn
` x1 : : : xn:t : T1 ! : : : ! Tn ! T
` t : T</p>
        <p>Lam
` t1 : T1
: : :
` tn : Tn
` f t1 : : : tn : T
` f : T1 ! : : : Tn ! T</p>
        <p>App
` t1 : T1
: : :
` tn : Tn</p>
        <p>; x1 : Gen(T1; ); : : : ; xn : Gen(Tn; ) ` t : T
` let ((x1 t1) : : : (xn tn)) t : T</p>
        <p>Let
` x as T : T</p>
        <p>Axas
: : : Tn ! T g; fassert 8T ((8x1 : T1 : : : xn : Tn f x1 : : : xn) = t)g [ Ci
fundef
h [ ff : 8T :T1
h ; fdeclare-fun 8T (f (T1 : : : Tn) T )g [ Ci fundec
: : :</p>
        <p>Tn ! T g; Ci
h ; fassert 8T tg [ Ci</p>
        <p>` t : bool
h ; Ci</p>
        <p>Assert</p>
        <p>The typing system is used in particular to nd monomorphic occurrences of polymorphic
terms. In the next section, we will use it in a monomorphization procedure.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Monomorphization</title>
      <p>Once we have checked that a set of commands is well-typed, we need to generate a
Smt-Libcompatible version of it, since we do not want to have to change the core of the solver. It means
rst that -terms must be eliminated and second, that the problem must be monomorphized.
The elimination of -terms has been discussed in Sec. 1 and uses -reduction. Only if the
problem is still rst-order after this elimination can we then try to compute a monomorphic
version of it. Otherwise we will simply discard it.</p>
      <p>Bobot and Paskevich [BP11] have shown the undecidability of computing a minimal
monomorphic set formulas equivalent to an original set of polymorphic formulas. However, we still aim
to present here a monomorphization method for polymorphic formulas. If needed, it should
compute an over-approximation of the minimal monomorphic set. Our implied goal is that
we hope monomorphization will be good enough in practice for most of our problems. The
proposed monomorphization is expected to be sound with respect to the original polymorphic
types. Hence, the unsatis ability of the newly generated problem implies the unsatis ability
of the original problem but its satis ability does not in general imply the satis ability of the
original problem.</p>
      <p>Monomorphization example. Let us detail the example of Fig. 2 to show what we would
like to achieve on this speci c case. On this example, monomorphization is expected to fail,
so that we can also explain how the procedure works and how we deal with failure. In the
example, three function signatures are de ned, where type variables are implicitly universally
quanti ed:
emptyset: e!B
insert: (( i ( i!B))! i!B)
flat :( f !B!B! f !B)</p>
      <p>The rst step identi es polymorphic and monomorphic instances of terms through typing.
In the example, we have three polymorphic formulas. These formulas are detailed below. For
the sake of readability, we write type annotations only for co-domains, according to the initial
function signatures, and hide annotations for term variables.</p>
      <p>ath !Bi(emptyseth !B!Bi) = emptyseth !Bi
8ss : !B!B
8e : ; s : !B; ss : !B!B
( ath !Bi(inserth !B!Bi(inserth !Bi(e; s); ss))
= inserth !Bi(e; ath !Bi(inserth !B!Bi(s; ss))))
( ath !Bi(inserth !B!Bi(emptyseth !Bi; ss)) = ath !Bi(ss))
(4.1a)
(4.1b)
(4.1c)</p>
      <sec id="sec-4-1">
        <title>In Fig. 2, the unique monomorphic assertion is:</title>
        <p>8s : Z!B ( athZ!Bi(inserthZ!B!Bi(s; emptysethZ!B!Bi)) = s)
Such monomorphic assertions drive the procedure. Basically, they provide the set of ground
types that forms the basis for the generation of monomorphic instances of polymorphic
functions.</p>
        <p>The second step consists in computing the set of new terms derived from the injection
of monomorphic elements. Using type substitutions, we can generate monomorphic
specializations F = femptyset[ e:=Z!B]; insert[ i:=Z!B]; at[ f :=Z]g of the polymorphic functions. We
try to substitute the polymorphic occurrences of the three terms emptyset, insert, flat by their
monomorphic counterpart whenever we can in the polymorphic terms 4.1a, 4.1b and 4.1c, using
a leftmost-innermost strategy. This generates the following new set of monomorphic assertions:
athZ!Bi(emptysethZ!B!Bi) = emptysethZ!Bi</p>
        <p>[ e:=Z]
8ss : Z!B!B
8e : Z; s : Z!B; ss : Z!B!B
( athZ!Bi(inserthZ!B!Bi(insert[hZ!i:=BiZ](e; s); ss))
= insert[hZ!i=BZi](e; athZ!Bi(inserthZ!B!Bi(s; ss))))
( athZ!Bi(inserthZ!B!Bi(emptyset[hZ!e:=BiZ]; ss)) = athZ!Bi(ss))
(4.2a)
(4.2b)
(4.2c)</p>
        <p>The procedure uses all monomorphic terms, and thus generates a number of new
monomorphic assertions. At this point, one full pass of the procedure has been executed. This is repeated
while new monomorphic type instances are created. For example, the problem after the rst
full pass now has uncovered new possible monomorphizations: emptyset[Z= e] (in 4.2a and 4.2b)
and insert[Z= i] (in 4.2c).</p>
        <p>The procedure thus stops on a nal problem if it does not uncover any more monomorphic
instances. There, only two things can happen:
if polymorphic terms are only found in their original place (i.e. as subterms of the
original problem) then we have found a monomorphic expression of the original polymorphic
problem, if we remove the original polymorphic assertions and functions from the nal
problem.
if polymorphic terms are still present, then we declare that we have failed to
monomorphic expression of the original problem and halt there.
nd a</p>
        <p>On the example, the procedural steps we have applied will never terminate because in the
term (flat emptyset) = emptyset, a new monomorphic type can be inferred for the leftmost emptyset
at any instantiation of the rightmost emptyset , which will be fed to the rightmost one, thus
looping forever.</p>
        <p>Monomorphization xpoint. The proposed monomorphization procedure is now
summarized. Let T represent the set of term occurrences of the original problem. Initially, the sets of
monomorphic and polymorphic term occurrences are empty.</p>
        <p>1. Apply type inference and divide the terms in T into two sets M and P of monomorphic
and polymorphic term occurrences. If they are the same as the previous M and P , we
have reached a xpoint and can stop. Otherwise, go to step 2.
2. Let M = fm1; m2; : : : mng and P = fp1; p2; : : : pmg. For each (mi; pj ), such that mi 2 M ,
pj 2 P and mi = pj (i.e. mi and pj are two occurrences of the same term), substitute the
polymorphic pj by its monomorphic mi in the term t where pj occurs as subterm, thus
deriving a new term tij = t[pj := mi].</p>
        <p>At the end of this step, we will have a new set of terms from the various possible pairings
between monomorphic and polymorphic occurrences of the same term, generating a new
set of term occurrences T 0. Let the new problem be represented by T [ T 0.</p>
        <p>Non-termination. The fact that our procedure is possibly non-terminating is mitigated by
the fact that, in practice, we impose restrictions on time or in this case, on the number of full
passes. However, we would like to be able to guess possibly in nite expansions because we know
we will not be able to guarantee a sound and complete monomorphization. To this e ect, we
have conjectured the following criterion, which depends on uni cation [Rob65]:
Conjecture 1 (Non-termination criterion). Let t and s be terms and s1 and s2 be two
occurrences of s in the term t. Let T1 be the type inferred for s1 and T2 the one of s2. If T1 and
T2 cannot be uni ed because of a failing occur check then the monomorphization procedure will
not terminate.
5</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Related work</title>
      <p>The use of polymorphic logics on top of many-sorted or mono-sorted logics has received speci c
attention in the last few years.</p>
      <p>In the context of the Caduceus and Why [FM07, BFMP11], Couchot and Lescuyer [CL07]
describe how to translate ML-style polymorphic formulas into untyped and multi-sorted versions
of the original problem.</p>
      <p>This method is re ned by Bobot and Paskevich [BP11] who show a 3-staged treatment of
polymorphic formulas to translate them into many-sorted versions, including various
possibilities for the last translating step. Their proposals particularly take care of protecting data types
which are known to be handled by decision procedures by the targeted Smt-solvers. This work
is further detailed in Bobot's thesis [Bob11].</p>
      <p>Leino and Rummer [LR10] consider the higher-order polymorphic speci cation language of
the Boogie2 tool [Lei08] that has to be translated to Smt-solvers which in general do not handle
polymorphism. They present two translations, one using type guards, the other adding types
as further function arguments.</p>
      <p>These two last approaches already present various advanced techniques to translate
polymorphism formulas for many-sorted Smt-solvers, each one coming from their experience and
needs, but do not tackle monomorphization. In the case of Bobot and Paskevich, their proof
of the undecidability of the monomorphization makes clear the reason why, while Leino and
Rummer leave it as a possible further optimization.</p>
      <p>Bobot et al. [BCCL08] have added built-in support for polymorphism inside the Alt-Ergo
prover [BCC+08]. Supporting polymorphic types at the solver level would indeed simplify the
addition of polymorphism at the speci cation level. We chose to keep things separated (for
now).</p>
      <p>There is also a large body of work on the translation of typed higher-order-logic into untyped
rst-order logic. In the context of using automation to help discharge proofs Hurd [Hur03]
or Meng and Paulson [MP08] can however rely on the type-checking capabilities of
higherorder provers to verify automated but untyped rst-order proofs. Therefore they can even use
unsound translations and leave to the higher-order prover the task of checking the soundness of
the proof. In order to use Smt-solvers inside Isabelle/HOL [Pau94], the monomorphization step
of Blanchette et al. [BBP11] bears a strong similarity to our proposal.
6</p>
    </sec>
    <sec id="sec-6">
      <title>Conclusion and further work</title>
      <p>We have presented a summary of two backward compatible syntactic extensions made to the
Smt-Lib standard: -terms and polymorphism. We have shown how to deal with -terms
through -reduction. We also have presented how we attempt to generate a monomorphic
version of our polymorphic problem using a xpoint-like procedure. This procedure heavily
uses a Damas-Hindley-Milner like type inference algorithm to discover relevant monomorphic
instances of polymorphic terms.</p>
      <p>The support for the proposed syntactic extensions is currently being implemented in the
development version of veriT. -terms are already supported and there is preliminary support
for polymorphic Smt-Lib scripts. We are currently testing the monomorphization process to
see how it behaves in practice.</p>
      <p>The preservation of satis ability means that, even in the case of a non-terminating
monomorphization, we could devise a strategy to correctly use an unsatis able result at any step of the
monomorphization process. Indeed, this would mean that we have found an unsatis able subset
of the initial problem.</p>
      <p>This strategy would be similar to depth- rst iterative deepening [Kor85], which has been
heavily used in provers based on the tableau method [Smu95, DGHP99]. In tableaux, this is
used to generate possible term instantiations for universally quanti ed variables in order to nd
a model refuting the original formula. In our case, after each deeper monomorphization step,
the Smt-solver would get to try a partial and new monomorphic problem containing only a
subset of possible type instantiations. If it can prove the unsatis ability of this new problem,
we can stop. If not, we can | and should to preserve completeness | continue. In practice,
this iterative procedure will be bounded either by a time limit or by a given number of steps.</p>
      <p>We believe this work is a step towards a more generalized use of polymorphism in the
context of Smt-solvers. These e orts might converge into an Alt-Ergo-like solution for provers
supporting Smt-Lib, indeed building polymorphism support in the prover and not only at the
syntactic level.</p>
      <p>Acknowledgments. We warmly thank the anonymous reviewers for their helpful feedback
and constructive criticism, which already show promises of future fruitful discussions about the
subject of this paper.
[BBP11]</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <string-name>
            <given-names>Jasmin C.</given-names>
            <surname>Blanchette</surname>
          </string-name>
          , Sascha Bohme, and
          <string-name>
            <surname>Lawrence</surname>
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Paulson</surname>
          </string-name>
          .
          <article-title>Extending Sledgehammer with SMT solvers</article-title>
          .
          <source>In Nikolaj B rner and Viorica</source>
          Sofronie-Stokkermans, editors,
          <source>Automated Deduction</source>
          , volume
          <volume>6803</volume>
          <source>of LNCS</source>
          , pages
          <volume>116</volume>
          {
          <fpage>130</fpage>
          . Springer,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [BCC+08]
          <string-name>
            <surname>Francois</surname>
            <given-names>Bobot</given-names>
          </string-name>
          , Sylvain Conchon, Evelyne Contejean, Mohamed Iguernelala, Stephane Lescuyer, and
          <string-name>
            <given-names>Alain</given-names>
            <surname>Mebsout</surname>
          </string-name>
          .
          <source>The Alt-Ergo Automated Theorem Prover</source>
          ,
          <year>2008</year>
          . http: //alt-ergo.lri.fr/.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [BCCL08]
          <string-name>
            <given-names>Francois</given-names>
            <surname>Bobot</surname>
          </string-name>
          , Sylvain Conchon, Evelyne Contejean, and
          <string-name>
            <given-names>Stephane</given-names>
            <surname>Lescuyer</surname>
          </string-name>
          .
          <article-title>Implementing Polymorphism in SMT solvers</article-title>
          . In Clark Barrett and Leonardo de Moura, editors,
          <source>SMT 2008: 6th International Workshop on Satis ability Modulo</source>
          , volume
          <volume>367</volume>
          <source>of ACM International Conference Proceedings Series, pages 1{5</source>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [BFMP11]
          <article-title>Francois Bobot, Jean-Christophe Fillia^tre, Claude Marche, and Andrei Paskevich. Why3: Shepherd Your Herd of Provers</article-title>
          .
          <source>In Boogie 2011: First International Workshop on Intermediate Veri cation Languages</source>
          , pages
          <volume>53</volume>
          {
          <fpage>64</fpage>
          ,
          <string-name>
            <surname>Wroclaw</surname>
          </string-name>
          , Poland,
          <year>August 2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [Bob11]
          <string-name>
            <given-names>Francois</given-names>
            <surname>Bobot</surname>
          </string-name>
          .
          <article-title>Logique de separation et veri cation deductive</article-title>
          .
          <source>Phd thesis</source>
          , Universite Paris-Sud,
          <year>December 2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [BP11]
          <string-name>
            <given-names>Francois</given-names>
            <surname>Bobot</surname>
          </string-name>
          and
          <string-name>
            <given-names>Andrey</given-names>
            <surname>Paskevich</surname>
          </string-name>
          .
          <article-title>Expressing polymorphic types in a many-sorted language</article-title>
          .
          <source>In Cesare Tinelli and Viorica</source>
          Sofronie-Stokkermans, editors,
          <source>FroCoS</source>
          , volume
          <volume>6989</volume>
          of Lecture Notes in Computer Science, pages
          <volume>87</volume>
          {
          <fpage>102</fpage>
          . Springer,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [BST10]
          <article-title>Clark Barrett, Aaron Stump, and Cesare Tinelli. The SMT-LIB Standard: Version 2.0</article-title>
          . In A. Gupta and D. Kroening, editors,
          <source>Proceedings of the 8th International Workshop on Satis ability Modulo Theories (Edinburgh, UK)</source>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [CL07]
          <string-name>
            <surname>Jean-Francois Couchot</surname>
            and
            <given-names>Stephane</given-names>
          </string-name>
          <string-name>
            <surname>Lescuyer</surname>
          </string-name>
          .
          <source>Handling Polymorphism in Automated Deduction. In 21th International Conference on Automated Deduction (CADE-21)</source>
          , volume
          <volume>4603</volume>
          <source>of LNCS (LNAI)</source>
          , pages
          <fpage>263</fpage>
          {
          <fpage>278</fpage>
          ,
          <string-name>
            <surname>Bremen</surname>
          </string-name>
          , Germany,
          <year>July 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [De10]
          <string-name>
            <given-names>David</given-names>
            <surname>Deharbe</surname>
          </string-name>
          .
          <article-title>Automatic Veri cation for a Class of Proof Obligations with SMT-Solvers</article-title>
          . In Abstract State Machines, Alloy, B and
          <string-name>
            <surname>Z</surname>
          </string-name>
          (ABZ
          <year>2010</year>
          ), volume
          <volume>5977</volume>
          of Lecture Notes in Computer Science, pages
          <volume>217</volume>
          {
          <fpage>230</fpage>
          . Springer,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [De13]
          <string-name>
            <given-names>David</given-names>
            <surname>Deharbe</surname>
          </string-name>
          .
          <article-title>Integration of SMT-solvers in B and Event-B development environments</article-title>
          .
          <source>Science of Computer Programming</source>
          ,
          <volume>78</volume>
          (
          <issue>3</issue>
          ):
          <volume>310</volume>
          {
          <fpage>316</fpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [DFGV12]
          <string-name>
            <given-names>David</given-names>
            <surname>Deharbe</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Pascal</given-names>
            <surname>Fontaine</surname>
          </string-name>
          , Yoann Guyot, and
          <string-name>
            <given-names>Laurent</given-names>
            <surname>Voisin</surname>
          </string-name>
          .
          <article-title>SMT Solvers for Rodin</article-title>
          .
          <source>In Proc. Abstract State Machines</source>
          , Alloy,
          <string-name>
            <surname>B</surname>
          </string-name>
          , VDM, and
          <string-name>
            <surname>Z</surname>
          </string-name>
          (ABZ
          <year>2012</year>
          ), volume
          <volume>7316</volume>
          of Lecture Notes in Computer Science, pages
          <volume>194</volume>
          {
          <fpage>207</fpage>
          . Springer,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [DGHP99]
          <string-name>
            <surname>Marcello D'Agostino</surname>
          </string-name>
          ,
          <string-name>
            <surname>Dov M. Gabbay</surname>
          </string-name>
          , Reiner Hahnle, and Joachim Posegga, editors.
          <source>Handbook of Tableau Methods</source>
          . Springer,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [FM07]
          <article-title>Jean-Christophe Fillia^tre and Claude Marche. The Why/Krakatoa/Caduceus Platform for Deductive Program Veri cation</article-title>
          .
          <source>In Werner Damm and Holger Hermanns</source>
          , editors,
          <source>CAV</source>
          , volume
          <volume>4590</volume>
          of Lecture Notes in Computer Science, pages
          <volume>173</volume>
          {
          <fpage>177</fpage>
          . Springer,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [Hin69]
          <string-name>
            <given-names>Roger</given-names>
            <surname>Hindley</surname>
          </string-name>
          .
          <article-title>The principle type-scheme of an object in combinatory logic</article-title>
          .
          <source>Trans. Amer. Math. Soc.</source>
          ,
          <volume>146</volume>
          :
          <fpage>29</fpage>
          {
          <fpage>60</fpage>
          ,
          <year>1969</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [Hur03]
          <string-name>
            <given-names>Joe</given-names>
            <surname>Hurd</surname>
          </string-name>
          .
          <article-title>First-Order Proof Tactics in Higher-Order Logic Theorem Provers</article-title>
          . In Myla Archer, Ben Di Vito, and Cesar Mun~oz, editors,
          <source>Design and Application of Strategies/Tactics in Higher Order Logics (STRATA</source>
          <year>2003</year>
          ), number NASA/CP-2003
          <source>-212448 in NASA Technical Reports</source>
          , pages
          <volume>56</volume>
          {
          <fpage>68</fpage>
          ,
          <year>September 2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [Kor85]
          <string-name>
            <given-names>Richard E.</given-names>
            <surname>Korf.</surname>
          </string-name>
          Depth-First
          <string-name>
            <surname>Iterative-Deepening</surname>
          </string-name>
          :
          <article-title>An Optimal Admissible Tree Search</article-title>
          . Artif. Intell.,
          <volume>27</volume>
          (
          <issue>1</issue>
          ):
          <volume>97</volume>
          {
          <fpage>109</fpage>
          ,
          <year>1985</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [Lei08]
          <string-name>
            <given-names>K.</given-names>
            <surname>Rustan. M. Leino</surname>
          </string-name>
          .
          <source>This is Boogie 2</source>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          <string-name>
            <surname>[LR10] K. Rustan M. Leino</surname>
          </string-name>
          and
          <article-title>Philipp Rummer. A Polymorphic Intermediate Veri cation Language: Design and Logical Encoding</article-title>
          . In Javier Esparza and Rupak Majumdar, editors,
          <source>TACAS</source>
          , volume
          <volume>6015</volume>
          of Lecture Notes in Computer Science, pages
          <volume>312</volume>
          {
          <fpage>327</fpage>
          . Springer,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [Mil78]
          <string-name>
            <given-names>Robin</given-names>
            <surname>Milner</surname>
          </string-name>
          .
          <article-title>A Theory of Type Polymorphism in Programming</article-title>
          .
          <source>J. Comput. Syst. Sci.</source>
          ,
          <volume>17</volume>
          (
          <issue>3</issue>
          ):
          <volume>348</volume>
          {
          <fpage>375</fpage>
          ,
          <year>1978</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [MP08]
          <article-title>Jia Meng</article-title>
          and Lawrence C.
          <article-title>Paulson. Translating Higher-Order Clauses to First-Order Clauses</article-title>
          .
          <source>J. Autom. Reasoning</source>
          ,
          <volume>40</volume>
          (
          <issue>1</issue>
          ):
          <volume>35</volume>
          {
          <fpage>60</fpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [Pau94]
          <string-name>
            <surname>Lawrence</surname>
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Paulson. Isabelle - A Generic Theorem</surname>
          </string-name>
          <article-title>Prover (with a contribution by T</article-title>
          .
          <source>Nipkow)</source>
          , volume
          <volume>828</volume>
          of Lecture Notes in Computer Science. Springer,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          <string-name>
            <surname>[Pie02] Benjamin</surname>
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Pierce</surname>
          </string-name>
          .
          <article-title>Types and Programming Languages</article-title>
          . MIT Press,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [Rob65
          <string-name>
            <surname>] John Alan Robinson.</surname>
          </string-name>
          <article-title>A machine-oriented logic based on the resolution principle</article-title>
          .
          <source>J. ACM</source>
          ,
          <volume>12</volume>
          (
          <issue>1</issue>
          ):
          <volume>23</volume>
          {
          <fpage>41</fpage>
          ,
          <year>1965</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          <string-name>
            <surname>[Smu95] R.M. Smullyan.</surname>
          </string-name>
          First-order
          <string-name>
            <surname>Logic</surname>
          </string-name>
          .
          <source>Dover books on advanced mathematics. Dover</source>
          ,
          <year>1995</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>