Davide Ancona's most recent papers
|
[1]
|
D. Ancona, G. Lagorio, and E. Zucca.
Type inference by coinductive logic programming.
In de' Liguoro U. Berardi S., Damiani F., editor,
Post-Proceedings of TYPES 2008, volume 5497 of Lecture Notes in
Computer Science. Springer Verlag, 2009.
[ bib |
.pdf ]
We propose a novel approach to constraint-based type
inference based on coinductive logic programming. That
is, constraint generation corresponds to translation
into a conjunction of Horn clauses P, and constraint
satisfaction is defined in terms of the maximal
coinductive Herbrand model of P. We illustrate the
approach by formally defining this translation for a
small object-oriented language similar to Featherweight
Java, where type annotations in field and method
declarations can be omitted. In this way, we obtain a
very precise type inference and provide new insights
into the challenging problem of type inference for
object-oriented programs. Since the approach is
deliberately declarative, we define in fact a formal
specification for a general class of algorithms, which
can be a useful road maps to researchers. Moreover,
despite we consider here a particular language, the
methodology could be used in general for providing
abstract specifications of type inference for different
kinds of programming languages.
|
|
[2]
|
D. Ancona and G. Lagorio.
Coinductive type systems for object-oriented languages.
In S. Drossopoulou, editor, ECOOP 2009 - Object-Oriented
Programming, volume 5653 of Lecture Notes in Computer Science, pages
2-26. Springer Verlag, 2009.
Best paper prize.
[ bib |
.pdf ]
We propose a novel approach based on coinductive logic
to specify type systems of programming languages. The
approach consists in encoding programs in Horn formulas
which are interpreted w.r.t. their coinductive Herbrand
model. We illustrate the approach by first specifying a
standard type system for a small object-oriented
language similar to Featherweight Java. Then we define
an idealized type system for a variant of the language
where type annotations can be omitted. The type system
involves infinite terms and proof trees not
representable in a finite way, thus providing a
theoretical limit to type inference of object-oriented
programs, since only sound approximations of the system
can be implemented. Approximation is naturally captured
by the notions of subtyping and subsumption; indeed,
rather than increasing the expressive power of the
system, as it usually happens, here subtyping is needed
for approximating infinite non regular types and proof
trees with regular ones.
|
|
[3]
|
D. Ancona and V. Mascardi.
Exploiting Agents and Ontologies for Type- and Meaning-Safe
Adaptation of Java Programs.
In Proceedings of the MALLOW-AWESOME 2009 workshop, volume
494. CEUR Workshop Proceedings, 2009.
[ bib |
.pdf ]
This paper discusses an application of intelligent
software agents and ontologies to solve the problem of
semi-automatic porting of Java programs. We have
designed a system for aiding users to adapt Java code
in a type- and meaning-safe way, when an application
has to migrate to new libraries which are not fully
compatible with the legacy ones. To achieve this, we
propose an approach based on an integration of the two
type-theoretic notions of subtyping and type
isomorphism with ontology matching. While the former
notions are needed to ensure flexible adaptation in the
presence of type-safety, the latter supports the user
to preserve the meaning of names that appear in the
program to be adapted. Intelligent agents control the
different components of the system and interact with
other agents in order to provide the final user with
the semi-automatic porting service he/she required.
|
|
[4]
|
A. Cuni, D. Ancona, and A. Rigo.
Faster than C#: efficient implementation of dynamic languages on
.NET.
In ICOOOLPS '09: Proceedings of the 4th workshop on the
Implementation, Compilation, Optimization of Object-Oriented
Languages and Programming Systems, pages 26-33, New York, NY, USA,
2009. ACM.
[ bib |
DOI |
.pdf ]
The Common Language Infrastructure (CLI) is a virtual
machine expressly designed for implementing statically
typed languages such as C#, therefore programs written
in dynamically typed languages are typically much
slower than C# when executed on .NET. Recent
developments show that Just In Time (JIT) compilers can
exploit runtime type information to generate quite
efficient code. Unfortunately, writing a JIT compiler
is far from being simple. In this paper we report our
positive experience with automatic generation of JIT
compilers as supported by the PyPy infrastructure, by
focusing on JIT compilation for .NET. Following this
approach, we have in fact added a second layer of JIT
compilation, by allowing dynamic generation of more
efficient .NET bytecode, which in turn can be compiled
to machine code by the .NET JIT compiler. The main and
novel contribution of this paper is to show that this
two-layers JIT technique is effective, since programs
written in dynamic languages can run on .NET as fast as
(and in some cases even faster than) the equivalent C#
programs. The practicality of the approach is
demonstrated by showing some promising experiments done
with benchmarks written in a simple dynamic language.
|
|
[5]
|
D. Ancona, C. Bolz, A. Cuni, and A. Rigo.
Automatic generation of JIT compilers for dynamic languages in
.NET.
Technical report, Univ. of Dusseldorf and Univ. of Genova, December
2008.
[ bib |
.pdf ]
Writing an optimizing static compiler for dynamic
languages is not an easy task, since quite complex
static analysis is required. On the other hand, recent
developments show that JIT compilers can exploit
runtime type information to generate quite efficient
code. Unfortunately, writing a JIT compiler is far from
being simple. In this paper we report our positive
experience with automatic generation of JIT compilers
as supported by the PyPy infrastructure, by focusing on
JIT compilation for .NET. The paper presents two main
and novel contributions: we show that partial
evaluation can be used in practice for generating a JIT
compiler, and we experiment with the potentiality
offered by the ability to add a further level of JIT
compilation on top of .NET. The practicality of the
approach is demonstrated by showing some promising
experiments done with benchmarks written in a simple
dynamic language.
|
|
[6]
|
D. Ancona and V. Mascardi.
Ontology matching for semi-automatic and type-safe adaptation of
Java programs.
Technical report, DISI - Univ. of Genova, December 2008.
[ bib |
.pdf ]
This paper proposes a solution to the problem of
semi-automatic porting of Java programs. In particular,
our work aims at the design of tools able to aid users
to adapt Java code in a type-safe way, when an
application has to migrate to new libraries which are
not fully compatible with the legacy ones. To achieve
this, we propose an approach based on an integration of
the two type-theoretic notions of subtyping and type
isomorphism with ontology matching. While the former
notions are needed to ensure flexible adaptation in the
presence of type-safety, the latter supports the user
to preserve the semantics of the program to be adapted.
|
|
[7]
|
D. Ancona, G. Lagorio, and E. Zucca.
Type inference for Java-like programs by coinductive logic
programming.
Technical report, DISI - Univ. of Genova, July 2008.
[ bib |
.pdf ]
Although coinductive logic programming (Co-LP) has
proved to have several applications, including
verification of infinitary properties, model checking
and bisimilarity proofs, type inference via Co-LP has
not been properly investigated yet. In this paper we
show a novel approach to solve the problem of type
inference in the context of Java-like languages, that
is, object-oriented languages based on nominal
subtyping. The proposed approach follows a generic
scheme: first, the program P to be analyzed is
translated into an approximating logic program P' and a
goal G; then, the solution of the type inference
problem corresponds to find an instantiation of the
goal G which belongs to the greatest model of P', that
is, the coinductive model of P'. Operationally, this
corresponds to find a co-SLD derivation of G in P',
according to the operational semantics of Co-LP
recently defined by Simon et al. [ICLP06,ICALP07]. A
complete formalization of an instantiation of this
scheme is considered for a simple object-oriented
language and a corresponding type soundness theorem is
stated. A prototype implementation based on a
meta-interpreter of co-SLD has been implemented.
Finally, we address scalability issues of the approach,
by sketching an instantiation able to deal with a much
more expressive object-oriented language.
|
|
[8]
|
D. Ancona, G. Lagorio, and E. Zucca.
A flexible and type-safe framework of components for Java-like
languages.
Technical report, DISI - Univ. of Genova, April 2008.
Submitted for journal publication. Extended version of this
conference paper.
[ bib |
.pdf ]
We define a framework of components based on Java-like
languages, where components are binary mixin modules.
Basic components can be obtained from a collection of
classes by compiling such classes in isolation; for
allowing that, requirements in the form of type
constraints are associated with each class.
Requirements are specified by the user who, however, is
assisted by the compiler that can generate missing
constraints essential to guarantee type safety. Basic
components can be composed together by using a set of
expressive typed operators; thanks to soundness
results, such a composition is always type safe. The
framework is designed as a separate layer that can be
instantiated on top of any Java-like language; to show
the effectiveness of the approach, an instantiation on
a small Java subset is provided, together with a
prototype implementation. Besides safety, the approach
achieves great flexibility in reusing components for
two reasons: (1) type constraints generated for a
single component exactly capture all possible contexts
where it can be safely used; (2) composition of
components is not limited to conventional linking, but
is achieved by means of a set of powerful operators
typical of mixin modules.
|
|
[9]
|
D. Ancona, S. Fagorzi, and E. Zucca.
A parametric calculus for mobile open code.
Electronic Notes in Theoretical Computer Science, 192(3):3 -
22, 2008.
Proceedings of the Third International Workshop on Developments in
Computational Models (DCM 2007).
[ bib |
DOI |
.pdf |
http ]
We present a simple parametric calculus of processes
which exchange open mobile code, that is, code which
may contain free variables to be bound by the
receiver's code. Type safety is ensured by a
combination of static and dynamic checks. That is,
internal consistency of each process is statically
verified, by relying on local type assumptions on
missing code; then, when code is sent from a process to
another, a runtime check based on a subtyping relation
ensures that it can be successfully received, without
requiring re-inspection of the code. In order to refuse
communication in as few cases as possible, the runtime
check accepts even mobile code which would be rejected
if statically available, by automatically inserting
coercions driven by the subtyping relation, as in the
so-called Penn translation. The calculus is parametric
in some ingredients which can vary depending on the
specific language or system. Notably, we abstract away
from the specific nature of the code to be exchanged,
and of the static and dynamic checks. We formalize the
notion of type safety in our general framework and
provide sufficient conditions on the above ingredients
which guarantee this property. We illustrate our
approach on a simple lambda-calculus with records,
where type safe exchange of mobile code is made
problematic by conflicts due to components which were
not explicitly required. In particular, we show that
the standard coercion semantics given in the
literature, with other aims, for this calculus, allows
to detect and eliminate conflicts due to inner
components, thus solving a problem which was left open
in previous work on type-safe exchange of mobile code.
|
|
[10]
|
D. Ancona, C. Anderson, F. Damiani, S. Drossopoulou, P. Giannini, and E. Zucca.
A Provenly Correct Translation of Fickle into Java.
ACM Transactions on Programming Languages and Systems, 29(2),
April 2007.
[ bib |
.pdf ]
We present a translation from Fickle, a small
object-oriented language allowing objects to change
their class at runtime, into Java. The translation is
provenly correct in the sense that it preserves the
static and dynamic semantics. Moreover, it is
compatible with separate compilation, since the
translation of a Fickle class does not depend on the
implementation of used classes. Based on the formal
system, we have developed an implementation. The
translation turned out to be a more subtle problem than
we expected. In this article, we discuss four possible
approaches we considered for the design of the
translation and to justify our choice, we present
formally the translation and proof of preservation of
the static and dynamic semantics, and discuss the
prototype implementation. Moreover, we outline an
alternative translation based on generics that avoids
most of the casts (but not all) needed in the previous
translation. The language Fickle has undergone and is
still undergoing several phases of development. In this
article we are discussing the translation of FickleII.
|
|
[11]
|
D. Ancona, G. Lagorio, and E. Zucca.
Type inference for polymorphic methods in Java-like languages.
In G. Italiano, E. Moggi, and L. Laura, editors, Theoretical
Computer Science: Proceedings of the 10th Italian Conference on
ICTCS '07. World Scientific, 2007.
See also the
long version
with proofs.
[ bib |
.pdf ]
In languages like C++, Java and C#, typechecking
algorithms require methods to be annotated with their
parameter and result types, which are either fixed or
constrained by a bound. We show that, surprisingly
enough, it is possible to infer the polymorphic type of
a method where parameter and result types are left
unspecified, as happens in most functional languages.
These types intuitively capture the (less restrictive)
requirements on arguments needed to safely apply the
method. We formalize our ideas on a minimal Java
subset, for which we define a type system with
polymorphic types and prove its soundness. We then
describe an algorithm for type inference and prove its
soundness and completeness. A prototype implementing
inference of polymorphic types is available.
|
|
[12]
|
D. Ancona and E. Zucca.
A formal framework for compositional compilation (extended abstract).
In D. Ancona, G. Lagorio, and E. Zucca, editors, Theoretical
Computer Science: Proceedings of the 10th Italian Conference on
ICTCS '07. World Scientific, 2007.
See also the
long version
with proofs and examples of framework instantiation.
[ bib |
.pdf ]
We define a general framework for compositional
compilation, meant as the ability of building an
executable application by separate compilation and
linking of single fragments, opposed to global
compilation of the complete source application code.
More precisely, compilation of a source code fragment
in isolation generates a corresponding binary fragment
equipped with type information, formally modeled as a
typing, allowing type safe linking of fragments without
re-inspecting code. We formally define a notion of
soundness and completeness of compositional compilation
w.r.t. global compilation, and show how linking can be
in practice expressed by an entailment relation on
typings. Then, we provide a sufficient condition on
such entailment to ensure soundness and completeness of
compositional compilation, and compare this condition
with the principal typings property. Furthermore, we
show that this entailment relation can often be
modularly expressed by an entailment relation on type
environments and a subtyping relation.
|
|
[13]
|
D. Ancona, M. Ancona, A Cuni, and N. Matsakis.
RPython: a Step Towards Reconciling Dynamically and
Statically Typed OO Languages.
In OOPSLA 2007 Proceedings and Companion, DLS'07:
Proceedings of the 2007 Symposium on Dynamic Languages, pages
53-64. ACM, 2007.
[ bib |
.pdf ]
Although the C-based interpreter of Python is
reasonably fast, implementations on the CLI or the JVM
platforms offers some advantages in terms of robustness
and interoperability. Unfortunately, because the CLI
and JVM are primarily designed to execute statically
typed, object-oriented languages, most dynamic language
implementations cannot use the native bytecodes for
common operations like method calls and exception
handling; as a result, they are not able to take full
advantage of the power offered by the CLI and JVM. We
describe a different approach that attempts to preserve
the flexibility of Python, while still allowing for
efficient execution. This is achieved by limiting the
use of the more dynamic features of Python to an
initial, bootstrapping phase. This phase is used to
construct a final RPython (Restricted Python) program
that is actually executed. RPython is a proper subset
of Python, is statically typed, and does not allow
dynamic modification of class or method definitions;
however, it can still take advantage of Python features
such as mixins and first-class methods and classes.
This paper presents an overview of RPython, including
its design and its translation to both CLI and JVM
bytecode. We show how the bootstrapping phase can be
used to implement advanced features, like extensible
classes and generative programming. We also discuss
what work remains before RPython is truly ready for
general use, and compare the performance of RPython
with that of other approaches.
|
|
[14]
|
D. Ancona, G. Lagorio, and E. Zucca.
Flexible type-safe linking of components for Java-like languages.
In Joint Modular Languages Conference (JMLC 2006),
volume 4228 of Lecture Notes in Computer Science, pages 136-154.
Springer Verlag, 2006.
See also the extended version.
[ bib |
.pdf ]
We define a framework of components based on Java-like
languages, where components are binary mixin modules.
Basic components can be obtained from a collection of
classes by compiling such classes in isolation; for
allowing that, requirements in the form of type
constraints are associated with each class.
Requirements are specified by the user who, however, is
assisted by the compiler which can generate missing
constraints essential to guarantee type safety. Basic
components can be composed together by using a set of
expressive typed operators; thanks to soundness
results, such a composition is always type safe. The
framework is designed as a separate layer which can be
instantiated on top of any Java-like language; a
prototype implementation is available for a small Java
subset. Besides safety, the approach achieves great
flexibility in reusing components for two reasons: (1)
type constraints generated for a single component
exactly capture all possible contexts where it can be
safely used; (2) composition of components is not
limited to conventional linking, but is achieved by
means of a set of powerful operators typical of mixin
modules.
|
|
[15]
|
D. Ancona, G. Lagorio, and E. Zucca.
Smart modules for Java-like languages.
In 7th Intl. Workshop on Formal Techniques for Java-like
Programs 2005, July 2005.
[ bib |
.pdf ]
We present SmartJavaMod, a language of mixin modules
supporting compositional compilation, and constructed
on top of the Java language. More in detail, this means
that basic modules are collections of Java classes
which can be typechecked in isolation, inferring
constraints on missing classes and allowing safe reuse
of the module in as many contexts as possible.
Furthermore, it is possible to write structured module
expressions by means of a set of module operators, and
a type system at the module level ensures type safety,
in the sense that we can always reduce a module
expression to a well-formed collection of Java classes.
What we obtain is a module language which is extremely
flexible and allows the encoding (without any need of
enriching the core level, that is, the Java language)
of a variety of constructs supporting software reuse
and extensibility.
|
|
[16]
|
D. Ancona, F. Damiani, S. Drossopoulou, and E. Zucca.
Compositional Compilation for Java-like Languages through
Polymorphic Bytecode.
Technical report, Dipartimento di Informatica e Scienze
dell'Informazione, Università di Genova, January 2005.
[ bib |
.pdf ]
We define compositional compilation as the ability to
typecheck source code fragments in isolation, generate
corresponding binaries, and link together fragments
whose mutual assumptions are satisfied, without
reinspecting the code. Even though compositional
compilation is a highly desirable feature, in Java-like
languages it can hardly be achieved. This is due to the
fact that the bytecode generated for a fragment (say, a
class) is not uniquely determined by its source code,
but also depends on the compilation context. We propose
a way to obtain compositional compilation for Java, by
introducing a polymorphic form of bytecode containing
type variables (ranging over class names) and equipped
with a set of constraints involving type variables.
Thus, polymorphic bytecode provides a representation
for all the (standard) bytecode that can be obtained by
replacing type variables with classes satisfying the
associated constraints. We illustrate our proposal by
developing a typing and a linking algorithm. The typing
algorithm compiles a class in isolation generating the
corresponding polymorphic bytecode fragment and
constraints on the classes it depends on. The linking
algorithm takes a collection of polymorphic bytecode
fragments, checks their mutual consistency, and
possibly simplifies and specializes them. In
particular, linking a self-contained collection of
fragments either fails, or produces standard bytecode
(the same as what would have been produced by standard
compilation of all fragments).
|
|
[17]
|
V. Mascardi, D. Demergasso, and D. Ancona.
Languages for Programming BDI-style Agents: an Overview.
In F. Corradini, F. De Paoli, E. Merelli, and A. Omicini, editors,
WOA 2005 - Workshop From Objects to Agents, pages 9-15,
2005.
[ bib |
.pdf ]
The notion of an intelligent agent as an entity which
appears to be the subject of mental attitudes like
beliefs, desires and intentions (hence, the BDI
acronym) is well known and accepted by many
researchers. Besides the definition of various BDI
logics, many languages and integrated environments for
programming BDI-style agents have been proposed since
the early nineties. In this reasoned bibliography, nine
languages and implemented systems, namely PRS, dMARS,
JACK, JAM, Jadex, AgentSpeak(L), 3APL, Dribble, and
Coo-BDI, are discussed and compared. References to
other systems and languages based on the BDI model are
also provided, as well as pointers to surveys dealing
with related topics.
|
|
[18]
|
D. Ancona, F. Damiani, S. Drossopoulou, and E. Zucca.
Polymorphic bytecode: Compositional compilation for Java-like
languages.
In POPL 2005 - The 32nd ACM SIGPLAN-SIGACT Symposium
on Principles of Programming Languages, pages 26-37. ACM Press, 2005.
[ bib |
.pdf ]
We define compositional compilation as the ability to
typecheck source code fragments in isolation, generate
corresponding binaries, and link together fragments
whose mutual assumptions are satisfied, without
reinspecting the code. Even though compositional
compilation is a highly desirable feature, in Java-like
languages it can hardly be achieved. This is due to the
fact that the bytecode generated for a fragment (say, a
class) is not uniquely determined by its source code,
but also depends on the compilation context. We propose
a way to obtain compositional compilation for Java, by
introducing a polymorphic form of bytecode containing
type variables (ranging over class names) and equipped
with a set of constraints involving type variables.
Thus, polymorphic bytecode provides a representation
for all the (standard) bytecode that can be obtained by
replacing type variables with classes satisfying the
associated constraints. We illustrate our proposal by
developing a typing and a linking algorithm. The typing
algorithm compiles a class in isolation generating the
corresponding polymorphic bytecode fragment and
constraints on the classes it depends on. The linking
algorithm takes a collection of polymorphic bytecode
fragments, checks their mutual consistency, and
possibly simplifies and specializes them. In
particular, linking a self-contained collection of
fragments either fails, or produces standard bytecode
(the same as what would have been produced by standard
compilation of all fragments).
|
|
[19]
|
D. Ancona, S. Fagorzi, and E. Zucca.
Mixin modules for dynamic rebinding.
In R. De Nicola and D. Sangiorgi, editors, Trustworthy Global
Computing: IST/FET International Workshop, TGC 2005, Edinburgh,
UK, April 7-9, 2005. Revised Selected Papers, volume 3705 of
Lecture Notes in Computer Science, pages 279-298. Springer Verlag, 2005.
[ bib |
.pdf ]
Dynamic rebinding is the ability of changing the
definitions of names at execution time. While dynamic
rebinding is clearly useful in practice, and
increasingly needed in modern systems, most programming
languages provide only limited and ad-hoc mechanisms,
and no adequate semantic understanding currently
exists. Here, we provide a simple and powerful
mechanism for dynamic rebinding by means of a calculus
of mixin modules (mutually recursive modules allowing
redefinition of components) where, differently from the
traditional approach, module operations can be
performed after selecting and executing a module
component: in this way, execution can refer to virtual
components, which can be rebound when module operators
are executed. In particular, in our calculus module
operations are performed on demand, when execution
would otherwise get stuck. We provide a sound type
system, which ensures that execution never tries to
access module components which cannot become available,
and show how the calculus can be used to encode a
variety of real-world dynamic rebinding mechanisms.
|
|
[20]
|
L. Bozzo, V. Mascardi, D. Ancona, and P. Busetta.
COOWS: Adaptive BDI Agents meet Service-Oriented
Computing.
In M. P. Gleizes, G. A. Kaminka, A. Nowé, S. Ossowski, K. Tuyls,
and K. Verbeeck, editors, EUMAS 2005 - Proceedings of the Third
European Workshop on Multi-Agent Systems, Brussels, Belgium,
December 7-8, 2005, page 473, 2005.
[ bib |
http ]
Mainstream research in Web Services is currently
looking at two main aspects, namely formally describing
interactions among services, and finding and combining
services. Much work made in the intelligent agents area
is being applied to these issues. In this paper, we
investigate the application of agent research to Web
Services from a different perspective, that is,
procedural learning. The final objective is to enable
an adaptive system (an agent in our terminology) to
discover or being fed with knowledge concerning how to
solve a specific set of problems in a specific software
or physical environment. Our work is a very preliminary
step into the issue, with the main objective of
assessing how current Web Services technology can
support a component, described in terms of beliefs,
desires and intentions, dynamically adapting its
behaviour to new environments.
|
|
[21]
|
D. Ancona and E. Moggi.
Program Generation and Components.
In F. S. de Boer, M. M. Bonsangue, S. Graf, and W. de Roever,
editors, Formal Methods for Components and Objects: Third
International Symposium, FMCO 2004, volume 3657 of Lecture Notes
in Computer Science, pages 222-250. Springer Verlag, 2005.
[ bib |
.pdf ]
The first part of the paper gives a brief overview of
meta-programming, in particular program generation, and
its use in software development. The second part
introduces a basic calculus, related to FreshML, that
supports program generation (as described through
examples and a translation of MetaML into it) and
programming in-the-large (this is demonstrated by a
translation of CMS into it).
|
|
[22]
|
D. Ancona, S. Fagorzi, and E. Zucca.
A calculus for dynamic reconfiguration with low priority linking.
Electronic Notes in Theoretical Computer Science. Proceedings of
the Second Workshop on Object Oriented Developments (WOOD 2004),
138(2):3-35, 2005.
[ bib |
.pdf |
http ]
Building on our previous work, we present a simple
module calculus where execution steps of a module
component can be interleaved with reconfiguration steps
(that is, reductions at the module level), and where
execution can partly control precedence between these
reconfiguration steps. This is achieved by means of a
low priority link operator which is only performed when
a certain component, which has not been linked yet, is
both available and really needed for execution to
proceed, otherwise precedence is given to the outer
operators. We illustrate the expressive power of this
mechanism by a number of examples. We ensure soundness
by combining a static type system, which prevents
errors in applying module operators, and a dynamic
check which raises a linkage error if the running
program needs a component which cannot be provided by
reconfiguration steps. In particular no linkage errors
can be raised if all components are potentially
available.
|
This file has been generated by
bibtex2html 1.87.
Back to the main page on Davide Ancona's papers
Please send suggestions and comments to:
Davide Ancona davide@disi.unige.it
Last Updated: August 24, 2009
|