<!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>Towards a Formalism of Configuration Properties Propagation</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>David Fabian</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Radek Marˇík</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Dept. of Cybernetics, Faculty of Electrical Engineering, Czech Technical University in Prague</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Dept. of Mathematics, Faculty of Nuclear Sciences and Physical Engineering, Czech Technical University in Prague</institution>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Tomáš Oberhuber</institution>
        </aff>
      </contrib-group>
      <abstract>
        <p>Software configuration often studies two issues: firstly, how to merge various software components together to create a program with a fixed structure that fits the requirements, and secondly, how to effectively set up the remaining (usually installation specific) configuration options when deploying the program. Nowadays, the user demands a simple and well arranged way to set up these options, possibly through a graphical user interface (GUI). There are various tools designed to assist the user with these tasks. In this paper, a general multi-platform configuration tool Freeconf is introduced. Our technique to simplify a GUI, which has been incorporated into Freeconf, is described. This technique is based on a set of properties that allow splitting the universe of configuration options into several categories with a clear semantics and rules that control the dynamics of options distribution to these categories in response to the user's actions. The rules are currently only implemented in the source code of Freeconf as a proof-of-concept without any formal proof of soundness or completeness. Results from the domain of Rule-Based Constraint Programming have been applied in the paper to develop a formal description of the rules.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        While working with a software application, the user usually needs to
adjust a working environment to her needs. Nowadays, almost every
application lets the user to perform some configuration. The
average user often does not understand the background of the program
and expects a nice graphical user interface (GUI) to assist her.
However, there are many applications (especially in the GNU/Linux
environment) that do not have any GUI whatsoever and the only way
how to configure them is through configuration text files. A serious
problem of these files is that their syntax differs greatly, so the user
must learn it first from the documentation. It is also necessary for
the user to deeply understand the meaning of various configuration
options (configuration keys), their dependencies, and their possible
values.
There exist tools that address the above mentioned difficulties. Some
are focused on a given domain (or even at one application, Linux
kernel is popular) like SmartFrog [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] and LCFG [
        <xref ref-type="bibr" rid="ref1 ref3">1, 3</xref>
        ] which are
designed to administer the installation of large scaled networks of
UNIX systems, or MenuConfig [16, ch. 7] which is a primary tool for
Linux kernel configuration. Then there exist general tools like
LinuxConf [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] and Freeconf [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. Freeconf is a unique tool as it offers a
multi-platform and a multi-desktop configuration of applications of
any kind.
1.2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Configuration Properties</title>
      <p>Many automatic configuration tools suffer from the overwhelming
complexity of the user interface they generate which is a severe
problem for the user. One of the possibilities of solving this issue consists
in breaking the uniform universe of keys to several categories and
providing the categories with an exact semantics. Then, only the keys
from a category which is the most interesting to the user at a given
moment can be displayed. The solution presented here is based on a
set of properties of keys, in other words, on a set of labels that are
assigned to every key and determine its membership to a category. In
Table 1, there is an example of a set of possible properties for keys
categorization. The last property undefined represents a set of keys
that do not have their value set and therefor could cause problems in
the output of the configuration. In other words, this property allows
us to describe a form of inconsistency with the instant state of the
configuration.</p>
      <p>property
mandatory
meaningful
undefined
meaning
The key is important to the configured application and
must be filled in.</p>
      <p>The key has sense in the present settings and its
existence is not ruled out by any dependency.</p>
      <p>The key finds itself in an invalid state such as that it
has no value set or the value is in conflict with
dependencies.</p>
      <p>
        Having each key as a feature, this approach resembles feature
modeling [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] with extra-functional attributes. The semantics for
operators and dependencies, however, is different.
      </p>
      <p>The distribution of keys into categories does not have to be static,
some keys can change their roles during the configuration process
in response to an outer activity (a dependency event, user input). A
mechanism is needed to control the development of the categories.
For this, Freeconf uses rules to control the propagation of properties.
The current set of rules in Freeconf has been constructed by hand
and tested only empirically; it has not been proved, whether the rules
are sound or complete. Techniques of the rule-based constraint
programming can provide a proof; however, one must first give a formal
description to the rules.</p>
      <p>The rest of this paper is divided as follows. In Section 2, a brief
introduction to Rule-Based constraint programming is presented.
Section 3 describes the structure of Freeconf and a set of properties used
in the tool. Section 4 introduces the way Freeconf handles
propagation of properties. Finally, Section 5 presents a formalized set of
rules, and Section 6 concludes.
2</p>
    </sec>
    <sec id="sec-3">
      <title>Rule-based Constraint Programming</title>
      <p>
        Rule-Based constraint programming is a special case of a more
general constraint programming studied in [
        <xref ref-type="bibr" rid="ref12 ref4 ref8">4, 8, 12, 13</xref>
        ]. Constraint
programming is an alternative approach to programming in which a
model of a problem is declarative, and then it is solved by general
or domain-specific methods. The model is formed by a set of
constraints (requirements) on variables so that acceptable variable
assignments correspond to solutions to the problem [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Following [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ],
let us assume a sequence of variables
with respective domains
      </p>
      <p>X = x1; : : : ; xn</p>
      <p>D1; : : : ; Dn;
so each xi takes its value from the set Di.</p>
      <p>Definition A constraint C on X is a pair hCR; Xi where CR is an
n-ary relation over the domains Di, i.e., CR D1 : : : Dn; of
solutions to the constraint.</p>
      <p>Definition A constraint satisfaction problem (CSP) is a triple
hC; X; Di where X = x1; : : : ; xn is a finite sequence of variables
with respective domains D = D1; : : : ; Dn, and C is a finite set of
constraints, each on a sub-sequence of X.</p>
      <p>Definition A solution to the CSP hC; X; Di is an element d 2 D1
: : : Dn such that for each constraint C 2 C on a sequence of
variables Y it holds d [Y ] 2 C where d [Y ] stands for a projection of d to
Y = xi(1); : : : ; xi(l), i.e., d [Y ] = di(1); : : : ; di(l). Sol (hC; X; Di)
will denote the set of all solutions to the CSP hC; X; Di.</p>
      <p>
        There exist general algorithms for solving a CSP [
        <xref ref-type="bibr" rid="ref8">8, 14</xref>
        ] and even
entire frameworks, such as Skyblue [15], ECLiPSe [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], and Minion
[
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]..
      </p>
      <p>
        The core concept of Rule-Based programming is a rule. Rules are
condition-action pairs where the condition part is used to determine
whether the rule is applicable and the action part defines the action
to be taken [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. A formal definition of a rule taken from [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] follows.
Definition Assume that A and B are sets of constraints such that the
constraints in A and B are on the variables X with domains D. The
expression B A is a constraint propagation rule. A is called the
condition and B the body of the rule. Rules act as functions on CSPs.
The application of a rule to a CSP with the variables X is given by
(B
      </p>
      <p>A)(hC; X; Di) :=
hC [ B; X; Di
hC; X; Di
ifA C;
otherwise:</p>
      <sec id="sec-3-1">
        <title>The rule B</title>
      </sec>
      <sec id="sec-3-2">
        <title>A is correct if Sol(hA; X; Di)</title>
        <p>Sol(hB; X; Di):</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Freeconf</title>
      <p>To help the user to overcome difficulties of software configuration,
the project Freeconf has been established. The purpose of this project
is to unify the existing configuration process and to assist the user
by automatically creating the configuration dialog window similar
to one in Fig.1. The configuration process must be smooth from the
point-of-view of the user: the dialog must fit nicely into the desktop
environment, configuration options must be presented in the logical
order, and only what is crucial to fill in should be shown. To better
understand how Freeconf addresses these tasks, a short description
of its inner structure is presented.
The project consists of several components as shown in Fig.2. The
most important one is the Freeconf library which contains the
entire functionality. The library is shared by graphical client
applications (clients), the sole purpose of which is to present a configuration
dialog to the user. One can have many different clients, each for one
desktop environment. The clients are supposed to be very small (less
than a 1000 lines of code), so it should be very simple to create
another one. To be able to configure an existing application, the library
needs to be provided with an appropriate configuration package. The
package is a collection of XML files that semantically describe the
configuration file the application understands (native configuration
file). It contains a list of all keys, their default values, properties and
dependencies, and a rough description of what the resulting dialog
should look like. Keys can be organized into configuration sections.
The number of keys can vary depending on the configured
application. Usually, configuration packages have tens to hundreds of keys,
but some configurations utilize up to thousands of keys like in the
case of the Linux kernel.</p>
      <p>When a package is loaded, the library constructs three tree
structures — a template tree for storing key properties, a configuration
tree for storing values and handling dependencies, and a GUI tree
for dialog modeling. The trees are interconnected, and one can freely
traverse from one node of one tree to the matching node of another
tree. Leave nodes correspond to keys and their properties, the
nonleave nodes represent configuration sections (there is always a
rootsection present). When a client needs data for dialog construction,
it connects to the library through the client-library interface and
obtains various properties for each node. Fig.3 shows the situation. The
interface forms a tree which is placed between the GUI tree in the
library and the hierarchy of GUI elements (group-boxes, line edits,
check-boxes, etc.). The client organizes the GUI elements to another
tree that is very closely related to the actual look of the dialog.
client tree
group-box
check-box group-box
i
n
t
e
r
f
a
c
e
library GUI tree</p>
      <p>Every key type adds additional properties, e.g., a number can have
a minimum, a maximum, and a step by which the value increments
and decrements. String keys usually have a regular expressions
associated with them constraining their value.</p>
      <p>While the basic set of properties would generally suffice to
construct a dialog, the dialog would look overfilled and confusing to the
user. That is why another set of properties was added to Freeconf
which would enable splitting keys into different categories. Thus,
only keys from a specific category can be shown to the user. The
current set of properties which extends those presented in Table 1 is
summarized in Table 3.</p>
      <p>property
static mandatory
static active
dynamic mandatory
dynamic active
inconsistent
empty
meaning
If it is true, the key is mandatory and must be
always shown.</p>
      <p>If it is false, the key is not visible to the
client.</p>
      <p>This property can only be set from a
dependency handler. If it is true, the key is
mandatory and must be shown. This property has
no meaning when the static mandatory
property is set to false.</p>
      <p>This property can only be set from a
dependency handler. If it is false, the key does not
have sense in the current settings. This
property has no meaning when the static active
property is set to false.</p>
      <p>The key does not have neither a value, nor a
default value set and is dynamically
mandatory and dynamically active.</p>
      <p>The property is only applicable to section
nodes. It states whether the section is empty,
i.e., all its children are hidden.</p>
      <p>All static properties are stored in the package as a part of a
template describing the native configuration file, while the dynamic ones
are a part of a file describing dependencies.</p>
      <p>Mandatory property states, whether the key is important or not.
Important keys should be visible in the dialog while non-mandatory
keys can be hidden, so the dialog becomes less confusing. The static
version of this property is used for packages with no dependencies
or for keys unaffected by any dependency. The dynamic version can,
as in the current version of Freeconf, override the static state only
when the static mandatory property is not false (that means static
non-mandatory keys are definite).</p>
      <p>Active property has two different semantics. In its static version, it
is used to prevent the library from announcing the key to the client.
In other words, if the property is set to false, the key is virtually
commented out. It is easier to disable the key that way than to delete
it from the entire package which is non-trivial. The dynamic version
of this property serves the purpose of ruling out situations that do not
have sense (e.g., when the user checks the "no sound" option, setting
the "volume" option becomes nonsensical and this option should be
left out from the dialog or at least disabled).</p>
      <p>Inconsistency is a special situation when the key does not have any
value set, but it is important to the configured program. This can
happen, especially when the configuration is run for the first time, and
there exist keys which do not have default value set by the creator
of the package. When this situation occurs, the user has to be told
so and must be able to solve the problem with minimum effort. It
follows from the above mentioned description of the properties there
are situations where inconsistency is acceptable and the user needs
not to be alerted (e.g., when the key is statically inactive). In fact,
there exists exactly one combination of the properties which needs
some user assistance (i.e., the client must be informed) — the key
is dynamically mandatory, dynamically active, and inconsistent at
the same time. In other situations, such as when the key is only
dynamically active but not mandatory, the key is simply left out from
the native output (so the native output will always contain only keys
with a defined value).</p>
      <p>Emptiness is an important property which naturally arose from the
need of hiding non-mandatory keys. The user cannot be distracted by
optional keys, so those must be hidden. If there is a section containing
only hidden keys, there is no point of displaying it. The empty
property can help the client with hiding of unnecessary GUI elements.
4</p>
    </sec>
    <sec id="sec-5">
      <title>Properties Propagation</title>
      <p>Freeconf maintains properties in connected tree structures as
described in Section 3. The Freeconf library must be able to inform
the clients about the state of each property in every node the client–
library interface announces. For leave nodes, this becomes trivial. For
non-leave nodes, however, the state of a property must reflect what is
happening in all of node’s direct successors.
4.1</p>
    </sec>
    <sec id="sec-6">
      <title>Propagation Mechanism</title>
      <p>To keep record of the number of properties in children nodes,
every section has a set of counters, each bound to a specific property.
Counters hold how many times the matching property occurs in the
successors. For example, for the inconsistent property the
"inconsistent count" counter exists in each section and if it is, for instance, set
to two, then there are exactly two children nodes that are inconsistent.</p>
      <p>If a counter reaches zero, a message about the change of a property
is sent to the client from the affected section. The section must also
inform its parent (i.e., another section) about the change, so the
appropriate counter of the parent can be adjusted. Similarly, a message
must be sent whenever a nullified counter is incremented.</p>
      <p>The entire propagation schema can be seen in Fig.4.</p>
      <p>When the state of a property (inconsistency in this case) has been
changed, the node notifies its parent about the change. The parent
section increments or decrements the matching counter and checks,
whether the counter is zero or not. If it is zero, the notification is
propagated further up the tree. This leads to the expected behavior in
the client since every path leading to an inconsistent key is marked,
so the client can render it appropriately. The top-level section (a
configuration tab in fact) also knows about the overall state of all keys
underneath and it can, for instance, forbid creating the native output
until all inconsistencies have been resolved. This method requires a
protection mechanism against resending the same message. An
obvious solution would be to remember the last state of each property
for every node and inform the parent only if the state changes.</p>
      <p>For this algorithm to be valid, all counter must be set to the correct
value at start time. This is called the initialization phase. All counters
are set to zero, and the tree is traversed by depth-first search. Every
leave node is evaluated and the existing propagation framework is
used to initialize all counter values.</p>
      <p>It is also possible to emit a global change, for instance, when the
user overrides the mandatory property and enforces showing all keys
which are dynamically active. In such a case, all leave nodes are
asked to reevaluate their states similarly to the initialization phase.
In fact, the initialization phase is a form of a global change.
5</p>
    </sec>
    <sec id="sec-7">
      <title>Rules</title>
      <p>The above mentioned algorithm was implemented in an ad hoc
manner. All property evaluation procedures were tailored to the
semantics described in Section 3. The result is a set of rules implemented
as condition statements in the source code.</p>
      <p>The goal of this section is to bring a formal description of the
resulting rules based on definitions from Section 2.
5.1</p>
    </sec>
    <sec id="sec-8">
      <title>Formal Description</title>
      <p>Let K = fk1; : : : ; kng be a set of indices for keys and S =
fs1; : : : ; slg a set of indices for sections. Let parent : K [ S !
S [ f;g be a mapping returning for each key or section its parent.
The symbol of an empty set is returned for the top-level section. All
properties of keys will be modeled as Boolean variables. For
example, dynactx will denote a dynamic active property of a key with an
index x 2 K. Together with the properties from Table 3, variables
def valsetx and valsetx will be used to describe the states where a
default value and a value have been set to the key, respectively.</p>
      <p>Section counters will be modeled as non-negative integer
variables. As an example, inconsistcounty represents the state of an
inconsistent counter in a section with an index y 2 S. If the index is
;, no action is performed.</p>
      <p>Moreover, there is a Boolean variable called showallact which
enables showing even non-mandatory properties (i.e., showing all
active keys regardless of the state of the mandatory property). The list
of all rules currently used in Freeconf follows.</p>
      <p>In the initialization phase, dynactx and dynmanx are set
according to the static version of the properties and inconsistentx is
evaluated for the first time.</p>
      <p>When the valsetx variable changes its value, these rules are
applied to update inconsistency.</p>
      <p>:inconsistentx
:(:def valsetx ^ :valsetx)^
^ inconsistentx 8x 2 K</p>
      <p>Whenever either dynmanx or dynactx variable changes its
value, the inconsistent state of the node must be reevaluated and the
parent’s counter is adjusted accordingly.</p>
      <p>dynactx
dynmanx
inconsistentx
inconsistentx
staticactx 8x 2 K
staticmanx 8x 2 K
(:def valsetx ^ :valsetx)^
^ dynmanx ^ dynactx 8x 2 K
(:def valsetx ^ :valsetx)^
^ :inconsistentx ^ dynmanx^</p>
      <p>dynmanx ^ inconsistentx ^ dynactx 8x 2 K
dec(inconsistcountparent(x))</p>
      <p>(dynmanx ^ inconsistentx ^ :dynactx)_
_ (dynactx ^ inconsistentx^
^ (:dynmanx _ :inconsistentx)) 8x 2 K</p>
      <p>If the inconsistcounty alters, the section must test if it is not
necessary to propagate the information further.</p>
      <p>dec(inconsistcountparent(y)) ^ :inconsistenty</p>
      <p>(inconsistcounty = 0) ^ inconsistenty 8y 2 S
inc(inconsistcountparent(y)) ^ inconsistenty</p>
      <p>:(inconsistcounty = 0) ^ :inconsistenty 8y 2 S
The mandatoryshowny and activeshowny counters change
when a dependency alters dynmanx and dynactx, respectively. It
must be also tested whether the static equivalents to the respective
properties have not been set to false.</p>
      <p>:emptyy ^ dec(sectionshownparent(y))</p>
      <p>emptyy ^ :(sectionshowny = 0)_
_ (showallact ^ :(activeshowny = 0))_
_ (:showallact ^ :(activeshowny = 0)^
^ :(mandatoryshowny = 0)) 8y 2 S
emptyy ^ inc(sectionshownparent(y))</p>
      <p>:emptyy ^ ((mandatoryshowny = 0)^
^ (sectionshowny = 0)) _ ((activeshowny = 0)^
^ (sectionshowny = 0)) 8y 2 S
5.2</p>
    </sec>
    <sec id="sec-9">
      <title>Weaknesses of Freeconf Design</title>
      <p>It can be easily seen that some of the rules are not optimal. For
instance, the second rule in 1 could be shortened by leaving out the last
occurrence of inconsistentx. In 2, the rules should be mutually
exclusive, but it is non-trivial showing the head formulas really behave
that way.
(1)
(2)</p>
      <p>Clearly, a problem of the current implementation is the lack of
formal description. All condition statements are scattered across
the source code, and it is very complicated maintaining them even
though the number of the properties is very small. The design is also
not very robust since a small change in any of the conditions will
render the system non-functioning. This actually happened — one
conjunction was overwritten by mistake by a disjunction, and the
client started behaving strangely. It was obvious there was a mistake
in a condition, but it was difficult to find it.
6</p>
    </sec>
    <sec id="sec-10">
      <title>Conclusion</title>
      <p>This paper introduces Freeconf, a multi-platform configuration tool,
and a technique which reduces the problem of very complex
graphical user interfaces that are often generated by automatic
configuration tools. The technique is based on splitting configuration options
into categories using properties and forming a set of rules that
control the dynamics of the evolution of the categories. A set of rules has
been proposed to be used in Freeconf to simpify its graphical output.
The rules have been implemented in the source code as a
proof-ofconcept, and it has been empirically verified that the rules work. In
this paper, a formal description of the rules has been presented based
on the theory of Rule-Based programming. The proof of soundness
and completeness of the rules is subject of future work.
7</p>
    </sec>
    <sec id="sec-11">
      <title>Acknowledgments</title>
      <p>This work was partially supported by the project of the
Student Grant Agency of the Czech Technical University in Prague
No. SGS11/161/OHK4/3T/14, 2011-13 and Research Direction
Project of the Ministry of Education of the Czech Republic No.
MSM6840770010.
[13] K. Marriott and P.J. Stuckey, Programming With Constraints: An
Introduction, Mit Press, 1998.
[14] Nico Roos, Yongping Ran, and H. Jaap van den Herik, ‘Combining
Local Search and Constraint Propagation to Find a Minimal Change
Solution for a Dynamic CSP’, in Proceedings of the 9th International
Conference on Artificial Intelligence: Methodology, Systems, and
Applications, AIMSA ’00, pp. 272–282, London, UK, UK, (2000).
SpringerVerlag.
[15] V. Saraswat and P. Van Hentenryck, Principles and Practice of
Constraint Programming: The Newport Papers, chapter The SkyBlue
Constraint Solver and Its Applications, 385–405, Mit Press, 1995.
[16] Sven Vermeulen, ‘Linux sea’. http://swift.siphos.be/linux_sea, 2012.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Paul</given-names>
            <surname>Anderson</surname>
          </string-name>
          ,
          <article-title>LCFG: A Practical Tool for System Configuration</article-title>
          ,
          <source>The USENIX Association</source>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Paul</given-names>
            <surname>Anderson</surname>
          </string-name>
          , Patrick Goldsack, and Jim Paterson, 'SmartFrog Meets LCFG:
          <article-title>Autonomous Reconfiguration with Central Policy Control'</article-title>
          ,
          <source>in Proceedings of the 17th USENIX conference on System administration, LISA '03</source>
          , pp.
          <fpage>213</fpage>
          -
          <lpage>222</lpage>
          , Berkeley, CA, USA, (
          <year>2003</year>
          ). USENIX Association.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Paul</given-names>
            <surname>Anderson</surname>
          </string-name>
          , Alastair Scobie, and Division Of, '
          <article-title>LCFG - the Next Generation'</article-title>
          ,
          <source>in UKUUG Winter Conference. UKUUG</source>
          , (
          <year>2002</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>K.R.</given-names>
            <surname>Apt</surname>
          </string-name>
          ,
          <source>Principles of Constraint Programming</source>
          , Cambridge University Press,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>K.R.</given-names>
            <surname>Apt</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Wallace</surname>
          </string-name>
          ,
          <article-title>Constraint Logic Programming Using ECLiPSe</article-title>
          , Cambridge University Press,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <surname>Krzysztof</surname>
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Apt</surname>
          </string-name>
          and Eric Monfroy, '
          <article-title>Constraint Programming viewed as Rule-based Programming', CoRR, cs</article-title>
          .
          <source>AI/0003076</source>
          , (
          <year>2000</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>David</given-names>
            <surname>Benavides</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Pablo</given-names>
            <surname>Trinidad</surname>
          </string-name>
          , and Antonio Ruiz-Cortés, '
          <source>Automated reasoning on feature models'</source>
          ,
          <source>in Proceedings of the 17th international conference on Advanced Information Systems Engineering</source>
          , CAiSE'05, pp.
          <fpage>491</fpage>
          -
          <lpage>503</lpage>
          , Berlin, Heidelberg, (
          <year>2005</year>
          ). Springer-Verlag.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Sebastian</given-names>
            <surname>Brand</surname>
          </string-name>
          ,
          <article-title>Rule-Based Constraint Propagation Theory and Applications</article-title>
          ,
          <source>Ph.D. dissertation</source>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>David</given-names>
            <surname>Fabian</surname>
          </string-name>
          ,
          <article-title>System for Simplified Generating of Configurations, Master thesis</article-title>
          ,
          <source>Faculty of Nuclear Sciences and Physical Engineering</source>
          , Prague,
          <year>2011</year>
          . in Czech.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>Jacques</given-names>
            <surname>Gélinas</surname>
          </string-name>
          . Linuxconf homepage,
          <year>2005</year>
          . http://www.solucorp.qc.ca/linuxconf/.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Ian</surname>
            <given-names>P.</given-names>
          </string-name>
          <string-name>
            <surname>Gent</surname>
          </string-name>
          , Chris Jefferson, and Ian Miguel, '
          <article-title>Minion: A fast scalable constraint solver'</article-title>
          ,
          <source>in Proceedings of ECAI 2006, Riva del Garda</source>
          , pp.
          <fpage>98</fpage>
          -
          <lpage>102</lpage>
          . IOS Press, (
          <year>2006</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>Michael</given-names>
            <surname>Gleicher</surname>
          </string-name>
          , '
          <article-title>Practical issues in graphical constraints'</article-title>
          ,
          <source>in Principles and Practice of Constraint Programming</source>
          , pp.
          <fpage>407</fpage>
          -
          <lpage>426</lpage>
          . MIT Press, (
          <year>1995</year>
          ).
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>