index 1fedd2a..b1b4d93 100644 (file)
@@ -54,11 +54,10 @@ tells us that "The simple theory of types was suggested as a
modification of Russell's ramified theory of types by Leon Chwistek in
1921 and 1922 and by F. P. Ramsey in 1926."  This footnote appears in
Church's 1940 paper [A formulation of the simple theory of
-types](church-simple-types.pdf).  In this paper, as Will Starr
-mentioned in class, Church does indeed write types by simple
-apposition, without the ugly angle brackets and commas used by
-Montague.  Furthermore, he omits parentheses under the convention that
-types associated to the *left*---the opposite of the modern
+types](church-simple-types.pdf).  In this paper, Church writes types
+by simple apposition, without the ugly angle brackets and commas used
+by Montague.  Furthermore, he omits parentheses under the convention
+that types associated to the *left*---the opposite of the modern
convention.  This is ok, however, because he also reverses the order,
so that `te` is a function from objects of type `e` to objects of type
`t`.  Cool paper!  If you ever want to see Church numerals in their
@@ -147,7 +146,7 @@ present it here; see Berendregt or Hankin.
Since &Omega; does not have a normal form, it follows that &Omega;
cannot have a type in &Lambda;_T.  We can easily see why:

-     &Omega; = (\x.xx)(\x.xx)
+<code>&Omega; = (\x.xx)(\x.xx)</code>

Assume &Omega; has type &tau;, and `\x.xx` has type &sigma;.  Then
because `\x.xx` takes an argument of type &sigma; and returns
@@ -161,36 +160,19 @@ In general, there is no way for a function to have a type that can
take itself for an argument.  It follows that there is no way to
define the identity function in such a way that it can take itself as
an argument.  Instead, there must be many different identity
-functions, one for each type.
+functions, one for each type.  Some of those types can be functions,
+and some of those functions can be (type-restricted) identity
+functions; but a simply-types identity function can never apply to itself.

#Typing numerals#

-Version 1 type numerals are not a good choice for the simply-typed
-lambda calculus.  The reason is that each different numberal has a
-different type!  For instance, if zero has type &sigma;, then since
-one is represented by the function `\x.x false 0`, it must have type
-`b --> &sigma; --> &sigma;`, where `b` is the type of a boolean.  But
-this is a different type than zero!  Because each number has a
-different type, it becomes unbearable to write arithmetic operations
-that can combine zero with one, since we would need as many different
+The Church numerals are well behaved with respect to types.  They can
+all be given the type (&sigma; --> &sigma;) --> &sigma; --> &sigma;.

-Fortunately, the Church numerals are well behaved with respect to
-types.  They can all be given the type (&sigma; --> &sigma;) -->
-&sigma; --> &sigma;.

-
-
-<!--
-
-Mau integrate some mention of this at some point.
-
-http://okmij.org/ftp/Computation/lambda-calc.html#predecessor
-
-
-Predecessor and lists are not representable in simply typed lambda-calculus
+## Predecessor and lists are not representable in simply typed lambda-calculus ##

The predecessor of a Church-encoded numeral, or, generally, the encoding of a list with the car and cdr operations are both impossible in the simply typed lambda-calculus. Henk Barendregt's ``The impact of the lambda-calculus in logic and computer science'' (The Bulletin of Symbolic Logic, v3, N2, June 1997) has the following phrase, on p. 186:

@@ -207,5 +189,6 @@ Predecessor and lists are not representable in simply typed lambda-calculus

Lists can also be represented in System F. As a matter of fact, we do not need the full System F (where the type reconstruction is not decidable). We merely need the extension of the Hindley-Milner system with higher-ranked types, which requires a modicum of type annotations and yet is able to infer the types of all other terms. This extension is supported in Haskell and OCaml. With such an extension, we can represent a list by its fold, as shown in the code below. It is less known that this representation is faithful: we can implement all list operations, including tail, drop, and even zip.

+See also [[Oleg Kiselyov on the predecessor function in the lambda
+calculus|http://okmij.org/ftp/Computation/lambda-calc.html#predecessor]].

--->