Germán Vidal

dblp:v/GermanVidal · DBLP profile ↗
← Back
70ranked-venue papers
17as first author
9since 2021 · last 2026
0000-0002-1857-6951ORCID · verified

Domains — the database's venue-derived domains; a paper can count in several

Software engineering, systems software and programming languages · 47 · 15 first-author · 6 since 2021Theory of computation · 39 · 6 first-author · 4 since 2021Applied, interdisciplinary, general and emerging computing · 7 · 2 first-author · 2 since 2021Artificial intelligence and machine learning · 5Computer networks · 3 · 1 first-author · 2 since 2021Databases, data management, data science and information retrieval · 2Human-computer interaction and ubiquitous computing · 1 · 1 first-author
YearPublicationVenuePosition
2026 A Reversible Semantics for Janus
Ivan Lanese, Germán Vidal
RC2
2025 Choreographies for Program Understanding
Gabriele Genovese, Ivan Lanese, Cinzia Di Giusto, Emilio Tuosto, Germán Vidal
FORTE5
2025 A distribution semantics for probabilistic term rewriting
abstract
Probabilistic programming is becoming increasingly popular thanks to its ability to specify problems with a certain degree of uncertainty. In this work, we focus on term rewriting, a well-known computational formalism. In particular, we consider systems that combine traditional rewriting rules with probabilities. Then, we define a novel “distribution semantics” for such systems that can be used to model the probability of reducing a term to some value. We also show how to compute a set of “explanations” for a given reduction, which can be used to compute its probability in a more efficient way. Finally, we illustrate our approach with several examples and outline a couple of extensions that may prove useful to improve the expressive power of probabilistic rewrite systems.
Germán Vidal
J. Log. Algebraic Methods Program.1
2024 Explaining Explanations in Probabilistic Logic Programming
Germán Vidal
APLAS1
2023 Towards a Taxonomy for Reversible Computation Approaches
Robert Glück, Ivan Lanese, Claudio Antares Mezzina, Jaroslaw Adam Miszczak, Iain Phillips 0001, Irek Ulidowski, Germán Vidal
RC7
2022 Computing Race Variants in Message-Passing Concurrent Programming with Selective Receives
Germán Vidal
FORTE1
2021 Prefix-Based Tracing in Message-Passing Concurrency
Juan José González-Abril, Germán Vidal
LOPSTR2
2021 Causal-Consistent Reversible Debugging: Improving CauDEr
Juan José González-Abril, Germán Vidal
PADL2
2021 Causal-Consistent Replay Reversible Semantics for Message Passing Concurrent Programs
abstract
Causal-consistent reversible debugging is an innovative technique for debugging concurrent systems. It allows one to go back in the execution focusing on the actions that most likely caused a visible misbehavior. When such an action is selected, the debugger undoes it, including all and only its consequences. This operation is called a causal-consistent rollback. In this way, the user can avoid being distracted by the actions of other, unrelated processes. In this work, we introduce its dual notion: causal-consistent replay. We allow the user to record an execution of a running program and, in contrast to traditional replay debuggers, to reproduce a visible misbehavior inside the debugger including all and only its causes. Furthermore, we present a unified framework that combines both causal-consistent replay and causal-consistent rollback. Although most of the ideas that we present are rather general, we focus on a popular functional and concurrent programming language based on message passing: Erlang.
Ivan Lanese, Adrián Palacios, Germán Vidal
Fundam. Informaticae3
2020 Reversible Computations in Logic Programming
Germán Vidal
RC1
2020 Selective Unification in (Constraint) Logic Programming
abstract
Concolic testing is a well-known validation technique for imperative and object oriented programs. In a previous paper, we have introduced an adaptation of this technique to logic programming. At the heart of our framework lies a specific procedure that we call “selective unification”. It is used to generate appropriate run-time goals by considering all possible ways an atom can unify with the heads of some program clauses. In this paper, we show that the existing algorithm for selective unification is not complete in the presence of non-linear atoms. We then prove soundness and completeness for a restricted version of the problem where some atoms are required to be linear. We also consider concolic testing in the context of constraint logic programming and extend the notion of selective unification accordingly.
Frédéric Mesnard, Étienne Payet, Germán Vidal
Fundam. Informaticae3
2020 Concolic Testing in CLP
abstract
Abstract Concolic testing is a popular software verification technique based on a combination of concrete and symbolic execution. Its main focus is finding bugs and generating test cases with the aim of maximizing code coverage. A previous approach to concolic testing in logic programming was not sound because it only dealt with positive constraints (by means of substitutions) but could not represent negative constraints. In this paper, we present a novel framework for concolic testing of CLP programs that generalizes the previous technique. In the CLP setting, one can represent both positive and negative constraints in a natural way, thus giving rise to a sound and (potentially) more efficient technique. Defining verification and testing techniques for CLP programs is increasingly relevant since this framework is becoming popular as an intermediate representation to analyze programs written in other programming paradigms.
Frédéric Mesnard, Étienne Payet, Germán Vidal
Theory Pract. Log. Program.3
2019 Causal-Consistent Replay Debugging for Message Passing Programs
Ivan Lanese, Adrián Palacios, Germán Vidal
FORTE3
2019 Characterizing Compatible View Updates in Syntactic Bidirectionalization
Naoki Nishida 0001, Germán Vidal
RC2
2019 Introduction to the 35th International Conference on Logic Programming Special Issue
Esra Erdem 0001, Andrea Formisano 0001, Germán Vidal, Fangkai Yang
Theory Pract. Log. Program.3
2018 Specialization of Distributed Actors by Partial Evaluation
abstract
Partial evaluation is a well-established technique for program specialization that might achieve dramatic runtime speedups. While it has been widely studied for sequential languages, partial evaluation of concurrent and distributed programs has received little attention. In this paper, we consider an asynchronous message passing language that can be seen as a simple but significant version of the concurrent and distributed language Erlang. We introduce a hybrid partial evaluation scheme for this language, and illustrate it with an example. A partial evaluation tool has been implemented and is publicly available. To the best of our knowledge, this is the first approach to the partial evaluation of an asynchronous message passing language like Erlang.
Germán Vidal
SMC1
2018 Preface for SCP special issue on Principles and Practice of Declarative Programming
Germán Vidal
Sci. Comput. Program.1
2018 Introduction to the special issue on computational logic for verification
Germán Vidal
Theory Pract. Log. Program.1
2017 Selective unification in constraint logic programming
abstract
Concolic testing is a well-known validation technique for imperative and object-oriented programs. We have recently introduced an adaptation of this technique to logic programming. At the heart of our framework for concolic testing lies a logic programming specific procedure that we call "selective unification". In this paper, we consider concolic testing in the context of constraint logic programming and extend the notion of selective unification accordingly. We prove that the selective unification problem is generally undecidable for constraint logic programs, and we present a correct and complete algorithm for selective unification in the context of a class of constraint structures.
Frédéric Mesnard, Étienne Payet, Germán Vidal
PPDP3
2017 Relative Termination via Dependency Pairs
abstract
A term rewrite system is terminating when no infinite reduction sequences are possible. Relative termination generalizes termination by permitting infinite reductions as long as some distinguished rules are not applied infinitely many times. Relative termination is thus a fundamental notion that has been used in a number of different contexts, like analyzing the confluence of rewrite systems or the termination of narrowing. In this work, we introduce a novel technique to prove relative termination by reducing it to dependency pair problems. To the best of our knowledge, this is the first significant contribution to Problem #106 of the RTA List of Open Problems. We first present a general approach that is then instantiated to provide a concrete technique for proving relative termination. The practical significance of our method is illustrated by means of an experimental evaluation.
José Iborra, Naoki Nishida 0001, Germán Vidal, Akihisa Yamada 0002
J. Autom. Reason.3
2016 A Reversible Semantics for Erlang
Naoki Nishida 0001, Adrián Palacios, Germán Vidal
LOPSTR3
2016 On the Completeness of Selective Unification in Concolic Testing of Logic Programs
Frédéric Mesnard, Étienne Payet, Germán Vidal
LOPSTR3
2016 Symbolic Execution and Thresholding for Efficiently Tuning Fuzzy Logic Programs
Ginés Moreno, Jaime Penabad, José A. Riaza, Germán Vidal
LOPSTR4
2015 Reducing Relative Termination to Dependency Pair Problems
José Iborra, Naoki Nishida 0001, Germán Vidal, Akihisa Yamada 0002
CADE3
2015 Concolic Execution in Functional Programming by Program Instrumentation
Adrián Palacios, Germán Vidal
LOPSTR2
2015 Symbolic execution as a basis for termination analysis
Germán Vidal
Sci. Comput. Program.1
2015 Concolic testing in logic programming
abstract
Abstract Software testing is one of the most popular validation techniques in the software industry. Surprisingly, we can only find a few approaches to testing in the context of logic programming. In this paper, we introduce a systematic approach for dynamic testing that combines both concrete and symbolic execution. Our approach is fully automatic and guarantees full path coverage when it terminates. We prove some basic properties of our technique and illustrate its practical usefulness through a prototype implementation.
Frédéric Mesnard, Étienne Payet, Germán Vidal
Theory Pract. Log. Program.3
2014 Concolic Execution and Test Case Generation in Prolog
Germán Vidal
LOPSTR1
2014 Fast offline partial evaluation of logic programs
Michael Leuschel, Germán Vidal
Inf. Comput.2
2013 A Finite Representation of the Narrowing Space
Naoki Nishida 0001, Germán Vidal
LOPSTR2
2013 Towards Erlang Verification by Term Rewriting
Germán Vidal
LOPSTR1
2012 Computing More Specific Versions of Conditional Rewriting Systems
Naoki Nishida 0001, Germán Vidal
LOPSTR2
2012 Closed Symbolic Execution for Verifying Program Termination
abstract
Symbolic execution, originally introduced as a method for program testing and debugging, is usually incomplete because of infinite symbolic execution paths. In this work, we adapt some well-known notions from partial evaluation in order to have a complete symbolic execution scheme which can then be used to check liveness properties like program termination. We also introduce a representation of the symbolic transitions as a term rewrite system so that existing termination provers for these systems can be used to verify the termination of the original program.
Germán Vidal
SCAM1
2012 Preface
Matthias Blume, Germán Vidal
Theor. Comput. Sci.2
2012 Annotation of logic programs for independent AND-parallelism by partial evaluation
abstract
Abstract Traditional approaches to automatic AND-parallelization of logic programs rely on some static analysis to identify independent goals that can be safely and efficiently run in parallel in any possible execution. In this paper, we present a novel technique for generating annotations for independent AND-parallelism that is based on partial evaluation. Basically, we augment a simple partial evaluation procedure with (run-time) groundness and variable sharing information so that parallel conjunctions are added to the residual clauses when the conditions for independence are met. In contrast to previous approaches, our partial evaluator is able to transform the source program in order to expose more opportunities for parallelism. To the best of our knowledge, we present the first approach to a parallelizing partial evaluator.
Germán Vidal
Theory Pract. Log. Program.1
2011 Program Inversion for Tail Recursive Functions
abstract
Program inversion is a fundamental problem that has been addressed in many different programming settings and applications. In the context of term rewriting, several methods already exist for computing the inverse of an injective function. These methods, however, usually return non-terminating inverted functions when the considered function is tail recursive. In this paper, we propose a direct and intuitive approach to the inversion of tail recursive functions. Our new technique is able to produce good results even without the use of an additional post-processing of determinization or completion. Moreover, when combined with a traditional approach to program inversion, it constitutes a promising approach to define a general method for program inversion. Our experimental results confirm that the new technique compares well with previous approaches.
Naoki Nishida 0001, Germán Vidal
RTA2
2010 A Hybrid Approach to Conjunctive Partial Evaluation of Logic Programs
Germán Vidal
LOPSTR1
2009 Goal-Directed and Relative Dependency Pairs for Proving the Termination of Narrowing
José Iborra, Naoki Nishida 0001, Germán Vidal
LOPSTR3
2009 Towards Scalable Partial Evaluation of Declarative Programs
Germán Vidal
LOPSTR1
2008 Trace Analysis for Predicting the Effectiveness of Partial Evaluation
Germán Vidal
ICLP1
2008 A Transformational Approach to Polyvariant BTA of Higher-Order Functional Programs
Gustavo Arroyo, J. Guadalupe Ramos, Salvador Tamarit, Germán Vidal
LOPSTR4
2008 Fast Offline Partial Evaluation of Large Logic Programs
Michael Leuschel, Germán Vidal
LOPSTR2
2007 Lazy call-by-value evaluation
abstract
Designing debugging tools for lazy functional programming languages is a complex task which is often solved by expensive tracing of lazy computations. We present a new approach in which the information collected as a trace is reduced considerably (kilobytes instead of megabytes). The idea is to collect a kind of step information for a call-by-value interpreter, which can then efficiently reconstruct the computation for debugging/viewing tools, like declarative debugging. We show the correctness of the approach, discuss a proof-of-concept implementation with a declarative debugger as back end and present some benchmarks comparing our new approach with the Haskell debugger Hat.
Bernd Brassel, Michael Hanus, Sebastian Fischer 0001, Frank Huch, Germán Vidal
ICFP5
2007 Preserving Sharing in the Partial Evaluation of Lazy Functional Programs
Sebastian Fischer 0001, Josep Silva, Salvador Tamarit, Germán Vidal
LOPSTR4
2007 Quasi-terminating logic programs for ensuring the termination of partial evaluation
abstract
One of the most important challenges in partial evaluation is the design of automatic methods for ensuring the termination of specialisation. It is well known that the termination of partial evaluation can be ensured when the considered computations are quasiterminating, i.e., when only finitely many different calls occur.
Germán Vidal
PEPM1
2007 Ensuring the quasi-termination of needed narrowing computations
J. Guadalupe Ramos, Josep Silva, Germán Vidal
Inf. Process. Lett.3
2007 Forward slicing of functional logic programs by partial evaluation
abstract
Abstract Program slicing has been mainly studied in the context of imperative languages, where it has been applied to a wide variety of software engineering tasks, like program understanding, maintenance, debugging, testing, code reuse, etc. This work introduces the first forward slicing technique for declarative multi-paradigm programs which integrate features from functional and logic programming. Basically, given a program and aslicing criterion(a function call in our setting), the computed forward slice contains those parts of the original program which arereachablefrom the slicing criterion. Our approach to program slicing is based on an extension of (online) partial evaluation. Therefore, it provides a simple way to develop program slicing tools from existing partial evaluators and helps to clarify the relation between both methodologies. A slicing tool for the multi-paradigm language Curry, which demonstrates the usefulness of our approach, has been implemented in Curry itself.
Josep Silva, Germán Vidal
Theory Pract. Log. Program.2
2006 A Slicing Tool for Lazy Functional Logic Programs
Claudio Ochoa, Josep Silva, Germán Vidal
JELIA3
2006 Improving Offline Narrowing-Driven Partial Evaluation Using Size-Change Graphs
Gustavo Arroyo, J. Guadalupe Ramos, Josep Silva, Germán Vidal
LOPSTR4
2005 Forward Slicing by Conjunctive Partial Deduction and Argument Filtering
Michael Leuschel, Germán Vidal
ESOP2
2005 Fast narrowing-driven partial evaluation for inductively sequential programs
abstract
Narrowing-driven partial evaluation is a powerful technique for the specialization of (first-order) functional and functional logic programs. However, although it gives good results on small programs, it does not scale up well to realistic problems (e.g., interpreter specialization). In this work, we introduce a faster partial evaluation scheme by ensuring the termination of the process offline. For this purpose, we first characterize a class of programs which are quasi-terminating, i.e., the computations performed with needed narrowing—the symbolic computation mechanism of narrowing-driven partial evaluation—only contain finitely many different terms (and, thus, partial evaluation terminates). Since this class is quite restrictive, we also introduce an annotation algorithm for a broader class of programs so that they behave like quasi-terminating programs w.r.t. an extension of needed narrowing. Preliminary experiments are encouraging and demonstrate the usefulness of our approach.
J. Guadalupe Ramos, Josep Silva, Germán Vidal
ICFP3
2005 Operational semantics for declarative multi-paradigm languages
Elvira Albert, Michael Hanus, Frank Huch, Javier Oliver 0001, Germán Vidal
J. Symb. Comput.5
2005 Specialization of functional logic programs based on needed narrowing
abstract
Many functional logic languages are based on narrowing, a unification-based goal-solving mechanism which subsumes the reduction mechanism of functional languages and the resolution principle of logic languages. Needed narrowing is an optimal evaluation strategy which constitutes the basis of modern (narrowing-based) lazy functional logic languages. In this work, we present the fundamentals of partial evaluation in such languages. We provide correctness results for partial evaluation based on needed narrowing and show that the nice properties of this strategy are essential for the specialization process. In particular, the structure of the original program is preserved by partial evaluation and, thus, the same evaluation strategy can be applied for the execution of specialized programs. This is in contrast to other partial evaluation schemes for lazy functional logic programs which may change the program structure in a negative way. Recent proposals for the partial evaluation of declarative multi-paradigm programs use (some form of) needed narrowing to perform computations at partial evaluation time. Therefore, our results constitute the basis for the correctness of such partial evaluators.
María Alpuente, Salvador Lucas, Michael Hanus, Germán Vidal
Theory Pract. Log. Program.4
2004 Run-Time Profiling of Functional Logic Programs
Bernd Brassel, Michael Hanus, Frank Huch, Josep Silva, Germán Vidal
LOPSTR5
2004 Dynamic slicing based on redex trails
abstract
Tracing computations is a widely used methodology for program debugging. Lazy languages, in particular, pose new demands on tracing techniques since following the actual trace of a computation is generally useless. Typically, they rely on the construction of a redex trail, a graph that describes the reductions of a computation and its relationships. While tracing provides a significant help for locating bugs, the task still remains complex. A well-known debugging technique for imperative programs is based on dynamic slicing, a method to find the program statements that influence the computation of a value for a specific program input.In this work, we introduce a novel technique for dynamic slicing in lazy functional logic languages. Rather than starting from scratch, our technique relies on (a slight extension of) redex trails. We provide a method to compute a correct and minimal dynamic slice from the redex trail of a computation. A clear advantage of our proposal is that one can enhance existing tracers with slicing capabilities with a modest implementation effort, since the same data structure (the redex trail) can be used for both tracing and slicing.
Claudio Ochoa, Josep Silva, Germán Vidal
PEPM3
2004 A semantics for tracing declarative multi-paradigm programs
abstract
We introduce the theoretical basis for tracing lazy functional logic computations in a declarative multi-paradigm language like Curry. Tracing computations is a difficult task due to the subtleties of the underlying operational semantics which combines laziness and non-determinism. In this work, we define an instrumented operational semantics that generates not only the computed values and bindings but also an appropriate data structure---a sort of redex trail---which can be used to trace computations at an adequate level of abstraction. In contrast to previous approaches, which rely solely on a transformation to instrument source programs, the formal definition of a tracing semantics improves the understanding of the tracing process. Furthermore, it allows us to formally prove the correctness of the computed trail. A prototype implementation of a tracer based on this semantics demonstrates the usefulness of our approach.
Bernd Brassel, Michael Hanus, Frank Huch, Germán Vidal
PPDP4
2004 An Embedded Language Approach to Router Specification in Curry
J. Guadalupe Ramos, Josep Silva, Germán Vidal
SOFSEM3
2004 Rules + strategies for transforming lazy functional logic programs
María Alpuente, Moreno Falaschi, Ginés Moreno, Germán Vidal
Theor. Comput. Sci.4
2003 A residualizing semantics for the partial evaluation of functional logic programs
Elvira Albert, Michael Hanus, Germán Vidal
Inf. Process. Lett.3
2003 Uniform Lazy Narrowing
abstract
Needed narrowing is a complete and optimal operational principle for modern declarative languages which integrate the best features of lazy functional and logic programming. We investigate the formal relation between needed narrowing and another (not so lazy) narrowing strategy which is the basis for popular implementations of lazy functional logic languages. We demonstrate that needed narrowing and lazy narrowing are computationally equivalent over the class of uniform programs. We also introduce a complete refinement of lazy narrowing, called uniform lazy narrowing, which is still equivalent to needed narrowing over the aforementioned class. Since actual implementations of functional logic languages are based on the transformation of the original program into a uniform one—which is then executed using a lazy narrowing strategy—our results can be thought of as a formal basis for the correctness of these implementations.
María Alpuente, Moreno Falaschi, Pascual Julián Iranzo, Germán Vidal
J. Log. Comput.4
2002 Cost-augmented narrowing-driven specialization
abstract
The aim of many program transformers is to improve efficiency while preserving program meaning. Correctness issues have been dealt with extensively. However, very little attention has been paid to formally establish the improvements achieved by these transformers. In this work, we introduce the scheme of a narrowing-driven partial evaluator enhanced with abstract costs. They are "abstract" in the sense that they measure the number of basic operations performed during a computation rather than actual execution times. Thus, we have available a setting in which one can discuss the effects of the program transformer in a precise framework and, moreover, to quantify these effects. Our scheme may serve as a basis to develop speedup analyses and cost-guided transformers. An implementation of the cost-augmented specializer has been undertaken, which demonstrates the practicality of our approach.
Germán Vidal
PEPM1
2000 Using an Abstract Representation to Specialize Functional Logic Programs
Elvira Albert, Michael Hanus, Germán Vidal
LPAR3
2000 An Automatic Composition Algorithm for Functional Logic Programs
María Alpuente, Moreno Falaschi, Ginés Moreno, Germán Vidal
SOFSEM4
1999 Specialization of Inductively Sequential Functional Logic Programs
abstract
Functional logic languages combine the operational principles of the most important declarative programming paradigms, namely functional and logic programming. Inductively sequential programs admit the definition of optimal computation strategies and are the basis of several recent (lazy) functional logic languages. In this paper, we define a partial evaluator for inductively sequential functional logic programs. We prove strong correctness of this partial evaluator and show that the nice properties of inductively sequential programs carry over to the specialization process and the specialized programs. In particular, the structure of the programs is preserved by the specialization process. This is in contrast to other partial evaluation methods for functional logic programs which can destroy the original program structure. Finally, we present some experiments which highlight the practical advantages of our approach.
María Alpuente, Michael Hanus, Salvador Lucas, Germán Vidal
ICFP4
1999 A Partial Evaluation Framework for Curry Programs
Elvira Albert, María Alpuente, Michael Hanus, Germán Vidal
LPAR4
1998 Improving Control in Functional Logic Program Specialization
Elvira Albert, María Alpuente, Moreno Falaschi, Pascual Julián Iranzo, Germán Vidal
SAS5
1998 Partial Evaluation of Functional Logic Programs
abstract
Languages that integrate functional and logic programming with a complete operational semantics are based on narrowing, a unification-based goal-solving mechanism which subsumes the reduction principle of functional languages and the resolution principle of logic languages. In this article, we present a partial evaluation scheme for functional logic languages based on an automatic unfolding algorithm which builds narrowing trees. The method is formalized within the theoretical framework established by Lloyd and Shepherdson for the partial deduction of logic programs, which we have generalized for dealing with functional computations. A generic specialization algorithm is proposed which does not depend on the eager or lazy nature of the narrower being used. To the best of our knowledge, this is the first generic algorithm for the specialization of functional logic programs. We also discuss the relation to work on partial evaluation in functional programming, term-rewriting systems, and logic programming. Finally, we present some experimental results with an implementation of the algorithm which show in practice that the narrowing-driven partial evaluator effectively combines the propagation of partial data structures (by means of logical variables and unification) with better opportunities for optimization (thanks to the functional dimension).
María Alpuente, Moreno Falaschi, Germán Vidal
ACM Trans. Program. Lang. Syst.3
1997 Specialization of Lazy Functional Logic Programs
abstract
Partial evaluation is a method for program specialization based on fold/unfold transformations [8, 25]. Partial evaluation of pure functional programs uses mainly static values of given data to specialize the program [15, 44]. In logic programming, the so-called static/dynamic distinction is hardly present, whereas considerations of determinacy and choice points are far more important for control [12]. We discuss these issues in the context of a (lazy) functional logic language. We formalize a two-phase specialization method for a non-strict, first order, integrated language which makes use of lazy narrowing to specialize the program w.r. t. a goal. The basic algorithm (first phase) is formalized as an instance of the framework for the partial evaluation of functional logic programs of [2, 3], using lazy narrowing. However, the results inherited by [2, 3] mainly regard the termination of the PE method, while the (strong) soundness and completeness results must be restated for the lazy strategy. A post-processing renaming scheme (second phase) is necessary which we describe and illustrate on the well-known matching example. This phase is essential also for other non-lazy narrowing strategies, like innermost narrowing, and our method can be easily extended to these strategies. We show that our method preserves the lazy narrowing semantics and that the inclusion of simplification steps in narrowing derivations can improve control during specialization.
María Alpuente, Moreno Falaschi, Pascual Julián Iranzo, Germán Vidal
PEPM4
1996 Narrowing-Driven Partial Evaluation of Functional Logic Programs
María Alpuente, Moreno Falaschi, Germán Vidal
ESOP3
1996 A Compositional Semantic Basis for the Analysis of Equational Horn Programs
María Alpuente, Moreno Falaschi, Germán Vidal
Theor. Comput. Sci.3