<!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>MutantChick: Type-Preserving Mutation Analysis for Coq?</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Matteo Cavada</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Andrea Colo</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Alberto Momigliano</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>DI, Universita di Milano</institution>
        </aff>
      </contrib-group>
      <abstract>
        <p>We present MutantChick, a mutation analysis tool for Coq to be used in combination with QuickChick to evaluate the fault detection capability of propertybased testing in a proof assistant. Mutation analysis of Coq theories is implemented via metaprogramming with MetaCoq and it is by construction type-preserving.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>Formal verification of software via (interactive) theorem proving gives the highest level of
assurance, but it is still very labor-intensive. This effort may be furthermore wasted in the
design phase of a software system, where mistakes and changes are likely to occur both at
the level of the specification and of the implementation. Testing/validation/model-checking
can ameliorate the situation by finding faults in a mostly \push-button" way so that to
refine the specification/code until theorem proving can start. Even so, it poses the question:
when do we stop testing and start proving? This is analogous to asking when to stop
testing in the traditional software cycle and release the software itself. While taking into
the right consideration Dijkstra's admonishments, in practical terms it much depends on
how good our testing suite is.</p>
      <p>
        In this paper we fix our validation technique to be property-based testing [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] (PBT),
which aims to refute executable specifications against automatically generated data,
typically in a pseudo-random way. Once the idea broke out in the Haskell community with
QuickCheck [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], it spread to most programming languages and turned also in a commercial
enterprise.
      </p>
      <p>
        We can view PBT as a testing suite that consists of a set of properties plus a data
generation strategy: while PBT tools vary in those strategies and in the amount of automation
they offer, when dealing with random generation uniform distributions are rarely the most
effective choice; the art of PBT resides in writing very sophisticated generators, see [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] for
an intimidating example. Hence, how do we assess the fault detection capability of such
a testing suite? If the latter stops finding new counterexamples, are we willing to consider
the system-under-test ready for verification?
      </p>
      <p>
        Mutation analysis [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] (MA) aims to evaluate software testing techniques with a form of
white box testing, whereby a source program is changed in a localized way by introducing
a single (syntactic) fault. The resulting program is called a \mutant" and hopefully it is
? Copyright @ 2020 for this paper by its authors. Use permitted under Creative Commons License
Attribution 4.0 International (CC BY 4.0). Partially supported by GNCS project \METALLIC
#2: METodi di prova per il ragionamento Automatico per Logiche non-cLassIChe".
also semantically different from its ancestor. A testing suite should recognize the faulted
code, which is known as \killing" the mutant. The higher the number of killed mutants,
the better the testing suite. While typically used in combination with unit testing, MA
fits fairly well with PBT (as proposed in [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]) and, in fact, in the literature PBT tools
are evaluated with manually inserted faults (e.g., the PLT-redex benchmark suite, see
http://docs.racket-lang.org/redex/benchmark.html).
      </p>
      <p>
        On the verification side, Coq (https://coq.inria.fr) is one of the leading proof
assistants, which has shown its color both in formalizing general mathematics (see the proof
of the Odd Order Theorem https://github.com/math-comp/odd-order) and in specific
domains such as the one dearest to our heart, namely the semantics of programming
languages ([
        <xref ref-type="bibr" rid="ref1 ref18 ref8 ref9">18,8,9,1</xref>
        ]).
      </p>
      <p>
        Coq is an extremely powerful logic, which accommodates programming, specification
and proving in a constructive setting. In accordance with the Peter Parker principle \with
great power comes great responsibility", PBT in such an environment is no small feat:
QuickChick, while under active developments ([
        <xref ref-type="bibr" rid="ref15 ref16">16,15</xref>
        ]), brings in additional challenges as
we touch upon in the next section.
      </p>
      <p>
        This is where MutantChick comes in: MutantChick is a mutation analysis tool for Coq
theories, whose main application is evaluating the \oracle adequacy" of PBT with QuickChick.
We accomplish this in a purely logical way via meta-programming with MetaCoq [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. Since
any MA tool is as good as the mutation operators it implements, we provide a DSL to
specify and compute type-preserving mutation operators, supporting both the functional
and the relational aspects of Coq: we also give the users the possibility to define their own.
Differently from related tools ([
        <xref ref-type="bibr" rid="ref17 ref4">17,4</xref>
        ]), our guiding principle insists that operators are not
just grammatical rules that injects faults, but must preserve types, so that any resultant
mutant will type-check by construction; thanks to Coq's extremely strong type system,
this also helps to reduce the combinatorial explosion intrinsic in operators application.
      </p>
      <p>
        What MutantChick does not (yet) achieve is the full automation of the cycle of mutant
generation, testing and scoring, as tools for imperative programming languages do ([
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]).
This is hard to accomplish, if one stays within the realm of a pure language such as
(Meta)Coq.
      </p>
      <p>
        We assume some familiarity with Coq and the basics of PBT and refer to the
relevant chapter in Software Foundations (https://softwarefoundations.cis.upenn.edu/
qc-current) for QuickChick and to [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] for testing the case studies we mention. Further, we
will use MetaCoq as a black box and will describe only some of the features of MutantChick
without diving at all into its implementation. The technical report [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and the
repository https://bitbucket.org/matteo_cavada/tesi/src/master/mutantChick give full
details. Under the latter, one can also find the electronic appendix to the present paper
with additional topical information.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Running Example</title>
      <p>We are mainly interested in the mechanization of the meta-theory of programming
languages (PL) and related calculi. As any practitioner may testify, the relevant properties
are well known and have mathematically shallow proofs. The difficulty lies in the potential
magnitude of the cases one must consider and in the trickiness that some encodings require.
Here, very minor mistakes, even at the level of typos, may severely frustrate the verification
effort, to the point to make it not cost-effective.</p>
      <p>As a running example, we consider a very simple model of a PL, a typed arithmetic
language (https://softwarefoundations.cis.upenn.edu/plf-current/Types.html),
featuring numerals with predecessor and Booleans with if-then-else and test-for-zero. For
the sake of this section, we concentrate on a rule-based presentation (akin to logic programs)
of the typing rules, but our approach covers the functional rendition as well. As a property,
we consider the progress lemma, which ensures that if a term is well typed, then either it
is a value or it can take a step; it is one of the building blocks in Milner's motto for which
a well-typed program cannot go wrong.</p>
      <p>The typing rules are encoded as an Inductive definition has_type to be read \term
t has type T" (see the electronic Appendix for the other definitions):
Inductive has_type: tm !typ !Prop :=</p>
      <p>T_Tru: has_type ttrue TBool
j T_Fls: has_type tfalse TBool
j T_Test: 8 t1 t2 t3</p>
      <p>T, has_type t1 TBool !has_type t2 T !has_type t3 T !has_type (tif t1 t2 t3) T
j T_Zro: has_type tzero TNat
j T_Scc: 8 t1, has_type t1 TNat !has_type (tsucc t1) TNat
j T_Prd: 8 t1 has_type t1 TNat !has_type (tpred t1) TNat
j T_Iszro: 8 t1, has_type t1 TNat !has_type (tiszero t1) TBool.</p>
      <p>Theorem progress: 8t T, has_type t T !value t _9t', step t t'.</p>
      <p>We now introduce some mutations that should mirror typical mistakes while designing
a PL artifact | see for example the manual mutations in the cited PLT-Redex benchmark
suite. A first mutation1 represents a simple typo where we have swapped TBool for TNat
in the test-for-zero rule:
::: j T_Iszro_M : 8 t1 : tm, has_type_M1 t1 TBool !has_type_M1 (tiszero t1) TNat.
The second one corresponds to having forgotten an hypothesis in the rule for if-then-else,
namely that the test t1 is a Boolean:
::: j T_Test_M: 8t1 t2 t3 T,</p>
      <p>has_type_M2 t2 T !has_type_M2 t3 T !has_type_M2 (tif t1 t2 t3) T
Finally, suppose instead we add an additional rule to the given ones (this is exercise 2
from Types.html):
::: j T_Scc_M: 8 t, has_type_M3 t TBool !has_type_M3 (tsucc t) TBool.</p>
      <p>
        All mutants do not satisfy progress: it would stand to reason that a PBT tool should
find the relevant counterexamples, as say Check [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] does quite easily and without any
complicated setup. However, this is not immediately the case with QuickChick. Coq
is, under the Curry-Howard view, a version of constructive higher-order logic, enriched
with (co)inductive types and universe polymorphism, where only pure total functional
programs are permitted, while allowing highly undecidable specifications. This duality is
reflected in the type Set of computations and Prop of arbitrary propositions. If we wish to
1 Each mutation yields a new Inductive definition named by convention has_type_Mn.
test a conjecture, it must be shown effectively computable, in QuickChick's terminology a
Checkable property. There are two ways to go about it: first, if the notion under test is defined
relationally, that is at Prop, we can manually provide a proof that it is indeed decidable. In
certain simple cases such as the has_type relation, we can rely on the rather unpredictable
tool for automatic derivations of generators out of Inductive definitions [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]. The second
and fail-safe way is to translate every specification into a Boolean-valued function: since in
Coq every such function must be total, decidability and therefore Checkability is guaranteed.
This approach has its drawbacks, since it needs to explicitly address the partiality of
rulebased specifications and to accommodate Coq's rather temperamental totality checker, or
we may even have to provide our own termination argument. Even stating the progress
property so that it can be tested is not immediate, neither with automatic derivation , see [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>All these layers point to the utility of a MA tool to assess the \oracle adequacy" of
QuickChick. In the next section we will see how MutantChick can derive those mutations. Note
that in our example properties (viz. progress) are trusted. This is generally the case for PL
semantics, since they come from the theorems that should hold for the underlying calculus;
however, a large number of surviving mutants may suggest a possible under-specification in
such properties or a fault in its testable implementation. Finally, since properties are just Coq
terms, our tool could mutate them as well, although we do not see this as particularly useful.
3</p>
    </sec>
    <sec id="sec-3">
      <title>MutantChick</title>
      <p>
        Our tool is based on MetaCoq [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], a library that provides rich meta-programming features
for Coq. Among those, we will use 1) the (anti)quotation mechanism: quoting a Coq term
t, denoted by &lt;% t %&gt;, induces a bijection between Coq kernel terms and a deep
embedding in Coq itself of the syntax of the terms of the underlying Calculus of (Co)Inductive
Constructions; the embedding is realized as an Inductive definition of the type term;
2) a reification of the static and dynamic semantics of the representation of the calculus,
providing a hook for checking well-typedness of quoted terms.
      </p>
      <p>For example, quoting the lambda expression fun x ) 2 + (hd x [9;8;7]) that
sums 2 to the head of a given list returns the following abstract syntax tree (AST), which
we have significantly abridged by using numbers to stand for their quotation | keep in
mind that in Coq naturals and lists are not built-in, but obtained as inductive types.
(tLambda (nNamed "x")
(tInd fj inductive_mind := "Coq.Init.Datatypes.nat"; inductive_ind := 0 jg [])
(tApp (tConst "Coq.Init.Nat.add" [])
[2; tApp (tConst "Coq.Lists.List.hd" [])
[ tInd fj inductive_mind := "Coq.Init.Datatypes.nat"; inductive_ind := 0 jg [];
tRel 0;
tApp (tConstruct fj</p>
      <p>inductive_mind := "Coq.Init.Datatypes.list"; inductive_ind := 0 jg 1 [])
[ tInd fj</p>
      <p>inductive_mind := "Coq.Init.Datatypes.nat"; inductive_ind := 0 jg [];
tApp (tConstruct fj inductive_mind</p>
      <p>:= "Coq.Init.Datatypes.nat"; inductive_ind := 0 jg 1 []) [9;8;7]]]]) )</p>
      <p>To access and modify Coq's terms and environment, MetaCoq provides a monad
(TemplateMonad) in which it is possible to describe quoting and unquoting of Coq terms,
General
Inductive</p>
      <p>Operator Description
Substitute Substitutes a term with another
Swap Exchanges two terms
IfThenElse Exchanges then and else branch
DelImplications Deletes assumptions
UserDefined User defined operator
NewConstructor Adds new constructor
SubConstructor Substitutes a constructor
OnConstructor Maps an operator over a constructor
OnConstructors Maps an operator over an inductive def.
as well as other (few) actions with side-effects, such as raising an exception and inserting
new terms inside Coq's environment; these monadic meta-programs, once invoked with
the Run TemplateProgram command, will be executed by an interpreter inside the OCaml
environment.</p>
      <p>
        MutantChick aims to devise mutation operators for a proof assistant, here Coq (but they
would also be relevant for other systems such as Lean or Isabelle/HOL), which encompasses
both functional and relational specifications, with a particular attention to our intended
domain of application. Those operators specify the mutations that the tool will inject,
trying to simulate natural occurring bugs. This is justified by the \competent programmer
assumption" [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], according to which the programmer tends to develop code \close" to
the correct version and thus the delta for each fault is small.
      </p>
      <p>
        An MA tool is as effective as its operators are relevant. Historically, MA comes from
imperative languages and the operators thereby still owe to those initially devised for
FORTRAN. Even operators proposed for declarative programs ([
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]) make only partial
sense, being untyped and too linked to the operational semantics of the programming
language. Usable examples comprise arithmetic and relational operator mutations, say
turn into + and &lt; into and constant mutations, say 0 into 1.
      </p>
      <p>Table 3 describes at a high level the operators currently implemented in MutantChick.
We have two (non-disjoint) main categories: general operators, working on any Coq term,
and inductive ones, which are particularly suited to relationally defined judgments.</p>
      <p>The general syntax to mutate a terms is as follow (see the electronic Appendix for the
BNF of the DSL):
Run TemplateProgram (</p>
      <p>Mutate &lt;% term_to_mutate %&gt;
using (operator)
named "new_name").</p>
      <p>Let us see a classic arithmetic mutation: t1 ==&gt; t2 substitutes every
occurrence of t1 with t2. This operator is internally defined as an inductive definition
Substitute A (t1 t2: A), which is indexed by the type A of the operands in order to
ensure that the substitution is type-preserving. For example:
Run TemplateProgram (</p>
      <p>Mutate &lt;% 4 ∗ 5 %&gt;
using (Init.Nat.mul ==&gt; Init.Nat.add)
named "out").</p>
      <p>Print out.
out = 4 + 5
: nat
All the generic operators work both on plain Coq terms and on Definition,Fixpoint etc.</p>
      <p>Since a quoted term is a (rather large) AST, a mutation operator is implemented by
two components: 1) a search phase, in which we find all locations inside the tree of the
to-be-mutated term; this is accomplished by a function check :: term ! bool that
establishes if a given quoted term is suitable for mutation; 2) a mutation phase, in which a
transformation function trans :: term ! term is applied to the terms in the locations
previously identified.</p>
      <p>
        An important optimization in MA is random generation of mutants [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]: since a given
mutation can be applied multiple times in the same term, it is reasonable to select only
a sample thereof. Again, a pure language such as Coq cannot rely on an external
pseudorandom number generator, hence we had to deploy our own as a Linear-Feedback Shift
Register on 7 bits; this generates pseudo-random sequences of numbers starting from a
seed (at this stage provided by the user).
      </p>
      <p>The DSL offers three choices: 1) mutate everywhere; 2) pick mutations with probability
p, i.e., generate a random number for every mutable location in the AST: if it is bigger
then a certain threshold (chosen by the user), then collect the mutant; 3) pick a maximum
of n mutations, i.e., maximum of n locations are drawn among all the coordinates found
in the search phase.</p>
      <p>
        Rather than seeing each operator in details (for which we refer once again to [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]), we
detail how MutantChick realizes the mutations of the previous section.
      </p>
      <p>For the typo, we use bidirectional substitution Swap t1 t2; it exchanges the order of
appearance of t1 and t2 inside an expression and is defined in terms of Substitute. Note
that t1 and t2 can be (bound) variables, which mirrors a large category of errors.
Run TemplateProgram (</p>
      <p>Mutate &lt;% 8t1, has_type t1 TNat !has_type (tiszero t1) TBool. %&gt;
using (Swap &lt;% TBool %&gt; &lt;% TNat %&gt;)
named "T_Iszro_M").</p>
      <p>We could have achieved this and the next mutation with the operator SubConstructor
although with less automation.</p>
      <p>DelImplications mirrors missing assumptions by non-deterministically removing
implications (technically, dependent products); in the following case it will yield 6 different
non-isomorphic mutants.</p>
      <p>Interestingly, we can achieve this more directly by using the OnConstructors combinator
that maps the operator over the whole relation; since this could generate several mutants,
we use random choice to select a few.</p>
      <p>Run TemplateProgram (</p>
      <p>Run TemplateProgram (</p>
      <p>Mutate &lt;% has_type %&gt;
using (OnConstructors DelImplications)
named "has_type_M"
generating (RandomMutations 34 64)).</p>
      <p>Finally, we can add a new constructor to an Inductive definition via NewConstructor
Run TemplateProgram (
Mutate &lt;% has_type %&gt;
using (NewConstructor "T_Scc_M"
&lt;% fun hastype_M1 )8t, has_type_M1 t TBool !</p>
      <p>has_type_M1 (tsucc t) TBool %&gt;)
named "hastype_M3").
4</p>
    </sec>
    <sec id="sec-4">
      <title>Conclusions, related and future work</title>
      <p>
        In this short paper we have sketched the rationale and the high level design of MutantChick,
a mutation analysis tool for the Coq proof assistant. We have advocated the usefulness of
such a tool, given the popularity that testing, in particular PBT, is having in the Coq world
in terms of applications ([
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]) and development ([
        <xref ref-type="bibr" rid="ref15 ref16">16,15</xref>
        ]). Still, mutation testing, by which
we mean the improvement of a testing suite via MA, has been lagging behind, being only
informally and manually used to evaluate PBT. The exception is mCoq [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], which follows a very
different philosophy from ours: it exports the AST of a Coq term as an S-expression thanks
to an OCaml serializer and then applies mutations to the S-expression using a tool written
in Java. Following this choice, it cannot enforce that mutation operators are type-preserving,
nor can they be easily extended by the user. In fact, the hardwired operators are quite limited,
being mostly concerned with functional programming. We also do not share mCoq's
motivation, which is not mutation testing but mutation proving, whereas mutations are introduced
in definitions to see if the proof scripts of related theorems still hold: if they do, it means that
those definitions are under-specified. It seems to us a very big hammer for such a small nail.
      </p>
      <p>
        We have evaluated the tool on two case studies ([
        <xref ref-type="bibr" rid="ref3 ref6">6,3</xref>
        ]): the arithmetic language and
much more significantly, Leroy &amp; Appel's list-machine benchmark [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. In both, we have
realized the mutations described in the literature [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], implemented the relevant generators
and tested various forms of type soundness with QuickChick. The list-machine case study
is particularly meaningful, as the properties under test have extremely sparse precondition:
this forces us to implement complex generators with intricated heuristics built-in, whose
fault detection capability would be hard to gauge without a MA tool.
      </p>
      <p>The main limitation of MutantChick is performance: mutation analysis is
computationally expensive and (Meta)Coq is definitely not an efficient general-purpose programming
language, neither w.r.t. memory consumption nor the boilerplate required to generate and
test mutants in a completely automated way. We have managed to use operators such as
==&gt; to percolate mutated terms within all the definitions that depend on them in a Coq
theory, but to address the whole mutation cycle fully, we would need, among others, to
read and write files, which is out of Coq's remit.</p>
      <p>
        To address the performance issue, a possibility is the extraction to OCaml of the
MetaCoq code responsible for the heaviest computations: this is possible but not trivial
(see Sec. 5 of [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]). A more radical solution would be to port MutantChick to Elpi [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], the
      </p>
      <p>Prolog interpreter embedded inside Coq, and exploit full-range logic programming.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>A.</given-names>
            <surname>Abel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Allais</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Hameer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Pientka</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Momigliano</surname>
          </string-name>
          ,
          <string-name>
            <surname>S.</surname>
          </string-name>
          <article-title>Schafer, and</article-title>
          K. Stark.
          <article-title>Poplmark reloaded: Mechanizing proofs by logical relations</article-title>
          .
          <source>J. Funct. Program.</source>
          ,
          <volume>29</volume>
          :
          <fpage>e19</fpage>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>A. W.</given-names>
            <surname>Appel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Dockins</surname>
          </string-name>
          , and
          <string-name>
            <given-names>X.</given-names>
            <surname>Leroy</surname>
          </string-name>
          .
          <article-title>A list-machine benchmark for mechanized metatheory</article-title>
          .
          <source>J. Autom. Reasoning</source>
          ,
          <volume>49</volume>
          (
          <issue>3</issue>
          ):
          <volume>453</volume>
          {
          <fpage>491</fpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>M.</given-names>
            <surname>Cavada</surname>
          </string-name>
          .
          <article-title>Property-based testing and mutation analysis in Coq</article-title>
          .
          <source>Technical report</source>
          , DI, University of Milano,
          <year>2020</year>
          . http://dx.doi.
          <source>org/10.13140/RG.2.2.18766.69445.</source>
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>A.</given-names>
            <surname>Celik</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Palmskog</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Parovic</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E. J. G.</given-names>
            <surname>Arias</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Gligoric</surname>
          </string-name>
          .
          <article-title>Mutation analysis for Coq</article-title>
          .
          <source>In ASE</source>
          , pages
          <volume>539</volume>
          {
          <fpage>551</fpage>
          . IEEE,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>J.</given-names>
            <surname>Cheney</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Momigliano</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Pessina</surname>
          </string-name>
          .
          <article-title>Advances in property-based testing for Prolog</article-title>
          . In B. K. Aichernig and
          <string-name>
            <surname>C.</surname>
          </string-name>
          <article-title>A</article-title>
          . Furia, editors,
          <source>TAP</source>
          , volume
          <volume>9762</volume>
          <source>of LNCS</source>
          , pages
          <volume>37</volume>
          {
          <fpage>56</fpage>
          . Springer,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>A.</given-names>
            <surname>Colo</surname>
          </string-name>
          .
          <article-title>Property-based testing of the list-machine benchmark with QuickChick</article-title>
          .
          <source>Technical report</source>
          , DI, University of Milano,
          <year>2020</year>
          .
          <volume>10</volume>
          .13140/RG.2.2.19283.60962.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>C.</given-names>
            <surname>Dunchev</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Guidi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Sacerdoti Coen</surname>
          </string-name>
          , and
          <string-name>
            <surname>E. Tassi. ELPI</surname>
          </string-name>
          : Fast, Embeddable,
          <string-name>
            <given-names>Prolog</given-names>
            <surname>Interpreter</surname>
          </string-name>
          .
          <source>In Proceedings of LPAR</source>
          , Suva, Fiji, Nov.
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>M.</given-names>
            <surname>Felleisen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R. B.</given-names>
            <surname>Findler</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Flatt</surname>
          </string-name>
          .
          <article-title>Semantics Engineering with PLT Redex</article-title>
          . MIT Press,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Felty</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Momigliano</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B.</given-names>
            <surname>Pientka</surname>
          </string-name>
          .
          <article-title>Benchmarks for reasoning with syntax trees containing binders and contexts of assumptions</article-title>
          .
          <source>Math. Struct. Comput. Sci.</source>
          ,
          <volume>28</volume>
          (
          <issue>9</issue>
          ):
          <volume>1507</volume>
          {
          <fpage>1540</fpage>
          ,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10. G. Fink and
          <string-name>
            <given-names>M.</given-names>
            <surname>Bishop</surname>
          </string-name>
          .
          <article-title>Property-based testing: a new approach to testing for assurance</article-title>
          .
          <source>ACM SIGSOFT Software Engineering Notes</source>
          , pages
          <volume>74</volume>
          {
          <fpage>80</fpage>
          ,
          <year>July 1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>C. Hritcu</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Lampropoulos</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Spector</surname>
            , A. de Amorim,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Denes</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Hughes</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Pierce</surname>
            , and
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Vytiniotis</surname>
          </string-name>
          .
          <article-title>Testing noninterference, quickly</article-title>
          .
          <source>J. Funct. Program.</source>
          ,
          <volume>26</volume>
          :
          <fpage>e4</fpage>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <given-names>J.</given-names>
            <surname>Hughes</surname>
          </string-name>
          .
          <article-title>Quickcheck testing for fun and profit</article-title>
          .
          <source>In PADL'07, LNCS</source>
          , pages
          <volume>1</volume>
          {
          <fpage>32</fpage>
          , Berlin, Heidelberg,
          <year>2007</year>
          . Springer-Verlag.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jia</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Harman</surname>
          </string-name>
          .
          <article-title>An analysis and survey of the development of mutation testing</article-title>
          .
          <source>IEEE Trans. Softw</source>
          . Eng.,
          <volume>37</volume>
          (
          <issue>5</issue>
          ):
          <volume>649</volume>
          {
          <fpage>678</fpage>
          ,
          <string-name>
            <surname>Sept</surname>
          </string-name>
          .
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>F.</given-names>
            <surname>Komauli</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Momigliano</surname>
          </string-name>
          .
          <article-title>Property-based testing of the meta-theory of abstract machines: an experience report</article-title>
          . In CILC, volume
          <volume>2214</volume>
          <source>of CEUR</source>
          , pages
          <volume>22</volume>
          {
          <fpage>39</fpage>
          ,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15. L.
          <string-name>
            <surname>Lampropoulos</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Hicks</surname>
            , and
            <given-names>B. C.</given-names>
          </string-name>
          <string-name>
            <surname>Pierce</surname>
          </string-name>
          .
          <article-title>Coverage guided, property based testing</article-title>
          .
          <source>Proc. ACM Program. Lang.</source>
          ,
          <volume>3</volume>
          (OOPSLA):
          <volume>181</volume>
          :1{
          <fpage>181</fpage>
          :
          <fpage>29</fpage>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16. L.
          <string-name>
            <surname>Lampropoulos</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          <string-name>
            <surname>Paraskevopoulou</surname>
            , and
            <given-names>B. C.</given-names>
          </string-name>
          <string-name>
            <surname>Pierce</surname>
          </string-name>
          .
          <article-title>Generating good generators for inductive relations</article-title>
          .
          <source>POPL</source>
          , pages
          <volume>1</volume>
          {
          <fpage>30</fpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>D. Le</surname>
            ,
            <given-names>M. A.</given-names>
          </string-name>
          <string-name>
            <surname>Alipour</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Gopinath</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <surname>A. Groce.</surname>
          </string-name>
          <article-title>MuCheck: an extensible tool for mutation testing of Haskell programs</article-title>
          .
          <source>In ISSTA</source>
          , pages
          <volume>429</volume>
          {
          <fpage>432</fpage>
          . ACM,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <given-names>X.</given-names>
            <surname>Leroy</surname>
          </string-name>
          .
          <article-title>Formal verification of a realistic compiler</article-title>
          .
          <source>CACM</source>
          ,
          <volume>52</volume>
          (
          <issue>7</issue>
          ):
          <volume>107</volume>
          {
          <fpage>115</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>M. Sozeau</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Anand</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Boulier</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Cohen</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          <string-name>
            <surname>Forster</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          <string-name>
            <surname>Kunze</surname>
            , G. Malecha,
            <given-names>N.</given-names>
          </string-name>
          <string-name>
            <surname>Tabareau</surname>
            , and
            <given-names>T.</given-names>
          </string-name>
          <string-name>
            <surname>Winterhalter</surname>
          </string-name>
          .
          <article-title>The MetaCoq project</article-title>
          .
          <source>J. Autom. Reasoning</source>
          , pages
          <volume>1</volume>
          {
          <fpage>53</fpage>
          ,
          <year>2020</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>