【问题标题】:SICP Exercise 4.54SICP 练习 4.54
【发布时间】:2012-12-15 20:16:05
【问题描述】:

我对计算机程序的结构和解释第 4.3.3 节中的练习 4.54 有疑问 (http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#% _sec_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 表达式的过程analyze-require。完成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))))

我是这样完成的:

(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 为假时,require 应该会失败;也就是说,它应该调用一个失败继续过程。但我有点困惑是否应该调用(fail)(fail2)。哪一个是正确的?

【问题讨论】:

    标签: scheme sicp


    【解决方案1】:

    (fail2) 是正确的。该过程符合continuation-passing style,在这种情况下正确的继续过程是fail2

    【讨论】:

      【解决方案2】:

      我认为(fail) 是正确的。

      这里我们得到了pred-value,这意味着pproc 目前评估良好。但如果它是 false 值,我们会将其视为错误,因为 pproc 评估错误。所以这里的延续是fail 而不是fail2

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

      【讨论】:

        【解决方案3】:

        (fail2)是正确的,好吧,大多数时候,无论您选择哪个都无所谓,但对于以下条件:

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

        (require (amb false true false true true))

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

        你可以看看,这是因为除了以上两种进程外,大部分进程的fail-continuation和它的调用者是一样的。虽然这听起来有些荒谬。

        【讨论】:

          猜你喜欢
          • 2012-07-05
          • 2011-11-05
          • 2017-02-03
          • 2010-12-26
          • 2021-05-23
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          相关资源
          最近更新 更多