Cleaned up SCP source.
This commit is contained in:
parent
85f0dce1ac
commit
5d21b09743
16 changed files with 0 additions and 4757 deletions
Binary file not shown.
|
@ -1,32 +0,0 @@
|
||||||
\section{Code}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/InherentIndices.png}
|
|
||||||
\caption{Indices}
|
|
||||||
\label{fig:indices}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/InherentSubst.png}
|
|
||||||
\caption{Substitution}
|
|
||||||
\label{fig:subst}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/InherentReductions.png}
|
|
||||||
\caption{Reductions}
|
|
||||||
\label{fig:reductions}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/InherentProgress.png}
|
|
||||||
\caption{Progress}
|
|
||||||
\label{fig:progress}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/InherentEval.png}
|
|
||||||
\caption{Evaluation}
|
|
||||||
\label{fig:eval}
|
|
||||||
\end{figure}
|
|
||||||
|
|
Binary file not shown.
|
@ -1,660 +0,0 @@
|
||||||
%\documentclass[runningheads,oribibl]{llncs}
|
|
||||||
\documentclass[runningheads]{llncs}
|
|
||||||
\usepackage{natbib}
|
|
||||||
% \usepackage{stmaryrd}
|
|
||||||
% \usepackage{proof}
|
|
||||||
% \usepackage{amsmath}
|
|
||||||
% \usepackage{amssymb}
|
|
||||||
% \usepackage{color}
|
|
||||||
% \usepackage{bbm}
|
|
||||||
% \usepackage[greek,english]{babel}
|
|
||||||
% \usepackage{ucs}
|
|
||||||
% \usepackage[utf8x]{inputenc}
|
|
||||||
% \usepackage{autofe}
|
|
||||||
\usepackage{agda}
|
|
||||||
\usepackage{graphicx}
|
|
||||||
\usepackage{url}
|
|
||||||
\renewcommand\UrlFont{\color{blue}\rmfamily}
|
|
||||||
\usepackage{stix}
|
|
||||||
\setcitestyle{round,aysep={}}
|
|
||||||
|
|
||||||
\DeclareUnicodeCharacter{"2982}{\ensuremath{\typecolon}} % ⦂
|
|
||||||
\DeclareUnicodeCharacter{"220E}{\ensuremath{\QED}} % ∎
|
|
||||||
|
|
||||||
\begin{document}
|
|
||||||
\title{Programming Language Foundations in Agda}
|
|
||||||
\author{Philip Wadler}
|
|
||||||
\authorrunning{P. Wadler}
|
|
||||||
\institute{University of Edinburgh\\
|
|
||||||
\email{wadler@inf.ed.ac.uk}}
|
|
||||||
\maketitle
|
|
||||||
%
|
|
||||||
\begin{abstract}
|
|
||||||
The leading textbook for formal methods is \emph{Software Foundations}
|
|
||||||
(SF), written by Benjamin Pierce in collaboration with others, and
|
|
||||||
based on Coq. After five years using SF in the classroom, I have come
|
|
||||||
to the conclusion that Coq is not the best vehicle for this purpose,
|
|
||||||
as too much of the course needs to focus on learning tactics for proof
|
|
||||||
derivation, to the cost of learning programming language theory.
|
|
||||||
Accordingly, I have written a new textbook, \emph{Programming Language
|
|
||||||
Foundations in Agda} (PLFA). PLFA covers much of the same ground as
|
|
||||||
SF, although it is not a slavish imitation.
|
|
||||||
|
|
||||||
What did I learn from writing PLFA? First, that it is possible. One
|
|
||||||
might expect that without proof tactics that the proofs become too
|
|
||||||
long, but in fact proofs in PLFA are about the same length as those in
|
|
||||||
SF. Proofs in Coq require an interactive environment to be understood,
|
|
||||||
while proofs in Agda can be read on the page. Second, that
|
|
||||||
constructive proofs of preservation and progress give immediate rise
|
|
||||||
to a prototype evaluator. This fact is obvious in retrospect but it is
|
|
||||||
not exploited in SF (which instead provides a separate normalise
|
|
||||||
tactic) nor can I find it in the literature. Third, that using raw
|
|
||||||
terms with a separate typing relation is far less perspicuous than
|
|
||||||
using inherently-typed terms. SF uses the former presentation, while
|
|
||||||
PLFA presents both; the former uses about 1.6 as many lines of Agda
|
|
||||||
code as the latter, roughly the golden ratio.
|
|
||||||
|
|
||||||
The textbook is written as a literate Agda script, and can be found here:
|
|
||||||
\begin{center}
|
|
||||||
\url{http://plfa.inf.ed.ac.uk}
|
|
||||||
\end{center}
|
|
||||||
\keywords{Agda \and Coq \and lambda calculus \and dependent types.}
|
|
||||||
\end{abstract}
|
|
||||||
|
|
||||||
\section{Introduction}
|
|
||||||
|
|
||||||
The most profound connection between logic and computation is a pun.
|
|
||||||
The doctrine of Propositions as Types asserts that a certain kind of formal
|
|
||||||
structure may be read in two ways: either as a proposition in logic or
|
|
||||||
as a type in computing. Further, a related structure may be read as
|
|
||||||
either the proof of the proposition or as a programme of the
|
|
||||||
corresponding type. Further still, simplification of proofs
|
|
||||||
corresponds to evaluation of programs.
|
|
||||||
|
|
||||||
Accordingly, the title of this paper, and the corresponding textbook,
|
|
||||||
\emph{Programming Language Foundations in Agda} (hence, PLFA)
|
|
||||||
also has two readings. It may be parsed as ``(Programming Language)
|
|
||||||
Foundations in Agda'' or ``Programming (Language Foundations) in
|
|
||||||
Agda''---the specifications in the proof assistant Agda both describe
|
|
||||||
programming languages and are themselves programmes.
|
|
||||||
|
|
||||||
Since 2013, I have taught a course on Types and Semantics for
|
|
||||||
Programming Languages to fourth-year undergraduates and masters
|
|
||||||
students at the University of Edinburgh. An earlier version of that
|
|
||||||
course was based on \emph{Types and Programming Languages} by
|
|
||||||
\citet{Pierce-2002}, but my version was taught from its successor,
|
|
||||||
\emph{Software Foundations} (hence, SF) by \citet{Pierce-et-al-2010},
|
|
||||||
which is based on the proof assistance Coq \citep{Huet-et-al-1997}.
|
|
||||||
I am convinced by the claim of \citet{Pierce-2009}, made in his ICFP
|
|
||||||
Keynote \emph{Lambda, The Ultimate TA}, that basing a course around a
|
|
||||||
proof assistant aids learning.
|
|
||||||
|
|
||||||
However, after five years of experience, I have come to the conclusion
|
|
||||||
that Coq is not the best vehicle. Too much of the course needs to
|
|
||||||
focus on learning tactics for proof derivation, to the cost of
|
|
||||||
learning the fundamentals of programming language theory. Every
|
|
||||||
concept has to be learned twice: e.g., both the product data type, and
|
|
||||||
the corresponding tactics for introduction and elimination of
|
|
||||||
conjunctions. The rules Coq applies to generate induction hypotheses
|
|
||||||
can sometimes seem mysterious. While the \texttt{notation} construct
|
|
||||||
permits pleasingly flexible syntax, it can be confusing that the same
|
|
||||||
concept must always be given two names, e.g., both
|
|
||||||
\texttt{subst~N~x~M} and \texttt{N~[x~:=~M]}. Names of tactics are
|
|
||||||
sometimes short and sometimes long; naming conventions in the standard
|
|
||||||
library can be wildly inconsistent. \emph{Propositions as types} as a
|
|
||||||
foundation of proof is present but hidden.
|
|
||||||
|
|
||||||
I found myself keen to recast the course in Agda \citep{Bove-et-al-2009}.
|
|
||||||
In Agda, there is
|
|
||||||
no longer any need to learn about tactics: there is just
|
|
||||||
dependently-typed programming, plain and simple. Introduction is
|
|
||||||
always by a constructor, elimination is always by pattern
|
|
||||||
matching. Induction is no longer a mysterious separate concept, but
|
|
||||||
corresponds to the familiar notion of recursion. Mixfix syntax is
|
|
||||||
flexible while using just one name for each concept, e.g.,
|
|
||||||
substitution is \texttt{\_[\_:=\_]}. The standard library is not perfect, but
|
|
||||||
there is a fair attempt at consistency. \emph{Propositions as types} as a
|
|
||||||
foundation of proof is on proud display.
|
|
||||||
|
|
||||||
Alas, there is no textbook for programming language theory in
|
|
||||||
Agda. \emph{Verified Functional Programming in Agda} by \citep{Stump-2016}
|
|
||||||
covers related ground, but focusses more on programming with dependent
|
|
||||||
types than on the theory of programming languages.
|
|
||||||
|
|
||||||
The original goal was to simply adapt \emph{Software Foundations},
|
|
||||||
maintaining the same text but transposing the code from Coq to Agda.
|
|
||||||
But it quickly became clear to me that after five years in the
|
|
||||||
classroom I had my own ideas about how to present the material. They
|
|
||||||
say you should never write a book unless you cannot \emph{not} write the
|
|
||||||
book, and I soon found that this was a book I could not not write.
|
|
||||||
|
|
||||||
I am fortunate that my student, Wen Kokke, was keen to help. She
|
|
||||||
guided me as a newbie to Agda and provided an infrastructure that is
|
|
||||||
easy to use and produces pages that are a pleasure to view.
|
|
||||||
The bulk of the book was written January--June 2018, while on
|
|
||||||
sabbatical in Rio de Janeiro.
|
|
||||||
|
|
||||||
This paper is a personal reflection, summarising what I learned in the
|
|
||||||
course of writing the textbook. Some of it reiterates advice that is
|
|
||||||
well-known to some members of the dependently-typed programming
|
|
||||||
community, but which deserves to be better known. The paper is
|
|
||||||
organised as follows.
|
|
||||||
|
|
||||||
Section~2 outlines the
|
|
||||||
topics covered in PLFA, and notes what is omitted.
|
|
||||||
|
|
||||||
Section~3 compares Agda and Coq as vehicles for pedagogy. Before
|
|
||||||
writing the book, it was not obvious that it was even possible;
|
|
||||||
conceivably, without tactics some of the proofs
|
|
||||||
balloon in size. In fact, it turns out that for the results in PLFA
|
|
||||||
and SF, the proofs are of roughly comparable size, and (in my opinion)
|
|
||||||
the proofs in PLFA are more readable and have a pleasing visual
|
|
||||||
structure.
|
|
||||||
|
|
||||||
Section~4 observes that constructive proofs of progress and
|
|
||||||
preservation combine trivially to produce a constructive evaluator for
|
|
||||||
terms. This idea is obvious once you have seen it, yet I cannot
|
|
||||||
find it described in the literature. For instance, SF separately
|
|
||||||
implements a \texttt{normalise} tactic that has nothing to do with
|
|
||||||
progress and preservation.
|
|
||||||
|
|
||||||
Section~5 claims that raw terms should be avoided in favour of
|
|
||||||
inherently-typed terms. PLFA develops lambda calculus with both raw
|
|
||||||
and inherently-typed terms, permitting a comparison. It turns out the
|
|
||||||
former is less powerful---it supports substitution only for closed
|
|
||||||
terms---but significantly longer---about 1.6 times as many lines of code,
|
|
||||||
roughly the golden ratio.
|
|
||||||
|
|
||||||
I will argue that Agda has advantages over Coq for
|
|
||||||
pedagogic purposes. My focus is purely on the case of a proof assistant
|
|
||||||
as an aid to \emph{learning} formal semantics using examples of
|
|
||||||
\emph{modest} size. I admit up front that
|
|
||||||
there are many tasks for which Coq is better suited than Agda.
|
|
||||||
A proof assistant that supports tactics, such as Coq or Isabelle,
|
|
||||||
is essential for formalising serious mathematics,
|
|
||||||
such as the Four-Colour Theorem \citep{Gonthier-2008},
|
|
||||||
the Odd-Order Theorem \citep{Gonthier-et-al-2013},
|
|
||||||
or Kepler's Conjecture \citep{Hales-et-al-2017},
|
|
||||||
or for establishing correctness of software at scale,
|
|
||||||
as with the CompCert compiler \citep{Leroy-2009,Kastner-et-al-2017}
|
|
||||||
or the SEL4 operating system \citep{Klein-2009,O'Connor-2016}.
|
|
||||||
|
|
||||||
\section{Scope}
|
|
||||||
|
|
||||||
PLFA is aimed at students in the last year of an undergraduate
|
|
||||||
honours programme or the first year of a master or doctorate degree.
|
|
||||||
It aims to teach the fundamentals of operational semantics of
|
|
||||||
programming languages, with simply-typed lambda calculus as the
|
|
||||||
central example. The textbook is written as a literate script in Agda.
|
|
||||||
As with SF, the hope is that using
|
|
||||||
a proof assistant will make the development more concrete
|
|
||||||
and accessible to students, and give them rapid feedback to find
|
|
||||||
and correct misaprehensions.
|
|
||||||
|
|
||||||
The book is broken into two parts. The first part, Logical Foundations,
|
|
||||||
develops the needed formalisms. The second part, Programming Language
|
|
||||||
Foundations, introduces basic methods of operational semantics.
|
|
||||||
(SF is divided into books, the first two of which have the same names
|
|
||||||
as the two parts of PLFA, and cover similar material.)
|
|
||||||
|
|
||||||
Each chapter has both a one-word name and a title, the one-word name
|
|
||||||
being both its module name and its file name.
|
|
||||||
|
|
||||||
\subsection*{Part I, Logical Foundations}
|
|
||||||
|
|
||||||
\paragraph{Naturals: Natural numbers}
|
|
||||||
Introduces the inductive definition of natural numbers in terms of
|
|
||||||
zero and successor, and recursive definitions of addition,
|
|
||||||
multiplication, and monus. Emphasis is put on how a tiny description
|
|
||||||
can specify an infinite domain.
|
|
||||||
|
|
||||||
\paragraph{Induction: Proof by induction}
|
|
||||||
Introduces induction to prove properties
|
|
||||||
such as associativity and commutativity of addition.
|
|
||||||
Also introduces dependent functions to express universal quantification.
|
|
||||||
Emphasis is put on the correspondence between induction and recursion.
|
|
||||||
|
|
||||||
\paragraph{Relations: Inductive definitions of relations}
|
|
||||||
Introduces inductive definitions of less than or equal on natural numbers,
|
|
||||||
and odd and even natural numbers.
|
|
||||||
Proves properties such as reflexivity, transitivity, and
|
|
||||||
anti-symmetry, and that the sum of two odd numbers is even.
|
|
||||||
Emphasis is put on proof by induction over evidence that a relation holds.
|
|
||||||
|
|
||||||
\paragraph{Equality: Equality and equational reasoning}
|
|
||||||
Gives Martin L\"of's and Leibniz's definitions of equality, and proves
|
|
||||||
them equivalent, and defines the notation for equational reasoning used
|
|
||||||
throughout the book.
|
|
||||||
|
|
||||||
\paragraph{Isomorphism: Isomorphism and embedding}
|
|
||||||
Introduces isomorphism, which plays an important role in the
|
|
||||||
subsequent development. Also introduces dependent records, lambda
|
|
||||||
terms, and extensionality.
|
|
||||||
|
|
||||||
\paragraph{Connectives: Conjunction, disjunction, and implication}
|
|
||||||
Introduces product, sum, unit, empty, and function types, and their
|
|
||||||
interpretations as connectives of logic under Propositions as Types.
|
|
||||||
Emphasis is put on the analogy between these types and product, sum,
|
|
||||||
unit, zero, and exponential on naturals; e.g., product of numbers is
|
|
||||||
commutative and product of types is commutative up to isomorphism.
|
|
||||||
|
|
||||||
\paragraph{Negation: Negation, with intuitionistic and classical logic}
|
|
||||||
Introduces logical negation as a function into the empty
|
|
||||||
type, and explains the difference between classical and intuitionistic
|
|
||||||
logic.
|
|
||||||
|
|
||||||
\paragraph{Quantifiers: Universals and existentials}
|
|
||||||
Recaps universal quantifiers and their correspondence to dependent
|
|
||||||
functions, and introduces existential quantifiers and their
|
|
||||||
correspondence to dependent products.
|
|
||||||
|
|
||||||
\paragraph{Lists: Lists and higher-order functions}
|
|
||||||
Gives two different definitions of reverse and proves them equivalent.
|
|
||||||
Introduces map and fold and their properties, including that fold left
|
|
||||||
and right are equivalent in a monoid. Introduces predicates that hold
|
|
||||||
for all or any member of a list, with membership as a specialisation
|
|
||||||
of the latter.
|
|
||||||
|
|
||||||
\paragraph{Decidable: Booleans and decision procedures}
|
|
||||||
Introduces booleans and decidable types, and why the latter is to be
|
|
||||||
preferred to the former.
|
|
||||||
|
|
||||||
\subsection*{Part II, Programming Language Foundations}
|
|
||||||
|
|
||||||
\paragraph{Lambda: Introduction to lambda calculus}
|
|
||||||
Introduces lambda calculus, using a representation with named
|
|
||||||
variables and a separate typing relation. The language used is PCF,
|
|
||||||
with variables, lambda abstraction, application, zero, successor, case
|
|
||||||
over naturals, and fixpoint. Reduction is call-by-value and restricted
|
|
||||||
to closed terms.
|
|
||||||
|
|
||||||
\paragraph{Properties: Progress and preservation}
|
|
||||||
Proves key properties of simply-typed
|
|
||||||
lambda calculus, including progress and preservation. Progress and
|
|
||||||
preservation are combined to yield an evaluator.
|
|
||||||
|
|
||||||
\paragraph{DeBruijn: Inherently typed de Bruijn representation}
|
|
||||||
Introduces de Bruijn numbers and the inherently-typed representation.
|
|
||||||
Emphasis is put on the structural similarity between a term and its
|
|
||||||
corresponding type derivation; in particular, de Bruijn numbers
|
|
||||||
correspond to the judgment that a variable is well-typed under a given
|
|
||||||
environment.
|
|
||||||
|
|
||||||
\paragraph{More: More constructs of simply-typed lambda calculus}
|
|
||||||
Introduces product, sum, unit, and empty types as well as lists and let bindings
|
|
||||||
are explained. Typing and reduction rules are given informally; a few
|
|
||||||
are then give formally, and the rest are left as exercises for the reader.
|
|
||||||
The inherently typed representation is used.
|
|
||||||
|
|
||||||
\paragraph{Bisimulation: Relating reduction systems}
|
|
||||||
Shows how to translate the language with ``let'' terms
|
|
||||||
to the language without, representing a let as an application of an abstraction,
|
|
||||||
and shows how to relate the source and target languages with a bisimulation.
|
|
||||||
|
|
||||||
\paragraph{Inference: Bidirectional type inference}
|
|
||||||
Introduces bidirectional type inference, and applies it to convert from
|
|
||||||
a representation with named variables and a separate typing relation
|
|
||||||
to a representation de Bruijn indices with inherent types.
|
|
||||||
|
|
||||||
\paragraph{Untyped: Untyped calculus with full normalisation}
|
|
||||||
As a variation on earlier themes, discusses an untyped (but inherently
|
|
||||||
scoped) lambda calculus. Reduction is call-by-name over open terms,
|
|
||||||
with full normalisation (including reduction under lambda terms). Emphasis
|
|
||||||
is put on the correspondence between the structure of a term and
|
|
||||||
evidence that it is in normal form.
|
|
||||||
|
|
||||||
\subsection*{Discussion}
|
|
||||||
|
|
||||||
PLFA and SF differ in several particulars. PLFA begins with a computationally
|
|
||||||
complete language, PCF, while SF begins with a minimal language, simply-typed
|
|
||||||
lambda calculus with booleans. PLFA does not include type annotations in terms,
|
|
||||||
and uses bidirectional type inference, while SF has terms with unique types and
|
|
||||||
uses type checking. SF also covers a simple imperative language with Hoare logic,
|
|
||||||
subtyping, record types, mutable references, and normalisation none of which are
|
|
||||||
treated by PLFA. PLFA covers an inherently-typed de Bruijn
|
|
||||||
representation, bidirectional type inference, bisimulation, and an
|
|
||||||
untyped call-by-value language with full normalisation, none of which
|
|
||||||
are treated by SF.
|
|
||||||
|
|
||||||
SF has a third volume, written by Andrew Appel, on Verified Functional
|
|
||||||
Algorithms. I'm not sufficiently familiar with that volume to have a view
|
|
||||||
on whether it would be easy or hard to cover that material in Agda.
|
|
||||||
|
|
||||||
There is more material that would be desirable to include in PLFA
|
|
||||||
which was not due to limits of time. In future years, PLFA may be
|
|
||||||
extended to cover additional material, including mutable references,
|
|
||||||
normalisation, System F, pure type systems, and denotational
|
|
||||||
semantics. I'd especially like to include pure type systems as they
|
|
||||||
provide the readers with a formal model close to the dependent types
|
|
||||||
used in the book. My attempts so far to formalise pure type systems
|
|
||||||
have proved challenging.
|
|
||||||
|
|
||||||
\section{Proofs in Agda and Coq}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/plfa-progress-1.png}
|
|
||||||
\caption{PLFA, Progress (1/2)}
|
|
||||||
\label{fig:plfa-progress-1}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{figure}[p]
|
|
||||||
\includegraphics[width=\textwidth]{figures/plfa-progress-2.png}
|
|
||||||
\includegraphics[width=\textwidth]{figures/plfa-progress-3a.png}
|
|
||||||
\caption{PLFA, Progress (2/2)}
|
|
||||||
\label{fig:plfa-progress-2}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/sf-progress-1.png}
|
|
||||||
\caption{SF, Progress (1/2)}
|
|
||||||
\label{fig:sf-progress-1}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{figure}[t]
|
|
||||||
\includegraphics[width=\textwidth]{figures/sf-progress-2.png}
|
|
||||||
\caption{SF, Progress (2/2)}
|
|
||||||
\label{fig:sf-progress-2}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
% \begin{figure}[t]
|
|
||||||
% \includegraphics[width=\textwidth]{figures/sf-progress-3.png}
|
|
||||||
% \caption{SF, Progress (3/3)}
|
|
||||||
% \label{fig:sf-progress-3}
|
|
||||||
% \end{figure}
|
|
||||||
|
|
||||||
The introduction listed several reasons for preferring Agda over Coq.
|
|
||||||
But Coq tactics enable more compact proofs. Would it be possible for
|
|
||||||
PLFA to cover the same material as SF, or would the proofs
|
|
||||||
balloon to unmanageable size?
|
|
||||||
|
|
||||||
As an experiment, I first rewrote SF's development of simply-typed
|
|
||||||
lambda calculus (SF, Chapters Stlc and StlcProp) in Agda. I was a
|
|
||||||
newbie to Agda, and translating the entire development, sticking as
|
|
||||||
closely as possible to the development in SF, took me about two days.
|
|
||||||
I was pleased to discover that the proofs remained about the same
|
|
||||||
size.
|
|
||||||
|
|
||||||
There was also a pleasing surprise regarding the structure of the
|
|
||||||
proofs. While most proofs in both SF and PLFA are carried out by
|
|
||||||
induction over the evidence that a term is well typed, in SF the
|
|
||||||
central proof, that substitution preserves types, is carried out by
|
|
||||||
induction on terms, not evidence of typing, for a technical reason
|
|
||||||
(the context is extended by a variable binding, and hence not
|
|
||||||
sufficiently ``generic'' to work well with Coq's induction tactic). In
|
|
||||||
Agda, I had no trouble formulating the same proof over evidence that
|
|
||||||
the term is well typed, and didn't even notice SF's description of the
|
|
||||||
issue until I was done.
|
|
||||||
|
|
||||||
The rest of the book was relatively easy to complete. The closest to
|
|
||||||
an issue with proof size arose when proving that reduction is
|
|
||||||
deterministic. There are 18 cases, one case per line. Ten of the
|
|
||||||
cases deal with the situation where there are potentially two
|
|
||||||
different reductions; each case is trivially shown to be
|
|
||||||
impossible. Five of the ten cases are redundant, as they just involve
|
|
||||||
switching the order of the arguments. I had to copy the cases
|
|
||||||
suitably permuted. It would be preferable to reinvoke the proof on
|
|
||||||
switched arguments, but this would not pass Agda's termination checker
|
|
||||||
since swapping the arguments doesn't yield a recursive call on
|
|
||||||
structurally smaller arguments. (I suspect tactics could cut down the
|
|
||||||
proof significantly. I tried to compare with SF's proof that reduction
|
|
||||||
is deterministic, but failed to find that proof.)
|
|
||||||
|
|
||||||
SF covers an imperative language with Hoare logic, culminating in
|
|
||||||
code that takes an imperative programme suitably decorated with preconditions
|
|
||||||
and postconditions and generates the necessary
|
|
||||||
verification conditions. The conditions are then verified by a custom
|
|
||||||
tactic, where any questions of arithmetic are resolved by the
|
|
||||||
``omega'' tactic invoking a decision procedure. The entire
|
|
||||||
exercise would be easy to repeat in Agda, save for the last step: I
|
|
||||||
suspect Agda's automation would not be up to verifying the generated
|
|
||||||
conditions, requiring tedious proofs by hand. However, I had already
|
|
||||||
decided to omit Hoare logic in order to focus on lambda calculus.
|
|
||||||
|
|
||||||
To give a flavour of how the texts compare, I show the
|
|
||||||
proof of progress for simply-typed lambda calculus from both texts.
|
|
||||||
Figures~\ref{fig:plfa-progress-1} and \ref{fig:plfa-progress-2}
|
|
||||||
are taken from PLFA, Chapter Properties,
|
|
||||||
while Figures~\ref{fig:sf-progress-1} and \ref{fig:sf-progress-2}
|
|
||||||
are taken from SF, Chapter StlcProp.
|
|
||||||
Both texts are intended to be read online,
|
|
||||||
and the figures were taken by grabbing bitmaps of the text as
|
|
||||||
displayed in a browser.
|
|
||||||
|
|
||||||
PLFA puts the formal statements first, followed by informal explanation.
|
|
||||||
PLFA introduces an auxiliary relation \texttt{Progress M} to capture
|
|
||||||
progress; an exercise (not shown) asks the reader to show it isomorphic
|
|
||||||
to the usual formulation with a disjunction and an existential.
|
|
||||||
Layout is used to present the auxiliary relation in inference rule form.
|
|
||||||
In Agda, any line beginning with two dashes is treated as a comment, making
|
|
||||||
it easy to use a line of dashes to separate hypotheses from conclusion
|
|
||||||
in inference rules. The proof is layed out carefully, with a neat
|
|
||||||
indented structure to emphasise the case analysis, and all right-hand
|
|
||||||
sides lined-up in the same column. My hope as an author is that students
|
|
||||||
will read the formal proof first, and use it as a tabular guide
|
|
||||||
to the informal explanation that follows.
|
|
||||||
|
|
||||||
SF puts the informal explanation first, followed by the formal proof.
|
|
||||||
The text hides the formal proof script under an icon;
|
|
||||||
the figures shows what appears when the icon is expanded.
|
|
||||||
As a teacher I was aware that
|
|
||||||
students might skip it on a first reading, and I would have to hope the
|
|
||||||
students would return to it and step through it with an interactive
|
|
||||||
tool in order to make it intelligible. I expect the students skipped over
|
|
||||||
many such proofs. This particular proof forms the basis for a question
|
|
||||||
of the mock exam and the past exams, so I expect most students will actually
|
|
||||||
look at this one if not all the others.
|
|
||||||
|
|
||||||
Both Coq and Agda support interactive proof. Interaction in Coq is
|
|
||||||
supported by Proof General, based on Emacs, or by CoqIDE, which
|
|
||||||
provides an interactive development environment of a sort familiar to
|
|
||||||
most students. Interaction in Agda is supported by an Emacs mode.
|
|
||||||
|
|
||||||
In Coq, interaction consists of stepping through a proof script, at
|
|
||||||
each point examining the current goal and the variables currently in
|
|
||||||
scope, and executing a new command in the script. Tactics are a whole
|
|
||||||
sublanguage, which must be learned in addition to the langauge for
|
|
||||||
expressing specifications. There are many tactics one can invoke in
|
|
||||||
the script at each point; one menu in CoqIDE lists about one hundred
|
|
||||||
tactics one might invoked, some in alphabetic submenus. A Coq
|
|
||||||
script presents the specification proved and the tactics executed.
|
|
||||||
Interaction is recorded in a script, which the students
|
|
||||||
may step through at their leisure. SF contains some prose descriptions
|
|
||||||
of stepping through scripts, but mainly contains scripts that students
|
|
||||||
are encouraged to step through on their own.
|
|
||||||
|
|
||||||
In Agda, interaction consists of writing code with holes, at each
|
|
||||||
point examining the current goal and the variables in scope, and
|
|
||||||
typing code or executing an Emacs command. The number of commands
|
|
||||||
available is much smaller than with Coq, the most important ones being
|
|
||||||
to show the type of the hole and the types of the variables in scope;
|
|
||||||
to check the code; to do a case analysis on a given variable; or to
|
|
||||||
guess how to fill in the hole with constructors or variables in scope.
|
|
||||||
An Agda proof consists of typed code. The interaction is \emph{not}
|
|
||||||
recorded. Students may recreate it by commenting out bits of code and
|
|
||||||
introducing a hole in their place. PLFA contains some prose descriptions
|
|
||||||
of interactively building code, but mainly contains code that students
|
|
||||||
can read. They may also introduce holes to interact with the code, but
|
|
||||||
I expect this will be rarer than with SF.
|
|
||||||
|
|
||||||
SF encourages students to interact with all the scripts in the text.
|
|
||||||
Trying to understand a Coq proof script without running it
|
|
||||||
interactively is a bit like understanding a chess game by reading
|
|
||||||
through the moves without benefit of a board, keeping it all in your
|
|
||||||
head. In contrast, PLFA provides code that students can read.
|
|
||||||
Understanding the code often requires working out the types, but
|
|
||||||
(unlike executing a Coq proof script) this is often easy to do in your
|
|
||||||
head; when it is not easy, students still have the option of
|
|
||||||
interaction.
|
|
||||||
|
|
||||||
While students are keen to interact to create code, I have found they
|
|
||||||
are reluctant to interact to understand code created by others. For
|
|
||||||
this reason, I suspect this may make Agda a more suitable vehicle for
|
|
||||||
teaching. Nate Foster suggests this hypothesis is ripe to be tested
|
|
||||||
empirically, perhaps using techniques similar to those of
|
|
||||||
\citet{Danas-et-al-2017}.
|
|
||||||
|
|
||||||
Neat layout of definitions such as that in
|
|
||||||
Figure~\ref{fig:plfa-progress-2} in Emacs requires a monospaced font
|
|
||||||
supporting all the necessary characters. Securing one has proved
|
|
||||||
tricky. As of this writing, we use FreeMono, but it lacks a few
|
|
||||||
characters (⦂ and ∎) which are loaded from fonts with a different
|
|
||||||
width. Long arrows are necessarily more than a single character wide.
|
|
||||||
Instead, we compose reduction —→ from an em dash — and an arrow →.
|
|
||||||
Similarly for reflexive and transitive closure —↠.
|
|
||||||
|
|
||||||
\section{Progress + Preservation = Evaluation}
|
|
||||||
|
|
||||||
\begin{figure}
|
|
||||||
\includegraphics[width=\textwidth]{figures/plfa-eval.png}
|
|
||||||
\caption{PLFA, Evaluation}
|
|
||||||
\label{fig:plfa-eval}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
A standard approach to type soundness used by many texts,
|
|
||||||
including SF and PLFA, is to prove progress and preservation,
|
|
||||||
as first suggested by \citet{Wright-and-Felleisen-1994}.
|
|
||||||
|
|
||||||
\begin{theorem}[Progress] Given term $M$ and type $A$ such that
|
|
||||||
$\emptyset \vdash M : A$ then either $M$ is a value or
|
|
||||||
$M \longrightarrow N$ for some term $N$.
|
|
||||||
\end{theorem}
|
|
||||||
|
|
||||||
\begin{theorem}[Preservation] Given terms $M$ and $N$ and type $A$
|
|
||||||
such that $\emptyset \vdash M : A$ and $M \longrightarrow N$, then
|
|
||||||
$\emptyset \vdash N : A$. \end{theorem}
|
|
||||||
|
|
||||||
A consequence is that when a term reduces to a value it retains
|
|
||||||
the same type. Further, well-typed terms don't get stuck:
|
|
||||||
that is, unable to reduce further but not yet reduced to a value.
|
|
||||||
The formulation neatly accommodates the case of non-terminating
|
|
||||||
reductions that never reach a value.
|
|
||||||
|
|
||||||
One useful by-product of the formal specification of a programming
|
|
||||||
language may be a prototype implementation of that language. For
|
|
||||||
instance, given a language specified by a reduction relation, such
|
|
||||||
as lambda calculus, the prototype might accept a term and apply reductions
|
|
||||||
to reduce it to a value. Typically, one might go to some extra work to
|
|
||||||
create such a prototype. For instance, SF introduces a \texttt{normalize}
|
|
||||||
tactic for this purpose. Some formal methods frameworks, such as
|
|
||||||
Redex \citep{Felleisen-et-al-2009} and K \citep{Rosu-Serbanuta-2010},
|
|
||||||
advertise as one of their advantages that they can generate
|
|
||||||
a prototype from descriptions of the reduction rules.
|
|
||||||
|
|
||||||
I was therefore surprised to realise that any constructive proof of
|
|
||||||
progress and preservation \emph{automatically} gives rise to such a
|
|
||||||
prototype. The input is a term together with evidence the term is
|
|
||||||
well-typed. (In the inherently-typed case, these are the same thing.)
|
|
||||||
Progress determines whether we are done, or should take another step;
|
|
||||||
preservation provides evidence that the new term is well-typed, so we
|
|
||||||
may iterate. In a language with guaranteed termination, we cannot
|
|
||||||
iterate forever, but there are a number of well-known techniques to
|
|
||||||
address that issue; see, e.g., \citet{Bove-and-Capretta-2001},
|
|
||||||
\citet{Capretta-2005}, or \citet{McBride-2015}.
|
|
||||||
We use the simplest, similar to McBride's \emph{petrol-driven} (or
|
|
||||||
\emph{step-indexed}) semantics: provide a maximum number of steps to
|
|
||||||
execute; if that number proves insufficient, the evaluator returns the
|
|
||||||
term it reached, and one can resume execution by providing a new
|
|
||||||
number.
|
|
||||||
|
|
||||||
Such an evaluator from PLFA is shown in Figure~\ref{fig:plfa-eval},
|
|
||||||
where (inspired by McBride and cryptocurrencies) the number of steps
|
|
||||||
to execute is referred to as \emph{gas}. All of the example reduction
|
|
||||||
sequences in PLFA were computed by the evaluator and then edited to
|
|
||||||
improve readability; in addition, the text includes examples of
|
|
||||||
running the evaluator with its unedited output.
|
|
||||||
|
|
||||||
It is immediately obvious that progress and preservation make it
|
|
||||||
trivial to construct a prototype evaluator, and yet I cannot find such
|
|
||||||
an observation in the literature nor mentioned in an introductory
|
|
||||||
text. It does not appear in SF, nor in \citet{Harper-2016}. A plea
|
|
||||||
to the Agda mailing list failed to turn up any prior mentions.
|
|
||||||
The closest related observation I have seen in the published
|
|
||||||
literature is that evaluators can be extracted from proofs of
|
|
||||||
normalisation \citep{Berger-1993,Dagand-and-Scherer-2015}.
|
|
||||||
|
|
||||||
(Late addition: My plea to the Agda list eventually bore fruit. Oleg
|
|
||||||
Kiselyov directed me to unpublished remarks on his web page where he
|
|
||||||
uses the name \texttt{eval} for a proof of progress and notes ``the
|
|
||||||
very proof of type soundness can be used to evaluate sample
|
|
||||||
expressions'' \citet{Kiselyov-2009}.)
|
|
||||||
|
|
||||||
|
|
||||||
\section{Inherent typing is golden}
|
|
||||||
|
|
||||||
The second part of PLFA first discusses two different approaches to
|
|
||||||
modelling simply-typed lambda calculus. It first presents ``raw''
|
|
||||||
terms with named variables and a separate typing relation and
|
|
||||||
then shifts to inherently-typed terms with de Bruijn indices.
|
|
||||||
Before writing the text, I had thought the two approaches
|
|
||||||
complementary, with no clear winner. Now I am convinced that the
|
|
||||||
inherently-typed approach is superior.
|
|
||||||
|
|
||||||
The clearest indication comes from counting lines of code.
|
|
||||||
Stripping out examples and any proofs that appear in one but not the
|
|
||||||
other, the development for raw terms takes 451 lines (216 lines of
|
|
||||||
definitions and 235 lines for the proofs) and the development for
|
|
||||||
inherently typed terms takes 275 lines (with definitions and proofs
|
|
||||||
interleaved, as substitution cannot be defined without
|
|
||||||
also showing it preserves types). We have 451 / 235 = 1.64, close
|
|
||||||
to the golden ratio.
|
|
||||||
|
|
||||||
Another indication is expressive power. The approach with named
|
|
||||||
variables and separate typing is restricted to substitution of one
|
|
||||||
variable by a single closed term, while de Bruijn indices with
|
|
||||||
inherent typing support simultaneous substitution of all variables by
|
|
||||||
open terms, using a pleasing formulation due to \citet{McBride-2005},
|
|
||||||
inspired by \citet{Goguen-and-McKinna-1997} and described
|
|
||||||
in \citet{Allais-et-al-2017}. In fact, I managed to extend
|
|
||||||
McBride's approach to support raw terms with named variables, but the
|
|
||||||
resulting code was too long and too complex for use in an introductory
|
|
||||||
text, requiring 695 lines of code---more than the total for the other
|
|
||||||
two approaches combined.
|
|
||||||
|
|
||||||
The text develops both approaches because named variables with
|
|
||||||
separate typing is more familiar, and placing de Bruijn indices and
|
|
||||||
inherent typing first would lead to a steep learning curve. By
|
|
||||||
presenting the more long-winded but less powerful approach first,
|
|
||||||
students can see for themselves the advantages of de Bruijn indices
|
|
||||||
with inherent typing.
|
|
||||||
|
|
||||||
There are actually four possible designs, as the choice of named
|
|
||||||
variables vs de Bruijn indices, and the choice of raw vs
|
|
||||||
inherently-typed terms may be made independently. There are synergies
|
|
||||||
beween the two. Manipulation of de Bruijn indices can be notoriously
|
|
||||||
error-prone without inherent-typing to give assurance of correctness.
|
|
||||||
In inherent typing with named variables, simultaneous substitution by
|
|
||||||
open terms remains difficult.
|
|
||||||
|
|
||||||
The benefits of replacing raw typing by inherent are well
|
|
||||||
known to some. The technique was introduced by
|
|
||||||
\citet{Altenkirch-and-Reus-1999}, and widely used elsewhere,
|
|
||||||
notably by \citet{Chapman-2009} and \citet{Allais-et-al-2017}.
|
|
||||||
I'm grateful to David Darais for bringing it to my attention.
|
|
||||||
|
|
||||||
|
|
||||||
\section{Conclusion}
|
|
||||||
|
|
||||||
I look forward to experience teaching from the new text,
|
|
||||||
and encourage others to use it too. Please comment!
|
|
||||||
|
|
||||||
|
|
||||||
\paragraph{Acknowledgements}
|
|
||||||
|
|
||||||
A special thank you to my coauthor, Wen Kokke. For inventing ideas on
|
|
||||||
which PLFA is based, and for hand-holding, many thanks to Conor
|
|
||||||
McBride, James McKinna, Ulf Norell, and Andreas Abel. For showing me
|
|
||||||
how much more compact it is to avoid raw terms, thanks to David
|
|
||||||
Darais. For inspiring my work by writing SF, thanks to Benjamin
|
|
||||||
Pierce and his coauthors. For comments on a draft of this paper, an
|
|
||||||
extra thank you to James McKinna, Ulf Norell, Andreas Abel, and
|
|
||||||
Benjamin Pierce.
|
|
||||||
|
|
||||||
\bibliographystyle{plainnat}
|
|
||||||
%\bibliographystyle{splncsnat.bst}
|
|
||||||
\bibliography{PLFA}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\end{document}
|
|
||||||
|
|
||||||
|
|
|
@ -1,691 +0,0 @@
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Some useful commands when doing highlighting of Agda code in LaTeX.
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
\ProvidesPackage{agda}
|
|
||||||
|
|
||||||
\RequirePackage{ifxetex, ifluatex, xifthen, xcolor, polytable, etoolbox,
|
|
||||||
calc, environ}
|
|
||||||
|
|
||||||
% https://tex.stackexchange.com/questions/47576/combining-ifxetex-and-ifluatex-with-the-logical-or-operation
|
|
||||||
\newif\ifxetexorluatex
|
|
||||||
\ifxetex
|
|
||||||
\xetexorluatextrue
|
|
||||||
\else
|
|
||||||
\ifluatex
|
|
||||||
\xetexorluatextrue
|
|
||||||
\else
|
|
||||||
\xetexorluatexfalse
|
|
||||||
\fi
|
|
||||||
\fi
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Options
|
|
||||||
|
|
||||||
\DeclareOption{bw} {\newcommand{\AgdaColourScheme}{bw}}
|
|
||||||
\DeclareOption{conor}{\newcommand{\AgdaColourScheme}{conor}}
|
|
||||||
|
|
||||||
\newif\if@AgdaEnableReferences\@AgdaEnableReferencesfalse
|
|
||||||
\DeclareOption{references}{
|
|
||||||
\@AgdaEnableReferencestrue
|
|
||||||
}
|
|
||||||
|
|
||||||
\newif\if@AgdaEnableLinks\@AgdaEnableLinksfalse
|
|
||||||
\DeclareOption{links}{
|
|
||||||
\@AgdaEnableLinkstrue
|
|
||||||
}
|
|
||||||
|
|
||||||
% If the "nofontsetup" option is used, then the package does not
|
|
||||||
% select any fonts, and it does not change the font encoding.
|
|
||||||
\newif\if@AgdaSetupFonts\@AgdaSetupFontstrue
|
|
||||||
\DeclareOption{nofontsetup}{
|
|
||||||
\@AgdaSetupFontsfalse
|
|
||||||
}
|
|
||||||
|
|
||||||
% If the "noinputencodingsetup" option is used, then the package does
|
|
||||||
% not change the input encoding, and it does not load the `ucs`
|
|
||||||
% package.
|
|
||||||
\newif\if@AgdaSetupInputEncoding\@AgdaSetupInputEncodingtrue
|
|
||||||
\DeclareOption{noinputencodingsetup}{
|
|
||||||
\@AgdaSetupInputEncodingfalse
|
|
||||||
}
|
|
||||||
|
|
||||||
\ProcessOptions\relax
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Input encoding setup
|
|
||||||
|
|
||||||
\if@AgdaSetupInputEncoding
|
|
||||||
\ifxetexorluatex
|
|
||||||
|
|
||||||
\providecommand{\DeclareUnicodeCharacter}[2]{\relax}
|
|
||||||
|
|
||||||
\else
|
|
||||||
|
|
||||||
\RequirePackage{ucs}
|
|
||||||
\RequirePackage[utf8x]{inputenc}
|
|
||||||
|
|
||||||
\fi
|
|
||||||
\fi
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Font setup
|
|
||||||
|
|
||||||
\tracinglostchars=2 % If the font is missing some symbol, then say
|
|
||||||
% so in the compilation output.
|
|
||||||
|
|
||||||
\if@AgdaSetupFonts
|
|
||||||
% XeLaTeX or LuaLaTeX
|
|
||||||
\ifxetexorluatex
|
|
||||||
|
|
||||||
% Hack to get the amsthm package working.
|
|
||||||
% https://tex.stackexchange.com/questions/130491/xelatex-error-paragraph-ended-before-tempa-was-complete
|
|
||||||
\let\AgdaOpenBracket\[\let\AgdaCloseBracket\]
|
|
||||||
\RequirePackage{fontspec}
|
|
||||||
\let\[\AgdaOpenBracket\let\]\AgdaCloseBracket
|
|
||||||
\RequirePackage{unicode-math}
|
|
||||||
|
|
||||||
\setmainfont
|
|
||||||
[ Ligatures = TeX
|
|
||||||
, BoldItalicFont = xits-bolditalic.otf
|
|
||||||
, BoldFont = xits-bold.otf
|
|
||||||
, ItalicFont = xits-italic.otf
|
|
||||||
]
|
|
||||||
{xits-regular.otf}
|
|
||||||
|
|
||||||
\setmathfont{xits-math.otf}
|
|
||||||
\setmonofont[Mapping=tex-text]{FreeMono.otf}
|
|
||||||
|
|
||||||
% Make mathcal and mathscr appear as different.
|
|
||||||
% https://tex.stackexchange.com/questions/120065/xetex-what-happened-to-mathcal-and-mathscr
|
|
||||||
\setmathfont[range={\mathcal,\mathbfcal},StylisticSet=1]{xits-math.otf}
|
|
||||||
\setmathfont[range=\mathscr]{xits-math.otf}
|
|
||||||
|
|
||||||
% pdfLaTeX
|
|
||||||
\else
|
|
||||||
|
|
||||||
% https://tex.stackexchange.com/questions/1774/how-to-insert-pipe-symbol-in-latex
|
|
||||||
\RequirePackage[T1]{fontenc}
|
|
||||||
|
|
||||||
\RequirePackage{amsfonts, amssymb}
|
|
||||||
\RequirePackage[safe]{tipa} % See page 12 of the tipa manual for what
|
|
||||||
% safe does.
|
|
||||||
|
|
||||||
\fi
|
|
||||||
\fi
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Colour schemes.
|
|
||||||
|
|
||||||
\providecommand{\AgdaColourScheme}{standard}
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% References to code (needs additional post-processing of tex files to
|
|
||||||
% work, see wiki for details).
|
|
||||||
|
|
||||||
\if@AgdaEnableReferences
|
|
||||||
\RequirePackage{catchfilebetweentags, xstring}
|
|
||||||
\newcommand{\AgdaRef}[2][]{%
|
|
||||||
\StrSubstitute{#2}{\_}{AgdaUnderscore}[\tmp]%
|
|
||||||
\ifthenelse{\isempty{#1}}%
|
|
||||||
{\ExecuteMetaData{AgdaTag-\tmp}}%
|
|
||||||
{\ExecuteMetaData{#1}{AgdaTag-\tmp}}
|
|
||||||
}
|
|
||||||
\fi
|
|
||||||
|
|
||||||
\providecommand{\AgdaRef}[2][]{#2}
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Links (only done if the option is passed and the user has loaded the
|
|
||||||
% hyperref package).
|
|
||||||
|
|
||||||
\if@AgdaEnableLinks
|
|
||||||
\@ifpackageloaded{hyperref}{
|
|
||||||
|
|
||||||
% List that holds added targets.
|
|
||||||
\newcommand{\AgdaList}[0]{}
|
|
||||||
|
|
||||||
\newtoggle{AgdaIsElem}
|
|
||||||
\newcounter{AgdaIndex}
|
|
||||||
\newcommand{\AgdaLookup}[3]{%
|
|
||||||
\togglefalse{AgdaIsElem}%
|
|
||||||
\setcounter{AgdaIndex}{0}%
|
|
||||||
\renewcommand*{\do}[1]{%
|
|
||||||
\ifstrequal{#1}{##1}%
|
|
||||||
{\toggletrue{AgdaIsElem}\listbreak}%
|
|
||||||
{\stepcounter{AgdaIndex}}}%
|
|
||||||
\dolistloop{\AgdaList}%
|
|
||||||
\iftoggle{AgdaIsElem}{#2}{#3}%
|
|
||||||
}
|
|
||||||
|
|
||||||
\newcommand*{\AgdaTargetHelper}[1]{%
|
|
||||||
\AgdaLookup{#1}%
|
|
||||||
{\PackageError{agda}{``#1'' used as target more than once}%
|
|
||||||
{Overloaded identifiers and links do not%
|
|
||||||
work well, consider using unique%
|
|
||||||
\MessageBreak identifiers instead.}%
|
|
||||||
}%
|
|
||||||
{\listadd{\AgdaList}{#1}%
|
|
||||||
\hypertarget{Agda\theAgdaIndex}{}%
|
|
||||||
}%
|
|
||||||
}
|
|
||||||
|
|
||||||
\newcommand{\AgdaTarget}[1]{\forcsvlist{\AgdaTargetHelper}{#1}}
|
|
||||||
|
|
||||||
\newcommand{\AgdaLink}[1]{%
|
|
||||||
\AgdaLookup{#1}%
|
|
||||||
{\hyperlink{Agda\theAgdaIndex}{#1}}%
|
|
||||||
{#1}%
|
|
||||||
}
|
|
||||||
}{\PackageError{agda}{Load the hyperref package before the agda package}{}}
|
|
||||||
\fi
|
|
||||||
|
|
||||||
\providecommand{\AgdaTarget}[1]{}
|
|
||||||
\providecommand{\AgdaLink}[1]{#1}
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Font styles.
|
|
||||||
|
|
||||||
\ifxetexorluatex
|
|
||||||
\newcommand{\AgdaFontStyle}[1]{\ensuremath{\mathsf{#1}}}
|
|
||||||
\ifthenelse{\equal{\AgdaColourScheme}{bw}}{
|
|
||||||
\newcommand{\AgdaKeywordFontStyle}[1]{\underline{#1}}
|
|
||||||
}{
|
|
||||||
\newcommand{\AgdaKeywordFontStyle}[1]{\ensuremath{\mathsf{#1}}}
|
|
||||||
}
|
|
||||||
\newcommand{\AgdaStringFontStyle}[1]{\ensuremath{\texttt{#1}}}
|
|
||||||
\newcommand{\AgdaCommentFontStyle}[1]{\ensuremath{\texttt{#1}}}
|
|
||||||
\newcommand{\AgdaBoundFontStyle}[1]{\ensuremath{\mathit{#1}}}
|
|
||||||
|
|
||||||
\else
|
|
||||||
\newcommand{\AgdaFontStyle}[1]{\textsf{#1}}
|
|
||||||
\ifthenelse{\equal{\AgdaColourScheme}{bw}}{
|
|
||||||
\newcommand{\AgdaKeywordFontStyle}[1]{\underline{#1}}
|
|
||||||
}{
|
|
||||||
\newcommand{\AgdaKeywordFontStyle}[1]{\textsf{#1}}
|
|
||||||
}
|
|
||||||
\newcommand{\AgdaStringFontStyle}[1]{\texttt{#1}}
|
|
||||||
\newcommand{\AgdaCommentFontStyle}[1]{\texttt{#1}}
|
|
||||||
\newcommand{\AgdaBoundFontStyle}[1]{\textit{#1}}
|
|
||||||
\fi
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Colours.
|
|
||||||
|
|
||||||
% ----------------------------------
|
|
||||||
% The black and white colour scheme.
|
|
||||||
\ifthenelse{\equal{\AgdaColourScheme}{bw}}{
|
|
||||||
|
|
||||||
% Aspect colours.
|
|
||||||
\definecolor{AgdaComment} {HTML}{000000}
|
|
||||||
\definecolor{AgdaOption} {HTML}{000000}
|
|
||||||
\definecolor{AgdaKeyword} {HTML}{000000}
|
|
||||||
\definecolor{AgdaString} {HTML}{000000}
|
|
||||||
\definecolor{AgdaNumber} {HTML}{000000}
|
|
||||||
\definecolor{AgdaSymbol} {HTML}{000000}
|
|
||||||
\definecolor{AgdaPrimitiveType}{HTML}{000000}
|
|
||||||
|
|
||||||
% NameKind colours.
|
|
||||||
\definecolor{AgdaBound} {HTML}{000000}
|
|
||||||
\definecolor{AgdaInductiveConstructor} {HTML}{000000}
|
|
||||||
\definecolor{AgdaCoinductiveConstructor}{HTML}{000000}
|
|
||||||
\definecolor{AgdaDatatype} {HTML}{000000}
|
|
||||||
\definecolor{AgdaField} {HTML}{000000}
|
|
||||||
\definecolor{AgdaFunction} {HTML}{000000}
|
|
||||||
\definecolor{AgdaMacro} {HTML}{000000}
|
|
||||||
\definecolor{AgdaModule} {HTML}{000000}
|
|
||||||
\definecolor{AgdaPostulate} {HTML}{000000}
|
|
||||||
\definecolor{AgdaPrimitive} {HTML}{000000}
|
|
||||||
\definecolor{AgdaRecord} {HTML}{000000}
|
|
||||||
\definecolor{AgdaArgument} {HTML}{000000}
|
|
||||||
|
|
||||||
% Other aspect colours.
|
|
||||||
\definecolor{AgdaDottedPattern} {HTML}{000000}
|
|
||||||
\definecolor{AgdaUnsolvedMeta} {HTML}{D3D3D3}
|
|
||||||
\definecolor{AgdaTerminationProblem}{HTML}{BEBEBE}
|
|
||||||
\definecolor{AgdaIncompletePattern} {HTML}{D3D3D3}
|
|
||||||
\definecolor{AgdaError} {HTML}{696969}
|
|
||||||
|
|
||||||
% Misc.
|
|
||||||
\definecolor{AgdaHole} {HTML}{BEBEBE}
|
|
||||||
|
|
||||||
% ----------------------------------
|
|
||||||
% Conor McBride's colour scheme.
|
|
||||||
}{ \ifthenelse{\equal{\AgdaColourScheme}{conor}}{
|
|
||||||
|
|
||||||
% Aspect colours.
|
|
||||||
\definecolor{AgdaComment} {HTML}{B22222}
|
|
||||||
\definecolor{AgdaOption} {HTML}{000000}
|
|
||||||
\definecolor{AgdaKeyword} {HTML}{000000}
|
|
||||||
\definecolor{AgdaString} {HTML}{000000}
|
|
||||||
\definecolor{AgdaNumber} {HTML}{000000}
|
|
||||||
\definecolor{AgdaSymbol} {HTML}{000000}
|
|
||||||
\definecolor{AgdaPrimitiveType}{HTML}{0000CD}
|
|
||||||
|
|
||||||
% NameKind colours.
|
|
||||||
\definecolor{AgdaBound} {HTML}{A020F0}
|
|
||||||
\definecolor{AgdaInductiveConstructor} {HTML}{8B0000}
|
|
||||||
\definecolor{AgdaCoinductiveConstructor}{HTML}{8B0000}
|
|
||||||
\definecolor{AgdaDatatype} {HTML}{0000CD}
|
|
||||||
\definecolor{AgdaField} {HTML}{8B0000}
|
|
||||||
\definecolor{AgdaFunction} {HTML}{006400}
|
|
||||||
\definecolor{AgdaMacro} {HTML}{006400}
|
|
||||||
\definecolor{AgdaModule} {HTML}{006400}
|
|
||||||
\definecolor{AgdaPostulate} {HTML}{006400}
|
|
||||||
\definecolor{AgdaPrimitive} {HTML}{006400}
|
|
||||||
\definecolor{AgdaRecord} {HTML}{0000CD}
|
|
||||||
\definecolor{AgdaArgument} {HTML}{404040}
|
|
||||||
|
|
||||||
% Other aspect colours.
|
|
||||||
\definecolor{AgdaDottedPattern} {HTML}{000000}
|
|
||||||
\definecolor{AgdaUnsolvedMeta} {HTML}{FFD700}
|
|
||||||
\definecolor{AgdaTerminationProblem}{HTML}{FF0000}
|
|
||||||
\definecolor{AgdaIncompletePattern} {HTML}{A020F0}
|
|
||||||
\definecolor{AgdaError} {HTML}{F4A460}
|
|
||||||
|
|
||||||
% Misc.
|
|
||||||
\definecolor{AgdaHole} {HTML}{9DFF9D}
|
|
||||||
|
|
||||||
% ----------------------------------
|
|
||||||
% The standard colour scheme.
|
|
||||||
}{
|
|
||||||
% Aspect colours.
|
|
||||||
\definecolor{AgdaComment} {HTML}{B22222}
|
|
||||||
\definecolor{AgdaOption} {HTML}{000000}
|
|
||||||
\definecolor{AgdaKeyword} {HTML}{CD6600}
|
|
||||||
\definecolor{AgdaString} {HTML}{B22222}
|
|
||||||
\definecolor{AgdaNumber} {HTML}{A020F0}
|
|
||||||
\definecolor{AgdaSymbol} {HTML}{404040}
|
|
||||||
\definecolor{AgdaPrimitiveType}{HTML}{0000CD}
|
|
||||||
|
|
||||||
% NameKind colours.
|
|
||||||
\definecolor{AgdaBound} {HTML}{000000}
|
|
||||||
\definecolor{AgdaInductiveConstructor} {HTML}{008B00}
|
|
||||||
\definecolor{AgdaCoinductiveConstructor}{HTML}{8B7500}
|
|
||||||
\definecolor{AgdaDatatype} {HTML}{0000CD}
|
|
||||||
\definecolor{AgdaField} {HTML}{EE1289}
|
|
||||||
\definecolor{AgdaFunction} {HTML}{0000CD}
|
|
||||||
\definecolor{AgdaMacro} {HTML}{458B74}
|
|
||||||
\definecolor{AgdaModule} {HTML}{A020F0}
|
|
||||||
\definecolor{AgdaPostulate} {HTML}{0000CD}
|
|
||||||
\definecolor{AgdaPrimitive} {HTML}{0000CD}
|
|
||||||
\definecolor{AgdaRecord} {HTML}{0000CD}
|
|
||||||
\definecolor{AgdaArgument} {HTML}{404040}
|
|
||||||
|
|
||||||
% Other aspect colours.
|
|
||||||
\definecolor{AgdaDottedPattern} {HTML}{000000}
|
|
||||||
\definecolor{AgdaUnsolvedMeta} {HTML}{FFFF00}
|
|
||||||
\definecolor{AgdaTerminationProblem}{HTML}{FFA07A}
|
|
||||||
\definecolor{AgdaIncompletePattern} {HTML}{F5DEB3}
|
|
||||||
\definecolor{AgdaError} {HTML}{FF0000}
|
|
||||||
|
|
||||||
% Misc.
|
|
||||||
\definecolor{AgdaHole} {HTML}{9DFF9D}
|
|
||||||
}}
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% Commands.
|
|
||||||
|
|
||||||
\newcommand{\AgdaNoSpaceMath}[1]
|
|
||||||
{\begingroup\thickmuskip=0mu\medmuskip=0mu#1\endgroup}
|
|
||||||
|
|
||||||
% Aspect commands.
|
|
||||||
\newcommand{\AgdaComment} [1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaCommentFontStyle{\textcolor{AgdaComment}{#1}}}}
|
|
||||||
\newcommand{\AgdaOption} [1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaCommentFontStyle{\textcolor{AgdaOption}{#1}}}}
|
|
||||||
\newcommand{\AgdaKeyword} [1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaKeywordFontStyle{\textcolor{AgdaKeyword}{#1}}}}
|
|
||||||
\newcommand{\AgdaString} [1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaStringFontStyle{\textcolor{AgdaString}{#1}}}}
|
|
||||||
\newcommand{\AgdaNumber} [1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaNumber}{#1}}}}
|
|
||||||
\newcommand{\AgdaSymbol} [1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaSymbol}{#1}}}}
|
|
||||||
\newcommand{\AgdaPrimitiveType}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPrimitiveType}{#1}}}}
|
|
||||||
% Note that, in code generated by the LaTeX backend, \AgdaOperator is
|
|
||||||
% always applied to a NameKind command.
|
|
||||||
\newcommand{\AgdaOperator} [1]{#1}
|
|
||||||
|
|
||||||
% NameKind commands.
|
|
||||||
|
|
||||||
% The user can control the typesetting of (certain) individual tokens
|
|
||||||
% by redefining the following command. The first argument is the token
|
|
||||||
% and the second argument the thing to be typeset (sometimes just the
|
|
||||||
% token, sometimes \AgdaLink{<the token>}). Example:
|
|
||||||
%
|
|
||||||
% \usepackage{ifthen}
|
|
||||||
%
|
|
||||||
% % Insert extra space before some tokens.
|
|
||||||
% \DeclareRobustCommand{\AgdaFormat}[2]{%
|
|
||||||
% \ifthenelse{
|
|
||||||
% \equal{#1}{≡⟨} \OR
|
|
||||||
% \equal{#1}{≡⟨⟩} \OR
|
|
||||||
% \equal{#1}{∎}
|
|
||||||
% }{\ }{}#2}
|
|
||||||
%
|
|
||||||
% Note the use of \DeclareRobustCommand.
|
|
||||||
|
|
||||||
\newcommand{\AgdaFormat}[2]{#2}
|
|
||||||
|
|
||||||
\newcommand{\AgdaBound}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaBoundFontStyle{\textcolor{AgdaBound}{\AgdaFormat{#1}{#1}}}}}
|
|
||||||
\newcommand{\AgdaInductiveConstructor}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaInductiveConstructor}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaCoinductiveConstructor}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaCoinductiveConstructor}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaDatatype}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaDatatype}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaField}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaField}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaFunction}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaFunction}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaMacro}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaMacro}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaModule}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaModule}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaPostulate}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPostulate}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaPrimitive}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPrimitive}{\AgdaFormat{#1}{#1}}}}}
|
|
||||||
\newcommand{\AgdaRecord}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaRecord}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}}
|
|
||||||
\newcommand{\AgdaArgument}[1]
|
|
||||||
{\AgdaNoSpaceMath{\AgdaBoundFontStyle{\textcolor{AgdaArgument}{\AgdaFormat{#1}{#1}}}}}
|
|
||||||
|
|
||||||
% Other aspect commands.
|
|
||||||
\newcommand{\AgdaFixityOp} [1]{\AgdaNoSpaceMath{$#1$}}
|
|
||||||
\newcommand{\AgdaDottedPattern} [1]{\textcolor{AgdaDottedPattern}{#1}}
|
|
||||||
\newcommand{\AgdaUnsolvedMeta} [1]
|
|
||||||
{\AgdaFontStyle{\colorbox{AgdaUnsolvedMeta}{#1}}}
|
|
||||||
\newcommand{\AgdaTerminationProblem}[1]
|
|
||||||
{\AgdaFontStyle{\colorbox{AgdaTerminationProblem}{#1}}}
|
|
||||||
\newcommand{\AgdaIncompletePattern} [1]{\colorbox{AgdaIncompletePattern}{#1}}
|
|
||||||
\newcommand{\AgdaError} [1]
|
|
||||||
{\AgdaFontStyle{\textcolor{AgdaError}{\underline{#1}}}}
|
|
||||||
\newcommand{\AgdaCatchallClause} [1]{#1} % feel free to change this
|
|
||||||
|
|
||||||
% Used to hide code from LaTeX.
|
|
||||||
%
|
|
||||||
% Note that this macro has been deprecated in favour of giving the
|
|
||||||
% hide argument to the code environment.
|
|
||||||
\long\def\AgdaHide#1{\ignorespaces}
|
|
||||||
|
|
||||||
% Misc.
|
|
||||||
\newcommand{\AgdaHole}[1]{\colorbox{AgdaHole}{#1}}
|
|
||||||
|
|
||||||
% ----------------------------------------------------------------------
|
|
||||||
% The code environment.
|
|
||||||
|
|
||||||
\newcommand{\AgdaCodeStyle}{}
|
|
||||||
% \newcommand{\AgdaCodeStyle}{\tiny}
|
|
||||||
|
|
||||||
\ifdefined\mathindent
|
|
||||||
{}
|
|
||||||
\else
|
|
||||||
\newdimen\mathindent\mathindent\leftmargini
|
|
||||||
\fi
|
|
||||||
|
|
||||||
% Adds the given amount of vertical space and starts a new line.
|
|
||||||
%
|
|
||||||
% The implementation comes from lhs2TeX's polycode.fmt, written by
|
|
||||||
% Andres Löh.
|
|
||||||
\newcommand{\Agda@NewlineWithVerticalSpace}[1]{%
|
|
||||||
{\parskip=0pt\parindent=0pt\par\vskip #1\noindent}}
|
|
||||||
|
|
||||||
% Should there be space around code?
|
|
||||||
\newboolean{Agda@SpaceAroundCode}
|
|
||||||
|
|
||||||
% Use this command to avoid extra space around code blocks.
|
|
||||||
\newcommand{\AgdaNoSpaceAroundCode}{%
|
|
||||||
\setboolean{Agda@SpaceAroundCode}{false}}
|
|
||||||
|
|
||||||
% Use this command to include extra space around code blocks.
|
|
||||||
\newcommand{\AgdaSpaceAroundCode}{%
|
|
||||||
\setboolean{Agda@SpaceAroundCode}{true}}
|
|
||||||
|
|
||||||
% By default space is inserted around code blocks.
|
|
||||||
\AgdaSpaceAroundCode{}
|
|
||||||
|
|
||||||
% Sometimes one might want to break up a code block into multiple
|
|
||||||
% pieces, but keep code in different blocks aligned with respect to
|
|
||||||
% each other. Then one can use the AgdaAlign environment. Example
|
|
||||||
% usage:
|
|
||||||
%
|
|
||||||
% \begin{AgdaAlign}
|
|
||||||
% \begin{code}
|
|
||||||
% code
|
|
||||||
% code (more code)
|
|
||||||
% \end{code}
|
|
||||||
% Explanation...
|
|
||||||
% \begin{code}
|
|
||||||
% aligned with "code"
|
|
||||||
% code (aligned with (more code))
|
|
||||||
% \end{code}
|
|
||||||
% \end{AgdaAlign}
|
|
||||||
%
|
|
||||||
% Note that AgdaAlign environments should not be nested.
|
|
||||||
%
|
|
||||||
% Sometimes one might also want to hide code in the middle of a code
|
|
||||||
% block. This can be accomplished in the following way:
|
|
||||||
%
|
|
||||||
% \begin{AgdaAlign}
|
|
||||||
% \begin{code}
|
|
||||||
% visible
|
|
||||||
% \end{code}
|
|
||||||
% \begin{code}[hide]
|
|
||||||
% hidden
|
|
||||||
% \end{code}
|
|
||||||
% \begin{code}
|
|
||||||
% visible
|
|
||||||
% \end{code}
|
|
||||||
% \end{AgdaAlign}
|
|
||||||
%
|
|
||||||
% However, the result may be ugly: extra space is perhaps inserted
|
|
||||||
% around the code blocks.
|
|
||||||
%
|
|
||||||
% The AgdaSuppressSpace environment ensures that extra space is only
|
|
||||||
% inserted before the first code block, and after the last one (but
|
|
||||||
% not if \AgdaNoSpaceAroundCode{} is used). Example usage:
|
|
||||||
%
|
|
||||||
% \begin{AgdaAlign}
|
|
||||||
% \begin{code}
|
|
||||||
% code
|
|
||||||
% more code
|
|
||||||
% \end{code}
|
|
||||||
% Explanation...
|
|
||||||
% \begin{AgdaSuppressSpace}
|
|
||||||
% \begin{code}
|
|
||||||
% aligned with "code"
|
|
||||||
% aligned with "more code"
|
|
||||||
% \end{code}
|
|
||||||
% \begin{code}[hide]
|
|
||||||
% hidden code
|
|
||||||
% \end{code}
|
|
||||||
% \begin{code}
|
|
||||||
% also aligned with "more code"
|
|
||||||
% \end{code}
|
|
||||||
% \end{AgdaSuppressSpace}
|
|
||||||
% \end{AgdaAlign}
|
|
||||||
%
|
|
||||||
% Note that AgdaSuppressSpace environments should not be nested.
|
|
||||||
%
|
|
||||||
% There is also a combined environment, AgdaMultiCode, that combines
|
|
||||||
% the effects of AgdaAlign and AgdaSuppressSpace.
|
|
||||||
|
|
||||||
% The number of the current/next code block (excluding hidden ones).
|
|
||||||
\newcounter{Agda@Current}
|
|
||||||
\setcounter{Agda@Current}{0}
|
|
||||||
|
|
||||||
% The number of the previous code block (excluding hidden ones), used
|
|
||||||
% locally in \Agda@SuppressEnd.
|
|
||||||
\newcounter{Agda@Previous}
|
|
||||||
|
|
||||||
% Is AgdaAlign active?
|
|
||||||
\newboolean{Agda@Align}
|
|
||||||
\setboolean{Agda@Align}{false}
|
|
||||||
|
|
||||||
% The number of the first code block (if any) in a given AgdaAlign
|
|
||||||
% environment.
|
|
||||||
\newcounter{Agda@AlignStart}
|
|
||||||
|
|
||||||
\newcommand{\Agda@AlignStart}{%
|
|
||||||
\ifthenelse{\boolean{Agda@Align}}{%
|
|
||||||
\PackageError{agda}{Nested AgdaAlign environments}{%
|
|
||||||
AgdaAlign and AgdaMultiCode environments must not be
|
|
||||||
nested.}}{%
|
|
||||||
\setboolean{Agda@Align}{true}%
|
|
||||||
\setcounter{Agda@AlignStart}{\value{Agda@Current}}}}
|
|
||||||
|
|
||||||
\newcommand{\Agda@AlignEnd}{\setboolean{Agda@Align}{false}}
|
|
||||||
|
|
||||||
\newenvironment{AgdaAlign}{%
|
|
||||||
\Agda@AlignStart{}}{%
|
|
||||||
\Agda@AlignEnd{}%
|
|
||||||
\ignorespacesafterend}
|
|
||||||
|
|
||||||
% Is AgdaSuppressSpace active?
|
|
||||||
\newboolean{Agda@Suppress}
|
|
||||||
\setboolean{Agda@Suppress}{false}
|
|
||||||
|
|
||||||
% The number of the first code block (if any) in a given
|
|
||||||
% AgdaSuppressSpace environment.
|
|
||||||
\newcounter{Agda@SuppressStart}
|
|
||||||
|
|
||||||
% Does a "do not suppress space after" label exist for the current
|
|
||||||
% code block? (This boolean is used locally in the code environment's
|
|
||||||
% implementation.)
|
|
||||||
\newboolean{Agda@DoNotSuppressSpaceAfter}
|
|
||||||
|
|
||||||
\newcommand{\Agda@SuppressStart}{%
|
|
||||||
\ifthenelse{\boolean{Agda@Suppress}}{%
|
|
||||||
\PackageError{agda}{Nested AgdaSuppressSpace environments}{%
|
|
||||||
AgdaSuppressSpace and AgdaMultiCode environments must not be
|
|
||||||
nested.}}{%
|
|
||||||
\setboolean{Agda@Suppress}{true}%
|
|
||||||
\setcounter{Agda@SuppressStart}{\value{Agda@Current}}}}
|
|
||||||
|
|
||||||
% Marks the given code block as one that space should not be
|
|
||||||
% suppressed after (if AgdaSpaceAroundCode and AgdaSuppressSpace are
|
|
||||||
% both active).
|
|
||||||
\newcommand{\Agda@DoNotSuppressSpaceAfter}[1]{%
|
|
||||||
% The use of labels is intended to ensure that LaTeX will provide a
|
|
||||||
% warning if the document needs to be recompiled.
|
|
||||||
\label{Agda@DoNotSuppressSpaceAfter@#1}}
|
|
||||||
|
|
||||||
\newcommand{\Agda@SuppressEnd}{%
|
|
||||||
\ifthenelse{\value{Agda@SuppressStart} = \value{Agda@Current}}{}{%
|
|
||||||
% Mark the previous code block in the .aux file.
|
|
||||||
\setcounter{Agda@Previous}{\theAgda@Current-1}%
|
|
||||||
\immediate\write\@auxout{%
|
|
||||||
\noexpand\Agda@DoNotSuppressSpaceAfter{\theAgda@Previous}}}%
|
|
||||||
\setboolean{Agda@Suppress}{false}}
|
|
||||||
|
|
||||||
\newenvironment{AgdaSuppressSpace}{%
|
|
||||||
\Agda@SuppressStart{}}{%
|
|
||||||
\Agda@SuppressEnd{}%
|
|
||||||
\ignorespacesafterend}
|
|
||||||
|
|
||||||
\newenvironment{AgdaMultiCode}{%
|
|
||||||
\Agda@AlignStart{}%
|
|
||||||
\Agda@SuppressStart{}}{%
|
|
||||||
\Agda@SuppressEnd{}%
|
|
||||||
\Agda@AlignEnd{}%
|
|
||||||
\ignorespacesafterend}
|
|
||||||
|
|
||||||
% Vertical space used for empty lines. By default \baselineskip.
|
|
||||||
\newlength{\AgdaEmptySkip}
|
|
||||||
\setlength{\AgdaEmptySkip}{\baselineskip}
|
|
||||||
|
|
||||||
% Extra space to be inserted for empty lines (the difference between
|
|
||||||
% \AgdaEmptySkip and \baselineskip). Used internally.
|
|
||||||
\newlength{\AgdaEmptyExtraSkip}
|
|
||||||
|
|
||||||
% The code environment.
|
|
||||||
%
|
|
||||||
% Code can be hidden by writing \begin{code}[hide].
|
|
||||||
%
|
|
||||||
% The implementation is based on plainhscode in lhs2TeX's
|
|
||||||
% polycode.fmt, written by Andres Löh.
|
|
||||||
\NewEnviron{code}[1][]{%
|
|
||||||
% Conditionally hide the code.
|
|
||||||
\ifthenelse{\equal{#1}{hide}}{}{%
|
|
||||||
%
|
|
||||||
% Conditionally emit space before the code block. Unconditionally
|
|
||||||
% switch to a new line.
|
|
||||||
\ifthenelse{\boolean{Agda@SpaceAroundCode} \and%
|
|
||||||
\(\not \boolean{Agda@Suppress} \or%
|
|
||||||
\value{Agda@SuppressStart} = \value{Agda@Current}\)}{%
|
|
||||||
\Agda@NewlineWithVerticalSpace{\abovedisplayskip}}{%
|
|
||||||
\Agda@NewlineWithVerticalSpace{0pt}}%
|
|
||||||
%
|
|
||||||
% Indent the entire code block.
|
|
||||||
\advance\leftskip\mathindent%
|
|
||||||
%
|
|
||||||
% The code's style can be customised.
|
|
||||||
\AgdaCodeStyle%
|
|
||||||
%
|
|
||||||
% Used to control the height of empty lines.
|
|
||||||
\setlength{\AgdaEmptyExtraSkip}{\AgdaEmptySkip - \baselineskip}%
|
|
||||||
%
|
|
||||||
% The environment used to handle indentation (of individual lines)
|
|
||||||
% and alignment.
|
|
||||||
\begin{pboxed}%
|
|
||||||
%
|
|
||||||
% Conditionally preserve alignment between code blocks.
|
|
||||||
\ifthenelse{\boolean{Agda@Align}}{%
|
|
||||||
\ifthenelse{\value{Agda@AlignStart} = \value{Agda@Current}}{%
|
|
||||||
\savecolumns}{%
|
|
||||||
\restorecolumns}}{}%
|
|
||||||
%
|
|
||||||
% The code.
|
|
||||||
\BODY%
|
|
||||||
\end{pboxed}%
|
|
||||||
%
|
|
||||||
% Does the label Agda@DoNotSuppressAfter@<current code block
|
|
||||||
% number> exist?
|
|
||||||
\ifcsdef{r@Agda@DoNotSuppressSpaceAfter@\theAgda@Current}{%
|
|
||||||
\setboolean{Agda@DoNotSuppressSpaceAfter}{true}}{%
|
|
||||||
\setboolean{Agda@DoNotSuppressSpaceAfter}{false}}%
|
|
||||||
%
|
|
||||||
% Conditionally emit space after the code block. Unconditionally
|
|
||||||
% switch to a new line.
|
|
||||||
\ifthenelse{\boolean{Agda@SpaceAroundCode} \and%
|
|
||||||
\(\not \boolean{Agda@Suppress} \or%
|
|
||||||
\boolean{Agda@DoNotSuppressSpaceAfter}\)}{%
|
|
||||||
\Agda@NewlineWithVerticalSpace{\belowdisplayskip}}{%
|
|
||||||
\Agda@NewlineWithVerticalSpace{0pt}}%
|
|
||||||
%
|
|
||||||
% Step the code block counter, but only for non-hidden code.
|
|
||||||
\stepcounter{Agda@Current}}}
|
|
||||||
|
|
||||||
% Space inserted after tokens.
|
|
||||||
\newcommand{\AgdaSpace}{ }
|
|
||||||
|
|
||||||
% Space inserted to indent something.
|
|
||||||
\newcommand{\AgdaIndentSpace}{\AgdaSpace{}$\;\;$}
|
|
||||||
|
|
||||||
% Default column for polytable.
|
|
||||||
\defaultcolumn{@{}l@{\AgdaSpace{}}}
|
|
||||||
|
|
||||||
% \AgdaIndent expects a non-negative integer as its only argument.
|
|
||||||
% This integer should be the distance, in code blocks, to the thing
|
|
||||||
% relative to which the text is indented.
|
|
||||||
%
|
|
||||||
% The default implementation only indents if the thing that the text
|
|
||||||
% is indented relative to exists in the same code block or is wrapped
|
|
||||||
% in the same AgdaAlign or AgdaMultiCode environment.
|
|
||||||
\newcommand{\AgdaIndent}[1]{%
|
|
||||||
\ifthenelse{#1 = 0
|
|
||||||
\or
|
|
||||||
\( \boolean{Agda@Align}
|
|
||||||
\and
|
|
||||||
\cnttest{\value{Agda@Current} - #1}{>=}{
|
|
||||||
\value{Agda@AlignStart}}
|
|
||||||
\)}{\AgdaIndentSpace{}}{}}
|
|
||||||
|
|
||||||
% Underscores are typeset using \AgdaUnderscore{}.
|
|
||||||
\newcommand{\AgdaUnderscore}{\_}
|
|
||||||
|
|
||||||
\endinput
|
|
Binary file not shown.
|
@ -1,139 +0,0 @@
|
||||||
Version history for the LLNCS LaTeX2e class
|
|
||||||
|
|
||||||
date filename version action/reason/acknowledgements
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
29.5.96 letter.txt beta naming problems (subject index file)
|
|
||||||
thanks to Dr. Martin Held, Salzburg, AT
|
|
||||||
|
|
||||||
subjindx.ind renamed to subjidx.ind as required
|
|
||||||
by llncs.dem
|
|
||||||
|
|
||||||
history.txt introducing this file
|
|
||||||
|
|
||||||
30.5.96 llncs.cls incompatibility with new article.cls of
|
|
||||||
1995/12/20 v1.3q Standard LaTeX document class,
|
|
||||||
\if@openbib is no longer defined,
|
|
||||||
reported by Ralf Heckmann and Graham Gough
|
|
||||||
solution by David Carlisle
|
|
||||||
|
|
||||||
10.6.96 llncs.cls problems with fragile commands in \author field
|
|
||||||
reported by Michael Gschwind, TU Wien
|
|
||||||
|
|
||||||
25.7.96 llncs.cls revision a corrects:
|
|
||||||
wrong size of text area, floats not \small,
|
|
||||||
some LaTeX generated texts
|
|
||||||
reported by Michael Sperber, Uni Tuebingen
|
|
||||||
|
|
||||||
16.4.97 all files 2.1 leaving beta state,
|
|
||||||
raising version counter to 2.1
|
|
||||||
|
|
||||||
8.6.97 llncs.cls 2.1a revision a corrects:
|
|
||||||
unbreakable citation lists, reported by
|
|
||||||
Sergio Antoy of Portland State University
|
|
||||||
|
|
||||||
11.12.97 llncs.cls 2.2 "general" headings centered; two new elements
|
|
||||||
for the article header: \email and \homedir;
|
|
||||||
complete revision of special environments:
|
|
||||||
\newtheorem replaced with \spnewtheorem,
|
|
||||||
introduced the theopargself environment;
|
|
||||||
two column parts made with multicol package;
|
|
||||||
add ons to work with the hyperref package
|
|
||||||
|
|
||||||
07.01.98 llncs.cls 2.2 changed \email to simply switch to \tt
|
|
||||||
|
|
||||||
25.03.98 llncs.cls 2.3 new class option "oribibl" to suppress
|
|
||||||
changes to the thebibliograpy environment
|
|
||||||
and retain pure LaTeX codes - useful
|
|
||||||
for most BibTeX applications
|
|
||||||
|
|
||||||
16.04.98 llncs.cls 2.3 if option "oribibl" is given, extend the
|
|
||||||
thebibliograpy hook with "\small", suggested
|
|
||||||
by Clemens Ballarin, University of Cambridge
|
|
||||||
|
|
||||||
20.11.98 llncs.cls 2.4 pagestyle "titlepage" - useful for
|
|
||||||
compilation of whole LNCS volumes
|
|
||||||
|
|
||||||
12.01.99 llncs.cls 2.5 counters of orthogonal numbered special
|
|
||||||
environments are reset each new contribution
|
|
||||||
|
|
||||||
27.04.99 llncs.cls 2.6 new command \thisbottomragged for the
|
|
||||||
actual page; indention of the footnote
|
|
||||||
made variable with \fnindent (default 1em);
|
|
||||||
new command \url that copys its argument
|
|
||||||
|
|
||||||
2.03.00 llncs.cls 2.7 \figurename and \tablename made compatible
|
|
||||||
to babel, suggested by Jo Hereth, TU Darmstadt;
|
|
||||||
definition of \url moved \AtBeginDocument
|
|
||||||
(allows for url package of Donald Arseneau),
|
|
||||||
suggested by Manfred Hauswirth, TU of Vienna;
|
|
||||||
\large for part entries in the TOC
|
|
||||||
|
|
||||||
16.04.00 llncs.cls 2.8 new option "orivec" to preserve the original
|
|
||||||
vector definition, read "arrow" accent
|
|
||||||
|
|
||||||
17.01.01 llncs.cls 2.9 hardwired texts made polyglot,
|
|
||||||
available languages: english (default),
|
|
||||||
french, german - all are "babel-proof"
|
|
||||||
|
|
||||||
20.06.01 splncs.bst public release of a BibTeX style for LNCS,
|
|
||||||
nobly provided by Jason Noble
|
|
||||||
|
|
||||||
14.08.01 llncs.cls 2.10 TOC: authors flushleft,
|
|
||||||
entries without hyphenation; suggested
|
|
||||||
by Wiro Niessen, Imaging Center - Utrecht
|
|
||||||
|
|
||||||
23.01.02 llncs.cls 2.11 fixed footnote number confusion with
|
|
||||||
\thanks, numbered institutes, and normal
|
|
||||||
footnote entries; error reported by
|
|
||||||
Saverio Cittadini, Istituto Tecnico
|
|
||||||
Industriale "Tito Sarrocchi" - Siena
|
|
||||||
|
|
||||||
28.01.02 llncs.cls 2.12 fixed footnote fix; error reported by
|
|
||||||
Chris Mesterharm, CS Dept. Rutgers - NJ
|
|
||||||
|
|
||||||
28.01.02 llncs.cls 2.13 fixed the fix (programmer needs vacation)
|
|
||||||
|
|
||||||
17.08.04 llncs.cls 2.14 TOC: authors indented, smart \and handling
|
|
||||||
for the TOC suggested by Thomas Gabel
|
|
||||||
University of Osnabrueck
|
|
||||||
|
|
||||||
07.03.06 splncs.bst fix for BibTeX entries without year; patch
|
|
||||||
provided by Jerry James, Utah State University
|
|
||||||
|
|
||||||
14.06.06 splncs_srt.bst a sorting BibTeX style for LNCS, feature
|
|
||||||
provided by Tobias Heindel, FMI Uni-Stuttgart
|
|
||||||
|
|
||||||
16.10.06 llncs.dem 2.3 removed affiliations from \tocauthor demo
|
|
||||||
|
|
||||||
11.12.07 llncs.doc note on online visibility of given e-mail address
|
|
||||||
|
|
||||||
15.06.09 splncs03.bst new BibTeX style compliant with the current
|
|
||||||
requirements, provided by Maurizio "Titto"
|
|
||||||
Patrignani of Universita' Roma Tre
|
|
||||||
|
|
||||||
30.03.10 llncs.cls 2.15 fixed broken hyperref interoperability;
|
|
||||||
patch provided by Sven Koehler,
|
|
||||||
Hamburg University of Technology
|
|
||||||
|
|
||||||
15.04.10 llncs.cls 2.16 fixed hyperref warning for informatory TOC entries;
|
|
||||||
introduced \keywords command - finally;
|
|
||||||
blank removed from \keywordname, flaw reported
|
|
||||||
by Armin B. Wagner, IGW TU Vienna
|
|
||||||
|
|
||||||
15.04.10 llncs.cls 2.17 fixed missing switch "openright" used by \backmatter;
|
|
||||||
flaw reported by Tobias Pape, University of Potsdam
|
|
||||||
|
|
||||||
27.09.13 llncs.cls 2.18 fixed "ngerman" incompatibility; solution provided
|
|
||||||
by Bastian Pfleging, University of Stuttgart
|
|
||||||
|
|
||||||
04.09.17 llncs.cls 2.19 introduced \orcidID command
|
|
||||||
|
|
||||||
10.03.18 llncs.cls 2.20 adjusted \doi according to CrossRef requirements;
|
|
||||||
TOC: removed affiliation numbers
|
|
||||||
|
|
||||||
splncs04.bst added doi field;
|
|
||||||
bold journal numbers
|
|
||||||
|
|
||||||
samplepaper.tex new sample paper
|
|
||||||
|
|
||||||
llncsdoc.pdf new LaTeX class documentation
|
|
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
@ -1,19 +0,0 @@
|
||||||
Dear LLNCS user,
|
|
||||||
|
|
||||||
The files in this directory belong to the LaTeX2e package for
|
|
||||||
Lecture Notes in Computer Science (LNCS) of Springer-Verlag.
|
|
||||||
|
|
||||||
It consists of the following files:
|
|
||||||
|
|
||||||
readme.txt this file
|
|
||||||
|
|
||||||
history.txt the version history of the package
|
|
||||||
|
|
||||||
llncs.cls the LaTeX2e document class
|
|
||||||
|
|
||||||
samplepaper.tex a sample paper
|
|
||||||
fig1.eps a figure used in the sample paper
|
|
||||||
|
|
||||||
llncsdoc.pdf the documentation of the class (PDF version)
|
|
||||||
|
|
||||||
splncs04.bst current LNCS BibTeX style with alphabetic sorting
|
|
Binary file not shown.
|
@ -1,150 +0,0 @@
|
||||||
% This is samplepaper.tex, a sample chapter demonstrating the
|
|
||||||
% LLNCS macro package for Springer Computer Science proceedings;
|
|
||||||
% Version 2.20 of 2017/10/04
|
|
||||||
%
|
|
||||||
\documentclass[runningheads]{llncs}
|
|
||||||
%
|
|
||||||
\usepackage{graphicx}
|
|
||||||
% Used for displaying a sample figure. If possible, figure files should
|
|
||||||
% be included in EPS format.
|
|
||||||
%
|
|
||||||
% If you use the hyperref package, please uncomment the following line
|
|
||||||
% to display URLs in blue roman font according to Springer's eBook style:
|
|
||||||
% \renewcommand\UrlFont{\color{blue}\rmfamily}
|
|
||||||
|
|
||||||
\begin{document}
|
|
||||||
%
|
|
||||||
\title{Contribution Title\thanks{Supported by organization x.}}
|
|
||||||
%
|
|
||||||
%\titlerunning{Abbreviated paper title}
|
|
||||||
% If the paper title is too long for the running head, you can set
|
|
||||||
% an abbreviated paper title here
|
|
||||||
%
|
|
||||||
\author{First Author\inst{1}\orcidID{0000-1111-2222-3333} \and
|
|
||||||
Second Author\inst{2,3}\orcidID{1111-2222-3333-4444} \and
|
|
||||||
Third Author\inst{3}\orcidID{2222--3333-4444-5555}}
|
|
||||||
%
|
|
||||||
\authorrunning{F. Author et al.}
|
|
||||||
% First names are abbreviated in the running head.
|
|
||||||
% If there are more than two authors, 'et al.' is used.
|
|
||||||
%
|
|
||||||
\institute{Princeton University, Princeton NJ 08544, USA \and
|
|
||||||
Springer Heidelberg, Tiergartenstr. 17, 69121 Heidelberg, Germany
|
|
||||||
\email{lncs@springer.com}\\
|
|
||||||
\url{http://www.springer.com/gp/computer-science/lncs} \and
|
|
||||||
ABC Institute, Rupert-Karls-University Heidelberg, Heidelberg, Germany\\
|
|
||||||
\email{\{abc,lncs\}@uni-heidelberg.de}}
|
|
||||||
%
|
|
||||||
\maketitle % typeset the header of the contribution
|
|
||||||
%
|
|
||||||
\begin{abstract}
|
|
||||||
The abstract should briefly summarize the contents of the paper in
|
|
||||||
150--250 words.
|
|
||||||
|
|
||||||
\keywords{First keyword \and Second keyword \and Another keyword.}
|
|
||||||
\end{abstract}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
\section{First Section}
|
|
||||||
\subsection{A Subsection Sample}
|
|
||||||
Please note that the first paragraph of a section or subsection is
|
|
||||||
not indented. The first paragraph that follows a table, figure,
|
|
||||||
equation etc. does not need an indent, either.
|
|
||||||
|
|
||||||
Subsequent paragraphs, however, are indented.
|
|
||||||
|
|
||||||
\subsubsection{Sample Heading (Third Level)} Only two levels of
|
|
||||||
headings should be numbered. Lower level headings remain unnumbered;
|
|
||||||
they are formatted as run-in headings.
|
|
||||||
|
|
||||||
\paragraph{Sample Heading (Fourth Level)}
|
|
||||||
The contribution should contain no more than four levels of
|
|
||||||
headings. Table~\ref{tab1} gives a summary of all heading levels.
|
|
||||||
|
|
||||||
\begin{table}
|
|
||||||
\caption{Table captions should be placed above the
|
|
||||||
tables.}\label{tab1}
|
|
||||||
\begin{tabular}{|l|l|l|}
|
|
||||||
\hline
|
|
||||||
Heading level & Example & Font size and style\\
|
|
||||||
\hline
|
|
||||||
Title (centered) & {\Large\bfseries Lecture Notes} & 14 point, bold\\
|
|
||||||
1st-level heading & {\large\bfseries 1 Introduction} & 12 point, bold\\
|
|
||||||
2nd-level heading & {\bfseries 2.1 Printing Area} & 10 point, bold\\
|
|
||||||
3rd-level heading & {\bfseries Run-in Heading in Bold.} Text follows & 10 point, bold\\
|
|
||||||
4th-level heading & {\itshape Lowest Level Heading.} Text follows & 10 point, italic\\
|
|
||||||
\hline
|
|
||||||
\end{tabular}
|
|
||||||
\end{table}
|
|
||||||
|
|
||||||
|
|
||||||
\noindent Displayed equations are centered and set on a separate
|
|
||||||
line.
|
|
||||||
\begin{equation}
|
|
||||||
x + y = z
|
|
||||||
\end{equation}
|
|
||||||
Please try to avoid rasterized images for line-art diagrams and
|
|
||||||
schemas. Whenever possible, use vector graphics instead (see
|
|
||||||
Fig.~\ref{fig1}).
|
|
||||||
|
|
||||||
\begin{figure}
|
|
||||||
\includegraphics[width=\textwidth]{fig1.eps}
|
|
||||||
\caption{A figure caption is always placed below the illustration.
|
|
||||||
Please note that short captions are centered, while long ones are
|
|
||||||
justified by the macro package automatically.} \label{fig1}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\begin{theorem}
|
|
||||||
This is a sample theorem. The run-in heading is set in bold, while
|
|
||||||
the following text appears in italics. Definitions, lemmas,
|
|
||||||
propositions, and corollaries are styled the same way.
|
|
||||||
\end{theorem}
|
|
||||||
%
|
|
||||||
% the environments 'definition', 'lemma', 'proposition', 'corollary',
|
|
||||||
% 'remark', and 'example' are defined in the LLNCS documentclass as well.
|
|
||||||
%
|
|
||||||
\begin{proof}
|
|
||||||
Proofs, examples, and remarks have the initial word in italics,
|
|
||||||
while the following text appears in normal font.
|
|
||||||
\end{proof}
|
|
||||||
For citations of references, we prefer the use of square brackets
|
|
||||||
and consecutive numbers. Citations using labels or the author/year
|
|
||||||
convention are also acceptable. The following bibliography provides
|
|
||||||
a sample reference list with entries for journal
|
|
||||||
articles~\cite{ref_article1}, an LNCS chapter~\cite{ref_lncs1}, a
|
|
||||||
book~\cite{ref_book1}, proceedings without editors~\cite{ref_proc1},
|
|
||||||
and a homepage~\cite{ref_url1}. Multiple citations are grouped
|
|
||||||
\cite{ref_article1,ref_lncs1,ref_book1},
|
|
||||||
\cite{ref_article1,ref_book1,ref_proc1,ref_url1}.
|
|
||||||
%
|
|
||||||
% ---- Bibliography ----
|
|
||||||
%
|
|
||||||
% BibTeX users should specify bibliography style 'splncs04'.
|
|
||||||
% References will then be sorted and formatted in the correct style.
|
|
||||||
%
|
|
||||||
% \bibliographystyle{splncs04}
|
|
||||||
% \bibliography{mybibliography}
|
|
||||||
%
|
|
||||||
\begin{thebibliography}{8}
|
|
||||||
\bibitem{ref_article1}
|
|
||||||
Author, F.: Article title. Journal \textbf{2}(5), 99--110 (2016)
|
|
||||||
|
|
||||||
\bibitem{ref_lncs1}
|
|
||||||
Author, F., Author, S.: Title of a proceedings paper. In: Editor,
|
|
||||||
F., Editor, S. (eds.) CONFERENCE 2016, LNCS, vol. 9999, pp. 1--13.
|
|
||||||
Springer, Heidelberg (2016). \doi{10.10007/1234567890}
|
|
||||||
|
|
||||||
\bibitem{ref_book1}
|
|
||||||
Author, F., Author, S., Author, T.: Book title. 2nd edn. Publisher,
|
|
||||||
Location (1999)
|
|
||||||
|
|
||||||
\bibitem{ref_proc1}
|
|
||||||
Author, A.-B.: Contribution title. In: 9th International Proceedings
|
|
||||||
on Proceedings, pp. 1--2. Publisher, Location (2010)
|
|
||||||
|
|
||||||
\bibitem{ref_url1}
|
|
||||||
LNCS Homepage, \url{http://www.springer.com/lncs}. Last accessed 4
|
|
||||||
Oct 2017
|
|
||||||
\end{thebibliography}
|
|
||||||
\end{document}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,35 +0,0 @@
|
||||||
Everyone on this list will be familiar with Progress and Preservation
|
|
||||||
for terms in a typed calculus. Write ∅ ⊢ M : A to indicate that term
|
|
||||||
M has type A for closed M.
|
|
||||||
|
|
||||||
Progress. If ∅ ⊢ M : A then either M is a value or M —→ N,
|
|
||||||
for some term N.
|
|
||||||
|
|
||||||
Preservation. If ∅ ⊢ M : A and M —→ N then ∅ ⊢ N : A.
|
|
||||||
|
|
||||||
It is easy to combine these two proofs into an evaluator.
|
|
||||||
Write —↠ for the transitive and reflexive closure of —→.
|
|
||||||
|
|
||||||
Evaluation. If ∅ ⊢ M : A, then for every natural number n,
|
|
||||||
either M —↠ V, where V is a value and the reduction sequence
|
|
||||||
has no more than n steps, or M —↠ N, where N is not a value
|
|
||||||
and the reduction sequence has n steps.
|
|
||||||
|
|
||||||
Evaluation implies that either M —↠ V or there is an infinite
|
|
||||||
sequence M —→ M₁ —→ M₂ —→ ... that never reduces to a value;
|
|
||||||
but this last result is not constructive, as deciding which of
|
|
||||||
the two results holds is not decidable.
|
|
||||||
|
|
||||||
An Agda implementation of Evaluation provides an evaluator for terms:
|
|
||||||
given a number n it will perform up to n steps of evaluation, stopping
|
|
||||||
early if a value is reached. This is entirely obvious (at least in
|
|
||||||
retrospect), but I have not seen it written down anywhere. For
|
|
||||||
instance, this approach is not exploited in Software Foundations to
|
|
||||||
evaluate terms (other methods are used instead). I have used it
|
|
||||||
in my draft textbook:
|
|
||||||
|
|
||||||
https:plfa.inf.ed.ac.uk
|
|
||||||
|
|
||||||
Questions: What sources in the literature should one cite for this
|
|
||||||
technique? How well-known is it as folklore?
|
|
||||||
|
|
|
@ -1,245 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Dear Philip,
|
|
||||||
|
|
||||||
Thank you very much for having submitted to SBMF 2018.
|
|
||||||
|
|
||||||
We are glad to inform you that the paper "Programming Language
|
|
||||||
Foundations in Agda" has been accepted for presentation and inclusion
|
|
||||||
in the LNCS proceedings of SBMF 2018.
|
|
||||||
|
|
||||||
We have received 30 submissions to this edition of the conference,
|
|
||||||
accepting 14 submissions among them; each submission received a
|
|
||||||
minimum of three and a maximum of five review reports. Once again
|
|
||||||
congratulations for being among a select few!
|
|
||||||
|
|
||||||
We enclose below the review reports of your submission, provided by
|
|
||||||
our international program committee. Please consider them carefully
|
|
||||||
when preparing your camera-ready paper.
|
|
||||||
|
|
||||||
Please note that the camera-ready paper is due on September 11th, and
|
|
||||||
the deadline is strict. You will be invited to submit your final
|
|
||||||
manuscript via the EasyChair system. Please make sure that you use the
|
|
||||||
LNCS style file (without any manual modifications) for preparing the
|
|
||||||
camera-ready version and also include a signed copy of the LNCS
|
|
||||||
copyright form in your camera-ready submission.
|
|
||||||
|
|
||||||
Thank you very much again for having submitted your paper, and we are
|
|
||||||
looking forward to meeting you and listening to you at SBMF 2018.
|
|
||||||
|
|
||||||
Best regards -- Tiago Massoni and Mohammad Mousavi
|
|
||||||
|
|
||||||
PC Chairs of SBMF 2018
|
|
||||||
|
|
||||||
|
|
||||||
----------------------- REVIEW 1 ---------------------
|
|
||||||
PAPER: 14
|
|
||||||
TITLE: Programming Language Foundations in Agda
|
|
||||||
AUTHORS: Philip Wadler
|
|
||||||
|
|
||||||
Overall evaluation: 3 (strong accept)
|
|
||||||
|
|
||||||
----------- Overall evaluation -----------
|
|
||||||
This paper is an experience report about using the proof assistant
|
|
||||||
Agda to teach some basic topics in programming language theory,
|
|
||||||
following the lines of the book Software Foundations (SF) which uses
|
|
||||||
Coq. The Agda development discussed in the paper is part of a larger
|
|
||||||
development comprising a new textbook that uses Agda and covers some
|
|
||||||
of the topics of SF. There are three main contributions as I see
|
|
||||||
them. First, Agda is compared with Coq for suitability of teaching
|
|
||||||
this sort of material. Second, the paper spells out how constructive
|
|
||||||
proofs of progress and subject reduction can be composed in a simple
|
|
||||||
way to define an evaluator. Third, some arguments are given in favor
|
|
||||||
of using an inherently-typed representation of terms rather than raw
|
|
||||||
terms.
|
|
||||||
|
|
||||||
The comparison with Agda and Coq has no surprises for experts, but is
|
|
||||||
clearly written and should serve as a valuable guide to educators.
|
|
||||||
Key aspects of the two systems are explained, from the point of view
|
|
||||||
of teaching core PL concepts at an introductory level, and the paper
|
|
||||||
is likely to make a broad community aware of the newly developed
|
|
||||||
alternative to SF. The comparisons are interesting points, phrased
|
|
||||||
fairly and succinctly, and are based on substantial teaching
|
|
||||||
experience.
|
|
||||||
|
|
||||||
The direct use of progress plus subject reduction as the components of
|
|
||||||
an evaluator seems so obvious that it is surprising that, as the
|
|
||||||
author explains, it does not seem to be very widely known (and not
|
|
||||||
previously published). This part of the paper therefore provides
|
|
||||||
novel scientific content.
|
|
||||||
|
|
||||||
The discussion of inherently-typed term representation, and de Bruin
|
|
||||||
notation, is somewhat high level, less clear and less accessible to
|
|
||||||
non-experts than the other topics, but still interesting.
|
|
||||||
|
|
||||||
Details
|
|
||||||
|
|
||||||
The writing is excellent and I have only a few minor issues to point
|
|
||||||
out.
|
|
||||||
|
|
||||||
Given that the author aims to improve on SF, not merely reproduce it
|
|
||||||
in Agda, I suggest not settling for progress and preservation, but
|
|
||||||
also include some semantic type soundness result. The significance of
|
|
||||||
such results is well argued in Dreyer's invited talk at POPL 2018.
|
|
||||||
|
|
||||||
Perhaps the biggest contribution of the work reported here is the
|
|
||||||
possibility to do empirical studies of learning with two different
|
|
||||||
forms of interactive proving, as remarked near the top of page 11. I
|
|
||||||
encourage the author to pursue that.
|
|
||||||
|
|
||||||
|
|
||||||
- The first line of the abstract refers to SF as "the leading textbook
|
|
||||||
for formal methods". If there is evidence for that, it should be
|
|
||||||
mentioned in the paper; otherwise it should be watered down. Formal
|
|
||||||
methods is a broader field than the topics covered in SF, and SF is
|
|
||||||
not the only widely used textbook on those topics or others in
|
|
||||||
formal methods. [done]
|
|
||||||
|
|
||||||
- page 2 "Pierce and Benjamin" should be just Pierce [done]
|
|
||||||
|
|
||||||
- page 6 the first term in Fig 1 uses dot for application, which is
|
|
||||||
sufficiently nonstandard to deserve mention by the time the figure
|
|
||||||
is discussed; it doesn't become obvious until fig 2
|
|
||||||
|
|
||||||
- fig 2 could benefit with a bit more explanation of the formal
|
|
||||||
notation, for readers (like this reviewer) not familiar with Agda.
|
|
||||||
For example, on first glance it's surprising to see the identifier
|
|
||||||
progress re-defined, and back-tick empty-parens isn't obviously the
|
|
||||||
variable case. [done]
|
|
||||||
|
|
||||||
- page 13 comments about formatting, "All of the example ... output."
|
|
||||||
are not so interesting and could be omitted. [disagree]
|
|
||||||
|
|
||||||
- section 5 please consider showing some notation and explaining
|
|
||||||
inherently-typed terms in more detail
|
|
||||||
|
|
||||||
- page 13 "any proofs that appear in one..." is ambiguous. It could
|
|
||||||
refer to results that are only relevant to one but not the other, in
|
|
||||||
which case stripping them out could be an unfair comparison.
|
|
||||||
Perhaps you mean results that simply happen not to be stated and
|
|
||||||
proved in one of the two developments. [done]
|
|
||||||
|
|
||||||
|
|
||||||
----------------------- REVIEW 2 ---------------------
|
|
||||||
PAPER: 14
|
|
||||||
TITLE: Programming Language Foundations in Agda
|
|
||||||
AUTHORS: Philip Wadler
|
|
||||||
|
|
||||||
Overall evaluation: 2 (accept)
|
|
||||||
|
|
||||||
----------- Overall evaluation -----------
|
|
||||||
This paper reports an alternative to the Software Foundations book
|
|
||||||
(SF) by Pierce et al. The author claims that the language Agda is a
|
|
||||||
better vehicle to teaching the foundations of programming languages in
|
|
||||||
comparison to Coq. According to his experience using SF, much of the
|
|
||||||
learning effort goes to tactics. His textbook, Programming Language
|
|
||||||
Foundations in Agda, also provides an elegant way to get from
|
|
||||||
constructive proofs of preservation and progress to a prototype
|
|
||||||
evaluator.
|
|
||||||
|
|
||||||
As part of the "Experience reports regarding teaching formal methods"
|
|
||||||
of our Call for Paper, I think this work will introduce to the
|
|
||||||
audience a relevant alterantive to SF and an important new way to
|
|
||||||
teaching formal methods and programming languages.
|
|
||||||
|
|
||||||
|
|
||||||
----------------------- REVIEW 3 ---------------------
|
|
||||||
PAPER: 14
|
|
||||||
TITLE: Programming Language Foundations in Agda
|
|
||||||
AUTHORS: Philip Wadler
|
|
||||||
|
|
||||||
Overall evaluation: 2 (accept)
|
|
||||||
|
|
||||||
----------- Overall evaluation -----------
|
|
||||||
In this paper the author presents his personal experience on writing a
|
|
||||||
textbook covering the same material as the famous “Software
|
|
||||||
Foundations” in Agda instead of Coq. The main motivation to use Agda
|
|
||||||
is pedagogical. For understanding a Coq proof a student will typically
|
|
||||||
need to run the proof in an interactive prover. However, it should be
|
|
||||||
possible for a student to read an Agda proof without running it in a
|
|
||||||
prover. For the modest size proofs that the textbook uses the lengths
|
|
||||||
of the proofs are quite comparable. The author has given some
|
|
||||||
comparisons between the the two textbooks in Section 3. Sections 4 and
|
|
||||||
5 present some of the decisions that the author has made in writing
|
|
||||||
the book (prototype evaluator and inherent typing). The paper in
|
|
||||||
general is a pleasant read and the comparisons between the books are
|
|
||||||
interesting. I tend to agree with Nate Foster that it is certainly
|
|
||||||
interesting to empirically evaluate the reluctance of the students to
|
|
||||||
use theorem provers. Such an evaluation can quite a strong case for
|
|
||||||
writing the new book.
|
|
||||||
|
|
||||||
-------------------------------------------------------
|
|
||||||
|
|
||||||
Paper: 14
|
|
||||||
Authors: Philip Wadler
|
|
||||||
Title: Programming Language Foundations in Agda
|
|
||||||
|
|
||||||
-------------------------------------------------------
|
|
||||||
|
|
||||||
Dear Philip,
|
|
||||||
|
|
||||||
You have already received the comments by the reviewers in a
|
|
||||||
previous email. Please take them carefully into account when
|
|
||||||
preparing your camera-ready paper for the proceedings. The final
|
|
||||||
paper and the signed copyright form are due on
|
|
||||||
|
|
||||||
September 11, 2018
|
|
||||||
|
|
||||||
This is a firm deadline for the production of the proceedings.
|
|
||||||
You should submit your paper using your EasyChair proceedings
|
|
||||||
author role for SBMF 2018.
|
|
||||||
|
|
||||||
1. FINAL PAPER: Please submit the files belonging to your
|
|
||||||
camera-ready paper using your EasyChair author account. Follow
|
|
||||||
the instructions after the login for uploading two files:
|
|
||||||
|
|
||||||
(1) either a zipped file containing all your LaTeX sources or
|
|
||||||
a Word file in the RTF format, and
|
|
||||||
|
|
||||||
(2) the PDF version of your camera-ready paper
|
|
||||||
|
|
||||||
Please follow strictly
|
|
||||||
the author instructions of Springer-Verlag when preparing the
|
|
||||||
final version:
|
|
||||||
|
|
||||||
http://www.springer.de/comp/lncs/authors.html
|
|
||||||
|
|
||||||
Our publisher has recently introduced an extra control loop: once
|
|
||||||
data processing is finished, they will contact all corresponding
|
|
||||||
authors and ask them to check their papers. We expect this to
|
|
||||||
happen shortly before the printing of the proceedings. At that
|
|
||||||
time your quick interaction with Springer-Verlag will be greatly
|
|
||||||
appreciated.
|
|
||||||
|
|
||||||
2. COPYRIGHT: Please upload a signed and completed copyright form
|
|
||||||
to us as soon as possible. The Springer copyright forms can be
|
|
||||||
found at
|
|
||||||
|
|
||||||
https://resource-cms.springernature.com/springer-cms/rest/v1/content/15433008/data/Contract_Book_Contributor_Consent_to_Publish_LNCS_SIP
|
|
||||||
|
|
||||||
|
|
||||||
It is sufficient for one of the authors to sign the copyright
|
|
||||||
form. You can scan the form into PDF or any other standard image
|
|
||||||
format.
|
|
||||||
|
|
||||||
We greatly appreciate your cooperation in these matters. Thank
|
|
||||||
you again for your contribution to SBMF 2018.
|
|
||||||
|
|
||||||
All questions about papers should be sent to the volume editors
|
|
||||||
Tiago Massoni <massoni@computacao.ufcg.edu.br> and
|
|
||||||
Mohammadreza Mousavi <mm789@leicester.ac.uk>.
|
|
||||||
|
|
||||||
Sincerely,
|
|
||||||
-- Tiago Massoni and
|
|
||||||
Mohammad Mousavi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The LNCS edition will allow papers to present up to two (2) extra
|
|
||||||
pages in their final version, so you may use this to better
|
|
||||||
accommodate changes required by the reviews.
|
|
||||||
|
|
||||||
Regards,
|
|
||||||
Tiago and Mohammad.
|
|
|
@ -1,20 +0,0 @@
|
||||||
\documentclass{article}
|
|
||||||
\usepackage{bbm}
|
|
||||||
\usepackage[greek,english]{babel}
|
|
||||||
\usepackage{ucs}
|
|
||||||
\usepackage[utf8x]{inputenc}
|
|
||||||
\usepackage{autofe}
|
|
||||||
\usepackage{agda}
|
|
||||||
\begin{document}
|
|
||||||
|
|
||||||
\begin{code}
|
|
||||||
data αβγδεζθικλμνξρστυφχψω : Set₁ where
|
|
||||||
|
|
||||||
postulate
|
|
||||||
→⇒⇛⇉⇄↦⇨↠⇀⇁ : Set
|
|
||||||
\end{code}
|
|
||||||
|
|
||||||
\[
|
|
||||||
∀X [ ∅ ∉ X ⇒ ∃f:X ⟶ ⋃ X\ ∀A ∈ X (f(A) ∈ A) ]
|
|
||||||
\]
|
|
||||||
\end{document}
|
|
Loading…
Reference in a new issue