灯下 登录
计算机科学 / SICP / 4.4.4 Implementing the Query System

Exercise 4.71 · 习题

Exercise 4.71: Louis Reasoner wonders why the
simple-query and disjoin procedures (4.4.4.2) are
implemented using explicit delay operations, rather than being defined
as follows:

(define (simple-query
query-pattern frame-stream)
(stream-flatmap
(lambda (frame)
(stream-append
(find-assertions query-pattern frame)
(apply-rules query-pattern frame)))
frame-stream))

(define (disjoin disjuncts frame-stream)
(if (empty-disjunction? disjuncts)
the-empty-stream
(interleave
(qeval (first-disjunct disjuncts)
frame-stream)
(disjoin (rest-disjuncts disjuncts)
frame-stream))))

Can you give examples of queries where these simpler definitions would lead to

undesirable behavior?

练习 4.71:Louis Reasoner 想知道,为什么 simple-query 和 disjoin 过程(4.4.4.2)要使用显式的 delay 操作,而不是按以下方式定义:

(define (simple-query
query-pattern frame-stream)
(stream-flatmap
(lambda (frame)
(stream-append
(find-assertions query-pattern frame)
(apply-rules query-pattern frame)))
frame-stream))

(define (disjoin disjuncts frame-stream)
(if (empty-disjunction? disjuncts)
the-empty-stream
(interleave
(qeval (first-disjunct disjuncts)
frame-stream)
(disjoin (rest-disjuncts disjuncts)
frame-stream))))

你能举出使用这些较简单定义会导致不良行为的查询示例吗?

Racket #lang sicp
(define (simple-query
 query-pattern frame-stream)
 (stream-flatmap
 (lambda (frame)
 (stream-append
 (find-assertions query-pattern frame)
 (apply-rules query-pattern frame)))
 frame-stream))

(define (disjoin disjuncts frame-stream)
 (if (empty-disjunction? disjuncts)
 the-empty-stream
 (interleave
 (qeval (first-disjunct disjuncts)
 frame-stream)
 (disjoin (rest-disjuncts disjuncts)
 frame-stream))))