These abstracts are for talks at this event.

NEPLS is a venue for ongoing research, so the abstract and supplemental material associated with each talk is necessarily temporal. The work presented here may be in a state of flux. In all cases, please consult the authors' Web pages for up-to-date information. Please don't refer to these pages as a definitive source.


Integrating Testing with Theorem Proving in ACL2s

Harsh Raju Chamarthi (Northeastern University)

Using an interactive theorem prover to reason about programs involves
a sequence of interactions where the user challenges the theorem
prover with conjectures. Invariably, many of the conjectures posed are
in fact false, and users often spend considerable effort examining the
theorem prover's output before realizing this. We present a
lightweight method, implemented in the ACL2 Sedan (ACL2s), for
automatically generating concrete counterexamples. Our approach
automatically generates examples that are guaranteed to satisfy
hypotheses restricting the type of a variable. Furthermore, we use the
full power of the theorem prover to simplify conjectures, leading to a
very powerful, synergistic integration of testing with theorem
proving. We will discuss our experience with using ACL2s to teach
freshmen students how to reason about programs and will give a demo
that includes several examples.

This is joint work with Peter Dillinger, Matt Kaufmann and Panagiotis
Manolios.


Delimited Checkpoints for Effective Contracts

Avi Shinnar (Harvard University)

Delimited checkpoints are a convenient interface that we can use to
build effective contracts.  Like first class checkpoints, they allow a
form of time travel, letting a computation capture a snapshot of
memory and restore it at some later point.  Crucially, they also allow
for comparison operations, allowing a contract to determine the
footprint of a computation.  This allows us to build expressive
contracts, including framing contracts such as modifies and
post-conditions that can reference the pre-execution state of memory.
Additionally, they support assertions that are guaranteed to be
erasable, despite having local effects.

Observing that these contracts only require the use of checkpoints in
a delimited (region based) manner, we restrict our attention to
checkpoints that are only used within a given scope: hence "delimited"
checkpoints.  This allows for a simple implementation reusing the
mechanisms underlying Software Transactional Memory.  A prototype of
this system has been created by extending GHC's implementation of STM
Haskell.


Synthesizing Cyber-Physical Architectural Models with Real-Time Constraints

Vasilis Papavasileiou (Northeastern University)

We present techniques that enable designers to algorithmically
synthesize cyber-physical architectural models with real-time
constraints. We do this by providing a declarative language that
allows designers to specify what properties their architectural models
should have, not how to achieve them. This provides designers with a
qualitatively new level of abstraction that enables the exploration of
design spaces at the earliest stages of design, when doing so provides
the most benefit. Our system was used to automatically synthesize
cyber-physical architectural models with hard real-time constraints
from a large-scale industrial design.


Macros that Oblige

Martin Hirzel (IBM Watson Research Center)

This talk describes two contributions:

1. Higher-order macros with contracts and hygiene.

2. Higher-order composite stream-processing operators with contracts.

Contribution (1) enables contribution (2), and contribution (2)
motivates contribution (1). But this talk explains (1) and (2)
separately to facilitate understanding and adoption.


Implicit Arrow Annotations in Alms

Jesse Tov (Northeastern University)

Alms is a practical language with affine types, but it is not quite as
practical as it could be.  One thing weighing it down is the need for
"usage" annotations on arrows. For most types, Alms infers how many
times values of that type can be used (freely or only once) from the
structure of the type, but in general, the domain and codomain of a
function type do not determine how many times the function can be
used. Thus, function arrows require annotation.

In the common case, however, arrow annotations follow regular
patterns, and are therefore predictable. We can exploit this
regularity to infer annotations on unadorned arrow types. In cases
where the default annotation would be wrong, an explicit annotation
can override it. The annotation inference rules have no effect on type
soundness, but a good heuristic minimizes the annotation burden while
making the implicit annotations predictable by the programmer.


Taming the Wildcards: Combining Definition- and Use-Site Variance

John Altidor (University of Massachusetts, Amherst)

Variance allows the safe integration of parametric and subtype
polymorphism. Two flavors of variance, definition-site versus use-site
variance, have been studied and have had their merits hotly
debated. Definition-site variance (as in Scala and C#) offers simple
type-instantiation rules, but causes fractured definitions of
naturally invariant classes; Use-site variance (as in Java) offers
simplicity in class definitions, yet complex type-instantiation rules
that elude most programmers.

We present a unifying framework for reasoning about variance. Our
framework is quite simple and entirely denotational, that is, it
evokes directly the definition of variance with a small core calculus
that does not depend on specific type systems. This general framework
can have multiple applications to combine the best of both worlds: for
instance, it can be used to add use-site variance annotations to the
Scala type system. We show one such application in detail: we extend
the Java type system with a mechanism that modularly infers the
definition-site variance of type parameters, while allowing use-site
variance annotations on any type-instantiation.

Applying our technique to six Java generic libraries (including the
Java core library) shows that 20-58% (depending on the library) of
generic definitions are inferred to have single-variance; 8-63% of
method signatures can be relaxed through this inference, and up to 91%
of existing wildcard annotations are unnecessary and can be elided.


Parsing Reflective Grammars

Paul Stansifer (Northeastern University)

Existing technology can parse arbitrary context-free grammars, but
only a single, static grammar per input.  In order to support macro
systems that can locally introduce arbitrary new syntax (as opposed to
syntax constrained to S-expressions), we propose reflective grammars,
which can add new rules to their grammars during parsing.  We
demonstrate an algorithm for parsing reflective grammars. The
algorithm is based on Earley's algorithm, and we prove that it
performs asymptotically no worse than Earley's algorithm on ordinary
context-free grammars.


Virtualizing Real-World Objects

Daniel Winograd-Cort (Yale University)

Every programming language has some way of communicating with the
outside world.  Usually we refer to such mechanisms as input/output,
or I/O. In our opinion, conventional I/O mechanisms represent an
awkward disconnect between the internal execution of a program and the
objects, devices, and protocols in the real world. Furthermore, the
I/O interface typically does not distinguish between different kinds
of real-world objects -- everything is treated the same.

In this talk we introduce a radically different approach to
I/O. Instead of treating real- world objects as being external to the
program, we expand the sphere of influence of program execution to
include, indeed subsume, the real world. No longer are "commands" sent
to or received from a device -- instead, the device is a functional
value in the program, just like an arithmetic operator. We call this
approach virtualizing real-world objects.

But the idea runs deeper. Virtual objects (such as GUI widgets) can be
handled in the same way -- and thus we virtualize virtual objects as
well. Furthermore, the approach can be generalized to include
non-local effects, such as is needed for debugging (using something
that we call a wormhole) and random number generation.

Our methodology might seem naive -- for example, how does one prevent
a virtualized device from being copied, thus potentially introducing
non-determinism as one part of a program competes for the same
resource as another? To solve this problem, we introduce the notion of
resource types that assure that a virtualized object is not duplicated
and that I/O and non-local effects are safe. Perhaps just as
important, resource types provide a deeper level of transparency given
for free at the type level; by inspecting the type, one can clearly
see exactly what resources are being used. By using an arrow-based
framework, higher-order types, and type families, we are able to
implement our ideas in Haskell. The result is a safe, effective, and
transparent approach to I/O.


Further Developments in Forlan

Alley Stoughton

Forlan is an open source formal language theory toolset that I've been
developing over the last decade.  It's intended to facilitate
sophisticated experimentation with formal languages, and is embedded
in Standard ML.  In this talk, I will focus on work not reported in my
FDPE '08 paper, "Experimenting with Formal Languages using Forlan".
Some of this work predates the publication of this paper, and some of
it is more recent, or is ongoing.  I will focus on:

 * JForlan, a complete redevelopment of the graphical editor for
   Forlan automata and trees;

 * simplification of regular expressions, finite automata and
   grammars;

 * implementation of additional closure algorithms for finite
   automata and grammars;

 * conversion of finite automata to regular expressions using regular
   expression finite automata; and

 * the functional programming language used as an alternative to
   Turing machines.

I will also talk about future plans for Forlan.

Forlan


From Java to Lime: Sequential to Parallel, Imperative to Functional, Homogeneous to Heterogeneous

Joshua Auerbach (IBM Research)

Lime is a new language developed in the Liquid Metal project at IBM
Research. Lime targets managed environments with a heterogeneous mix
of CPUs, GPUs, FPGAs, and other accelerators. Lime's strengths include
source and binary level compatibility with Java, and a methodology for
gradual migration from sequential, imperative code to parallel,
functional code that better fits heterogeneous hardware. Lime permits
imperative parts of a program to remain largely unchanged, and allows
the programmer to focus on smaller parts that need modification. Such
changes are designed to be "just enough" to permit the compiler to
infer areas that are functional, parallel, and capable of being
offloaded from the CPU to a GPU or FPGA.

The talk will demonstrate the Lime language, development environment,
compiler, and runtime support, as well as Lime's novel approaches to
both data flow and map/reduce styles of programming. The talk will
also present language support to identify pure functions in a natural
way, that meshes well with an imperative object-oriented language.

See the Web for earlier publications and details of the project.


Asynchronous Assertions

Edward Aftandilian (Tufts University)

Assertions are a powerful bug detection technique. Traditional
assertion checking, however, is performed synchronously, imposing its
full cost on the runtime of the program. As a result, many useful
kinds of checks are impractical because they lead to extreme
slowdowns.

We present a solution that decouples assertion evaluation from program
execution: assertions are evaluated asynchronously while the program
continues to execute. Our technique ensures that the assertion
checking thread sees a consistent snapshot of the global state from
the moment the assertion is issued, and that an assertion always
produces the same result as it would in a serial execution. In
addition, asynchronous assertions may be written as though they will
be executed synchronously; no explicit synchronization with the
program is necessary.

We implemented our technique in a system called STROBE, a
snapshot-based system for asynchronous assertion checking in both
single-and multi-threaded Java applications. STROBE runs inside the
Java virtual machine and uses copy-on-write to build snapshots
incrementally. We find that asynchronous checking scales almost
perfectly over synchronous checking in many cases, indicating that the
snapshot overhead is quite low. STROBE provides tolerable overheads
(under 2X) even for heavy-weight assertions that would otherwise
result in crushing slowdowns.


Polymorphic Contracts

Michael Greenberg (University of Pennsylvania

Manifest contracts track precise properties by refining types with
predicates---e.g., {x:Int | x > 0} denotes the positive integers.
Contracts and polymorphism make a natural combination: programmers can
give strong contracts to abstract types, precisely stating pre- and
post-conditions while hiding implementation details---for example, an
abstract type of stacks might specify that the pop operation has input
type {x:'a Stack | not (empty x)}. We formalize this combination by
defining FH, a polymorphic calculus with manifest contracts, and
establishing fundamental properties including type soundness and
relational parametricity. Our development relies on a significant
technical improvement over earlier presentations of contracts: instead
of introducing a denotational model to break a problematic circularity
between typing, subtyping, and evaluation, we develop the metatheory
of contracts in a completely syntactic fashion, omitting subtyping
from the core system and recovering it post facto as a derived
property.


Last modified Monday, February 28th, 2011 6:40:52pm