Oege de Moor

dblp:m/OegedeMoor · DBLP profile ↗
← Back
40ranked-venue papers
6as first author
0since 2021 · last 2016
—ORCID · none

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

Software engineering, systems software and programming languages · 30 · 2 first-authorTheory of computation · 8 · 3 first-authorDatabases, data management, data science and information retrieval · 4 · 2 first-author

Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.

Software engineering, system software, and programming languages
14 papers
Programming languages and type systems · 43% Program analysis · 18% Software maintenance and evolution · 15%
Databases, data mining, and information retrieval
4 papers
Data models and query languages · 59% Graph data management · 21% Indexing and storage engines · 21%
Computer architecture, parallel and distributed computing, and storage systems
2 papers
Performance modeling and evaluation · 52% GPUs and heterogeneous computing · 48%

Topics — the 28 heaviest of 33, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Software maintenance and evolution
refactoring
0.332010
Specifying and implementing refactorings · OOPSLA 2010
Sound and extensible renaming for java · OOPSLA 2008
JunGL: a scripting language for refactoring · ICSE 2006
Programming languages and type systems
aspect-oriented programming
0.252007
Semantics of static pointcuts in aspectJ · POPL 2007
Optimising aspectJ · PLDI 2005
Adding trace matching with free variables to AspectJ · OOPSLA 2005
Empirical software engineering
mining software repositories
0.212015
Tracking Static Analysis Violations over Time to Capture Developer Characteristics · ICSE (1) 2015
Programming languages and type systems
type inference
0.222010
Type inference for datalog with complex type hierarchies · POPL 2010
Type inference for datalog and its application to query optimisation · PODS 2008
Data models and query languages › datalog
datalog query optimization
0.222008
Adding magic to an optimising datalog compiler · SIGMOD Conference 2008
Type inference for datalog and its application to query optimisation · PODS 2008
Graph data management › graph query processing
reachability query
0.112011
A memory efficient reachability data structure through bit vector compression · SIGMOD Conference 2011
Data models and query languages
datalog
0.112010
Type inference for datalog with complex type hierarchies · POPL 2010
Programming languages and type systems
type systems
0.112010
Type inference for datalog with complex type hierarchies · POPL 2010
Data models and query languages › datalog › datalog query optimization
magic sets
0.112008
Adding magic to an optimising datalog compiler · SIGMOD Conference 2008
Program analysis › binary analysis
bytecode analysis
0.112008
Efficient local type inference · OOPSLA 2008
Software maintenance and evolution › refactoring
identifier renaming
0.112008
Sound and extensible renaming for java · OOPSLA 2008
Programming languages and type systems › type inference
local type inference
0.112008
Efficient local type inference · OOPSLA 2008
Programming languages and type systems › lambda calculus
variable binding
0.112008
Sound and extensible renaming for java · OOPSLA 2008
Programming languages and type systems
language semantics
0.112007
Semantics of static pointcuts in aspectJ · POPL 2007
Program analysis › dynamic analysis
runtime monitoring
0.112007
Making trace monitors feasible · OOPSLA 2007
Program verification › dynamic verification
runtime verification
0.112007
Making trace monitors feasible · OOPSLA 2007
Program verification › temporal logic
temporal logic specification
0.112007
Making trace monitors feasible · OOPSLA 2007
Programming languages and type systems
language design
0.122005
Adding trace matching with free variables to AspectJ · OOPSLA 2005
Optimising aspectJ · PLDI 2005
Program analysis
static analysis
0.112015
Tracking Static Analysis Violations over Time to Capture Developer Characteristics · ICSE (1) 2015
Programming languages and type systems
domain-specific languages
0.112006
JunGL: a scripting language for refactoring · ICSE 2006
Program analysis › static analysis
incremental analysis
0.012004
Incremental execution of transformation specifications · POPL 2004
Performance modeling and evaluation
workload characterization
0.012004
Measuring the dynamic behaviour of AspectJ programs · OOPSLA 2004
Programming languages and type systems › type inference
static type inference
0.012008
Efficient local type inference · OOPSLA 2008
Program analysis › program representation
program graph
0.012006
JunGL: a scripting language for refactoring · ICSE 2006
Program analysis
program representation
0.012006
JunGL: a scripting language for refactoring · ICSE 2006
Program analysis › dynamic analysis › trace analysis
trace alignment
0.012005
Adding trace matching with free variables to AspectJ · OOPSLA 2005
Program analysis › dynamic analysis › instrumentation
bytecode instrumentation
0.012004
Measuring the dynamic behaviour of AspectJ programs · OOPSLA 2004
Compilers and program optimization
program transformation
0.012004
Incremental execution of transformation specifications · POPL 2004

Methods — techniques the papers use, named apart from their topics

type inference · 0.3domain-specific language compilation · 0.3revision history analysis · 0.2type system design · 0.2soundness proof · 0.2optimality proof · 0.2word-aligned hybrid compression · 0.1word partitions · 0.1microrefactorings · 0.1dependency analysis · 0.1data flow analysis · 0.1temporal logic · 0.1dynamic analysis · 0.0bytecode instrumentation · 0.0
YearPublicationVenuePosition
2016 QL: Object-oriented Queries on Relational Data
abstract
This paper describes QL, a language for querying complex, potentially recursive data structures. QL compiles to Datalog and runs on a standard relational database, yet it provides familiar-looking object-oriented features such as classes and methods, reinterpreted in logical terms: classes are logical properties describing sets of values, subclassing is implication, and virtual calls are dispatched dynamically by considering the most specific classes containing the receiver. Furthermore, types in QL are prescriptive and actively influence program evaluation rather than just describing it. In combination, these features enable the development of concise queries based on reusable libraries, which are written in a purely declarative style, yet can be efficiently executed even on very large data sets. In particular, we have used QL to implement static analyses for various programming languages, which scale to millions of lines of code.
Pavel Avgustinov, Oege de Moor, Michael Peyton Jones, Max Schäfer
ECOOP2
2015 Tracking Static Analysis Violations over Time to Capture Developer Characteristics
abstract
Many interesting questions about the software quality of a code base can only be answered adequately if fine-grained information about the evolution of quality metrics over time and the contributions of individual developers is known. We present an approach for tracking static analysis violations (which are often indicative of defects) over the revision history of a program, and for precisely attributing the introduction and elimination of these violations to individual developers. As one application, we demonstrate how this information can be used to compute ``fingerprints'' of developers that reflect which kinds of violations they tend to introduce or to fix. We have performed an experimental study on several large open-source projects written in different languages, providing evidence that these fingerprints are well-defined and capture characteristic information about the coding habits of individual developers.
Pavel Avgustinov, Arthur I. Baars, Anders Starcke Henriksen, R. Greg Lavender, Galen Menzel, Oege de Moor, Max Schäfer, Julian Tibble
ICSE (1)6
2012 Synthesising graphics card programs from DSLs
abstract
Over the last five years, graphics cards have become a tempting target for scientific computing, thanks to unrivaled peak performance, often producing a runtime speed-up of x10 to x25 over comparable CPU solutions.
Luke Cartey, Rune B. Lyngsø, Oege de Moor
PLDI3
2011 A memory efficient reachability data structure through bit vector compression
abstract
When answering many reachability queries on a large graph, the principal challenge is to represent the transitive closure of the graph compactly, while still allowing fast membership tests on that transitive closure. Recent attempts to address this problem are complex data structures and algorithms such as Path-Tree and 3-HOP. We propose a simple alternative based on a novel form of bit-vector compression. Our starting point is the observation that when computing the transitive closure, reachable vertices tend to cluster together. We adapt the well-known scheme of word-aligned hybrid compression (WAH) to work more efficiently by introducing word partitions. We prove that the resulting scheme leads to a more compact data structure than its closest competitor, namely interval lists. In extensive and detailed experiments, this is confirmed in practice. We also demonstrate that the new technique can handle much larger graphs than alternative algorithms.
Sebastiaan J. van Schaik, Oege de Moor
SIGMOD Conference2
2010 Specifying and implementing refactorings
abstract
Modern IDEs for object-oriented languages like Java provide support for a basic set of simple automated refactorings whose behaviour is easy to describe intuitively. It is, however, surprisingly difficult to specify their behaviour in detail. In particular, the popular precondition-based approach tends to produce somewhat unwieldy descriptions if advanced features of the object language are taken into account. This has resulted in refactoring implementations that are complex, hard to understand, and even harder to maintain, yet these implementations themselves are the only precise specification of many refactorings. We have in past work advocated a different approach based on several complementary notions of dependencies that guide the implementation, and on the concept of microrefactorings that structure it. We show in this work that these concepts are powerful enough to provide high-level specifications of many of the refactorings implemented in Eclipse. These specifications are precise enough to serve as the basis of a clean-room reimplementation of these refactorings that is very compact, yet matches Eclipse's for features and outperforms it in terms of correctness.
Max Schäfer, Oege de Moor
OOPSLA2
2010 Type inference for datalog with complex type hierarchies
abstract
Type inference for Datalog can be understood as the problem of mapping programs to a sublanguage for which containment is decidable. To wit, given a program in Datalog, a schema describing the types of extensional relations, and a user-supplied set of facts about the basic types (stating conditions such as disjointness, implication or equivalence), we aim to infer an over-approximation of the semantics of the program, which should be expressible in a suitable sublanguage of Datalog.
Max Schäfer, Oege de Moor
POPL2
2009 Stepping Stones over the Refactoring Rubicon
Max Schäfer, Mathieu Verbaere, Torbjörn Ekman 0001, Oege de Moor
ECOOP4
2009 Formalising and Verifying Reference Attribute Grammars in Coq
Max Schäfer, Torbjörn Ekman 0001, Oege de Moor
ESOP3
2008 Efficient local type inference
abstract
Inference of static types for local variables in Java bytecode is the first step of any serious tool that manipulates bytecode, be it for decompilation, transformation or analysis. It is important, therefore, to perform that step as accurately and efficiently as possible. Previous work has sought to give solutions with good worst-case complexity.
Ben Bellamy, Pavel Avgustinov, Oege de Moor, Damien Sereni
OOPSLA3
2008 Sound and extensible renaming for java
abstract
Descriptive names are crucial to understand code. However, good names are notoriously hard to choose and manually changing a globally visible name can be a maintenance nightmare. Hence, tool support for automated renaming is an essential aid for developers and widely supported by popular development environments.
Max Schäfer, Torbjörn Ekman 0001, Oege de Moor
OOPSLA3
2008 Type inference for datalog and its application to query optimisation
abstract
Certain variants of object-oriented Datalog can be compiled to Datalog with negation. We seek to apply optimisations akin to virtual method resolution (a well-known technique in compiling Java and other OO languages) to improve efficiency of the resulting Datalog programs. The effectiveness of such optimisations strongly depends on the precision of the underlying type inference algorithm. Previous work on type inference for Datalog has focussed on Cartesian abstractions, where the type of each field is computed separately. Such Cartesian type inference is inherently imprecise in the presence of field equalities. We propose a type system where equalities are tracked, and present a type inference algorithm. The algorithm is proved sound. We also prove that it is optimal for Datalog without negation, in the sense that the inferred type is as tight as possible. Extensive experiments with our type-based optimisations, in a commercial implementation of object-oriented Datalog, confirm the benefits of this non-Cartesian type inference algorithm.
Oege de Moor, Damien Sereni, Pavel Avgustinov, Mathieu Verbaere
PODS1
2008 Adding magic to an optimising datalog compiler
abstract
The magic-sets transformation is a useful technique for dramatically improving the performance of complex queries, but it has been observed that this transformation can also drastically reduce the performance of some queries. Successful implementations of magic in previous work require integration with the database optimiser to make appropriate decisions to guide the transformation (the sideways information passing strategy, or SIPS).
Damien Sereni, Pavel Avgustinov, Oege de Moor
SIGMOD Conference3
2007 Making trace monitors feasible
abstract
A trace monitor observes an execution trace at runtime; when it recognises a specified sequence of events, the monitor runs extra code. In the aspect-oriented programming community, the idea originatedas a generalisation of the advice-trigger mechanism: instead of matchingon single events (joinpoints), one matches on a sequence of events. The runtime verification community has been investigating similar mechanisms for a number of years, specifying the event patterns in terms of temporal logic, and applying the monitors to hardware and software.
Pavel Avgustinov, Julian Tibble, Oege de Moor
OOPSLA3
2007 Object-oriented queries over software systems: (abstract of invited talk)
abstract
Code queries are useful for enforcing coding conventions, navigating a large code base, and for identifying locations to refactor. The program understanding community has long advocated the use of a relational database to facilitate such code queries [3, 9]. While the idea has found some uptake in industry [2, 11], relational queries over code have not yet found widespread use.
Oege de Moor, Elnar Hajiyev, Mathieu Verbaere
PEPM1
2007 Semantics of static pointcuts in aspectJ
abstract
In aspect-oriented programming, one can intercept events by writing patterns called pointcuts. The pointcut language of the most popular aspect-oriented programming language, AspectJ, allows the expression of highly complex properties of the static program structure.We present the first rigorous semantics of the AspectJ pointcut language, by translating static patterns into safe ( i.e. range-restricted and stratified) Datalog queries. Safe Datalog is a logic language like Prolog, but it does not have data structures; consequently it has a straightforward least fixpoint semantics and all queries terminate.The translation from pointcuts to safe Datalog consists of a set of simple conditional rewrite rules, implemented using the Stratego system. The resulting queries are themselves executable with the CodeQuest system. We present experiments indicating that direct execution of our semantics is not prohibitively expensive.
Pavel Avgustinov, Elnar Hajiyev, Neil Ongkingco, Oege de Moor, Damien Sereni, Julian Tibble, Mathieu Verbaere
POPL4
2007 On the Semantics of Matching Trace Monitoring Patterns
Pavel Avgustinov, Julian Tibble, Oege de Moor
RV3
2006 codeQuest: Scalable Source Code Queries with Datalog
Elnar Hajiyev, Mathieu Verbaere, Oege de Moor
ECOOP3
2006 JunGL: a scripting language for refactoring
abstract
Refactorings are behaviour-preserving program transformations, typically for improving the structure of existing code. A few of these transformations have been mechanised in interactive development environments. Many more refactorings have been proposed, and it would be desirable for programmers to script their own refactorings. Implementing such source-to-source transformations, however, is quite complex: even the most sophisticated development environments contain significant bugs in their refactoring tools.We present a domain-specific language for refactoring, named JunGL. It manipulates a graph representation of the program: all information about the program, including ASTs for its compilation units, variable binding, control flow and so on is represented in a uniform graph format. The language is a hybrid of a functional language (in the style of ML) and a logic query language (akin to Datalog). JunGL furthermore has a notion of demand-driven evaluation for constructing computed information in the graph, such as control flow edges. Borrowing from earlier work on the specification of compiler optimisations, JunGL uses so-called `path queries' to express dataflow properties.We motivate the design of JunGL via a number of non-trivial refactorings, and describe its implementation on the.NET platform.
Mathieu Verbaere, Ran Ettinger, Oege de Moor
ICSE3
2006 Aspects and Data Refinement
Pavel Avgustinov, Eric Bodden, Elnar Hajiyev, Oege de Moor, Neil Ongkingco, Damien Sereni, Ganesh Sittampalam, Julian Tibble
MPC4
2005 abc: The AspectBench Compiler for AspectJ
Chris Allan, Pavel Avgustinov, Aske Simon Christensen, Laurie J. Hendren, Sascha Kuzins, Jennifer Lhoták, Ondrej Lhoták, Oege de Moor, Damien Sereni, Ganesh Sittampalam, Julian Tibble
GPCE8
2005 Adding trace matching with free variables to AspectJ
abstract
An aspect observes the execution of a base program; when certain actions occur, the aspect runs some extra code of its own. In the AspectJ language, the observations that an aspect can make are confined to the current action: it is not possible to directly observe the history of a computation.Recently, there have been several interesting proposals for new history-based language features, most notably by Douence et al. and by Walker and Viggers. In this paper, we present a new history-based language feature called tracematches that enables the programmer to trigger the execution of extra code by specifying a regular pattern of events in a computation trace. We have fully designed and implemented tracematches as a seamless extension of AspectJ.A key innovation in our tracematch approach is the introduction of free variables in the matching patterns. This enhancement enables a whole new class of applications in which events can be matched not only by the event kind, but also by the values associated with the free variables. We provide several examples of applications enabled by this feature.After introducing and motivating the idea of tracematches via examples, we present a detailed semantics of our language design, and we derive an implementation from that semantics. The implementation has been realised as an extension of the abc compiler for AspectJ.
Chris Allan, Pavel Avgustinov, Aske Simon Christensen, Laurie J. Hendren, Sascha Kuzins, Ondrej Lhoták, Oege de Moor, Damien Sereni, Ganesh Sittampalam, Julian Tibble
OOPSLA7
2005 Optimising aspectJ
Pavel Avgustinov, Aske Simon Christensen, Laurie J. Hendren, Sascha Kuzins, Jennifer Lhoták, Ondrej Lhoták, Oege de Moor, Damien Sereni, Ganesh Sittampalam, Julian Tibble
PLDI7
2004 Measuring the dynamic behaviour of AspectJ programs
abstract
This paper proposes and implements a rigorous method for studying the dynamic behaviour of AspectJ programs. As part of this methodology several new metrics specific to AspectJ programs are proposed and tools for collecting the relevant metrics are presented. The major tools consist of: (1) a modified version of the AspectJ compiler that tags bytecode instructions with an indication of the cause of their generation, such as a particular feature of AspectJ; and (2) a modified version of the *J dynamic metrics collection tool which is composed of a JVMPI-based trace generator and an analyzer which propagates tags and computes the proposed metrics. This dynamic propagation is essential, and thus this paper contributes not only new metrics, but also non-trivial ways of computing them.
Bruno Dufour, Christopher Goard, Laurie J. Hendren, Oege de Moor, Ganesh Sittampalam, Clark Verbrugge
OOPSLA4
2004 Incremental execution of transformation specifications
abstract
We aim to specify program transformations in a declarative style, and then to generate executable program transformers from such specifications. Many transformations require non-trivial program analysis to check their applicability, and it is prohibitively expensive to re-run such analyses after each transformation. It is desirable, therefore, that the analysis information is incrementally updated.We achieve this by drawing on two pieces of previous work: first, Bernhard Steffen's proposal to use model checking for certain analysis problems, and second, John Conway's theory of language factors. The first allows the neat specification of transformations, while the second opens the way for an incremental implementation. The two ideas are linked by using regular patterns instead of Steffen's modal logic: these patterns can be viewed as queries on the set of program paths.
Ganesh Sittampalam, Oege de Moor, Ken Friis Larsen
POPL2
2003 Compiling embedded languages
abstract
Functional languages are particularly well-suited to the interpretive implementations of Domain-Specific Embedded Languages (DSELs). We describe an implemented technique for producing optimizing compilers for DSELs, based on Kamin's idea of DSELs for program generation. The technique uses a data type of syntax for basic types, a set of smart constructors that perform rewriting over those types, some code motion transformations, and a back-end code generator. Domain-specific optimization results from chains of domain-independent rewrites on basic types. New DSELs are defined directly in terms of the basic syntactic types, plus host language functions and tuples. This definition style makes compilers easy to write and, in fact, almost identical to the simplest embedded interpreters. We illustrate this technique with a language Pan for the computationally intensive domain of image synthesis and manipulation.
Conal Elliott, Sigbjørn Finne, Oege de Moor
J. Funct. Program.3
2002 Forwarding in Attribute Grammars for Modular Language Design
Eric Van Wyk, Oege de Moor, Kevin Backhouse, Paul Kwiatkowski
CC2
2002 Transforming the .NET intermediate language using path logic programming
abstract
Path logic programming is a modest extension of Prolog for the specification of program transformations. We give an informal introduction to this extension, and we show how it can be used in coding standard compiler optimisations, and also a number of obfuscating transformations. The object language is the Microsoft .NET intermediate language (IL).
Stephen Drape, Oege de Moor, Ganesh Sittampalam
PPDP2
2001 Imperative Program Transformation by Rewriting
David Lacey, Oege de Moor
CC2
2001 Higher-order matching for program transformation
Oege de Moor, Ganesh Sittampalam
Theor. Comput. Sci.1
2000 Container types categorically
abstract
A program derivation is said to be polytypic if some of its parameters are data types. Often these data types are container types, whose elements store data. Polytypic program derivations necessitate a general, non-inductive definition of ‘container (data) type’. Here we propose such a definition: a container type is a relator that has membership. It is shown how this definition implies various other properties that are shared by all container types. In particular, all container types have a unique strength, and all natural transformations between container types are strong.
Paul F. Hoogendijk, Oege de Moor
J. Funct. Program.2
1999 Bridging the Algorithm Gap: A Linear-Time Functional Program for Paragraph Formatting
Oege de Moor, Jeremy Gibbons
Sci. Comput. Program.1
1998 Transformation in intentional programming
abstract
Intentional programming is a new paradigm in software engineering that allows programming languages to be implemented in a highly extensible manner. In particular, the programmer can specify new abstractions that are specific to his problem domain, while simultaneously recording any domain specific optimizations that may apply to such new abstractions. This paper describes a system that implements intentional programming, focusing on the facilities for program transformation. The key difference with other approaches lies in the way the order of transformation is controlled: emphasis is placed on specifying that order in a compositional fashion, so that transformations are easily re-used.
William Aitken, Brian Dickens, Paul Kwiatkowski, Oege de Moor, Charles Simonyi
ICSR4
1997 More Haste, Less Speed: Lazy Versus Eager Evaluation
abstract
Nicholas Pippenger has recently given a problem that, under two simple restrictions, can be solved in linear time by an impure Lisp program, but requires Ω( n log n ) steps to be solved by any eager pure Lisp program. By showing how to solve the problem in linear time with a lazy functional program, we demonstrate that – for some problems at least – lazy evaluators are strictly more powerful than eager ones.
Richard S. Bird, Geraint Jones, Oege de Moor
J. Funct. Program.3
1996 Generic Functional Programming with Types and Relations
abstract
Abstract A generic functional program is one which is parameterised by datatype. By installing specific choices, for example lists or trees, different programs are obtained that are, nevertheless, abstractly the same. The purpose of this paper is to explore the possibility of deriving generic programs. Part of the theory of lists that deals with segments is recast as a theory about ‘segments’ in a wide class of datatypes, and then used to pose and solve a generic version of a well-known problem.
Richard S. Bird, Oege de Moor, Paul F. Hoogendijk
J. Funct. Program.2
1994 Categories, Relations and Dynamic Programming
abstract
Dynamic programming is a strategy for solving optimisation problems. In this paper, we show how many problems that may be solved by dynamic programming are instances of the same abstract specification. This specification is phrased using the calculus of relations offered by topos theory. The main theorem underlying dynamic programming can then be proved by straightforward equational reasoning. The generic specification of dynamic programming makes use of higher-order operators on relations, akin to the fold operators found in functional programming languages. In the present context, a data type is modelled as an initial F-algebra, where F is an endofunctor on the topos under consideration. The mediating arrows from this initial F-algebra to other F-algebras are instances of fold – but only for total functions. For a regular category ε, it is possible to construct a category of relations Rel(ε). When a functor between regular categories is a so-called relator, it can be extended (in some canonical way) to a functor between the corresponding categories of relations. Applied to an endofunctor on a topos, this process of extending functors preserves initial algebras, and hence fold can be generalised from functions to relations. It is well-known that the use of dynamic programming is governed by the principle of optimality. Roughly, the principle of optimality says that an optimal solution is composed of optimal solutions to subproblems. In a first attempt, we formalise the principle of optimality as a distributivity condition. This distributivity condition is elegant, but difficult to check in practice. The difficulty arises because we consider minimum elements with respect to a preorder, and therefore minimum elements are not unique. Assuming that we are working in a Boolean topos, it can be proved that monotonicity implies distributivity, and this monotonicity condition is easy to verify in practice.
Oege de Moor
Math. Struct. Comput. Sci.1
1994 An Algebraic Construction of Predicate Transformers
Paul H. B. Gardiner, Clare E. Martin, Oege de Moor
Sci. Comput. Program.3
1993 List Partitions
abstract
Abstract By definition, a partition of a list is a division of that list into nonempty contiguous segments. Many programming and operations research problems can be specified in terms of list partitions, and we present a hierarchy of theorems for deriving programs from such specifications. Throughout, reasoning is conducted in an equational style using the calculus for program synthesis developed by Bird and Meertens.
Richard S. Bird, Oege de Moor
Formal Aspects Comput.2
1992 Solving Optimisation Problems with Catamorphism
Richard S. Bird, Oege de Moor
MPC2
1992 An Algebraic Construction of Predicate Transformers
Paul H. B. Gardiner, Clare E. Martin, Oege de Moor
MPC3
1992 Inductive Data Types for Predicate Transformers
Oege de Moor
Inf. Process. Lett.1