• Home
  • Agent Gallery
  • Templates
  • Chat with PDF
  • Literature Review
  • AI Writer
  • Find Topics
  • Paraphraser
  • Citation Generator
  • Extract Data
  • AI Detector
  • AI Humanizer
Scispace (Formerly Typeset)
  1. Home
  2. Journals
  3. Journal of Functional Programming
  4. 1996
  1. Home
  2. Journals
  3. Journal of Functional Programming
  4. 1996
Showing papers in "Journal of Functional Programming in 1996"
Journal Article•10.1017/S0956796800001945•
λν, a calculus of explicit substitutions which preserves strong normalisation

[...]

Zine-El-Abidine Benaissa1, Daniel Briaud1, Pierre Lescanne2, Jocelyne Rouyer-Degli2•
Centre national de la recherche scientifique1, French Institute for Research in Computer Science and Automation2
01 Sep 1996-Journal of Functional Programming
TL;DR: In this paper, a calculus of explicit substitutions, called $C\lambda\xi\phi, was proposed and compared to the one proposed by de Bruijn and is shown to preserve strong normalization.
Abstract: Explicit substitutions were proposed by Abadi, Cardelli, Curien, Hardin and Levy to internalise substitutions into $\lambda$-calculus and to propose a mechanism for computing on substitutions. $\lambda\upsilon$ is another view of the same concept which aims to explain the process of substitution and to decompose it in small steps. $\lambda\upsilon$ is simple and preserves strong normalisation. Apparently that important property cannot stay with another important one, namely confluence on open terms. The spirit of $\lambda\upsilon$ is closely related to another calculus of explicit substitutions proposed by de Bruijn and called $C\lambda\xi\phi$. In this paper, we introduce $\lambda\upsilon$, we present $C\lambda\xi\phi$ in the same framework as $\lambda\upsilon$ and we compare both calculi. Moreover, we prove properties of $\lambda\upsilon$; namely $\lambda\upsilon$ correctly implements $\beta$ reduction, $\lambda\upsilon$ is confluent on closed terms, i.e., on terms of classical $\lambda$-calculus and on all terms that are derived from those terms, and finally $\lambda\upsilon$ preserves strong normalization of $\beta$-reduction.

131 citations

Journal Article•10.1017/S0956796800001805•
Haskore music notation – An algebra of music –

[...]

Paul Hudak1, Tom Makucevich1, Syam Gadde1, Bo Whong1•
Yale University1
01 May 1996-Journal of Functional Programming
TL;DR: A notion of literal performance is defined through which observationally equivalent musical objects can be determined and many useful properties can be proved, such as commutative, associative, and distributive properties of various operators.
Abstract: We have developed a simple algebraic approach to music description and composition called Haskore. In this framework, musical objects consist of primitive notions such as notes and rests, operations to transform musical objects such as transpose and tempo-scaling, and operations to combine musical objects to form more complex ones, such as concurrent and sequential composition. When these simple notions are embedded into a functional language such as Haskell, rather complex musical relationships can be expressed clearly and succinctly. Exploiting the algebraic properties of Haskore, we have further defined a notion of literal performance (devoid of articulation) through which observationally equivalent musical objects can be determined. With this basis many useful properties can be proved, such as commutative, associative, and distributive properties of various operators. An algebra of music thus surfaces.

102 citations

Journal Article•10.1017/S0956796800001891•
Benchmarking Implementations of Functional Languages with `Pseudoknot', a Float-Intensive Benchmark

[...]

Pieter H. Hartel1, Marc Feeley2, M. Alt3, Lennart Augustsson4•
University of Amsterdam1, Université de Montréal2, Saarland University3, Chalmers University of Technology4
01 Jul 1996-Journal of Functional Programming
TL;DR: Over 25 implementations of different functional languages are benchmarked using the same program, a floatingpoint intensive application taken from molecular biology, and the principal aspects studied are compile time and execution time for the various implementations that were benchmarked.
Abstract: Over 25 implementations of different functional languages are benchmarked using the same program, a floatingpoint intensive application taken from molecular biology. The principal aspects studied are compile time and execution time for the various implementations that were benchmarked. An important consideration is how the program can be modified and tuned to obtain maximal performance on each language implementation. With few exceptions, the compilers take a significant amount of time to compile this program, though most compilers were faster than the then current GNU C compiler (GCC version 2.5.8). Compilers that generate C or Lisp are often slower than those that generate native code directly: the cost of compiling the intermediate form is normally a large fraction of the total compilation time. There is no clear distinction between the runtime performance of eager and lazy implementations when appropriate annotations are used: lazy implementations have clearly come of age when it comes to implementing largely strict applications, such as the Pseudoknot program. The speed of C can be approached by some implemtations, but to achieve this performance, special measures such as strictness annotations are required by non-strict implementations. The benchmark results have to be interpreted with care. Firstly, a benchmark based on a single program cannot cover a wide spectrum of 'typical' applications.j Secondly, the compilers vary in the kind and level of optimisations offered, so the effort required to obtain an optimal version of the program is similarly varied.

86 citations

Journal Article•10.1017/S0956796800001556•
Generic functional programming with types and relations

[...]

Richard Bird1, Oege de Moor1, Paul F. Hoogendijk2•
University of Oxford1, Eindhoven University of Technology2
01 Jan 1996-Journal of Functional Programming
TL;DR: The purpose of this paper is to explore the possibility of deriving generic programs by recasting part of the theory of lists that deals with segments as a theory about ‘segments’ in a wide class of datatypes and then used to pose and solve a generic version of a well-known problem.
Abstract: A generic functional program is one which is parameterised by datatype. By installing specific choices, for example lists or trees, different programs are obtained that are, nevertheless, abstractly the same. The purpose of this paper is to explore the possibility of deriving generic programs. Part of the theory of lists that deals with segments is recast as a theory about ‘segments’ in a wide class of datatypes, and then used to pose and solve a generic version of a well-known problem.

64 citations

Journal Article•10.1017/S0956796800001933•
A syntactic theory of type generativity and sharing

[...]

Xavier Leroy
01 Sep 1996-Journal of Functional Programming
TL;DR: This article presented a purely syntactic account of type generativity and sharing in the SML module system and showed its equivalence with the traditional stamp-based description of these mechanisms, and recast the S ML module system in a more abstract, type-theoretic framework.
Abstract: This paper presents a purely syntactic account of type generativity and sharing | two key mechanisms in the SML module system | and shows its equivalence with the traditional stamp-based description of these mechanisms. This syntactic description recasts the SML module system in a more abstract, type-theoretic framework. Capsule Review The issue of ame equivalence" versus \structural equivalence" for statically typed languages has been a vexing problem in programming language design for decades. With the

63 citations

Journal Article•10.1017/S0956796800001817•
Type classes with existential types

[...]

Konstantin Läufer
01 May 1996-Journal of Functional Programming
TL;DR: It is argued that the novel combination of type classes and existential types in a single language yields significant expressive power in the context of higher-order functional languages with static typing, parametric polymorphism, algebraic data types and Hindley-Milner type inference.
Abstract: We argue that the novel combination of type classes and existential types in a single language yields significant expressive power. We explore this combination in the context of higher-order functional languages with static typing, parametric polymorphism, algebraic data types and Hindley-Milner type inference. Adding existential types to an existing functional language that already features type classes requires only a minor syntactic extension. We first demonstrate how to provide existential quantification over type classes by extending the syntax of algebraic data type definitions, and give examples of possible uses. We then develop a type system and a type inference algorithm for the resulting language. Finally, we present a formal semantics by translation to an implicitly-typed second-order .̂-calculus and show that the type system is semantically sound. Our extension has been implemented in the Chalmers Haskell B. system, and all examples from this paper have been developed using this system. Capsule Review It is well known that existential quantifiers can be used to formalise the definition and use of abstract datatypes. However, few mainstream functional languages most of which are based on a polymorphic, Hindley-Milner type system provide any direct support for this. In previous work, both Perry and Laufer have studied extensions of the Hindley-Milner type system in which datatypes are used to manipulate values with existentially quantified types. The current paper extends their approach to a language that combines existential typing with the type class overloading mechanisms of Haskell. The main benefit is the ability to use type classes in the definition of abstract datatypes; classes themselves serve as datatype signatures, particular implementations can be coded up as instances of a class, and existential typing can be used to make these implementations abstract. The first part of the paper shows that the use of overloading can be quite convenient because it frees the programmer from the need to make explicit reference to the implementation of a particular datatype. On the other hand, this approach inherits some of the restrictions of the Haskell class mechanism. For example, it is not possible for different implementations to share a single representation type. The second part of the paper provides a formal treatment of the type system. In particular, it shows that well-typed terms have principal types and that the semantics of a program can be explained by a type-preserving translation into an implicitly typed, second-order X calculus. 486 Konstantin Laufer

46 citations

Journal Article•10.1017/S095679680000201X•
Optimal purely functional priority queues

[...]

Gerth Stølting Brodal1, Chris Okasaki2•
Aarhus University1, Carnegie Mellon University2
01 Nov 1996-Journal of Functional Programming
TL;DR: This paper adapts Brodal’s data structure to a purely functional setting and clarifies its relationship to the binomial queues of Vuillemin, which support all four operations in O(log n) time.
Abstract: Brodal recently introduced the first implementation of imperative priority queues to support findMin, insert and meld in O(1) worst-case time, and deleteMin in O(log n) worst-case time. These bounds are asymptotically optimal among all comparison-based priority queues. In this paper, we adapt Brodal's data structure to a purely functional setting. In doing so, we both simplify the data structure and clarify its relationship to the binomial queues of Vuillemin, which support all four operations in O(log n) time. Specifically, we derive our implementation from binomial queues in three steps: first, we reduce the running time of insert to O(1) by eliminating the possibility of cascading links; second, we reduce the running time of findMin to O(1) by adding a global root to hold the minimum element; and finally, we reduce the running time of meld to O(1) by allowing priority queues to contain other priority queues. Each of these steps is expressed using ML-style functors. The last transformation, known as data-structural bootstrapping, is an interesting application of higher-order functors and recursive structures.

43 citations

Journal Article•10.1017/S0956796800001672•
Canonical typing and $\Pi$-conversion in the Barendregt cube

[...]

Fairouz Kamareddine1, RP Rob Nederpelt2•
University of Glasgow1, Eindhoven University of Technology2
01 Mar 1996-Journal of Functional Programming
TL;DR: This article extends the Barendregt Cube with ?
Abstract: In this article, we extend the Barendregt Cube with ?-conversion (which is the analogue of s-conversion, on product type level) and study its properties. We use this extension to separate the problem of whether a term is typable from the problem of what is the type of a term.

28 citations

Journal Article•10.1017/S0956796800001738•
An Introduction to Formal Specification and Z by Ben Potter, Jane Sinclair and David Till, Prentice-Hall, 1991. Z: An Introduction to Formal Methods (second edition) by Antoni Diller, John Wiley & Sons, 1994.

[...]

Andrew D. Gordon1•
University of Cambridge1
01 Mar 1996-Journal of Functional Programming

21 citations

Journal Article•10.1017/S0956796800001684•
Generating action compilers by partial evaluation

[...]

Anders Bondorf, Jens Palsberg
01 Mar 1996-Journal of Functional Programming
TL;DR: Even though the compiler produces Scheme code, the code runs as fast as that produced by the previous action compilers.
Abstract: Compiler generation based on Mosses' action semantics has been studied by Brown, Moura, and Watt, and also by the second author. The core of each of their systems is a handwritten action compiler, producing either C or machine code. We have obtained an action compiler in a much simpler way: by partial evaluation of an action interpreter. Even though our compiler produces Scheme code, the code runs as fast as that produced by the previous action compilers.

15 citations

Journal Article•10.1017/S0956796800001623•
Back to Basics: Deriving Representation Changers Functionally

[...]

Graham Hutton, Erik Meijer
01 Jan 1996-Journal of Functional Programming
TL;DR: A number of different approaches to specifying representation changers (pointwise, functional, and relational) are given, and a simple technique that can be used to derive functional programs from the specifications is presented.
Abstract: Many functional programs can be viewed as representation changers, that is, as functions that convert abstract values from one concrete representation to another. Examples of such programs include base-converters, binary adders and multipliers, and compilers. In this paper we give a number of different approaches to specifying representation changers (pointwise, functional, and relational), and present a simple technique that can be used to derive functional programs from the specifications.
Journal Article•10.1017/S0956796800001957•
π-RED + An interactive compiling graph reduction system for an applied λ-calculus

[...]

Dietmar Gärtner1, Werner E. Kluge1•
University of Kiel1
01 Sep 1996-Journal of Functional Programming
TL;DR: An implementation technique for a functional language based on an applied 2-calculus which allows to stop the execution of a program at any point and to reconvert the graph to the original syntax of the functional language, and even allows one to output results containing free variables and functions.
Abstract: This paper describes a compiling graph reduction system which realizes the reduction semantics of a fully-fledged applied i-calculus. High-level functional programs are conceptually executed as sequences of program transformations governed by full ^-reductions. They may be carried out step-by-step, and intermediate programs may be displayed in high-level notation, rendering the system suitable for interactive program design, high-level debugging, and also for teaching basic programming language concepts and language interpretation. Run-time efficiency for production runs is achieved by means of an abstract stack machine ASM which serves as an intermediate level of code generation. It employs multiple stacks for reasonably fast function calls, optimized tail-end recursions, and earliest possible releases of subgraphs that are no longer needed. The ASM involves an interpreter if and only if potential naming conflicts need to be resolved when reducing partial function applications. The main point of the paper is an implementation technique for a functional language based on an applied 2-calculus which allows to stop the execution of a program at any point and to reconvert the graph to the original syntax of the functional language. It even allows one to output results containing free variables and functions. This is surely interesting and helpful for debugging and teaching. Previous attempts to reach this aim were based on an interpreter. The new approach is based on compilation, and reaches an efficiency close to that of state-of-the-art implementations of Haskell, Clean and SML.
Journal Article•10.1017/S0956796800001775•
Operational interpretations of an extension of F ω with control operators

[...]

Robert Harper1, Mark Lillibridge1•
Carnegie Mellon University1
01 May 1996-Journal of Functional Programming
TL;DR: The operational semantics of an extension of Girard's System F ω with two control operators are studied: an abort operation that abandons the current control context, and a callcc operation that captures theCurrent control context.
Abstract: We study the operational semantics of an extension of Girard's System F ω with two control operators: an abort operation that abandons the current control context, and a callcc operation that captures the current control context. Two classes of operational semantics are considered, each with a call-by-value and a call-by-name variant, differing in their treatment of polymorphic abstraction and instantiation. Under the standard semantics, polymorphic abstractions are values and polymorphic instantiation is a significant computation step; under the ML-like semantics evaluation proceeds beneath polymorphic abstractions and polymorphic instantiation is computationally insignificant. Compositional, type-preserving continuation-passing style (cps) transformation algorithms are given for the standard semantics, resulting in terms on which all four evaluation strategies coincide. This has as a corollary the soundness and termination of well-typed programs under the standard evaluation strategies. In contrast, such results are obtained for the call-by-value ML-like strategy only for a restricted sub-language in which constructor abstractions are limited to values. The ML-like call-by-name semantics is indistinguishable from the standard call-by-name semantics when attention is limited to complete programs.
Journal Article•10.1017/S0956796800001829•
Proof-irrelevance out of excluded-middle and choice in the calculus of constructions

[...]

Franco Barbanera1, Stefano Berardi1•
University of Turin1
01 May 1996-Journal of Functional Programming
TL;DR: A short and direct syntactic proof of the fact that adding the axiom of choice and the principle of excluded-middle to Coquand-Huet's Calculus of Constructions gives proof-irrelevance is presented.
Abstract: We present a short and direct syntactic proof of the fact that adding the axiom of choice and the principle of excluded-middle to Coquand-Huet's Calculus of Constructions gives proof-irrelevance.
Journal Article•10.1017/S0956796800001799•
Combinators for parsing expressions

[...]

Steve Hill1•
University of Kent1
01 May 1996-Journal of Functional Programming
TL;DR: In this paper, a set of combinators for parsing expressions described by ambiguous grammars with precedence and associativity rules is described, and a parser for the expression part of the C programming language is presented.
Abstract: This paper describes a scheme for constructing parsers based on the top-down combinator approach. In particular, it describes a set of combinators for parsing expressions described by ambiguous grammars with precedence and associativity rules. The new combinators embody the mechanical grammar manipulations typically employed to remove left-recursion and hence help to avoid the possibility of a non-terminating parser. A number of approaches to the problem are described—the most elegant and efficient method is based on continuation passing. As a practical demonstration, a parser for the expression part of the C programming language is presented. The expression combinators are general, and may be constructed from any suitable set of top-down combinators. A comparison with parser generators shows that the combinator approach is most applicable for rapid development.
Journal Article•10.1017/S0956796800001969•
A simple proof of the undecidability of inhabitation in λP

[...]

Marc Bezem1, Jan Springintveld2•
Utrecht University1, Radboud University Nijmegen2
01 Sep 1996-Journal of Functional Programming
TL;DR: The authors of this paper have given a very direct argument showing the same result, by a surprisingly straightforward encoding of a register machine, that arithmetic and even a finitely axiomatizable part of it (Robinson's arithmetic) is essentially undecidable.
Journal Article•10.1017/S0956796800001714•
Predictive parser combinators need four values to report errors

[...]

Andrew S. Partridge1, David W. Wright1•
University of Tasmania1
01 Mar 1996-Journal of Functional Programming
TL;DR: A method for constructing parser combinators that can be used to build efficient predictive parsers which accurately report the cause of parsing errors is described.
Abstract: A combinator-based parser is a parser constructed directly from a BNF grammar, using higher-order functions (combinators) to model the alternative and sequencing operations of BNF. This paper describes a method for constructing parser combinators that can be used to build efficient predictive parsers which accurately report the cause of parsing errors. The method uses parsers that return values (parse trees or error indications) decorated with one of four tags.
Journal Article•10.1017/S0956796800001593•
Weak polymorphism can be sound

[...]

John Greiner1•
Carnegie Mellon University1
01 Jan 1996-Journal of Functional Programming
TL;DR: An explanation of weak polymorphism is presented and it is shown that a formalization of this is sound and relates this to the SML/NJ implementation ofWeak polymorphism through a series of type systems that incorporate elements of the S ML/NJ type inference algorithm.
Abstract: The weak polymorphic type system of Standard ML of New Jersey (SML/NJ) (MacQueen, 1992) has only been presented as part of the implementation of the SML/NJ compiler, not as a formal type system. As a result, it is not well understood. And while numerous versions of the implementation have been shown unsound, the concept has not been proved sound or unsound. We present an explanation of weak polymorphism and show that a formalization of this is sound. We also relate this to the SML/NJ implementation of weak polymorphism through a series of type systems that incorporate elements of the SML/NJ type inference algorithm.
Journal Article•10.1017/S0956796800001581•
Proving the correctness of compiler optimisations based on a global analysis: a study of strictness analysis †

[...]

Geoffrey L. Burn1, Daniel Le Métayer•
Imperial College London1
01 Jan 1996-Journal of Functional Programming
TL;DR: It is shown that compiler optimisations based on strictness analysis can be expressed formally in the functional framework using continuations, allowing for a rigorous correctness proof of the optimised compiler and exposing the various optimisations made possible by a strictnessAnalysis.
Journal Article•10.1017/S0956796800001611•
Note on Algol and Conservatively Extending Functional Programming

[...]

Peter W. O'Hearn1•
Syracuse University1
01 Jan 1996-Journal of Functional Programming
TL;DR: It is shown that observational equivalence in this language conservatively extends observational equivalences in its assignment-free functional sublanguage.
Abstract: A simple Idealized Algol is considered, based on Reynolds's \\essence of Algol.\" It is shown that observational equivalence in this language conservatively extends observational equivalence in its assignment-free functional sublanguage.
Journal Article•10.1017/s0956796800001623•
Functional Pearl

[...]

Graham Hutton, Erik Meijer
01 Jan 1996-Journal of Functional Programming
TL;DR: This paper shows that the generality of relations is not essential, and representation changers can be derived within the more basic setting of functional programming, by deriving a carry-save adder and a base-converter, two functions which have been derived relationally.
Abstract: A representation changer is a function that converts a concrete representation of an abstract value into a different concrete representation of that value. Many useful functions can be recognised as representation changers; examples include compilers and arithmetic functions such as addition and multiplication. Functions that can be specified as the right inverse of other functions are special cases of representation changers. In recent years, a number of authors have used a relational calculus to derive representation changers from their specifications. In this paper, we show that the generality of relations is not essential, and representation changers can be derived within the more basic setting of functional programming. We illustrate our point by deriving a carry-save adder and a base-converter, two functions which have previously been derived relationally. This paper discusses several programming problems all related to base conversion in number representation. The problems are all formulated as instances of finding so-called 'representa-tion changers'. The discussion of what a representation changer is is clear and well motivated. The derivation of the algorithms is also clear and straightforward. The material presented in the paper could be easily (and profitably) integrated into an undergraduate course on functional programming as illustration of the calculational method in program derivation.
Journal Article•10.1017/S095679680000160X•
Sparse matrix representations in a functional language

[...]

Philip W. Grant1, John A. Sharp1, M.F. Webster1, Xiaoming Zhang1•
Swansea University1
01 Jan 1996-Journal of Functional Programming
TL;DR: Experimental evidence comparing time and space efficiency of these sparse matrix representation schemes and associated algorithms in Haskell for solving linear systems of equations arising from solving realistic computational fluid dynamics problems using a finite element algorithm is reported.
Abstract: This paper investigates several sparse matrix representation schemes and associated algorithms in Haskell for solving linear systems of equations arising from solving realistic computational fluid dynamics problems using a finite element algorithm. This work complements that of Wainwright and Sexton (1992) in that a Choleski direct solver (with an emphasis on its forward/backward substitution steps) is examined. Experimental evidence comparing time and space efficiency of these matrix representation schemes is reported, together with associated forward/backward substitution implementations. Our results are in general agreement with Wainwright and Sexton's.
Journal Article•10.1017/S0956796800001878•
Representing demand by partial projections

[...]

John Launchbury1, Gebreselassie Baraki1•
Oregon Health & Science University1
01 Jul 1996-Journal of Functional Programming
TL;DR: The projection-based strictness analysis of Wadler and Hughes is elegant and theoretically satisfying except in one respect: the need for lifting, so removing this infelicity is seen.
Abstract: The projection-based strictness analysis of Wadler and Hughes is elegant and theoretically satisfying except in one respect: the need for lifting. The domains and functions over which the analysis is performed need to be transformed, leading to a less direct correspondence between analysis and program than might be hoped for. In this paper we shall see that the projection analysis may be reformulated in terms of partial projections, so removing this infelicity. There are additional benefits of the formulation: the two forms of information captured by the projection are distinguished, and the operational significance of the range of the projection fits exactly with the theory of unboxed types.
Journal Article•10.1017/S0956796800001787•
Some lattice-based scientific problems, expressed in Haskell

[...]

D. B. Carpenter1, Hugh Glaser1•
University of Southampton1
01 May 1996-Journal of Functional Programming
TL;DR: This paper explores the application of a lazy functional language, Haskell, to a series of grid-based scientific problems---solution of the Poisson equation and Monte Carlo simulation of two theoretical models from statistical and particle physics.
Abstract: The paper explores the application of a lazy functional language, Haskell, to a series of grid-based scientific problems---solution of the Poisson equation and Monte Carlo simulation of two theoretical models from statistical and particle physics. The implementations introduce certain abstractions of grid topology, making extensive use of the polymorphic features of Haskell. Updating is expressed naturally through use of infinite lists, exploiting the laziness of the language. Evolution of systems is represented by arrays of interacting streams.
Journal Article•10.1017/S0956796800001568•
The resource constrained shortest path problem implemented in a lazy functional language

[...]

Pieter H. Hartel1, Hugh Glaser2•
University of Amsterdam1, University of Southampton2
01 Jan 1996-Journal of Functional Programming
TL;DR: The performance of the lazy functional implementations, even with the comparatively simple algorithms that are used, is competitive with a reference FORTRAN implementation.
Abstract: The resource constrained shortest path problem is an NP-hard problem for which many ingenious algorithms have been developed. These algorithms are usually implemented in FORTRAN or another imperative programming language. We have implemented some of the simpler algorithms in a lazy functional language. Benefits accrue in the software engineering of the implementations. Our implementations have been applied to a standard benchmark of data files, which is available from the Operational Research Library of Imperial College, London. The performance of the lazy functional implementations, even with the comparatively simple algorithms that we have used, is competitive with a reference FORTRAN implementation.
Journal Article•10.1017/S0956796800001726•
Functional Pearl Deduction for functional programmers

[...]

James J. Leifer1, Bernard Sufrin2•
University of Cambridge1, University of Oxford2
01 Mar 1996-Journal of Functional Programming
TL;DR: This work investigates how formal logic can be introduced to students who are familiar with functional programming in a way that takes advantage of their familiarity with higher order functions, free data-types, homomorphisms, and induction principles.
Abstract: We investigate how formal logic can be introduced to students who are familiar with functional programming in a way that takes advantage of their familiarity with higher order functions, free data-types, homomorphisms, and induction principles. In our experience, students often struggle with formal logic because they are unclear about the distinction between theorems and metatheorems, the distinction between syntactic constructors and semantic operators (and hence the meaning of models and valuations), and the induction and recursion principles over proofs. Using a functional programming notation as a metalanguage clears up these ambiguities because of the imposed type discipline: theorems and metatheorems have distinctive types, so are easily distinguished; when operators are overloaded (for example, when they are used both in syntax and semantics) their different types can be written out; and the recursion and induction principles over proofs become straightforward because the data-type for proofs is explicitly described. As an added benefit, proofs — naturally tree-structured — need not be arbitrarily linearized just so that natural number recursion and induction can be performed on them. We present a Gofer (Jones, 1991) functional program script that defines datatypes for representing well-formed formulas, proofs, and sequents in the propositional logic. We then discuss the implementation of theorem and inference schemas and illustrate the latter by defining a function that provides a constructive proof of the Deduction Theorem. Finally, we compare our approach to prior work and conclude by remarking on other research we have done in this area.
Journal Article•10.1017/S0956796800001635•
Programming with Standard ML by Colin Myers, Chris Clack and Ellen Poon, Prentice Hall International, Inc., New Jersey, 301pp, 1993, ISBN 0-13-722075-8. ML for the Working Programmer by L.C. Paulson, Cambridge University Press, 1991, 429pp, ISBN 0-521-39022-2. Elements of ML Programming by Jeffrey D. Ullman, Prentice Hall International, Inc., New Jersey, 1994, 320pp, ISBN 0-13-288788-6, 0-13-184854-2 (USA).

[...]

Michael Fourman
01 Jan 1996-Journal of Functional Programming
Journal Article•10.1017/S0956796800001702•
Formal basis for the refinement of rule based transition systems

[...]

Anthony N. Clark1•
University of Bradford1
01 Mar 1996-Journal of Functional Programming
TL;DR: This paper makes a contribution to the refinement of systems which involve search by proposing a simple non-deterministic model for rule based transition systems and using this to define a meaning for rulebased refinement which allows each stage of the software development path to be verified with respect to the previous stage.
Abstract: This paper makes a contribution to the refinement of systems which involve search by proposing a simple non-deterministic model for rule based transition systems and using this to define a meaning for rule based refinement which allows each stage of the software development path to be verified with respect to the previous stage. The proposal allows a system which involves search to be specified in terms of all the possible outcomes. Each stage of refinement will introduce complexity to the rules and therefore develop the search space in ever more sophisticated ways. At each stage of the refinement it will be possible to be precise about which collections of outcomes have been deleted, thereby achieving a verified (prototype) implementation.
Journal Article•10.1017/S0956796800001842•
Deriving Tidy Drawings of Trees

[...]

Jeremy Gibbons1•
University of Auckland1
01 May 1996-Journal of Functional Programming
TL;DR: This paper derives an e cient algorithm for producing tidy drawings of trees that consists of an upwards accumulation followed by a downwards accumulation on the tree, and is further evidence of the utility of these two higher-order tree operations.
Abstract: The tree-drawing problem is to produce a ‘tidy’ mapping from elements of a tree to points in the plane. In this paper, we derive an efficient algorithm for producing tidy drawings of trees. The specification, the starting point for the derivations, consists of a collection of intuitively appealing criteria satisfied by tidy drawings. The derivation shows constructively that these criteria completely determine the drawing. Indeed, the criteria completely determine a simple but inefficient algorithm for drawing a tree, which can be transformed into an efficient algorithm using just standard techniques and a small number of inventive steps.The algorithm consists of an upwards accumulation followed by a downwards accumulation on the tree, and is further evidence of the utility of these two higher-order tree operations.
Journal Article•10.1017/s0956796800001891•
Benchmarking implementations of functional languages with ‘Pseudoknot’, a float-intensive benchmark

[...]

Pieter H. Hartel, Marc Feeley, M. Alt, Lennart Augustsson, Peter Baumann1, M. Beemster2, Emmanuel Chailloux, Christine H. Flood, Wolfgang Grieskamp, John H. G. van Groningen, Kevin Hammond, Bogumil Hausman, M. Ivory, Richard E. Jones, J. Kamperman, Xavier Leroy, R. D. Lins, S. Loosemore, Niklas Röjemo, Manuel Serrano, Jean-Pierre Talpin3, J. Thackray, Stephen Thomas, Pum Walters, Pierre Weis, Peter Wentworth •
Technische Universität Darmstadt1, University of Amsterdam2, French Institute for Research in Computer Science and Automation3
01 Jul 1996-Journal of Functional Programming
TL;DR: Benchmarking functional languages with 'Pseudoknot' reveals that most compilers are faster than GCC version 2.5.8, but the compilation time can be significant. Native code generation is often faster than compilation to C or Lisp. Lazy implementations have comparable performance to eager implementations when appropriate annotations are used. To achieve C-like performance, non-strict implementations require additional measures.
Abstract: Abstract Over 25 implementations of different functional languages are benchmarked using the same program, a floating-point intensive application taken from molecular biology. The principal aspects studied are compile time and execution time for the various implementations that were benchmarked. An important consideration is how the program can be modified and tuned to obtain maximal performance on each language implementation. With few exceptions, the compilers take a significant amount of time to compile this program, though most compilers were faster than the then current GNU C compiler (GCC version 2.5.8). Compilers that generate C or Lisp are often slower than those that generate native code directly: the cost of compiling the intermediate form is normally a large fraction of the total compilation time. There is no clear distinction between the runtime performance of eager and lazy implementations when appropriate annotations are used: lazy implementations have clearly come of age when it comes to implementing largely strict applications, such as the Pseudoknot program. The speed of C can be approached by some implementations, but to achieve this performance, special measures such as strictness annotations are required by non-strict implementations. The benchmark results have to be interpreted with care. Firstly, a benchmark based on a single program cannot cover a wide spectrum of ‘typical’ applications. Secondly, the compilers vary in the kind and level of optimisations offered, so the effort required to obtain an optimal version of the program is similarly varied.

Tools

SciSpace AgentBiomedical AgentSciSpace RecruitSciSpace for EnterpriseAgent GalleryChat with PDFLiterature ReviewAI WriterFind TopicsParaphraserCitation GeneratorExtract DataAI DetectorAI Humanizer

Learn

CompareGuidesLive Workshops

SciSpace

CareersSupportBrowse PapersPricingSciSpace Affiliate ProgramCancellation & Refund PolicyTermsPrivacyData Sources

Directories

PapersTopicsJournalsAuthorsConferencesInstitutionsPublishersCitation StylesWriting templates

Extension & Apps

SciSpace Chrome ExtensionSciSpace Mobile App

Contact

[email protected]
SciSpace

© 2026 | PubGenius Inc. | Suite # 217 691 S Milpitas Blvd Milpitas CA 95035, USA

soc2