sicp 4.3.3小节习题

简介:
  本节实现了amb求值器,题目都是扩展这个求值器,引入一些特殊的过程。我的尝试解答从4.51开始
习题4.51,要求实现permanent-set!,这个过程的副作用在遇到失败时不撤销,实现如下:
;扩充analyze 
((permanent
- assignment? exp)
         (analyze
- permanent - assignment exp))

;实现

(define (permanent
- assignment? exp)
  (tagged
- list? exp  ' permanent-set!))
(define (analyze - permanent - assignment exp)
   (let ((var (assignment
- variable exp))
        (vproc (analyze (assignment
- value exp))))
      (
lambda (env succeed fail)
        (vproc env
               (
lambda (val fail2)
                      (set
- variable - value! var val env) 
                      (succeed 
' ok fail2))
               fail))))

习题4.52,实现if-fail的特殊形式,在第一个表达式如果求值成功,就返回该表达式的值,否则返回第二个表达式的值,实现如下:
;扩充analyze
 ((
if - fail? exp)
         (analyze
- if - fail exp))
;实现
(define (
if - fail? exp)
  (tagged
- list? exp  ' if-fail))
(define (analyze - if - fail exp)
   (let ((pproc (analyze (
if - predicate exp)))
        (cproc (analyze (
if - consequent exp))))
     (
lambda (env succeed fail)
        (pproc env (
lambda (pred - value fail2)
                     (succeed pred
- value fail2))
               (
lambda () (cproc env succeed fail))))))
pproc如果执行成功,就返回结果pred-value,否则就执行fail过程 ( lambda () (cproc env succeed fail)),测试略。

习题4.53,根据题意可知这个过程返回结果应该是(prime-sum-pair '(1 3 5 8) '(20 35 110))的所有结果,执行也是如此:
;;; AMB - Eval value:
((
8   35 ) ( 3   110 ) ( 3   20 ))

习题4.54,将require实现为特殊形式:
;扩充analyze
((require? exp)
         (analyze
- require exp))

;实现
(define (require? exp)
  (tagged
- list? exp  ' require))
(define (require - predicate exp)
  (cadr exp))
(define (analyze
- require exp)
  (let ((pproc (analyze (require
- predicate exp))))
    (
lambda  (env succeed fail)
      (pproc env (
lambda (pred - value fail2)
                   (
if  ( not  pred - value)
                       (fail2)
                       (succeed 
' ok fail2)))
             fail))))
文章转自庄周梦蝶  ,原文发布时间2008-11-21
目录
相关文章
|
6月前
|
人工智能 算法 BI
【AcWing算法基础课】第四章 数学知识(未完待续)(2)
从2到n枚举每个数,删掉其所有的倍数,枚举完之后,没有被删掉的数为质数。
49 0
|
6月前
|
存储 人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(3)
根据下面公式来预处理出等式右边的组合数的值,那么等式左边就可以用等式右边已经算过的值来进行计算(有点像dp)。
58 0
|
6月前
|
人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(1)
利用秦九韶算法来实现其他进制转十进制的结果求解
51 0
|
9月前
|
C语言
[课后习题]C Primer Plus【第六版】编程练习 第二章习题参考答案
[课后习题]C Primer Plus【第六版】编程练习 第二章习题参考答案
|
机器学习/深度学习 存储 人工智能
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
|
Java
java编程思想第四版第十一章习题
运行结果分析: 这个案例的重点是, 数组瘦受限制的, 集合是没有元素个数限制的。
183 0
|
Java
java编程思想第四版第八章习题
第一题 package net.mindview.polymorphism; //基类-自行车 class Cycle{ } //子类-单轮车 class Unicycle extends Cycle{ } //子类-双轮车 class Bicycle extends Cycle{ } //子类-三轮车 class Tricycle extends Cycl...
106 0
|
Java
java编程思想第四版第三章要点习题
输出结果: 这个结果需要特别说明一下, String是特殊的引用类型, 当他被直接赋值时,就是把这个值对应的引用位置赋值给String变量了, 所以, 两次结果都是true。 如果你用new String()赋值, 结果就不同了.
103 0