<!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>A Tool for Encoding Controlled Natural Language Specifications as ASP Rules</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Carmine Dodaro</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Marco Maratea</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Francesco Riccio</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>DIBRIS, University of Genoa</institution>
          ,
          <country country="IT">Italy</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>DeMaCS, University of Calabria</institution>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <fpage>188</fpage>
      <lpage>201</lpage>
      <abstract>
        <p>Answer Set Programming (ASP) is a popular declarative programming language for solving hard combinatorial problems. Albeit ASP has been widely adopted in both academic and industrial contexts, it might be dificult for people who are not familiar with logic programming conventions to use it. In this paper, we propose a translation of English sentences expressed in a controlled natural language (CNL) form into ASP. In particular, we first provide a definition of the type of sentences allowed by our CNL and their translation as ASP rules, and then exemplify the usage of CNL for the specification of well-known combinatorial problems.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Answer set programming</kwd>
        <kwd>Logic Programming</kwd>
        <kwd>Controlled Natural Language</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>some aspects of the grammar rules of PENGASP are also present in the grammar of our CNL, we
propose a language that is oriented in the definition of combinatorial problems in a
naturalfeeling, but that is also reliable in its translation to ASP, avoiding using more than one grammar
construct for the same behaviour and choosing words with an easily deducible meaning from
the given context. Moreover, it should be noted that the implementation of PENGASP, as well as
a binary executable, is not yet public, whereas the implementation of the system subject of this
paper is open source and publicly-available at https://github.com/dodaro/cnl2asp.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Preliminaries</title>
      <p>Answer Set Programming (ASP) [1] is a programming paradigm developed in the field of
nonmonotonic reasoning and logic programming. In this section, we overview the language of
ASP [11].</p>
      <p>Syntax. The syntax of ASP is similar to the one of Prolog. Variables are strings starting with
an uppercase letter, and constants are non-negative integers or strings starting with lowercase
letters. A term is either a variable or a constant. A standard atom is an expression p(t1,. . .,t),
where p is a predicate of arity  and t1,. . .,t are terms. An atom p(t1,. . .,t) is ground if
t1,. . .,t are constants. A ground set is a set of pairs of the form ⟨ : ⟩, where 
is a list of constants and  is a conjunction of ground standard atoms. A symbolic set is a set
specified syntactically as {Terms1 : Conj1; . . ., Terms : Conj} where  &gt; 0, and for all
 ∈ [1, ], each Terms is a non-empty list of terms, and each Conj is a non-empty conjunction
of standard atoms. A set term is either a symbolic set or a ground set. Intuitively, a set term
{X:a(X,c),p(X); Y:b(Y,m)} stands for the union of two sets: the first one contains the
Xvalues making the conjunction a(X,c), p(X) true, and the second one contains the Y-values
making the conjunction b(Y,m) true. An aggregate function is of the form  (), where  is a
set term, and  is an aggregate function symbol. Basically, aggregate functions map multisets of
constants to a constant. The most common functions implemented in ASP systems are #count,
for counting number of terms; and #sum, for computing sum of integers [12]. An aggregate atom
is of the form  () ≺  , where  () is an aggregate function, ≺ ∈ { &lt;, &lt;=, &gt;, &gt;=, !=, =}
is a comparison operator, and  is a term called guard. An aggregate atom  () ≺  is ground
if  is a constant and  is a ground set. An atom is either a standard atom or an aggregate atom.
A rule  has the following form:</p>
      <p>a1 | . . . | a :- b1, . . ., b, not b+1, . . ., not b.
where a1,. . .,a are standard atoms (with  ≥ 0), b1,. . .,b are atoms, and b+1,. . .,b are
standard atoms (with  ≥  ≥ 0). A literal is either a standard atom a or its negation not a. The
disjunction a1 | . . . | a is the head of , while the conjunction b1, . . ., b, not b+1,
. . ., not b is its body. Rules with empty body are called facts. Rules with empty head are
called constraints. A variable that appears uniquely in set terms of a rule  is said to be local in ,
otherwise it is a global variable of . An ASP program is a set of safe rules, where a rule  is safe
if the following conditions hold: (i) for each global variable  of  there is a positive standard
atom ℓ in the body of  such that  appears in ℓ; and (ii) each local variable of  appearing in a
symbolic set {Terms : Conj} also appears in a positive atom in Conj. A weak constraint  [13]
is of the form:</p>
      <p>:∼ b1, . . ., b, not b+1, . . ., not b. [w@l, t1, . . ., t]
where t1, . . ., t are terms, w and l are the weight and level of , respectively. Intuitively,
[w@l] is read “as weight w at level l”, where weight is the “cost” of violating the condition in
the body of w, whereas levels can be specified for defining a priority among preference criteria.
An ASP program with weak constraints is Π = ⟨,  ⟩, where  is a program and  is a set
of weak constraints. A standard atom, a literal, a rule, a program or a weak constraint is ground
if no variables appear in it.</p>
      <p>Semantics. Let  be an ASP program. The Herbrand universe  and the Herbrand base
 of  are defined as usual. The ground instantiation  of  is the set of all the ground
instances of rules of  that can be obtained by substituting variables with constants from  .
An interpretation  for  is a subset  of  . A ground standard atom p is true w.r.t.  if p ∈ ,
and false otherwise. A literal not p is true w.r.t.  if p is false w.r.t. , and false otherwise. An
aggregate atom is true w.r.t.  if the evaluation of its aggregate function (i.e., the result of the
application of  on the multiset ) with respect to  satisfies the guard; otherwise, it is false.
A ground rule  is satisfied by  if at least one atom in the head is true w.r.t.  whenever all
conjuncts of the body of  are true w.r.t. . A model is an interpretation that satisfies all rules of
a program. Given a ground program  and an interpretation , the reduct of  w.r.t.  is the
subset  of  obtained by deleting from  the rules in which a body literal is false w.r.t.
 [12]. An interpretation  for  is an answer set (or stable model) for  if  is a minimal model
(under subset inclusion) of  (i.e.,  is a minimal model for  ). Given a program with weak
constraints Π = ⟨,  ⟩ and an interpretation , the semantics of Π extends from the basic
case defined above. Thus, let  and  be the instantiation of  and  , respectively. Then,
let  be the set
{(w@l,t1,. . .,t) | :∼ b1,. . .,b,not b+1,. . .,not b. [w@l,t1,. . .,t] ∈  
b1,. . .,b ∈ }.</p>
      <p>
        Moreover, for an integer ,  = ∑︀(@,1,...,)∈  if there is at least one tuple in  whose
level is equal to , 0 otherwise. Given a program with weak constraints Π = ⟨,  ⟩, an answer
set  for  is said to be dominated by an answer set  ′ for  , if there exists an integer  such
that ′ &lt;  and ′′ = ′ for all integers ′ &gt; . An answer set  for  is said to be
optimal or optimum for Π if there is no other answer set  ′ that dominates  [11].
Syntactic shortcuts. In the following, p(1..n). denotes the set of facts p(
        <xref ref-type="bibr" rid="ref1">1</xref>
        ). . . . p(n).
Moreover, we use choice rules of the form {X}, where X is a set of atoms. Choice rules of this
kind can be viewed as a syntactic shortcut for the rule p | p’. for each p ∈ X, where p’ is
a fresh new atom not appearing elsewhere in the program, meaning that the atom  can be
chosen as true. Choice rules can also have bounds, i.e., {X} = 1, can be seen as a shortcut for
the choice rule {X} and the rule :- #count{X} != 1.
This section deals with the implementation of the grammar for the Controlled Natural Language
(CNL) presented in this work. A specification written in this CNL is made of propositions,
the structure of which is defined by clauses, linked by connectives, that are used to express
concepts, query them for information or express conditions on them. Concepts in a proposition
can be subjects, that represent the focus of the definition and only one of them is allowed per
proposition, or companion objects, that represent other information associated with the subject
of the proposition.
      </p>
      <p>The combination of clauses that produces a proposition defines its type, that is used to
understand what the proposition is supposed to mean and how that meaning can be translated
into ASP rules and facts.</p>
      <p>In the following subsections, we show the proposition types that compose the CNL and
related sub-types, if any, along with a visualization of their translation into the elements that
form the resulting ASP programs.</p>
      <sec id="sec-2-1">
        <title>3.1. Grammar</title>
        <p>A brief description of the grammar is reported in the following, we refer the reader to [14] for
the full grammar. In particular, our CNL is made of one or many propositions:
1 start →− (( negative_strong_constraint_proposition
2 | positive_strong_constraint_proposition
3 | weak_constraint_proposition
4 | definition_proposition
5 | quantified_choice_proposition)CNL_END_OF_LINE)+
where each proposition is terminated by CNL_END_OF_LINE (in our case, a dot). We consider
ifve types of propositions, namely negative strong constraints, positive strong constraints, weak
constraints, definition clauses, and quantified choice clauses.</p>
        <p>Negative strong constraints are as follows:
1 negative_strong_constraint_proposition →− "it is prohibited that" (
simple_clause ("and also" simple_clause)* (where_clause)? |
aggregate_clause comparison_clause (where_clause)? |
quantified_constraint (where_clause)?)
In particular, they start with the sentence "it is prohibited that" and are always followed
by a simple clause, i.e. a sentence of the form subject verb object, by an aggregate clause, i.e.
a sentence expressing a form of aggregations (e.g. the number of) or by a quantified constraint,
i.e. a sentence used to specify clauses with quantifiers as every or any. After that, additional
sentences can be added, which can be of the type (i) where_clause; or (ii) comparison_clause.
Sentences of type (i) are used to specify conditions; sentences of type (ii) are used to specify
comparison between elements (e.g. X is equal to 1).</p>
        <p>Positive strong constraints are as follows:
1 positive_strong_constraint_proposition →− "it is required that" (
aggregate_clause comparison_clause (where_clause)? | when_then_clause (
where_clause)? | quantified_constraint (where_clause)?)
In particular, they start with the sentence "it is required that" and are followed by an
aggregate clause, by a quantified constraint, or by a clause of the type "when"/"then".</p>
        <p>Weak constraints are as follows:
In particular, they start with the sentence "it is preferred that" and are always followed
by a priority operator, i.e. a sentence expressing the level of relevance of the constraint with
respect to other weak constraints (e.g. "with low priority") and either an aggregate clause or
a condition operation, i.e., a sentence expressing operations between variables in the proposition
(e.g. the sum of X and Y). The proposition is closed with an optimization operator, i.e., a
sentence expressing the nature of the optimization (e.g. "is maximized") and an optional
where clause.</p>
        <p>Definition propositions are as follows:
1 definition_proposition →− (compounded_clause | constant_definition_clause |
enumerative_definition_clause)
In particular, a definition proposition can be one of the type (i) compounded_clause; (ii)
constant_definition_clause; (iii) enumerative_definition_clause. Sentences of type
(i) are used to define elements using lists and ranges; sentences of type (ii) are used to specify
constants; sentences of type (iii) are used to define elements one at a time, optionally closing
the proposition with a "when" clause, defining a condition in which the element is defined (e.g.
X is true when Y is true), and with a where clause.</p>
        <p>Quantified choice propositions are as follows:
1 quantified_choice_proposition →− quantifier subject_clause "can" CNL_COPULA?
(verb_name | verb_name_with_preposition) (
quantified_exact_quantity_clause | quantified_range_clause)?
quantified_object_clause? foreach_clause?
In particular, they start with a quantifier, and are always followed by a subject and
a verb, optionally connected by a CNL_COPULA (e.g. is, is a, is an, ...) and then,
also optionally, a sentence of either type (i) quantified_exact_quantity_clause; or (ii)
quantified_range_clause. Sentences of type (i) are used to express the quantity in question
in exact terms (e.g. exactly 1); sentences of type (ii) are used to express it using a range (e.g.
between 1 and 2). The proposition can be closed with an object clause, i.e. a sentence used to
express an object for the proposition, in a subject verb object fashion, or a simple clause
and, finally, a foreach clause, i.e. a sentence used to express additional objects for which any
possible value can be tried.</p>
      </sec>
      <sec id="sec-2-2">
        <title>3.2. Definition propositions</title>
        <p>Definition propositions are used to define concepts that can, then, be used by other propositions.
These definitions express the signature of the concept indicated by the subject of the proposition,
carrying information regarding the concept in the definition that our system can use later on in
the specification whenever the same concept is used.</p>
        <p>There are three diferent types of constructions available for these kinds of propositions,
namely constant definitions, compound definitions, and enumerative definitions.
Constant definitions. They are used to introduce constants to be used later on in the
specification.</p>
        <sec id="sec-2-2-1">
          <title>Example 3.1.</title>
          <p>MyConstant is equal to 10.</p>
          <p>
            As we can see from proposition (
            <xref ref-type="bibr" rid="ref1">1</xref>
            ), the constant 10 is introduced with a equal to clause, and
it is bound to the subject of the proposition. In the case of constant definitions, there are no
translations to ASP available, because they are instead stored and substituted in the resulting
program when the subject of the definition is used.
          </p>
          <p>Compound definitions. Such definitions are used to introduce a set of related concepts all
at once, by making use of either ranges of numbers or lists.</p>
        </sec>
        <sec id="sec-2-2-2">
          <title>Example 3.2.</title>
        </sec>
        <sec id="sec-2-2-3">
          <title>A day goes from 1 to 365 and is made of hours that are made of (2)</title>
          <p>minutes.</p>
          <p>
            A drink is one of alcoholic, nonalcoholic and has color that is equal to (
            <xref ref-type="bibr" rid="ref3">3</xref>
            )
respectively blue, yellow.
          </p>
          <p>
            Proposition (
            <xref ref-type="bibr" rid="ref2">2</xref>
            ) is an example of a definition of a day using a range, identified by the construct
goes from/to. Additionally, it can be noticed the presence of additional made of clauses,
indicating what the preceding object, may it be the subject or an object complement, is made of.
          </p>
          <p>
            Proposition (
            <xref ref-type="bibr" rid="ref3">3</xref>
            ) tries to do the same thing with a drink using lists with a one of clause, where
one can also specify additional attributes for each element of the list in a positional way using a
respectively clause, and a list with the same number of elements of the list enumerating all
the possible values that the subject of the proposition can have.
          </p>
          <p>
            The corresponding ASP code, in this case, is quite straightforward and is depicted below:
(
            <xref ref-type="bibr" rid="ref1">1</xref>
            )
1 day(1..365).
2 drink(1, "alcoholic", "blue").
3 drink(2, "nonalcoholic", "yellow").
          </p>
          <p>
            where line 1 corresponds to proposition (
            <xref ref-type="bibr" rid="ref2">2</xref>
            ), while lines 2 and 3 are related to proposition (
            <xref ref-type="bibr" rid="ref3">3</xref>
            ).
One can notice the absence of information regarding made of clauses in proposition (
            <xref ref-type="bibr" rid="ref2">2</xref>
            ), but this
is because the system only adds the composition hierarchy to the signature and does not encode
them into ASP. Also, list elements defined in proposition (
            <xref ref-type="bibr" rid="ref3">3</xref>
            ) carry around their position number
with them, which turns out to be handy as a basic way to encode precedence relationships
when the subject is not a number.
          </p>
          <p>Enumerative definitions. Enumerative definitions are used to introduce a property for
a single concept or a relationship between a set of concepts. The peculiarity of this kind of
propositions lies in the diferent translations into ASP as the clauses used within them change.</p>
        </sec>
        <sec id="sec-2-2-4">
          <title>Example 3.3.</title>
          <p>
            John is a waiter. (
            <xref ref-type="bibr" rid="ref4">4</xref>
            )
Pub 1 is close to pub 2 and pub X, where X is equal to 3,4. (
            <xref ref-type="bibr" rid="ref5">5</xref>
            )
Waiter John works in pub 1. (
            <xref ref-type="bibr" rid="ref6">6</xref>
            )
Waiter W is working when waiter W serves a drink. (
            <xref ref-type="bibr" rid="ref7">7</xref>
            )
In propositions (
            <xref ref-type="bibr" rid="ref4">4</xref>
            )–(
            <xref ref-type="bibr" rid="ref7">7</xref>
            ) the construction to define relationships or properties related to a particular
subject is shown. Proposition (
            <xref ref-type="bibr" rid="ref5">5</xref>
            ), in particular, illustrates another feature of our CNL, i.e., where
clauses, that are used in the example to define the values that the variable X can take.
          </p>
          <p>
            The previous definitions always hold true, whereas proposition (
            <xref ref-type="bibr" rid="ref4">4</xref>
            ) is a conditional definition,
identified by a when clause, and so it holds true only if the statement introduced by the
aforementioned clause is true. Note that John is not considered as a variable here since it
contains a lower case letter. Indeed, our assumption is that variables contain only upper case
letters, numbers or symbols.
          </p>
          <p>
            Below are the translations in ASP of these examples:
1 waiter(john).
2 close_to(
            <xref ref-type="bibr" rid="ref1 ref2 ref3">1, 2, 3</xref>
            ). close_to(
            <xref ref-type="bibr" rid="ref1 ref2 ref4">1, 2, 4</xref>
            ).
3 work_in(john, 1).
4 working(W) :- serve(W,_).
          </p>
          <p>
            Also here, the translation is quite intuitive. Propositions that express relationships or properties
that always hold true become regular ASP facts. In particular, proposition (
            <xref ref-type="bibr" rid="ref6">6</xref>
            ) in translated
in a similar manner to compound definitions with lists. Proposition (
            <xref ref-type="bibr" rid="ref5">5</xref>
            ), instead, represents
something that follows by the truth of another statement and, as such, is translated into an ASP
rule, with what’s inside the when clause as the body of the rule.
          </p>
        </sec>
      </sec>
      <sec id="sec-2-3">
        <title>3.3. Quantified propositions</title>
        <p>Quantified propositions are used to define relationships or properties that can be true for a
given set of selected concepts following a choice. Also these propositions define a signature
for the concept upon which the choice has to be made. Quantified propositions are always
introduced by the every quantifier and, since they express possibilities, always contain a can
clause.</p>
        <sec id="sec-2-3-1">
          <title>Example 3.4.</title>
        </sec>
        <sec id="sec-2-3-2">
          <title>Every patron can drink in exactly 1 pub for each day. (8)</title>
          <p>
            Every waiter can serve a drink. (
            <xref ref-type="bibr" rid="ref9">9</xref>
            )
Every patron can drink with a patron next to patron X. (
            <xref ref-type="bibr" rid="ref10">10</xref>
            )
Proposition (
            <xref ref-type="bibr" rid="ref8">8</xref>
            ) shows how one can express an exact number of choices that can be made for
the concept expressed by the subject, and also how other concepts can be used in tandem with
the subject to create a sort of cartesian product of choices, using a for each clause. These
last constructions are optional, as shown in proposition (
            <xref ref-type="bibr" rid="ref9">9</xref>
            ). Proposition (
            <xref ref-type="bibr" rid="ref10">10</xref>
            ), instead, shows
how one can constrain the choices that can be made by means of an auxiliary statement that
defines the set of concepts from which the set of possible choices can be constructed. Their full
translations into ASP is shown below:
{drink_in(_X1,_X2,_X3): pub(_X2)} = 1 :- patron(_X1), day(_X3).
{serve(_X1,_X2): drink(_X2)} :- waiter(_X1).
{drink_with(X,_X1): next_to(X,_X1)} :- patron(X).
          </p>
          <p>These translations present a couple of novelties. The first one is the introduction of choice rules
with bounds, that are the ASP constructs that make it possible to represent propositions of this
type. The second one is the introduction of generated variables (starting with symbol _) that
are used wherever two atoms have to be bound and no variable to use has been found in the
specification given in input. This feature enables the specification writer to avoid cluttering the
document with unnecessary variables, as can be seen throughout the propositions, with the
only limitation that anaphoras have to be expressed explicitly by providing the correct variable.</p>
        </sec>
      </sec>
      <sec id="sec-2-4">
        <title>3.4. Strong Constraint propositions</title>
        <p>Strong Constraint propositions are used to define assertions that must be true for a given set
of selected concepts. This kind of propositions does not introduce new signatures but, on the
contrary, it consumes other signatures that were previously defined, meaning that the concepts
used inside these are to be defined before they are used. A strong constraint can represent either
a prohibition (It is prohibited...) or a requirement (It is required...), in which case one must
specify a when clause, containing a premise, and a then clause, containing a consequence.</p>
        <p>In addition to simple clauses, that are made of subject, a verb, and related object clauses, one
can also specify aggregate clauses, either in active or passive form, that define an aggregation of
the set of concepts that satisfy the statement in their body with the operator that was specified
(number or total).</p>
        <sec id="sec-2-4-1">
          <title>Example 3.5.</title>
          <p>
            It is prohibited that waiter X works with waiter W and also waiter X (
            <xref ref-type="bibr" rid="ref11">11</xref>
            )
works with a waiter before W, where W is between Jack and Mary.
          </p>
          <p>
            It is required that the number of occurrences between each 5 days (
            <xref ref-type="bibr" rid="ref12">12</xref>
            )
where a waiter works is at least 2.
          </p>
        </sec>
        <sec id="sec-2-4-2">
          <title>It is required that when a waiter works for 2 consecutive days then (13)</title>
          <p>the next day does not work.</p>
          <p>
            It is prohibited that a waiter does not work in a day and also the (
            <xref ref-type="bibr" rid="ref14">14</xref>
            )
previous 2 consecutive days does not work.
          </p>
          <p>
            It is required that when waiter X works in pub P1 then waiter X does (
            <xref ref-type="bibr" rid="ref15">15</xref>
            )
not work in pub P2, where P1 is diferent from P2.
          </p>
        </sec>
        <sec id="sec-2-4-3">
          <title>It is required that every waiter is payed. (16)</title>
          <p>
            Proposition (
            <xref ref-type="bibr" rid="ref11">11</xref>
            )-(
            <xref ref-type="bibr" rid="ref14">14</xref>
            ) show practical examples of how lists can be queried for sequence
relationships between its elements. It is possible to check whether elements come before or after a
specified element, take "windows" of a fixed number of elements or take consecutive elements,
also from a specified one. Proposition (
            <xref ref-type="bibr" rid="ref11">11</xref>
            ) and proposition (
            <xref ref-type="bibr" rid="ref15">15</xref>
            ) show the other two features
supported by where clauses, making it possible to express bounds or equality constraints
between variables. In addition to that, arithmetic operations are supported by the use of an
equal to clause. Lastly, proposition (
            <xref ref-type="bibr" rid="ref16">16</xref>
            ) is an example of how to specify a requirement that
must hold for all the elements present in a particular set of concepts. The translations of the
propositions above are the following:
1 :- waiter(_X1, W), waiter(_X2, _X3), work_with(X, W), work_with(X,_X3), _X3
&lt; W, _X1 &gt;= 1, _X1 &lt;= 3, _X2 &gt;= 1, _X2 &lt;= 5.
2 :- waiter(_X1), day(_X2), _X2 &lt;= 352, #count{_X3: work(_X1,_X3), _X3 &gt;=
_X2, _X3 &lt;= _X2+4} &lt; 2.
3 :- day(_X1), #count{_X3: work(_X2,_X3), _X3 &gt;= _X1, _X3 &lt;= _X1+1} = 2, not
work(_X2,_X1+2), waiter(_X2).
4 :- work(_X1,_X2), day(_X3), #count{_X2: work(_X1,_X2), _X2 &gt;= _X3-2, _X2 &lt;=
_X3-1} = 2.
5 :- work_in(_X1, P1), work_in(_X1, P2), P1 != P2.
6 :- not payed(_X1), waiter(_X1).
          </p>
          <p>
            The translations above show that list element operations and checks are reflected on the indices
of the elements in the list, or the numbers directly when there is a list. This behaviour is shown
in the translation from proposition (
            <xref ref-type="bibr" rid="ref11">11</xref>
            ) and proposition (
            <xref ref-type="bibr" rid="ref12">12</xref>
            ). Proposition (
            <xref ref-type="bibr" rid="ref13">13</xref>
            ) and proposition
(
            <xref ref-type="bibr" rid="ref14">14</xref>
            ), instead, show how check for consecutive elements in list are translated, as an existence
check of the exact number of elements that have to satisfy the statement inside the aggregate,
where the actual statement expressed in the proposition is expressed. On the other hand,
proposition (
            <xref ref-type="bibr" rid="ref15">15</xref>
            ) and proposition (
            <xref ref-type="bibr" rid="ref16">16</xref>
            ) translations are not very complex, and show how diferent
clauses referring to the same or diferent subject are linked in the resulting program, as well as
how quantifiers inside constraints are dealt with.
          </p>
        </sec>
      </sec>
      <sec id="sec-2-5">
        <title>3.5. Weak Constraint propositions</title>
        <p>Weak constraint propositions are used to define assertions that are preferably true for a given
set of selected concepts. Also this type of propositions consume signatures from previously
defined concepts. They are always introduced by It is preferred and need the specification of
the optimization objective (either minimization or maximization) and the level of priority of
the optimization (low, medium or high).</p>
        <sec id="sec-2-5-1">
          <title>Example 3.6.</title>
        </sec>
        <sec id="sec-2-5-2">
          <title>It is preferred, with high priority, that the diference in absolute (17) value between 1000 and and the total of items in a box where a drink is stocked ranging between 10 and 5000 is minimized.</title>
          <p>It is preferred with low priority that the number of drinks that are (18)
served is maximized.</p>
          <p>
            Proposition (
            <xref ref-type="bibr" rid="ref17">17</xref>
            ) displays a weak constraint that represent a minimization objective. Here, the
value to optimize is obtained by means of an arithmetic operation (showing here that also the
absolute value operator for those is supported) between a constant number and the result of an
aggregate clause, also with the definition of the range of possible values where the result of this
arithmetic operation lies (useful for limiting the search space of the solutions). In proposition
(18) there is an example of a maximization constraint, showing that arithmetic operations are
optional and even just the results of the aggregate clauses can be used as values to be optimized.
          </p>
          <p>Translation of the propositions above are shown below:
1 :∼ drink(_X1), #sum{_X2,_X3: stocked(_X1,_X3,_X2)} = _X4, _X4 &gt;= 10, _X4 &lt;=
5000, _X5 = |1000-_X4|. [_X5@1, _X1]
2 :∼ #count{_X1: served(_X1)} = _X2. [-_X2@3]</p>
          <p>
            The translations of proposition (
            <xref ref-type="bibr" rid="ref17">17</xref>
            ) and proposition (18) are very linear, starting from the
aggregate for the first value, and then, if necessary, putting bounds on it or extracting another
result, that is, the one to be optimized. Remarkably, priority levels are transformed into numerical
level constants, in descending order from the least severe to the most, and maximization
constraints are just translated as flipping the sign of the value to be optimized.
          </p>
          <p>Lastly, it is worth mentioning that the diference in the translation of the aggregate from
proposition (18) with respect to other translations seen in previous examples is due to the fact
that this is a special case of the active aggregate form, where a property is in verb position.</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>4. Use cases</title>
      <p>In this section we present some examples to demonstrate how the language can be used to
define well-known problems in a natural an easily understandable way. The corresponding
translations into ASP are also provided.</p>
      <sec id="sec-3-1">
        <title>4.1. Graph coloring</title>
        <p>
          We begin by presenting an encoding of the graph coloring problem using our controlled natural
language:
1 A node goes from 1 to 3.
2 A color is one of red, green, blue.
3 Node 1 is connected to node X, where X is one of 2, 3.
4 Node 2 is connected to node X, where X is one of 1, 3.
5 Node 3 is connected to node X, where X is one of 1, 2.
6 Every node can be assigned to exactly 1 color.
7 It is required that when node X is connected to node Y then node X is not
assigned to color C and also node Y is not assigned to color C.
One can notice the presence of a ranged definition proposition (line 1) and a list definition
proposition (line 2), enumerative definition propositions with where clauses (lines 3–5), a
quantified clause (line 6) and, lastly, a positive strong constraint (line 7). The resulting ASP
encoding is the following:
1 node(1..3).
2 color(1,"red"). color(2,"green"). color(3,"blue").
3 connected_to(
          <xref ref-type="bibr" rid="ref1 ref2">1,2</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref1 ref3">1,3</xref>
          ).
4 connected_to(
          <xref ref-type="bibr" rid="ref1 ref2">2,1</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref2 ref3">2,3</xref>
          ).
5 connected_to(
          <xref ref-type="bibr" rid="ref1 ref3">3,1</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref2 ref3">3,2</xref>
          ).
6 {assigned_to(_X1,_X2): color(_,_X2)} = 1 :- node(_X1).
7 :- connected_to(X,Y), assigned_to(X,C), assigned_to(Y,C).
        </p>
        <p>where each proposition at line  is translated as the rule(s) reported at line  (with  = [1..7]).</p>
        <p>
          For the sake of completeness, we report a comparison with the CNL for specifying the graph
coloring problem used by PENGASP (Figure 5 of [10]).
1 The node 1 is connected to the nodes 2 and 3.
2 The node 2 is connected to the nodes 1 and 3.
3 The node 3 is connected to the nodes 1 and 2.
4 Red is a colour. Green is a colour. Blue is a colour.
5 Every node is assigned to exactly one colour.
6 It is not the case that a node X is assigned to a colour and a node Y is
assigned to the colour and the node X is connected to the node Y.
There are two main diferences. The first one is that our CNL must use variables (i.e., X in our
example) also to specify the connections, whereas the one of PENGASP does not need it. In
our case, sentence at line 1 would create the atom connected_to(
          <xref ref-type="bibr" rid="ref1 ref2 ref3">1,2,3</xref>
          ). Secondly, the last
sentence is expressed in a negative form in case of PENGASP, which is similar to the concept of
constraint in ASP, whereas our CNL uses a positive sentence which is similar to the concept of
clause in propositional logic.
        </p>
      </sec>
      <sec id="sec-3-2">
        <title>4.2. Hamiltonian path</title>
        <p>The following statements represent an encoding in our CNL for the Hamiltonian path problem:</p>
        <p>
          Line 1 defines the nodes and lines from 2 to 6 define the connections between nodes. Then, line
7 reports a quantified proposition with an object accompanied by a verb clause, lines 8 and 9
report strong constraint propositions with aggregates, line 10 reports a conditional definition
clause, line 11 reports a constraint clause with the presence of a quantifier, and line 12 define
the constant start, which is subsequently used in line 13. The ASP encoding corresponding to
the CNL statements is the following:
1 node(1..5).
2 connected_to(
          <xref ref-type="bibr" rid="ref1 ref2">1,2</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref1 ref3">1,3</xref>
          ).
3 connected_to(
          <xref ref-type="bibr" rid="ref1 ref2">2,1</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref2 ref4">2,4</xref>
          ).
4 connected_to(
          <xref ref-type="bibr" rid="ref1 ref3">3,1</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref3 ref4">3,4</xref>
          ).
5 connected_to(
          <xref ref-type="bibr" rid="ref3 ref4">4,3</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref4 ref5">4,5</xref>
          ).
6 connected_to(
          <xref ref-type="bibr" rid="ref3 ref5">5,3</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref4 ref5">5,4</xref>
          ).
7 {path_to(X,_X1): connected_to(X,_X1)} :- node(X).
8 :- node(X), #count{_X2: path_to(X,_X2)} != 1.
9 :- node(X), #count{_X3: path_to(_X3,X)} != 1.
10 reachable(Y) :- reachable(X), path_to(X,Y).
11 :- not reachable(_X4), node(_X4).
12 reachable(
          <xref ref-type="bibr" rid="ref1">1</xref>
          ).
        </p>
        <p>where a CNL statement at line  is represented by the rule(s) at line  with ( = [1..11]), whereas
CNL statements reported in lines 12 and 13 are encoded by the rule at line 12.</p>
      </sec>
      <sec id="sec-3-3">
        <title>4.3. Maximal clique</title>
        <p>
          The following statements represent the encoding in our CNL of the maximum clique problem:
1 A node goes from 1 to 5.
2 Node 1 is connected to node X, where X is one of 2, 3.
3 Node 2 is connected to node X, where X is one of 1, 3, 4, 5.
4 Node 3 is connected to node X, where X is one of 1, 2, 4, 5.
5 Node 4 is connected to node X, where X is one of 2, 3, 5.
6 Node 5 is connected to node X, where X is one of 2, 3, 4.
7 Every node can be chosen.
8 It is required that when node X is not connected to node Y then node X is
not chosen and also node Y is not chosen, where X is different from Y.
9 It is preferred with high priority that the number of nodes that are chosen
is maximized.
where statements from line 1 to line 6 define the input graph. Then, line 7 reports a quantified
proposition with no object, line 8 contains a strong constraint proposition with a comparison
on the variables used inside it, and line 9 reports a weak constraint expressing a
maximization preference on the highest priority level. The resulting ASP encoding is reported in the
following:
9 :∼
1 node(1..5).
2 connected_to(
          <xref ref-type="bibr" rid="ref1 ref2">1,2</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref1 ref3">1,3</xref>
          ).
3 connected_to(
          <xref ref-type="bibr" rid="ref1 ref2">2,1</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref2 ref3">2,3</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref2 ref4">2,4</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref2 ref5">2,5</xref>
          ).
4 connected_to(
          <xref ref-type="bibr" rid="ref1 ref3">3,1</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref2 ref3">3,2</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref3 ref4">3,4</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref3 ref5">3,5</xref>
          ).
5 connected_to(
          <xref ref-type="bibr" rid="ref2 ref4">4,2</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref3 ref4">4,3</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref4 ref5">4,5</xref>
          ).
6 connected_to(
          <xref ref-type="bibr" rid="ref2 ref5">5,2</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref3 ref5">5,3</xref>
          ). connected_to(
          <xref ref-type="bibr" rid="ref4 ref5">5,4</xref>
          ).
7 {chosen(_X1)} :- node(_X1).
8 :- not connected_to(X,Y), chosen(X), chosen(Y), X != Y.
        </p>
        <p>#count{_X1: chosen(_X1)} = _X2. [-_X2@1]
where each CNL proposition at line  is translated as the rule(s) reported at line  (with  = [1..9]).</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>5. Conclusion</title>
      <p>In this paper we proposed a system for automatically translating English sentences expressed
using a controlled language into ASP rules. Moreover, we provided several examples of
combinatorial problems that can be specified in a clear and easy way, even by a non-ASP expert.
using our CNL and their translation as ASP rules. Concerning future work, our CNL might be
extended to cover additional constructs and language extensions, e.g. temporal operators [15]
or Constraint ASP (CASP) [16, 17], and the tool can be extended to implement a bidirectional
conversion, where ASP rules are translated into CNL statements. Finally, we recall that the tool
presented in this paper is open source and available at https://github.com/dodaro/cnl2asp.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>G.</given-names>
            <surname>Brewka</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Eiter</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Truszczynski</surname>
          </string-name>
          ,
          <article-title>Answer set programming at a glance</article-title>
          ,
          <source>Commun. ACM</source>
          <volume>54</volume>
          (
          <year>2011</year>
          )
          <fpage>92</fpage>
          -
          <lpage>103</lpage>
          . doi:
          <volume>10</volume>
          .1145/2043174.2043195.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>E.</given-names>
            <surname>Erdem</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Gelfond</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Leone</surname>
          </string-name>
          ,
          <article-title>Applications of answer set programming</article-title>
          ,
          <source>AI Mag</source>
          .
          <volume>37</volume>
          (
          <year>2016</year>
          )
          <fpage>53</fpage>
          -
          <lpage>68</lpage>
          . doi:
          <volume>10</volume>
          .1609/aimag.v37i3.
          <fpage>2678</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>M.</given-names>
            <surname>Gebser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Kaminski</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Kaufmann</surname>
          </string-name>
          , M. Ostrowski,
          <string-name>
            <given-names>T.</given-names>
            <surname>Schaub</surname>
          </string-name>
          , P. Wanko,
          <article-title>Theory solving made easy with clingo 5</article-title>
          , in:
          <source>Technical Communications of ICLP</source>
          , volume
          <volume>52</volume>
          of OASIcs,
          <source>Schloss Dagstuhl - Leibniz-Zentrum für Informatik</source>
          ,
          <year>2016</year>
          , pp.
          <volume>2</volume>
          :
          <fpage>1</fpage>
          -
          <lpage>2</lpage>
          :
          <fpage>15</fpage>
          . doi:
          <volume>10</volume>
          .4230/ OASIcs.ICLP.
          <year>2016</year>
          .
          <volume>2</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>M.</given-names>
            <surname>Alviano</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Calimeri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Dodaro</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Fuscà</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Leone</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Perri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Ricca</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Veltri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Zangari</surname>
          </string-name>
          ,
          <article-title>The ASP system DLV2</article-title>
          ,
          <source>in: Proceedings of LPNMR</source>
          , volume
          <volume>10377</volume>
          , Springer,
          <year>2017</year>
          , pp.
          <fpage>215</fpage>
          -
          <lpage>221</lpage>
          . URL: https://doi.org/10.1007/978-3-
          <fpage>319</fpage>
          -61660-5_
          <fpage>19</fpage>
          . doi:
          <volume>10</volume>
          .1007/ 978-3-
          <fpage>319</fpage>
          -61660-5\_
          <fpage>19</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>T.</given-names>
            <surname>Kuhn</surname>
          </string-name>
          ,
          <article-title>A survey and classification of controlled natural languages</article-title>
          ,
          <source>Comput. Linguistics</source>
          <volume>40</volume>
          (
          <year>2014</year>
          )
          <fpage>121</fpage>
          -
          <lpage>170</lpage>
          . URL: https://doi.org/10.1162/COLI_a_00168. doi:
          <volume>10</volume>
          .1162/COLI\_a\ _
          <volume>00168</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>I. S.</given-names>
            <surname>Bajwa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. G.</given-names>
            <surname>Lee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Bordbar</surname>
          </string-name>
          ,
          <article-title>SBVR business rules generation from natural language specification, in: AI for Business Agility</article-title>
          , AAAI,
          <year>2011</year>
          . URL: http://www.aaai.org/ocs/index. php/SSS/SSS11/paper/view/2378.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>The</given-names>
            <surname>Business Rules Group</surname>
          </string-name>
          ,
          <article-title>Defining business rules ∼ what are they really</article-title>
          ?,
          <year>2000</year>
          . URL: http://www.businessrulesgroup.org/first_paper/BRG-whatisBR_
          <year>3ed</year>
          .pdf.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>C.</given-names>
            <surname>Baral</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Dzifcak</surname>
          </string-name>
          ,
          <article-title>Solving puzzles described in english by automated translation to answer set programming and learning how to do that translation</article-title>
          ,
          <source>in: Proceedings of KR</source>
          , AAAI Press,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>E.</given-names>
            <surname>Erdem</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Yeniterzi</surname>
          </string-name>
          ,
          <article-title>Transforming controlled natural language biomedical queries into answer set programs</article-title>
          ,
          <source>in: Proceedings of the BioNLP Workshop</source>
          , Association for Computational Linguistics,
          <year>2009</year>
          , pp.
          <fpage>117</fpage>
          -
          <lpage>124</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>R.</given-names>
            <surname>Schwitter</surname>
          </string-name>
          ,
          <article-title>Specifying and verbalising answer set programs in controlled natural language</article-title>
          ,
          <source>Theory Pract. Log. Program</source>
          .
          <volume>18</volume>
          (
          <year>2018</year>
          )
          <fpage>691</fpage>
          -
          <lpage>705</lpage>
          . doi:
          <volume>10</volume>
          .1017/ S1471068418000327.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>F.</given-names>
            <surname>Calimeri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Faber</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Gebser</surname>
          </string-name>
          , G. Ianni,
          <string-name>
            <given-names>R.</given-names>
            <surname>Kaminski</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Krennwallner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Leone</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Maratea</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Ricca</surname>
          </string-name>
          , T. Schaub,
          <article-title>Asp-core-2 input language format</article-title>
          ,
          <source>Theory Pract. Log. Program</source>
          .
          <volume>20</volume>
          (
          <year>2020</year>
          )
          <fpage>294</fpage>
          -
          <lpage>309</lpage>
          . doi:
          <volume>10</volume>
          .1017/S1471068419000450.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>W.</given-names>
            <surname>Faber</surname>
          </string-name>
          , G. Pfeifer,
          <string-name>
            <given-names>N.</given-names>
            <surname>Leone</surname>
          </string-name>
          ,
          <article-title>Semantics and complexity of recursive aggregates in answer set programming</article-title>
          ,
          <source>Artif. Intell</source>
          .
          <volume>175</volume>
          (
          <year>2011</year>
          )
          <fpage>278</fpage>
          -
          <lpage>298</lpage>
          . doi:
          <volume>10</volume>
          .1016/j.artint.
          <year>2010</year>
          .
          <volume>04</volume>
          . 002.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>F.</given-names>
            <surname>Buccafurri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Leone</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Rullo</surname>
          </string-name>
          ,
          <article-title>Enhancing disjunctive datalog by constraints</article-title>
          ,
          <source>IEEE Trans. Knowl. Data Eng</source>
          .
          <volume>12</volume>
          (
          <year>2000</year>
          )
          <fpage>845</fpage>
          -
          <lpage>860</lpage>
          . doi:
          <volume>10</volume>
          .1109/69.877512.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>C.</given-names>
            <surname>Dodaro</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Maratea</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Riccio</surname>
          </string-name>
          , Grammar of the cnl,
          <year>2022</year>
          . URL: https://github.com/ dodaro/cnl2asp/blob/main/src/cnl/grammar/cnl_grammar.lark.
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>P.</given-names>
            <surname>Cabalar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Diéguez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Schaub</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Schuhmann</surname>
          </string-name>
          ,
          <article-title>Towards metric temporal answer set programming</article-title>
          ,
          <source>Theory Pract. Log. Program</source>
          .
          <volume>20</volume>
          (
          <year>2020</year>
          )
          <fpage>783</fpage>
          -
          <lpage>798</lpage>
          . URL: https://doi.org/10. 1017/S1471068420000307. doi:
          <volume>10</volume>
          .1017/S1471068420000307.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>M.</given-names>
            <surname>Balduccini</surname>
          </string-name>
          ,
          <article-title>Industrial-size scheduling with ASP+CP</article-title>
          , in
          <source>: Proceedings of LPNMR</source>
          , volume
          <volume>6645</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2011</year>
          , pp.
          <fpage>284</fpage>
          -
          <lpage>296</lpage>
          . URL: https://doi.org/10.1007/978-3-
          <fpage>642</fpage>
          -20895-9_
          <fpage>33</fpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>642</fpage>
          -20895-9\_
          <fpage>33</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>M.</given-names>
            <surname>Banbara</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Kaufmann</surname>
          </string-name>
          , M. Ostrowski, T. Schaub,
          <article-title>Clingcon: The next generation</article-title>
          ,
          <source>Theory Pract. Log. Program</source>
          .
          <volume>17</volume>
          (
          <year>2017</year>
          )
          <fpage>408</fpage>
          -
          <lpage>461</lpage>
          . URL: https://doi.org/10.1017/S1471068417000138. doi:
          <volume>10</volume>
          .1017/S1471068417000138.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>