<!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>CCononcecpeptutualalEExpxlpolroartaitoinonofofSoSfotfwt waraereStSrturcutcutruer:eA: ACCololellcetcitoinonofofEExaxmamplpelses</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Richard Cole</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Thomas Tilley</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jon Ducrou</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Richard Cole</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Thomas Tilley</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jon Ducrou</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>SchoUolniovfeCrsoitmypo.fSWcio.oalnodngIonnfog. Tech. UWniovoerlosintgyoonfgW</institution>
          ,
          <addr-line>Aouoslotrnagloiang Woolongong</addr-line>
          ,
          <country country="AU">Australia</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>SchoUolniovfeIrnsiftoy. oTfecQhu. eaenndslaEnledc. Eng. UnSivte.rLsiutcyiao</institution>
          ,
          <addr-line>f AQuuseternalsilaand</addr-line>
        </aff>
      </contrib-group>
      <fpage>135</fpage>
      <lpage>148</lpage>
      <abstract>
        <p>Software systems are often highly structured, consisting of artifacts (types, methods, variables, and packages), and relationships between these artifacts. Domain models, meta models, and software design documentation provide additional artifacts such as roles, associations, use cases, and paragraphs of text. This paper describes, and demonstrates the use of a tool for software structure understanding. The tool consists of a knowledge base containing software artifacts, relationships between artifacts, and rules for generating new relationships. The knowledge base is then explored using formal concept analysis (FCA). Exploration of the software structure via FCA is useful in: (i) understanding the software structure, (ii) the recognition of parts of the software structure violating design principles, (iii) the reorganisation of type and package hierarchies, and (iv) retrieving artifacts of the software development process.</p>
      </abstract>
      <kwd-group>
        <kwd>formal concept analysis</kwd>
        <kwd>software engineering</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>The design of software systems is fundamentally a human activity and therefore
necessarily involves human understanding of software structure. This observation
coniflcts with the complexity of modern software systems and so there is a need
for automated tools which help humans understand software systems. Such tools
need to be able to summarise aspects of the software structure so as not to
overload the human user with too much information. To do this it seems natural
to exploit the explicit generalisation/specialisation in hierarchies and to allow
diagrams to range in their level of abstraction from very general to very specific.</p>
      <p>
        The process of software design and implementation often contains many
arbitrary decisions, such as the name of methods or variables or indeed sometimes
the structure of a class hierarchy. As the design proceeds these decisions need to
be reviewed in order to achieve consistent, orthogonal and simple designs. Agile
methods, and extreme programming (XP) in particular, advocate regular
refactoring activities undertaken to regularise and revise the software structure [
        <xref ref-type="bibr" rid="ref2 ref8">8,
2</xref>
        ].
      </p>
      <p>Our tool, Conceptual Analysis of Software Structure (CASS), attempts to
address these requirements. The architecture of CASS is shown in Figure 1.
Source code analysers and profilers produce information which is stored in a
knowledge base. A rule based system is then used to extend the knowledge base
with new relationships and artifacts. Graph based queries define an aspect of
the code to be explored and are used to generate result sets that are visualised
using concept lattices. Hypotheses and questions may then be investigated by (i)
generating new lattices, perhaps displaying new aspects of the software structure;
and (ii) by navigating back to the source artifacts within the software or its
documentation. Since each concept lattice is generated from a query graph, a
natural renfiement ordering allows general views to be elaborated and made more
specific. Thus the user is able to progress from a general view to a more specific
view, or vice versa. In addition, the theory of formal concept analysis (FCA)
allows two or more aspects of the software structure to be combined coherently
in nested line diagrams.</p>
      <p>This paper presents and discusses examples of concept lattices extracted
during the analysis of a piece of software called OntoRama. OntoRama is an
open source project of a reasonable size that has been in development for several
years, has had several developers, and has gone through a number of signicfiant
design changes. Due to these properties we think that OntoRama is a realistic
example of software analysis. OntoRama was choosen because although we were
not familiar with the software design we have had some access to the software
developers who worked on OntoRama. Thus the examples in this paper are
constructed from the point of view of a developer who is new to piece of software
and seeking to understand it for the purpose of maintaining or extending it. This
is a common situation in the software development industry.</p>
      <p>The examples have also been choose to illustrate a range of activities made
possible within the CASS framework. The rfist example (Section 4) is an analysis
of the call graph between top level packages in OntoRama and gives an indication
of how modular the source code is. It shows which packages are dependent on
which other packages. The second example shows how an aspect of the call graph
can be investigated by unfolding the lattice structure. The third example, still
making use of the call graph, focuses attention on two specicfi packages. The
forth example shows how FCA can be used to analyse the naming of packages
to gain insight into the software structure. In the ffith example, two different
aspects of the software structure — one derived from the call graph information,
and a second derived from package naming — may be combined together in a
nested line diagram.</p>
      <p>Before discussing the examples we first review some related work and then
explain how concept lattices are produced in response to graph queries.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Related Work</title>
      <p>
        Tilley et al. [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ] categorise the use of FCA for software engineering via its
application to either early phase or late phase development activities in their survey
of FCA approaches to software engineering. Early phase approaches include the
identification of candidate classes in use case descriptions [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], reconciling use
cases from multiple stake-holders [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], software component retrieval [
        <xref ref-type="bibr" rid="ref11 ref7">11, 7</xref>
        ], and
the visualisation of formal specicfiations [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ].
      </p>
      <p>
        Late phase approaches focus on the maintenance and reengineering of
software. These approaches include; (i) identification of objects [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], class hierarchies
or modules in legacy code [
        <xref ref-type="bibr" rid="ref10 ref12 ref15">10, 15, 12</xref>
        ], (ii) restructuring of class hierarchies based
on method names [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], method usage [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], associations, or documented
properties [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], (iii) analysis of software congfiurations [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], (iv) proposing a code
review order for methods of classes based on call graphs [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], and (v) analysis of
execution profile information [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
      </p>
      <p>
        There are a number of approaches that store and visualise software structure
as graphs. Two well known examples being Rigi [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] and SHriMP[
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. Similar to
our approach, Rigi stores software information as triples and thus is compatible
and possibly complimentary to our approach.
      </p>
      <p>
        The novelty of our approach lies in the exploration of program information
stored in a knowledge base using FCA. The techniques presented by other
authors generally focus on a single aspect of software structure and analyse just
that aspect. For example Snelting and Lindig consider preprocessor statements
in C programs, while Snelting and Tip consider the static call graph in a C++
program. Our approach provides a mechanism to bring these different aspects
of software structure together in a single framework and application. By using
a graph based query language we can exploit the implicit structure captured in
class hierarchies, package hierarchies, and call graphs to help the user focus on
particular aspects of the software structure. Our approach differs from tools such
as Rigi and SHriMP in that the data under analysis is organised using concept
lattices. These lattices are algebraic structures and convey information about
the logic underlying the data. The user must be trained to read concept lattices
in the same way that users learn to interpret UML diagrams. Although a full
exposition of the mathematics underlying FCA takes several years of study, an
understanding of the diagrams is usually acquired in about half an hour [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
3
      </p>
    </sec>
    <sec id="sec-3">
      <title>From</title>
    </sec>
    <sec id="sec-4">
      <title>Graph Queries to Concept Lattices</title>
      <p>In some instances the query is made up of several graphs. In this case a
binary relation is returned from the result set of each graph and a union is
taken between these binary relations to form the formal context. This allows
two aspects of a software structure to be combined within a single diagram.</p>
      <p>The graph in Figure 2 can be expressed in a linear form. The linear form is
a list of triples separated by commas. Each triple corresponds to an edge in the
graph. Two triples can be merged together if the last node of the first triple is
the same as the rfist node of the second triple. The linear form for Figure 2 is:
caller in-t g in ontorama,
caller calls-t callee,
callee in-t m in ontorama.</p>
      <p>The objects of the formal context are retrieved using the following query
graph: “ g in ontorama.” While the attributes are retrieved using: “ m in
ontorama.” Having separate queries for the object and attribute sets is
important because otherwise objects and attributes that one might expect, for
example in a lattice showing the call structure of the top level packages, can
otherwise be omitted from the diagram and thus be a cause of confusion. It is
also often the case that these otherwise omitted objects and attributes are a
point of interest in the diagram. When they are included, as occurs with explicit
query graphs for the object and attribute sets, then they are attached to the top
and bottom concepts respectively.</p>
      <p>For our knowledge base we use a triple store called Kowari3. Kowari is
designed for storing and retrieving RDF statements and scales to hundreds of
millions of triples. Both our graph queries and our rules are translated
automatically into iTQL which is a query language of Kowari. iTQL is similar at
the syntax level to SQL. Our requirements are somewhat simpler than those of
RDF since we: (i) don’t make use of namespaces, (ii) don’t distinguish between
resources and literals, (iii) we don’t store anonymous nodes within the database,
(iv) are rules have no anonymous nodes in their conclusions and so our rule
system is decidable and has a finite closure. As a rough guide it takes about 10
seconds to import OntoRama into Kowari and then another 10 or so seconds
to calculate the rule closure. Subseqent queries are usually processed in under a
second.
4</p>
    </sec>
    <sec id="sec-5">
      <title>Example: Call Graphs</title>
      <sec id="sec-5-1">
        <title>3 See http://www.kowari.org</title>
        <p>call graph which is generated by recording the actions of a running program. By
taking the transitive closure, if method A calls method B which in turn calls
method C then we also record a transitive call from A to C.</p>
        <p>The reason, in this instance, for taking the transitive closure is to focus on
whether or not the top level packages fall neatly into layers with classes from
upper layers making calls to classes from lower layers. If such layers exist in the
call graph then we expect to see them in the concept lattice. In contrast, if there
are cyclic dependencies then we shall expect to see large intervals between the
object and attribute concepts for a package.</p>
        <p>OntoRama has cyclic dependencies. To understand why these result in large
intervals let us consider an example. Consider the interval formed by the object
and attribute concepts for ontorama.ui. The object concept for ontorama.ui is
near the bottom of the diagram while the attribute concept for ontorama.ui is
around the middle. Objects concepts that occur in the interval both make calls
into ontorama.ui and are themselves called into from within ontorama.ui. We
know these packages make calls into ontorama.ui because they have
ontorama.ui as an attribute. We can also assume that ontorama.ui calls into these
packages because the object concepts for these packages are above the object
concept for ontorama.ui, and it is usual for each package to make calls into
itself.</p>
        <p>The top of the concept lattice is a chain product. With the attributes
OntoramaConfig, and util forming one chain, the attribute backends forming
another, and the conjunction of ontotools and model forming yet a third. These
chains can be thought of as dimensions. The model package uses all four
dimensions, while importer leaves out util and TestPackage leaves out both
OntoramaConfig and util. The attributes at the top of the diagram can be
considered low level packages because they are called into by many other
packages.</p>
        <p>All most all of these low level packages have large intervals indicating that
they both make calls into many packages, and are also called into from within
many packages. The exception is util which has a relatively small interval.
Even so the util package is still involved in cyclic dependencies with both
OntoramaConfig and backends.</p>
        <p>The concept for TestPackage sits out to the right being mutually exclusive
with many of the attributes in the diagram. It calls very few packages and is
itself called by very few packages. The TestPackage class initiates tests stored
within the other packages. Since TestPackage only makes calls ontotools and
model we can assume that many of the packages don’t have testing. Another
possibility is that there are other unit tests in the other packages, but they have
not been hooked into the TestPackage class.</p>
        <p>The lower part of the diagram has to do with ui. The ui package is called
by several packages and also makes calls to many packages. We see that the
view package is both called by ui and also makes calls into the ui package. We
see that view occurs as an attribute fairly low down in the structure indicating
that it is a relatively high level package, being called from relatively few other
packages, but itself making calls into many other packages. By seeing that the
attribute concept for views is on the top plane of the lattice (visually speaking)
we can see that it does not make calls into the backends package which is the
attribute forming the lower plane of the lattice.</p>
        <p>The ui package is somewhat in the middle of the structure both being called
by many classes and calling many classes. To see whether the substructure of
the ui package reeflcts this we unfold the ui package. This forms the second
example.
5</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>Example: Unfolding a Package</title>
      <p>caller in-t g in ontorama,
caller calls-t callee,
callee in-t m in ontorama.</p>
      <p>OR
caller in-t g in ontorama,
caller calls-t callee,
callee in-t m in "ontorama.ui".</p>
      <p>The lattice has been drawn as a locally scaled nested line diagram. The
attributes of the inner scale are the contents of the ui package while attributes
of the outer scale are the same in the first Example.</p>
      <p>The rfist interesting aspect is that the inner scale is a very simple lattice
being composed of a single chain. By far the majority of the content of ui
appear as attributes of the bottom concept, which is instantiated for the rfist
time in the object concept for ui. This indicates that this part of the ui module
is only used by the ui module itself. The other three parts which are called
by other packages are: the class OntoRamaApp, the class ErrorDialog, and the
package events. Because OntoRamaApp is attached to the top concept of the
inner scale we can infer that everything that calls ui also calls OntoRamaApp.
The only package to call ui and not call ErrorDialog is ontotools. While
events are accessed (perhaps in the mode of event creation) from the importer
and backends packages.</p>
      <p>Returning to our initial question of whether or not the organisation of ui
reflects the usage of ui by other packages and classes. We can say that usage of
ui by other packages is not a primary concern of ui since it is not used by many
other classes and packages. Therefore it can be said that its package structure is
not organised in that way. Constructing the locally scaled nested line diagram
however has provided an organisation over the contents of the ui package that
is aligned with its usage by other packages.
6</p>
    </sec>
    <sec id="sec-7">
      <title>Example: Focused Call Graph</title>
      <p>caller in-t g in "ontorama",
caller calls-t callee,
callee in-t m in "ontorama.ui.events".</p>
      <p>The concept lattice shows that the ui class uses all the events in the package,
and also that, the packages importer, views and backends, each have their own
events that are not shared with the other packages.</p>
      <p>It is curious that of three events, according to their names, are associated
with the life cycle of a query, they are each accessed separately from the three
different packages. QueryEndEvent is access from importer, QueryStartEvent
is accessed from backends, and QueryCancalledEvent is accessed from ui. It
ontorama.util
ontorama.model</p>
      <p>ontorama.views
ontorama.views
ontorama.conf
ontorama.OntoramaConfig
ontorama.ui
ontorama.backends
ontorama.ontotools
ontorama.model
ontorama.ui.QueryPanel
ontorama.ui.ConfigurationManager
.o.n.torama.ui.controller
ontorama.ui.action
ontorama.ui.ProxySettings
ontorama.ui.HistoryElement
ontorama.ui .o.n.torama.ui..AboutOntoRamaDialog
ontorama.ui.OntoRamaApp
ontorama.ui.ErrorDialog
ontorama.ui.events
ontorama.TestPackage
ontorama.TestPackage
ontorama.importer</p>
      <p>ontorama.importer
ontorama.ontotools
ontorama.backends
could be that these events are being generated respectively in each of the three
packages. This hypothesis can be verified by submitting the following query 4:
caller in-t g in "ontorama",
caller calls callee in m,
m in-t "ontorama.ui.events",
callee has-name "&lt;init&gt;"</p>
      <p>This process of generating concept lattices, forming hypothesis and then
generation more concept lattices to verify these hypotheses can continue at length
as the programmer becomes slowly more familiar with the structure of the
software. In the interests of showing a variety of techniques we leave this thread
here and move on to the next example.</p>
    </sec>
    <sec id="sec-8">
      <title>7 Example: Package Names</title>
      <p>Packages in Java are identified by path names. The path names contain names
separated by full stops and usually are used to place the packages within a tree
structure. It is interesting however to consider the names in the path name of a
package as attributes in a concept lattice. This has been done for the packages
contained in the org.ontorama.model and the result is shown in Figure 6.</p>
      <sec id="sec-8-1">
        <title>4 &lt;init&gt; is the internal name of Java constructor methods.</title>
        <p>The concept lattice exhibits quite a lot of structure. It is the semi-product of
an M3 and an M2. The M2 says that the model is divided into graph and tree,
while the M3 says that the model is divided into controller, events, and text.
The semi-product produces all combinations between these two structures.</p>
        <p>One may surmise that the reason such an arrangement of the packages exists
within OntoRama is that one of the main developers was familiar with formal
concept analysis. Even so there is an irregularity in the diagram. The attribute
concept for test has an object in its contingent; the package ontorama.model.test.</p>
        <p>It is somewhat curious that both controllers and events could be
partioned into graph and tree packages and that there were no controllers or
events that are shared between graph and tree. One hypothesis is that such
events are also shared perhaps with the ui or view packages and thus are to
be found in ontorama.events or ontorama.controllers. Looking back to the
lattice in Figure 3 we see that there is indeed neither an ontorama.events nor
an ontorama.controller package and thus we can conclude that all events and
controllers associated with the model have been assigned to either the graph or
the view.
8</p>
      </sec>
    </sec>
    <sec id="sec-9">
      <title>Example: Combining Aspects</title>
      <p>Two aspects of the software structure can be combined together within a nested
line diagram. In software structure it is often the case that different aspects
are correlated and a nested line diagram provides a mechanism to look for, and
examine, any such correlations.</p>
      <p>Figure 7 combines two different aspects of software structure. It combines the
static call graph that we saw in the rfist three examples with the package names
that we saw in the previous example. The inner scale organises sub-packages of
the model package according to names in their pathnames, while the outer scale
organises the packages according to which sub-package and classes in the view
class they contain calls into.</p>
      <p>Looking inside the top concept of the outer scale we can see that many
of the packages don’t contain calls into the view package. We can tell this
because the object concept contained in the top concept of the outer scale
has no out scale attributes. The packages not making calls in the view are:
graph.events and graph.test and tree.test. The graph.controller
contains a call to views.textDescription, while tree.controller contains calls
to view.tree and view.hyper. This suggests that view.tree and view.hyper
are views of the tree while, views.textDescription is a view related to the
graph. Interestingly we see that tree.events contains calls to both views.tree
and views.textDescription, breaking the separation of the views into tree and
graph views. The irregularity is curious and can be further investigated by
considering the calls made from tree.events into views.textDescription and
the calls made from graph.controller into views.textDescription.
9</p>
    </sec>
    <sec id="sec-10">
      <title>Conclusion</title>
      <p>In summary, this paper has demonstrated via a number of concrete examples
how FCA, when used in conjunction with a knowledge base augmented by a rule
based system, can be used to explore software structure from different points of
view. We began with a very general lattice summarising the static call graph for
the whole program and then elaborated the diagram to look inside the package.
Having then become interested in a specicfi package we zoomed in and organised
its components based on usage by the top level packages. Changing tack we then
explored the names used in the package structure, before combining two aspects
of software structure — package naming of components in the model package,
and usage by view components. The examples presented here form only a small
part of the exploration techniques afforded by our system.</p>
      <p>Our approach is primarily aimed at human understanding of software
structure with the purpose of refactoring the software to make it simpler and more
uniform. Buy understanding the software structure and identifying places where
it is irregular or doesn’t meet with expectations the user is able to identify
opportunities for refactoring.</p>
    </sec>
    <sec id="sec-11">
      <title>Acknowledgements</title>
      <p>This research was supported by a Postdoctoral Fellowship granted by the
Australian Research Council, an Australian Postgraduate Award, and the Distributed
System Technology Centre. We gratefully acknowledge the contribution of
Peter Becker, and Nataliya Roberts. ToscanaJ5 was used for the preparation of
concept lattice diagrams.</p>
      <sec id="sec-11-1">
        <title>5 See http://toscanaj.sf.net</title>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>T.</given-names>
            <surname>Ball</surname>
          </string-name>
          .
          <article-title>The concept of dynamic analysis</article-title>
          .
          <source>In Proc. of ACM SIGSOFT Symposium on the Foundations of Software Eng</source>
          , pages
          <fpage>216</fpage>
          -
          <lpage>234</lpage>
          ,
          <year>September 1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>K.</given-names>
            <surname>Beck</surname>
          </string-name>
          .
          <source>Extreme Programming Explained: Embrace Change. Addison-Wesley</source>
          ,
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3. K. Bot¨tger,
          <string-name>
            <given-names>R.</given-names>
            <surname>Schwitter</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Richards</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Aguilera</surname>
          </string-name>
          , and D. Molal´.
          <article-title>Reconciling use cases via controlled language and graphical models</article-title>
          .
          <source>In INAP'2001 - Proc. of the 14th Int'l Conf. on Applications of Prolog</source>
          , pages
          <fpage>20</fpage>
          -
          <lpage>22</lpage>
          , Japan,
          <year>October 2001</year>
          . University of Tokyo.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>U.</given-names>
            <surname>Dekel</surname>
          </string-name>
          .
          <article-title>Applications of concept lattices to code inspection and review</article-title>
          .
          <source>In The Israeli Workshop on Programming Languages and Development Environments</source>
          , chapter 6. IBM Haifa Research Lab,
          <string-name>
            <surname>IBM HRL</surname>
          </string-name>
          , Haifa University, Israel,
          <year>July 2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. S. Du¨wel and
          <string-name>
            <given-names>W.</given-names>
            <surname>Hesse</surname>
          </string-name>
          .
          <article-title>Bridging the gap between use case analysis and class structure design by formal concept analysis</article-title>
          .
          <source>In J. Ebert and U</source>
          . Frank, editors,
          <source>Modelle und Modellierungssprachen in Informatik und Wirtschaftsinformatik. Proc. ”Modellierung</source>
          <year>2000</year>
          ”, pages
          <fpage>27</fpage>
          -
          <lpage>40</lpage>
          , Koblenz,
          <year>2000</year>
          . Fo¨lbach-Verlag.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>Peter</given-names>
            <surname>Werner Eklund</surname>
          </string-name>
          , Jon Ducrou, and
          <string-name>
            <given-names>Peter</given-names>
            <surname>Brawn</surname>
          </string-name>
          .
          <article-title>Information visualization using concept lattices : Can novices read line diagrams? In Peter Eklund, editor</article-title>
          ,
          <source>Proc. of the 2nd Int. Conference on Formal Concept Analysis</source>
          , volume
          <volume>2691</volume>
          <source>of LNAI</source>
          , pages
          <fpage>57</fpage>
          -
          <lpage>72</lpage>
          . Springer-Verlag,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>B.</given-names>
            <surname>Fischer</surname>
          </string-name>
          .
          <article-title>Specification-based browsing of software component libraries</article-title>
          .
          <source>In Automated Software Eng</source>
          , pages
          <fpage>74</fpage>
          -
          <lpage>83</lpage>
          ,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>M.</given-names>
            <surname>Fowler</surname>
          </string-name>
          . Refactoring,
          <source>Improving the Design of Existing Code. Addison Wesley</source>
          ,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>R.</given-names>
            <surname>Godin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Mili</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G. W.</given-names>
            <surname>Mineau</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Missaoui</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Arfi</surname>
          </string-name>
          , and T.-T. Chau.
          <article-title>Design of class hierarchies based on concept (galois) lattices</article-title>
          .
          <source>Theory and Application of Object Systems (TAPOS)</source>
          ,
          <volume>4</volume>
          (
          <issue>2</issue>
          ):
          <fpage>117</fpage>
          -
          <lpage>134</lpage>
          ,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>T.</given-names>
            <surname>Kuipers</surname>
          </string-name>
          and
          <string-name>
            <given-names>L.</given-names>
            <surname>Moonen</surname>
          </string-name>
          .
          <article-title>Types and concept analysis for legacy systems</article-title>
          .
          <source>Technical Report SEN-R0017</source>
          ,
          <article-title>Centrum voor Wiskunde en Informatica</article-title>
          ,
          <year>July 2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <given-names>C.</given-names>
            <surname>Lindig</surname>
          </string-name>
          .
          <article-title>Concept-based component retrieval</article-title>
          . In J. Ko¨hler,
          <string-name>
            <given-names>F.</given-names>
            <surname>Giunchiglia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Green</surname>
          </string-name>
          , and C. Walther, editors,
          <source>Working Notes of the IJCAI-95 Workshop:</source>
          Formal Approaches to the Reuse of Plans, Proofs, and Programs, pages
          <fpage>21</fpage>
          -
          <lpage>25</lpage>
          ,
          <year>August 1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <given-names>C.</given-names>
            <surname>Lindig</surname>
          </string-name>
          and
          <string-name>
            <given-names>G.</given-names>
            <surname>Snelting</surname>
          </string-name>
          .
          <article-title>Assessing modular structure of legacy code based on mathematical concept analysis</article-title>
          .
          <source>In Proc. of the Int'l Conf. on Software Eng (ICSE 97)</source>
          , pages
          <fpage>349</fpage>
          -
          <lpage>359</lpage>
          , Boston,
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <given-names>H.A.</given-names>
            <surname>Sahraoui</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Melo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Lounis</surname>
          </string-name>
          , and
          <string-name>
            <given-names>F.</given-names>
            <surname>Dumont</surname>
          </string-name>
          .
          <article-title>Applying concept formation methods to object identification in procedural code</article-title>
          .
          <source>In Proc. of Int'l Conf. on Automated Software Eng (ASE '97)</source>
          , pages
          <fpage>210</fpage>
          -
          <lpage>218</lpage>
          . IEEE,
          <year>November 1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>S.</given-names>
            <surname>Schupp</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Krishnamoorthy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Zalewski</surname>
          </string-name>
          , and
          <string-name>
            <surname>J. Kilbride.</surname>
          </string-name>
          <article-title>The “right” level of abstraction - assessing reusable software with formal concept analysis</article-title>
          . In G. Angelova,
          <string-name>
            <given-names>D.</given-names>
            <surname>Corbett</surname>
          </string-name>
          , and U. Priss, editors,
          <source>Foundations and Applications of Conceptual Structures - Contributions to ICCS</source>
          <year>2002</year>
          , pages
          <fpage>74</fpage>
          -
          <lpage>91</lpage>
          . Bulgarian Academy of Sciences,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <given-names>M.</given-names>
            <surname>Siff</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.</given-names>
            <surname>Reps</surname>
          </string-name>
          .
          <article-title>Identifying modules via concept analysis</article-title>
          .
          <source>In Proc. of the Int'l Conf. on Software Maintenance</source>
          , pages
          <fpage>170</fpage>
          -
          <lpage>179</lpage>
          . IEEE Computer Society Press,
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16. G. Snelting.
          <article-title>Reegineering of configurations based on mathematical concept analysis</article-title>
          .
          <source>Technical report, Technische Universiat¨t Braunschweig</source>
          ,
          <year>1996</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <given-names>G.</given-names>
            <surname>Snelting</surname>
          </string-name>
          and
          <string-name>
            <given-names>F.</given-names>
            <surname>Tip</surname>
          </string-name>
          .
          <article-title>Reengineering class hierarchies using concept analysis</article-title>
          .
          <source>Technical Report RC</source>
          <volume>21164</volume>
          (
          <issue>94592</issue>
          )24APR97, IBM T.J. Watson Research Center, Yorktown Heights, NY 10598, USA,
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18. M.
          <article-title>-</article-title>
          <string-name>
            <surname>A. D. Storey</surname>
            and
            <given-names>H. A.</given-names>
          </string-name>
          <string-name>
            <surname>Mu</surname>
          </string-name>
          <article-title>¨ller. Manipulating and documenting software structures using SHriMP views</article-title>
          .
          <source>In Proceedings of the 1995 International Conference on Software Maintenance (ICSM'95)</source>
          ,
          <year>1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Margaret-Anne D. Storey</surname>
          </string-name>
          , Kenny Wong, and
          <string-name>
            <surname>Hausi</surname>
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Muller</surname>
          </string-name>
          .
          <article-title>Rigi: A visualization environment for reverse engineering</article-title>
          .
          <source>In International Conference on Software Engineering</source>
          , pages
          <fpage>606</fpage>
          -
          <lpage>607</lpage>
          ,
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <string-name>
            <given-names>T.</given-names>
            <surname>Tilley</surname>
          </string-name>
          .
          <article-title>Towards an fca based tool for visualsing formal specifications</article-title>
          . In Contributions to ICCS 2003. Springer-Verlag,
          <year>2003</year>
          . To Appear.
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21. T. Tilley, P.eklund, R. Cole, and
          <string-name>
            <given-names>P.</given-names>
            <surname>Becker</surname>
          </string-name>
          .
          <article-title>A survey of formal concept analysis support for software eng activities</article-title>
          .
          <source>In Proc. of the First Int'l Conf. on Formal Concept Analysis, ICFCA03</source>
          . Springer-Verlag,
          <year>2003</year>
          . To Appear.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>