summaryrefslogtreecommitdiffstats
path: root/ps04_combinators_amb/ps.txt
diff options
context:
space:
mode:
Diffstat (limited to 'ps04_combinators_amb/ps.txt')
-rw-r--r--ps04_combinators_amb/ps.txt148
1 files changed, 148 insertions, 0 deletions
diff --git a/ps04_combinators_amb/ps.txt b/ps04_combinators_amb/ps.txt
new file mode 100644
index 0000000..56df0d8
--- /dev/null
+++ b/ps04_combinators_amb/ps.txt
@@ -0,0 +1,148 @@
+
+ MASSACHVSETTS INSTITVTE OF TECHNOLOGY
+ Department of Electrical Engineering and Computer Science
+
+ 6.945 Spring 2009
+ Problem Set 4
+
+ Issued: Wed. 25 Feb. 2009 Due: Wed. 4 Mar. 2009
+
+Reading:
+ SICP, From Chapter 4: section 4.1.7--4.2 (from PS03)
+ section 4.3; (pp. 412--437)
+
+Code: utils.scm, ghelper.scm, syntax.scm, rtdata.scm,
+ load-analyze.scm, analyze.scm, repl.scm
+ load-amb.scm, analyze-amb.scm repl-amb.scm
+ multiple-dwelling.scm
+
+
+ Heavy Evaluator Hacking
+
+In this problem set we build interpreters in a different direction.
+We start with the essential EVAL/APPLY interpreter, written as an
+analyzer of the syntax into a compiler of compositions of execution
+procedures -- a small combinator language. We will warm up by making
+modifications to this evaluator.
+
+Next, we will change the evaluator to include AMB expressions. To add
+AMB, the execution procedures will all have a different shape: in
+addition to the environment, each will take two "continuation
+procedures" SUCCEED and FAIL. In general, when a computation comes up
+with a value it will invoke SUCCEED with the proposed value and a
+complaint department which, if invoked, will try to produce an
+alternate value. If a computation cannot come up with a value, it
+will invoke the complaint department passed to it in the FAIL
+continuation.
+
+An important lesson to be learned here is how to use continuation
+procedures to partially escape the expression structure of the
+language. By construction, a functional expression has a unique
+value. However, in the AMB system an expression may be ambiguous as
+to its value... Think about how we arrange that to make sense!
+
+---------------------------------------------------------------------
+
+ Separating Syntactic Analysis from Execution
+ (Compiling to Combinators)
+
+It is important to read SICP section 4.1.7 carefully here. When you
+load "load-analyze.scm" you will get an evaluator similar to the one
+described in this section.
+
+
+-------------
+Problem 4.1: Warmup
+
+It is often valuable to have procedures that can take an indefinite
+number of arguments. The addition and multiplication procedures in
+Scheme are examples of such procedures. Traditionally, a user may
+specify such a procedure in a definition by making the bound-variable
+specification of a lambda expression a symbol rather than a list of
+formal parameters. That symbol is expected to be bound to the list of
+arguments supplied. For example, to make a procedure that takes
+several arguments and returns a list of the squares of the arguments
+supplied, one may write:
+
+(lambda x (map square x))
+
+or
+
+(define (ss . x) (map square x))
+
+and then
+
+(ss 1 2 3 4) ==> (1 4 9 16)
+
+Modify the analyzing interpreter to allow this construction.
+
+Hint: you do not need to change the code involving DEFINE or LAMBDA
+in syntax.scm! This is entirely a change in analyze.scm
+
+Demonstrate that your modification allows this kind of procedure, and
+that it does not cause other troubles.
+-------------
+
+-------------
+Problem 4.2: Infix notation
+
+Many people like infix notation for small arithmetic expressions. It
+is not hard to write a special form, (INFIX <infix-string>), that
+takes a character string, parses it as an infix expression with the
+usual precedence rules, and reduces it to Lisp. Note that to do this
+you really don't have to delve into the combinator target mechanism of
+the evaluator, since this can be accomplished as a "macro" in the same
+way that COND and LET are implemented (see syntax.scm).
+
+So, for example, we should be able to write the program:
+
+(define (quadratic a b c)
+ (let ((discriminant (infix "b**2-4*a*c")))
+ (infix "(-b+sqrt(discriminant))/(2*a)")))
+
+Hint: Do not try to parse numbers! That is hard -- let Scheme do it
+for you: use string->number (see MIT Scheme documentation). Just
+pass the substring that specifies the number to string->number to get
+the numerical value.
+
+Write the INFIX special form, install it in the evaluator, and
+demonstrate that it works.
+
+Please! Unless you have lots of time to burn, do not write a complete
+infix parser for some entire language, like Python (easy) or Java
+(hard)! We just want parsing of simple arithmetic expressions.
+-------------
+
+
+---------------------------------------------------------------------
+
+ AMB and Nondeterministic Programming
+
+Now comes the real fun part of this problem set! Please read section
+4.3 of SICP carefully before starting this part. This interpreter
+requires a change in the interface structure of the combinators that
+code compiles into, so it is quite different. Of course, our system
+differs from the one in SICP in that it is implemented with generic
+extension capability. The loader for the interpreter extended for AMB
+is "load-analyze.scm".
+
+-------------
+Problem 4.3: Warmup: Programming with AMB
+
+Run the multiple-dwelling program (to get a feeling for how to use the
+system).
+
+Do exercises 4.38, 4.39, and 4.40 (p. 419) from SICP.
+
+Note: we supply the multiple-dwelling.scm program so you need not type
+it in.
+-------------
+
+-------------
+Problem 4.4:
+
+Modify the AMB interpreter to record and report the number of
+alternatives examined in exploring a search space. What is this
+number for the simple multiple-dwelling program? For your best
+improvement of it from your work in exercise 4.40, above.
+-------------