X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?a=blobdiff_plain;f=exercises%2F_assignment6.mdwn;h=106572580ab0968309d8f911d52428832c1e1b0a;hb=9789c1adea9056a288c32272203892aae139dd2e;hp=f6a480306a595912daf5e6933a03ab02cc4dcdaa;hpb=8cd605a9141eba85196521657010fb7ae6f0ada1;p=lambda.git diff --git a/exercises/_assignment6.mdwn b/exercises/_assignment6.mdwn index f6a48030..10657258 100644 --- a/exercises/_assignment6.mdwn +++ b/exercises/_assignment6.mdwn @@ -38,19 +38,47 @@ need to worry about variables in CL.) We're not going to ask you to write the entire program yourself. Instead, we're going to give you [[the complete program, minus a few -little bits of glue|code/reduction.ml]]. What you need to do is +little bits of glue|code/reduction_with_substitution.ml]]. What you need to do is understand how it all fits together. When you do, you'll understand -how to add the last little bits to make functioning program. Here's a -first target for when you get it working: - - # reduce (App (Abstract ("x", Var "x"), Constant (Num 3)));; - - : lambdaTerm = Constant (Num 3) +how to add the last little bits to make functioning program. 1. In the previous homework, you built a function that took an identifier and a lambda term and returned a boolean representing whether that identifier occured free inside of the term. Your first -task is to adapt your previous solution as necessary to work with the -code base. Once you have your function working, you should be able to -run queries such as this: +task is to complete the `free_in` function, which has been crippled in +the code base (look for lines that say `COMPLETE THIS LINE`). Once +you have your function working, you should be able to run queries such +as this: + + # free_in "x" (App (Abstract ("x", Var "x"), Var "x"));; + - : bool = true + +2. Once you get the `free_in` function working, you'll need to +complete the `substitute` function. You'll see a new wrinkle on +OCaml's pattern-matching construction: `| PATTERN when x = 2 -> +RESULT`. This means that a match with PATTERN is only triggered if +the boolean condition in the `when` clause evaluates to true. +Sample target: + + # substitute (App (Abstract ("x", ((App (Abstract ("x", Var "x"), Var "y")))), Constant (Num 3))) "y" (Constant (Num 4));; + - : lambdaTerm = App (Abstract ("x", App (Abstract ("x", Var "x"), Constant (Num 4))), Constant (Num 3)) + +3. Once you have completed the previous two problems, you'll have a +complete evaluation program. Here's a simple sanity check for when you +get it working: + + # reduce (App (Abstract ("x", Var "x"), Constant (Num 3)));; + - : lambdaTerm = Constant (Num 3) + +What kind of evaluation strategy does this evaluator use? In +particular, what are the answers to the three questions about +evaluation strategy as given in the discussion of [[evaluation +strategies|topics/week3_evaluation_order]] as Q1, Q2, and Q3? + +## Evaluation in the untyped calculus: environments + +Ok, the previous strategy sucked: tracking free and bound variables, +computing fresh variables, it's all super complicated. +Here's a better strategy.