The Undecidability of System F Typability and Type Checking for Reductionists

Author(s):  
Andrej Dudenhefner
Keyword(s):  
1997 ◽  
Vol 4 (51) ◽  
Author(s):  
James McKinna ◽  
Robert Pollack

"This paper is about our hobby." That is the first sentence of [MP93], the first report on our formal development of lambda calculus and type theory, written in autumn 1992. We have continued to pursue this hobby on and off ever since, and have developed a substantial body of formal knowledge, including Church-Rosser and standardization<br />theorems for beta reduction, and the basic theory of<br />Pure Type Systems (PTS) leading to the strengthening theorem and type checking algorithms for PTS. Some of this work is reported in [MP93, vBJMP94, Pol94b, Pol95]. In the present paper we survey this work, including some new proofs, and point out what we feel has been learned about the general issues of formalizing mathematics. On the technical side, we describe an abstract, and simplified, proof of standardization for beta reduction, not previously published, that does<br />not mention redex positions or residuals. On the general issues, we emphasize the search for formal definitions that are convenient for formal proof and convincingly represent the intended informal concepts. The LEGO Proof Development System [LP92] was used to check the work in an implementation of the Extended Calculus of Constructions<br />(ECC) with inductive types [Luo94]. LEGO is a refinement style<br />proof checker, publicly available by ftp and WWW, with a User's Manual [LP92] and a large collection of examples. Section 1.3 contains information on accessing the formal development described in this paper. Other interesting examples formalized in LEGO include program specification and data refinement [Luo91], strong normalization of System F [Alt93], synthetic domain theory [Reu95, Reu96], and operational semantics for imperative programs [Sch97].


Author(s):  
David Cockayne ◽  
David McKenzie

The technique of Electron Reduced Density Function (RDF) analysis has ben developed into a rapid analytical tool for the analysis of small volumes of amorphous or polycrystalline materials. The energy filtered electron diffraction pattern is collected to high scattering angles (currendy to s = 2 sinθ/λ = 6.5 Å-1) by scanning the selected area electron diffraction pattern across the entrance aperture to a GATAN parallel energy loss spectrometer. The diffraction pattern is then converted to a reduced density function, G(r), using mathematical procedures equivalent to those used in X-ray and neutron diffraction studies.Nearest neighbour distances accurate to 0.01 Å are obtained routinely, and bond distortions of molecules can be determined from the ratio of first to second nearest neighbour distances. The accuracy of coordination number determinations from polycrystalline monatomic materials (eg Pt) is high (5%). In amorphous systems (eg carbon, silicon) it is reasonable (10%), but in multi-element systems there are a number of problems to be overcome; to reduce the diffraction pattern to G(r), the approximation must be made that for all elements i,j in the system, fj(s) = Kji fi,(s) where Kji is independent of s.


2020 ◽  
Vol 4 (POPL) ◽  
pp. 1-28 ◽  
Author(s):  
Matthieu Sozeau ◽  
Simon Boulier ◽  
Yannick Forster ◽  
Nicolas Tabareau ◽  
Théo Winterhalter
Keyword(s):  

2021 ◽  
Vol 43 (1) ◽  
pp. 1-73
Author(s):  
David J. Pearce

Rust is a relatively new programming language that has gained significant traction since its v1.0 release in 2015. Rust aims to be a systems language that competes with C/C++. A claimed advantage of Rust is a strong focus on memory safety without garbage collection. This is primarily achieved through two concepts, namely, reference lifetimes and borrowing . Both of these are well-known ideas stemming from the literature on region-based memory management and linearity / uniqueness . Rust brings both of these ideas together to form a coherent programming model. Furthermore, Rust has a strong focus on stack-allocated data and, like C/C++ but unlike Java, permits references to local variables. Type checking in Rust can be viewed as a two-phase process: First, a traditional type checker operates in a flow-insensitive fashion; second, a borrow checker enforces an ownership invariant using a flow-sensitive analysis. In this article, we present a lightweight formalism that captures these two phases using a flow-sensitive type system that enforces “ type and borrow safety .” In particular, programs that are type and borrow safe will not attempt to dereference dangling pointers. Our calculus core captures many aspects of Rust, including copy- and move-semantics, mutable borrowing, reborrowing, partial moves, and lifetimes. In particular, it remains sufficiently lightweight to be easily digested and understood and, we argue, still captures the salient aspects of reference lifetimes and borrowing. Furthermore, extensions to the core can easily add more complex features (e.g., control-flow, tuples, method invocation). We provide a soundness proof to verify our key claims of the calculus. We also provide a reference implementation in Java with which we have model checked our calculus using over 500B input programs. We have also fuzz tested the Rust compiler using our calculus against 2B programs and, to date, found one confirmed compiler bug and several other possible issues.


Sign in / Sign up

Export Citation Format

Share Document