diff --git a/ex-4_45-xx.scm b/ex-4_45-54.scm similarity index 90% rename from ex-4_45-xx.scm rename to ex-4_45-54.scm index 0f2aaf6..c6512c5 100644 --- a/ex-4_45-xx.scm +++ b/ex-4_45-54.scm @@ -355,7 +355,7 @@ (b (analyze (if-fail-second exp)))) (lambda (env succeed fail) (a env - (lambda (a-value fail2) (succeed a-value fail)) + (lambda (a-value fail2) (succeed a-value fail2)) (lambda () (b env succeed fail)))))) ;;; Amb-Eval input: @@ -368,22 +368,55 @@ (require (even? x)) x) 'all-odd) -)) -(assert (first result) 'all-odd) - -(amball '(begin (if-fail (let ((x (amb 1 3 5 8))) (require (even? x)) x) 'all-odd) + )) -(assert (first result) 8) - +(assert result '(8 all-odd)) (display "\nex-4.53\n") +; (let ((pairs '())) +; (if-fail (let ((p (prime-sum-pair '(1 3 5 8) '(20 35 110)))) +; (permanent-set! pairs (cons p pairs)) +; (amb)) +; pairs)) + +; The code will yield all prime-sum-pairs as expected. + +(display "[answered]\n") (display "\nex-4.54\n") +; Exercise 4.54. If we had not realized that require could be implemented as +; an ordinary procedure that uses amb, to be defined by the user as part of a +; nondeterministic program, we would have had to implement it as a special +; form. This would require syntax procedures + +(define (require? exp) (tagged-list? exp 'require)) + +(define (require-predicate exp) (cadr exp)) + +; and a new clause in the dispatch in analyze + +; ((require? exp) (analyze-require exp)) + +; as well the procedure analyze-require that handles require expressions. +; Complete the following definition of analyze-require. + +(define (analyze-require exp) + (let ((pproc (analyze (require-predicate exp)))) + (lambda (env succeed fail) + (pproc env + (lambda (pred-value fail2) + (if + + (succeed 'ok fail2))) + fail)))) + +(display "[done]\n") + diff --git a/ex-4_55-xx.scm b/ex-4_55-xx.scm new file mode 100644 index 0000000..d297ad0 --- /dev/null +++ b/ex-4_55-xx.scm @@ -0,0 +1,4 @@ +(load "util.scm") + +(display "\nex-4.55\n") +