2

我对计算机程序的结构和解释第 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))

以及analyze-require处理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). 哪一个是正确的?

4

3 回答 3

1

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

于 2012-12-31T23:20:43.310 回答
0

我认为(fail)是正确的。

Here we have got pred-value,这意味着pproc目前评估良好。但如果它是false价值,我们将其视为错误pproc评估。所以这里的延续fail不是fail2

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

于 2016-04-09T10:22:23.503 回答
0

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

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

(require (amb false true false true true))

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

你可以看看,这是因为除了以上两种进程外,大部分进程的失败延续与调用者的相同。虽然听起来有些荒谬。

于 2016-08-29T12:16:05.783 回答