首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP练习4.54

SICP练习4.54
EN

Stack Overflow用户
提问于 2012-12-31 19:46:49
回答 3查看 317关注 0票数 2

我有一个关于练习4.54的问题,来自4.3.3节“计算机程序的结构和解释”(4.3.3)。这项工作涉及Amb评估员。

这项工作如下:

如果我们没有意识到require可以作为一个使用amb的普通过程来实现,用户将其定义为一个非确定性程序的一部分,那么我们就必须将它作为一种特殊的形式来实现。这将需要语法过程。 (define (require? exp) (tagged-list? exp 'require)) (define (require-predicate exp) (cadr exp)) 以及analyze中调度中的一个新子句 ((require? exp) (analyze-require exp)) 以及处理require表达式的过程require。完成以下analyze-require定义。 (定义(分析-需求exp) (let ((pproc (分析(请求-谓词exp) (lambda (env成功)) (pproc env (lambda (pred-value fail2) (如果成功(Ok Fail2)失败))

我完成了以下工作:

代码语言:javascript
复制
(define (analyze-require exp)
  (let ((pproc (analyze (require-predicate exp))))
    (lambda (env succeed fail)
      (pproc env
             (lambda (pred-value fail2)
               (if (false? pred-value)
                   (fail2) ;; or (fail)
                   (succeed 'ok fail2)))
             fail))))

我怀疑以下几点:

我知道,在执行期间,当谓词值pred-value为false时,require应该失败;也就是说,它应该调用一个failure延续过程。但是我有点不明白它是应该调用(fail)还是(fail2)。哪一个是对的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-31 23:20:43

(fail2)是正确的。该过程符合续传式,在本例中正确的延续过程是fail2

票数 1
EN

Stack Overflow用户

发布于 2016-04-09 10:22:23

我认为(fail)是对的。

这里我们得到了pred-value,这意味着pproc现在评估得很好。但是如果它是false值,我们就把它当作pproc计算错误一样糟糕。所以这里的延续是fail而不是fail2

在这里可以找到一个测试:

票数 0
EN

Stack Overflow用户

发布于 2016-08-29 12:16:05

(fail2)是正确的,嗯,大多数情况下,不管您选择哪一个,都没关系,但是对于以下条件:

1.谓词部分包含(amb),例如

(require (amb false true false true true))

2.谓词部分包含(set!<...> <...>)

您可以检查它,这是因为除了上述两种进程之外,大多数进程的失败延续与调用者的相同。虽然听起来有点荒谬。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14105521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档