From: Chris Barker Date: Sat, 2 Oct 2010 00:34:07 +0000 (-0400) Subject: edits X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=commitdiff_plain;h=c67cbb8584091ee6f42f6780f9ab4142e45c37b0 edits --- diff --git a/temp.mdwn b/temp.mdwn index e91eeee5..4a5b9dc0 100644 --- a/temp.mdwn +++ b/temp.mdwn @@ -1,134 +1,124 @@ -Assignment 3 ------------- +This lambda evaluator will allow you to write lambda terms and evaluate (that is, normalize) them, and inspect the results. +(This won't work in Racket, because Racket doesn't even try to represent the internal structure of a function in a human-readable way.) -Once again, the lambda evaluator will make working through this -assignment much faster and more secure. +*Lambda terms*: lambda terms are written with a backslash, thus: `((\x (\y x)) z)`. -#Writing recursive functions on version 1 style lists# +If you click "Normalize", the system will try to produce a normal-form lambda expression that your original term reduces to (~~>). So `((\x (\y x)) z)` reduces to `(\y z)`. -Recall that version 1 style lists are constructed like this (see -[[lists and numbers]]): +*Let*: in order to make building a more elaborate set of terms easier, it is possible to define values using `let`. +In this toy system, `let`s should only be used at the beginning of a file. If we have, for intance, -
-; booleans
+    let true = (\x (\y x)) in
+    let false = (\x (\y y)) in
+    ((true yes) no)
+
+the result is `yes`.
+
+*Comments*: anything following a semicolon to the end of the line is ignored.
+Blank lines are fine.
+
+*Abbreviations*: In an earlier version, you couldn't use abbreviations. `\x y. y x x` had to be written `(\x (\y ((y x) x)))`. We've upgraded the parser though, so now it should be able to understand any lambda term that you can.
+
+*Constants*: The combinators `S`, `K`, `I`, `C`, `B`, `W`, and `T` are pre-defined to their standard values. Also, integers will automatically be converted to Church numerals. (`0` is `\s z. z`, `1` is `\s z. s z`, and so on.)
+
+
+
+
+
+do eta-reductions too
+
+
+
+
+
+
 
+ -#Computing with trees# -Linguists analyze natural language expressions into trees. -We'll need trees in future weeks, and tree structures provide good -opportunities for learning how to write recursive functions. -Making use of the resources we have at the moment, we can approximate -trees as follows: instead of words, we'll use Church numerals. -Then a tree will be a (version 1 type) list in which each element is -itself a tree. For simplicity, we'll adopt the convention that -a tree of length 1 must contain a number as its only element. -Then we have the following representations: -
-   (a)           (b)             (c)  
-    .
-   /|\            /\              /\
-  / | \          /\ 3            1 /\
-  1 2  3        1  2               2 3
+Under the hood
+---------------
 
-[[1];[2];[3]]  [[[1];[2]];[3]]   [[1];[[2];[3]]]
-
+The interpreter is written in JavaScript and runs inside your browser. +So if you decide to reduce a term that does not terminate (such as `((\x (x x)) (\x (x x)))`), it will be your +browser that stops responding, not the wiki server. -Limitations of this scheme include the following: there is no easy way -to label a constituent with a syntactic category (S or NP or VP, -etc.), and there is no way to represent a tree in which a mother has a -single daughter. - -When processing a tree, you can test for whether the tree contains -only a numeral (in which case the tree is leaf node) by testing for -whether the length of the list is less than or equal to 1. This will -be your base case for your recursive functions that operate on these -trees. - -1. Write a function that sums the number of leaves in a tree. - -Expected behavior: - -
-let t1 = (makeList 1 nil) in
-let t2 = (makeList 2 nil) in
-let t3 = (makeList 3 nil) in
-let t12 = (makeList t1 (makeList t2 nil)) in
-let t23 = (makeList t2 (makeList t3 nil)) in
-let ta = (makeList t1 t23) in
-let tb = (makeList t12 t3) in
-let tc = (makeList t1 (makeList t23 nil)) in
-
-sum-leaves t1 ~~> 1
-sum-leaves t2 ~~> 2
-sum-leaves t3 ~~> 3
-sum-leaves t12 ~~> 3
-sum-leaves t23 ~~> 5
-sum-leaves ta ~~> 6
-sum-leaves tb ~~> 6
-sum-leaves tc ~~> 6
-
+The main code is [here](http://lambda.jimpryor.net/code/lambda.js). Suggestions for improvements welcome. + +The code is based on: + +* Chris Barker's JavaScript lambda calculator +* [Oleg Kiselyov's Haskell lambda calculator](http://okmij.org/ftp/Computation/lambda-calc.html#lambda-calculator-haskell). +* The top-down JavaScript lexer and parser at . + +Improvements we hope to add soon: the ability to reduce Combinatory Logic combinators and report the result as combinators, rather than in lambda forms. -2. Write a function that counts the number of leaves.