2 (define input-prompt ";;; Query Input: ")
3 (define output-prompt ";;; Query Output: ")
4 (define (query-driver-loop)
5 (print-output input-prompt)
6 (let ((q (query-syntax-process (read))))
7 (cond ((assertion-to-be-added? q)
8 (add-assertion-or-rule! (add-assertion-body q))
10 (display "Assertion added to data base.")
13 (print-output output-prompt)
22 (contract-question-mark v))))
23 (qeval q (singleton-stream the-empty-frame))))
24 (query-driver-loop)))))
26 (define (query-syntax-process exp)
27 (map-over-symbols expand-question-mark exp))
28 (define (map-over-symbols proc exp)
29 (cond ((symbol? exp) (proc exp))
31 (cons (map-over-symbols proc (car exp))
32 (map-over-symbols proc (cdr exp))))
34 (define (expand-question-mark exp)
35 (let ((chars (symbol->string exp)))
36 (if (string=? (substring chars 0 1) "?")
39 (substring chars 1 (string-length chars))))
41 (define (contract-question-mark exp)
45 (if (number? (cadr exp))
47 (symbol->string (caddr exp))
49 (number->string (cadr exp)))
50 (symbol->string (cadr exp))))))
52 (define (instantiate pat frame unbound-var-handler)
55 (let ((binding (binding-in-frame exp frame)))
57 (copy (binding-value binding))
58 (unbound-var-handler exp frame))))
60 (cons (copy (car exp))
65 (define (assertion-to-be-added? exp)
66 (eq? (type exp) 'assert!))
67 (define (add-assertion-body exp)
72 (error "Unknown expression -- TYPE" exp)))
73 (define (contents exp)
76 (error "Unknown expression -- CONTENTS" exp)))
77 (define (add-assertion-or-rule! assertion)
80 (add-assertion! assertion)))
81 (define (rule? statement)
82 (tagged-list? statement 'rule))
83 (define (add-rule! rule)
84 (store-rule-in-index rule)
85 (let ((old-rules THE-RULES))
87 (cons-stream rule old-rules))
89 (define (store-rule-in-index rule)
90 (let ((pattern (conclusion rule)))
91 (if (indexable? pattern)
92 (let* ((key (index-key-of pattern))
94 (get-stream key 'rule-stream)))
97 (cons-stream rule current-rule-stream))))))
98 (define (add-assertion! assertion)
99 (store-assertion-in-index assertion)
100 (let ((old-assertions THE-ASSERTIONS))
102 (cons-stream assertion old-assertions))
104 (define (store-assertion-in-index assertion)
105 (if (indexable? assertion)
106 (let* ((key (index-key-of assertion))
107 (current-assertion-stream
108 (get-stream key 'assertion-stream)))
111 (cons-stream assertion current-assertion-stream)))))
112 (define (get-stream key1 key2)
113 (let ((s (get key1 key2)))
114 (if s s the-empty-stream)))
115 (define (index-key-of pattern)
116 (let ((key (car pattern)))
117 (if (var? key) '? key)))
118 (define (indexable? pattern)
119 (or (constant-symbol? (car pattern))
120 (var? (car pattern))))
122 (tagged-list? exp '?))
123 (define (constant-symbol? exp)
125 (define THE-ASSERTIONS the-empty-stream)
126 (define (singleton-stream x)
127 (cons-stream x the-empty-stream))
128 (define (make-binding var val)
130 (define (extend var val frame)
131 (cons (make-binding var val) frame))
132 (define (binding-in-frame var frame)
134 (define the-empty-frame '())
135 (define (conclusion rule)
137 (define (rule-body rule)
138 (if (null? (cddr rule))
141 (define (qeval query frame-stream)
142 (let ((qproc (get (type query) 'qeval)))
144 (qproc (contents query) frame-stream)
145 (simple-query query frame-stream))))
146 (define (conjoin conjuncts frame-stream)
147 (if (empty-conjuncts? conjuncts)
149 (conjoin (rest-conjuncts conjuncts)
150 (qeval (first-conjunct conjuncts) frame-stream))))
151 (define (disjoin disjuncts frame-stream)
152 (if (empty-disjuncts? disjuncts)
155 (qeval (first-disjunct disjuncts) frame-stream)
156 (delay (disjoin (rest-disjuncts disjuncts) frame-stream)))))
157 (define (negate operands frame-stream)
161 (qeval (negated-query operands)
162 (singleton-stream frame)))
163 (singleton-stream frame)
166 (define (lisp-value call frame-stream)
174 (error "Unknown pat var -- LISP-VALUE" v))))
175 (singleton-stream frame)
178 (define (execute exp)
179 (apply (eval (predicate exp) user-initial-environment)
181 (define (always-true ignore frame-stream) frame-stream)
182 (put 'and 'qeval conjoin)
183 (put 'or 'qeval disjoin)
184 (put 'not 'qeval negate)
185 (put 'lisp-value 'qeval lisp-value)
186 (put 'always-true 'qeval always-true)
188 (define (empty-conjuncts? exps) (null? exps))
189 (define (first-conjunct exps) (car exps))
190 (define (rest-conjuncts exps) (cdr exps))
191 (define (empty-disjuncts? exps) (null? exps))
192 (define (first-disjunct exps) (car exps))
193 (define (rest-disjuncts exps) (cdr exps))
194 (define (negated-query exps) (car exps))
195 (define (predicate exps) (car exps))
196 (define (args exps) (cdr exps))
198 (define (interleave-delayed s1 delayed-s2)
199 (if (stream-null? s1)
205 (delay (stream-cdr s1))))))
206 (define (stream-append-delayed s1 delayed-s2)
207 (if (stream-null? s1)
211 (stream-append-delayed
214 (define (stream-flatmap proc s)
215 (flatten-stream (stream-map proc s)))
216 (define (flatten-stream s)
221 (delay (flatten-stream (stream-cdr s))))))
223 (define (simple-query query frame-stream)
226 (stream-append-delayed
227 (find-assertions query frame)
228 (delay (apply-rules query frame))))
231 (define (find-assertions pattern frame)
234 (check-an-assertion datum pattern frame))
235 (fetch-assertions pattern frame)))
236 (define (check-an-assertion dat pat frame)
238 (pattern-match dat pat frame)))
239 (if (eq? match-result 'failed)
241 (singleton-stream match-result))))
242 (define (pattern-match pat dat frame)
243 (cond ((eq? frame 'failed) 'failed)
244 ((equal? pat dat) frame)
245 ((var? pat) (extend-if-consistent pat dat frame))
246 ((and (pair? pat) (pair? dat))
247 (pattern-match (cdr pat)
249 (pattern-match (car pat)
254 (define (extend-if-consistent var val frame)
255 (let ((binding (binding-in-frame var frame)))
257 (pattern-match (binding-value binding) val frame)
258 (extend var val frame))))
259 (define (fetch-assertions pattern frame)
260 (if (use-index? pattern)
261 (get-indexed-assertions pattern)
262 (get-all-assertions)))
263 (define (get-all-assertions) THE-ASSERTIONS)
264 (define (get-indexed-assertions pattern)
265 (get-stream (index-key-of pattern) 'assertion-stream))
266 (define (use-index? pattern)
267 (constant-symbol? (car pattern)))
268 (define (fetch-rules pattern frame)
269 (if (use-index? pattern)
270 (get-indexed-rules pattern)
272 (define (get-all-rules) THE-RULES)
273 (define (get-indexed-rules pattern)
275 (get-stream (index-key-of pattern) 'rule-stream)
276 (get-stream '? 'rule-stream)))
278 (define (apply-rules pattern frame)
281 (apply-a-rule rule pattern frame))
282 (fetch-rules pattern frame)))
283 (define (apply-a-rule rule pattern frame)
284 (let* ((clean-rule (rename-variables-in rule))
287 (conclusion clean-rule)
289 (if (eq? unify-result 'failed)
291 (qeval (rule-body clean-rule)
292 (singleton-stream unify-result)))))
295 (define (unify-match p1 p2 frame)
296 (cond ((eq? frame 'failed) 'failed)
297 ((equal? p1 p2) frame)
298 ((var? p1) (extend-if-possible p1 p2 frame))
299 ((var? p2) (extend-if-possible p2 p1 frame))
300 ((and (pair? p1) (pair? p2))
301 (unify-match (cdr p1)
303 (unify-match (car p1)
307 (define (extend-if-possible var val frame)
309 (define (depends-on? exp var frame)
311 (define (rename-variables-in rule)