2

Structure and Interpretation of Computer Programs (http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#%_sec_4.3.3) のセクション 4.3.3 の演習 4.54 について質問があります。 )。この演習は、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が false の場合、require失敗するはずです。つまり、失敗継続手順を呼び出す必要があります。しかし、私はそれが呼び出すべきか、それともを呼び出すべきかについて少し混乱してい(fail)ます(fail2)。どちらが正しいですか?

4

3 に答える 3

1

(fail2)は正しいものです。この手順は継続渡しスタイルに準拠しており、この場合の正しい継続手順は ですfail2

于 2012-12-31T23:20:43.310 に答える
0

(fail2)ほとんどの場合、どちらを選択しても問題ありませんが、次の条件の場合:

1.述語部分に (amb) などを含む

(require (amb false true false true true))

2.述語部分に (set! <...> <...>) を含む

確認できます。これは、上記の 2 種類のプロセスを除いて、プロセスの失敗継続のほとんどが呼び出し側のものと同じであるためです。ばかげているように聞こえますが。

于 2016-08-29T12:16:05.783 に答える
0

(fail)正しいと思います。

ここで が得られました。これは、現時点では が適切に評価されるpred-valueことを意味します。pprocしかし、それが値である場合は、評価が間違っているfalseため、悪いものとして扱います。pprocなので続きはここではありfailませんfail2

テストは次の場所にあります。

于 2016-04-09T10:22:23.503 に答える