2012-12-31 109 views
2

我對計算機程序的結構和解釋(http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28)第4.3.3節有關於練習4.54的問題。 HTML#%_ sec_4.3.3)。這個練習涉及Amb評估員。SICP練習4.54

行使如下:

如果我們沒有意識到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)。哪一個是正確的?

回答

0

我認爲(fail)是正確的。

這裏我們得到了pred-value,這意味着pproc現在評估良好。但是,如果是false的值,我們認爲它不好,因爲pproc評估錯誤。所以這裏的延續是fail而不是fail2

的測試可以在這裏找到:

0

(fail2)是正確的,那麼,大多數的不要緊無論你選擇的時間,但以下conditons:

1.謂詞部分包含(amb)如

(require (amb false true false true true))

2.謂詞部分包含(set! < ...> < ...>)

你可以檢查出來,這是因爲除了上述兩種進程之外,大部分進程的失敗延續與調用者的相同。雖然這聽起來有些荒謬。