SICP中查询系统的实现

该博客介绍了SICP中的查询系统实现,该系统基于逻辑程序设计思想,通过面向表达式的语言实现规则。文章涵盖了查询处理、数据结构如表的实现、流操作以及延迟评估等内容。核心是理解框架流的概念,以及查询如何被转换和处理,特别是`qeval`函数的角色。虽然不涉及用户交互,但提到了如何从文件读取输入,并通过`query-driver-loop`进行查询处理。
摘要由CSDN通过智能技术生成

这里的查询系统实现了一种逻辑程序设计的思想,利用面向表达式的语言实现一种规则。系统接受这一规则并产生结果。这里并没有提出如何做才能查询到结果。因为这个内容是与用户无关的。实现像prolog一样的解释器,只通过说明来解决问题。

发火抓狂抓狂其实书上的内容缺了一些,我自个给补上了。。。

           代码内容已通过mit-scheme解释和测试

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;other
(define (equal? s1 s2)
     (cond  ((and (null? s1) (null? s2)) true)
              ((and (not (pair? s1))  (not (pair? s2))) (eq?  s1 s2))
              ((and (pair? s1) (pair? s2) (eq? (car s1)  (car s2))) (equal? (cdr s1) (cdr s2)))
              (else false)))
               
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;二维表格数据导向技术
(define (make-table)
  (let ((local-table (list '*table*)))
    (define (lookup key-1 key-2)
      (let ((subtable (assoc key-1 (cdr local-table))))
        (if subtable
            (let ((record (assoc key-2 (cdr subtable))))
              (if record
                  (cdr record)
                  false))
            false)))
    (define (insert! key-1 key-2 value)
      (let ((subtable (assoc key-1 (cdr local-table))))
        (if subtable
            (let ((record (assoc key-2 (cdr subtable))))
              (if record
                  (set-cdr! record value)
                  (set-cdr! subtable
                            (cons (cons key-2 value)
                                  (cdr subtable)))))
            (set-cdr! local-table
                      (cons (list key-1
                                  (cons key-2 value))
                               (cdr local-table)))))
      
      'ok)    
    (define (dispatch m)
      (cond ((eq? m 'lookup-proc) lookup)
              ((eq? m 'insert-proc!) insert!)
              (else (error "Unknown operation -- TABLE" m))))
    dispatch))




(define (assoc key records)
     (cond   ((null? records) false)
               ((equal? key (caar records)) (car records))
               (else (assoc key (cdr records)))))
               
               
(define operation-table (make-table))
(define get (operation-table 'lookup-proc))
(define put (operation-table 'insert-proc!))




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;基于基本流操作的操作
(define (stream-ref s n)
    (if (= n 0)
        (stream-car s)
        (stream-ref (stream-cdr s) (- n 1))))
        
(define (stream-append s1 s2)
     (if (stream-null? s1)
         s2
         (cons-stream (stream-car s1)
                            (stream-append (stream-cdr s1) s2))))
(define (stream-map proc s)
   (if (stream-null? s)
        the-empty-stream
        (cons-stream (proc  (stream-car s))
                               (stream-map proc (stream-cdr s)))))
                     
(define (stream-for-each proc s)
    (if (stream-null? s)
        'done
        (begin (proc (stream-car s))
               (stream-for-each proc (stream-cdr s)))))
               
(define (display-stream s)
     (stream-for-each display-line s))
     
(define (display-line x)
    (newline)
    (display x))


(define the-empty-stream ())
(define (stream-null? stream) (null? stream))


(define (cons-stream a b)
    (cons a (delay b)))
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))


;;;;;;;;;;;;;;;;;;;;;;;delay 和force的实现
(define (force delayed-object)
    (delayed-object))
(define (memo-proc proc)
    (let ((already-run? false) (result false))
       (lambda ()
         (if (not already-run?)
             (begin (set! result (proc))
                    (set! already-run? true)
                    result)
             result))))
(define (delay exp)
     (memo-proc (lambda () exp)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;驱动循环和实例化
(define  input-prompt ";;; Query input;")
(define output-prompt ";;;;Query output;")


(define (query-driver-loop)
    (prompt-for-input input-prompt)
     (let ((q  (query-syntax-process (my-input))))
     ;;;;   (display "query-syntax-processed input  ")
        (display q)
        (newline)
        (cond ((assertion-to-be-added? q)
                       (add-rule-or-assertion! (add-assertion-body q))
                       (newline)
                       (display "Assertion adde to data base.  ")
        ;;;;;;;;;  ;;;;;;;;;;;;;;;;     (display (get 'job 'assertion-stream))     succed test  assertion add
                       (query-driver-loop))
                     (else   
                         (newline)
                         (display output-prompt)
                         (display-stream
                                (stream-map
                                        (lambda (frame)
                                               (instantiate    q
                                                                   frame
                                                                   (lambda (v f)
                                                                           (contract-question-mark v))))
                                        (qeval q (singleton-stream ()))))
                         (query-driver-loop)))))
                         
(define (instantiate exp frame unbound-var-handler)
(display " instatiate was called ")
(display exp)
(display frame)
  (define (copy exp)
    (cond ((var? exp)
               (display " var? was called ")
               (display exp)
               (let ((binding (binding-in-frame exp frame)))
                    (display binding)
                  (if binding
                       (copy (binding-value binding))
                       (unbound-var-handler exp frame))))
          ((pair? exp)
           (cons (copy (car exp)) (copy (cdr exp))))
          (else exp)))
  (copy exp))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 求值器
(define (qeval query frame-stream)
 ;;   (display (get (type query) 'qeval))
    (let ((qproc (get (type query) 'qeval)))
        (if qproc
            (qproc (contents query) frame-stream)
            (simple-query query frame-stream))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  简单查询
(define (simple-query query-pattern frame-stream)
 ;;;(display " simple-query was called ")
;;;;(display (find-assertions query-pattern (car frame-stream)))
     (stream-flatmap
        (lambda (frame)
            (stream-append-delayed
                 (find-assertions query-pattern frame)
                 (delay (apply-rules query-pattern frame))))
     frame-stream))        


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;复合查询
(define (conjoin conjuncts frame-stream)
    (if (empty-conjunction? conjuncts)
         frame-stream
         (conjoin (rest-conjuncts conjuncts)
                       (qeval (first-conjunct conjuncts)
                                  frame-stream))))
(put 'and 'qeval conjoin)


(define (disjoin disjuncts frame-stream)
     (if (empty-disjunction? disjuncts)
          the-empty-stream
          (interleave-delayed
            (qeval (first-disjunct disjuncts) frame-stream)
            (delay (disjoin (rest-disjuncts disjuncts)
                                     frame-stream)))))
(put 'or 'qeval disjoin)                      
                                                                      
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;过滤器
(define (negate operands frame-stream)
    (stream-flatmap
         (lambda (frame)
              (if (stream-null? (qeval (negated-query operands)
                                                    (singleton-stream frame)))
                   (singleton-stream frame)
                   the-empty-stream))
          frame-stream))
 (put 'not 'qeval negate)                                      


(define (lisp-value call frame-stream)
   (stream-flatmap
         (lambda (frame)
             (if (execute
                     (instantiate
                        call
                        frame
                        (lambda (v f)
                              (error "Unknwn pat var -- LISP-VALUE" v))))
                  (singleton-stream frame)
                  the-empty-stream))
        frame-stream))
(put 'lisp-value 'qeval lisp-value)


(define (execute exp)
     (my-apply (eval (predicate exp) user-initial-environment)
                      (args exp)))
 
(define (always-true ignorre frame-stream) frame-stream)
 (put 'always-true 'qeval always-true)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;通过匹配模式找出断言  pass
(define (find-assertions pattern frame)
;;;; (display " find-assertion was called ")
   (stream-flatmap (lambda (datum)
                                 (check-an-assertion datum pattern frame))
                              (fetch-assertions pattern frame)))
(define (check-an-assertion assertion query-pat query-frame)
 ;;;;;;;  (display " check-an-assertion was called ")
     (let ((match-result
               (pattern-match query-pat assertion query-frame)))
         (if (eq? match-result 'failed)
              the-empty-stream
              (singleton-stream match-result))))
              
(define (pattern-match pat dat frame)
 ;;;    (display " pattern-match was called ")
  ;;;;;; (display (equal? pat dat))
  ;;   (display pat)
 ;;    (display dat)
    (cond ((eq? frame 'failed) 'failed)
              ((equal? pat dat) frame)
              ((var? pat) (extend-if-consistent pat dat frame))
              ((and (pair? pat) (pair? dat))
               (pattern-match    (cdr pat)
                                        (cdr dat)
                                        (pattern-match (car pat)
                                                              (car dat)
                                                              frame)))
             (else 'failed)))
(define (extend-if-consistent var dat frame)
;;;;;; (display " extend-if-consistent was called ")
     (let ((binding (binding-in-frame var frame)))
         (if binding
               (pattern-match (binding-value binding) dat frame)
               (extend var dat frame))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;具有带点尾部的模式
;;;;;;;;;;;;;;;;;;;;;;; 规则和合一
(define (apply-rules pattern frame)
  ;;;;;;;  (display "       apply-rules was called ")
    (stream-flatmap (lambda (rule)
                                       (apply-a-rule rule pattern frame))
                               (fetch-rules pattern frame)))
(define (apply-a-rule rule query-pattern query-frame)
     (let ((clean-rule (rename-variables-in rule)))
       (let ((unify-result
                   (unify-match query-pattern
                                         (conclusion clean-rule)
                                         query-frame)))
          (if (eq? unify-result 'failed)
               the-empty-stream
               (qeval (rule-body clean-rule)
                          (singleton-stream unify-result))))))
(define (rename-variables-in rule)
(let ((rule-application-id (new-rule-application-id)))
   (define (tree-walk exp)
          (cond ((var? exp)
                       (make-new-variable exp rule-application-id))
                   ((pair? exp)
                       (cons (tree-walk (car exp))
                                 (tree-walk (cdr exp))))
                   (else exp)))
        (tree-walk rule)))
(define (unify-match p1 p2 frame)
     (cond ((eq? frame 'failed) 'failed)
               ((equal? p1 p2) frame)
               ((var? p1) (extend-if-possible p1 p2 frame))
               ((var? p2) (extend-if-possible p2 p1 frame))
               ((and (pair? p1) (pair? p2))
                   (unify-match (cdr p1)
                        (cdr p2)
                        (unify-match (car p1)
                         (car p2)
                         frame)))
               (else 'failed)))
(define (extend-if-possible var val frame)
(let ((binding (binding-in-frame var frame)))
(cond (binding
   (unify-match 
        (binding-value  binding) val frame))
     ((var? val)
       (let ((binding (binding-in-frame val frame)))
          (if binding
               (unify-match 
                  var (binding-value binding) frame)
               (extend var val frame))))
     ((depands-on? val var frame)
       'failed)
     (else (extend var val frame)))))  
     
(define (depands-on? exp var frame)
   (define (tree-walk e)
       (cond ((var? e)
        (if (equal? var e)
            true
        (let ((b (binding-in-frame e frame)))
            (if b
               (tree-walk (binding-value b))
               false))))
           ((pair? e)
             (or (tree-walk (car e))
                   (tree-walk (cdr e))))
           (else false)))
   (tree-walk exp))        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;数据库的维护
(define THE-ASSERTIONS the-empty-stream)    
(define (fetch-assertions pattern frame)
    (if (user-index? pattern)
         (get-indexed-assertions pattern)
         (get-all-assertions)))
 (define (get-all-assertions)  THE-ASSERTIONS)
 (define (get-indexed-assertions  pattern)
      (get-stream (index-key-of pattern) 'assertion-stream))
 (define (get-stream key1 key2)
  (let ((s (get key1 key2)))
    (if s s the-empty-stream)))


(define THE-RULES the-empty-stream)
(define (fetch-rules pattern frame)
   (if (user-index? pattern)
        (get-indexed-rules pattern)
        (get-all-rules)))
(define  (get-all-rules)  THE-RULES)
(define (get-indexed-rules pattern)
     (stream-append
      (get-stream (index-key-of pattern) 'rule-stream)
      (get-stream '? 'rule-stream)))   


(define (add-rule-or-assertion! assertion)
(if (rule? assertion)
  (add-rule! assertion)
  (add-assertion! assertion)))
(define (add-assertion! assertion)
    (store-assertion-in-index assertion)
    (let ((old-assertions THE-ASSERTIONS))
       (set! THE-ASSERTIONS
               (cons-stream assertion old-assertions))
         'ok))
(define (add-rule!  rule)
   (store-rule-in-index rule)
   (let ((old-rule THE-RULES))
    (set! THE-RULES (cons-stream rule old-rule))
    'ok))


(define (store-assertion-in-index assertion)
  (if (indexable? assertion)
  (let ((key (index-key-of assertion)))
     (let ((current-assertion-stream
              (get-stream key 'assertion-stream)))
         (put key
                 'assertion-stream
                 (cons-stream assertion
                                       current-assertion-stream))))))
(define (store-rule-in-index rule)
(let ((pattern (conclusion rule)))
  (if (indexable? pattern)
       (let ((key (index-key-of pattern)))
           (let ((current-rule-stream
                    (get-stream key 'rule-stream)))
                (put key
                        'rule-stream
                        (cons-stream rule
                                              current-rule-stream)))))))
(define (indexable? pat)
    (or (constant-symbol? (car pat))
          (var? (car pat))))
(define (index-key-of pat)
   (let ((key (car pat)))
      (if (var? key) '? key)))
(define (user-index? pat)
    (constant-symbol? (car pat)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;流操作
(define (stream-append-delayed s1 delayed-s2)
   ;;;;;  (display " stream-append-delayed  was called      ")
      (if (stream-null? s1)
           (force delayed-s2)
           (cons-stream
               (stream-car s1)
               (stream-append-delayed (stream-cdr s1) delayed-s2))))
(define (interleave-delayed s1 delayed-s2)
    (if (stream-null? s1)
         (force delayed-s2)
         (cons-stream
          (stream-car s1)
          (interleave-delayed  (force delayed-s2)
                                          (delay (stream-cdr s1))))))
(define (stream-flatmap proc s)
;;;;;     (display "    stream-flatmap was called   ")
(flatten-stream (stream-map proc s)))
(define (flatten-stream stream)
(if (stream-null? stream)
    the-empty-stream
    (interleave-delayed
         (stream-car stream)
         (delay (flatten-stream (stream-cdr stream))))))
(define (singleton-stream x)
(cons-stream x the-empty-stream))
;;;;;;;;;;;;;;;;;;;;;;;查询的语法过程
(define (type exp)
    (if (pair? exp)
         (car exp)
         (error "Unknown expression TYPE" exp)))
(define (contents exp)
    (if (pair? exp)
         (cdr exp)
         (error "Unknown expression CONTENTS" exp)))
 (define (assertion-to-be-added? exp)
      (eq? (type exp) 'assert!))
(define (add-assertion-body exp)
      (car (contents exp)))


(define (empty-conjunction? exps) (null? exps))
(define (first-conjunct exps) (car exps))
(define (rest-conjuncts exps) (cdr exps))


(define (empty-disjunction? exps) (null? exps))
(define (first-disjunct exps) (car exps))
(define (rest-disjuncts exps) (cdr exps))


(define (negated-query exps) (car exps))


(define (predicate exps) (car exps))
(define (args exps) (cdr exps))


(define (rule? statement)
    (tagged-list? statement 'rule))
(define (conclusion rule) (cadr rule))


(define (rule-body rule)
  (if (null? (cddr rule))
      '(always-true)
      (caddr rule)))
 
 (define (query-syntax-process exp)
     (newline)
  (map-over-symbols expand-question-mark exp))


(define (map-over-symbols proc exp)
     (cond ((pair? exp)
                 (cons (map-over-symbols proc (car exp))
                    (map-over-symbols proc (cdr exp))))
               ((symbol? exp) (proc exp))
               (else exp)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;对字符串的基本过程               
(define (expand-question-mark symbol)
    (let ((chars (symbol->string symbol)))
        (if (string=? (substring chars 0 1) "?")
             (list '?
                    (string->symbol
                         (substring chars 1 (string-length chars))))
             symbol)))


(define (var? exp)
    (tagged-list? exp '?))
(define (constant-symbol? exp) (symbol? exp))


(define rule-counter 0)
(define (new-rule-application-id)
    (set! rule-counter (+ 1 rule-counter))
    rule-counter)
(define (make-new-variable var rule-application-id)
(cons '? (cons rule-application-id (cdr var))))
(define (contract-question-mark variable)
(string->symbol
   (string-append "?"
       (if (number? (cadr variable))
            (string-append (symbol->string (caddr variable))
             "-"
             (number->string (cadr variable)))
            (symbol->string (cadr variable))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;框架和约束
(define (make-binding variable value)
     (cons variable value))
(define (binding-variable binding) (car binding))
(define (binding-value binding) (cdr binding))
(define (binding-in-frame variable frame)
 (assoc variable frame))
(define (extend variable value frame)
      (cons (make-binding variable value) frame))                                                               
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;test
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eval code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;other Codes
(define (length items)
 (if (null? items)
     0
     (+ 1 (length (cdr items)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;求值器的内核部分
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     eval  的定义
(define (eval exp env)
  (cond ((self-evaluation? exp) exp)
        ((variable? exp) (lookup-variable-value exp env))
        ((quoted? exp) (text-of-quotation exp))
        ((assignment? exp) (eval-assignment exp env))
        ((definition? exp) (eval-definition exp env))
        ((if? exp) (eval-if exp env))
        ((lambda? exp)
         (make-procedure (lambda-parameters exp)
                         (lambda-body exp)
                         env))
        ((begin? exp)
         (eval-sequence (begin-actions exp) env))
        ((cond? exp) (eval (cond->if exp) env))
        ((application? exp)
         (my-apply (eval (operator exp) env)
                (list-of-values (operands exp) env)))
        (else 
         (error "Unknown expression type--EVAL" exp))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    apply     定义       
(define (my-apply procedure arguments)
(cond ((primitive-procedure? procedure)
        (apply-primitive-procedure procedure arguments))
      ((compound-procedure? procedure)
       (eval-sequence
         (procedure-body procedure)
         (extend-environment
            (procedure-parameters procedure)
            arguments
            (procedure-environment procedure))))
      (else
       (error
         "Unknown procedure type -- APPLY" procedure))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     过程参数  定义
(define (list-of-values exps env)
   (if (no-operands? exps)
       ()
       (cons (eval (first-operand exps) env)
             (list-of-values (rest-operands exps) env))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;       条件  
(define (eval-if exp env)
   (if (true? (eval (if-predicate exp) env))
       (eval (if-consequent exp) env)
       (eval (if-alternative exp) env)))        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        序列
(define (eval-sequence exps env)
   (cond ((last-exp? exps) (eval (first-exp exps) env))
         (else (eval (first-exp exps) env)
               (eval-sequence (rest-exps exps) env))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         赋值和定义
(define (assignment? exp)
    (tagged-list? exp 'set!))
(define (assignment-variable exp) (cadr exp))
(define (assignment-value exp) (caddr exp))


(define (eval-assignment exp env)
   (set-variable-value! (assignment-variable exp)
                       (eval (assignment-value exp) env)
                       env)
   'ok)
(define (eval-definition exp env)
   (define-variable! (definition-variable exp)
                     (eval (definition-value exp) env)
                     env)
   'ok)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 表达式的表示
(define (self-evaluation? exp)
   (cond ((number? exp) true)
         ((string? exp) true)
         (else false)))
(define (variable? exp) (symbol? exp))
(define (quoted? exp)
    (tagged-list? exp 'quote))
(define (text-of-quotation exp) (cadr exp))
(define (tagged-list? exp tag)
    (if (pair? exp)
        (eq? (car exp) tag)
        false))




(define (definition? exp)
    (tagged-list? exp 'define))
(define (definition-variable exp)
    (if (symbol? (cadr exp))
        (cadr exp)
        (caadr exp)))
(define (definition-value exp)
   (if (symbol? (cadr exp))
       (caddr exp)
       (make-lambda (cdadr exp)
                    (cddr exp))))


(define (lambda? exp) (tagged-list? exp 'lambda))
(define (lambda-parameters exp) (cadr exp))
(define (lambda-body exp) (cddr exp))
(define (make-lambda parameters body)
     (cons 'lambda (cons parameters body)))


(define (if? exp) (tagged-list? exp 'if))
(define (if-predicate exp) (cadr exp))
(define (if-consequent exp) (caddr exp))
(define (if-alternative exp)
    (if (not (null? (cdddr exp)))
        (cadddr exp)
        'false))
(define (make-if predicate consequent alternative)
    (list 'if predicate consequent alternative))




(define (begin? exp) (tagged-list? exp 'begin))
(define (begin-actions exp) (cdr exp))
(define (last-exp? seq) (null? (cdr seq)))
(define (first-exp seq) (car seq))
(define (rest-exps seq) (cdr seq))      
(define (sequence->exp seq)
   (cond ((null? seq) seq)
         ((last-exp? seq) (first-exp seq))
         (else (make-begin seq))))
(define (make-begin seq) (cons 'begin seq))


(define (application? exp) (pair? exp))
(define (operator exp) (car exp))
(define (operands exp) (cdr exp))
(define (no-operands? ops) (null? ops))
(define (first-operand ops) (car ops))
(define (rest-operands ops) (cdr ops))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;派生表达式
(define (cond? exp) (tagged-list? exp 'cond))
(define (cond-clauses exp) (cdr exp))
(define (cond-else-clause? clause)
    (eq? (cond-predicate clause) 'else))
(define (cond-predicate clause) (car clause))
(define (cond-actions clause) (cdr clause))
(define (cond->if exp)
    (expand-clauses (cond-clauses exp)))
(define (expand-clauses clauses)
    (if (null? clauses)
        'false
        (let ((first (car clauses))
              (rest (cdr clauses)))
          (if (cond-else-clause? first)
              (if (null? rest)
                  (sequece->exp (cond-actions first))
                  (error "ELSE clause is'nt last -- COND->IF"
                        clauses))
              (make-if (cond-predicate first)
                       (sequence->exp (cond-actions first))
                       (expand-clauses rest))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 求值器的数据结构
;;;;;;;;;;;;;;;;;;;;;;;;;谓词检测
(define (true? x)
   (not (eq? x false)))
(define (false? x)
   (eq? x false))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;过程的表示
(define (make-procedure parameters body env)
    (list 'procedure parameters body env))
(define (compound-procedure? p)
    (tagged-list? p 'procedure))
(define (procedure-parameters p) (cadr p))
(define (procedure-body p) (caddr p))
(define (procedure-environment p) (cadddr p))
;;;;;;;;;;;;;;;;;;;;;;;;;;;对环境的操作
(define (enclosing-environment env) (cdr env))
(define (first-frame env) (car env))
(define the-empty-environment ())


(define (make-frame variables values)
    (cons variables values))
(define (frame-variables frame) (car frame))
(define (frame-values frame) (cdr frame))
(define (add-binding-to-frame! var val frame)
    (set-car! frame (cons var (car frame)))
    (set-cdr! frame (cons val (cdr frame))))
    
(define (extend-environment vars vals base-env)
    (if (= (length vars) (length vals))
        (cons (make-frame vars vals) base-env)
        (if (< (length vars) (length vals))   
           (error "Too many arguments supplied" vars vals)
           (error "Too few arguments supplied" vars vals))))
(define (lookup-variable-value var env)
    (define (env-loop env)
       (define (scan vars vals)
          (cond ((null? vars)
                   (env-loop (enclosing-environment env)))
                ((eq? var (car vars))
                 (car vals))
                (else (scan (cdr vars) (cdr vals)))))
       (if (eq? env the-empty-environment)
           (error "Unbound variable" var)
           (let ((frame (first-frame env)))
              (scan (frame-variables frame)
                    (frame-values frame)))))
    (env-loop env))
(define (set-variable-value! var val env)
   (define (env-loop env)
       (define (scan vars vals)
          (cond ((null? vars)
                 (env-loop (enclosing-environment env)))
                ((eq? var (car vars))
                 (set-car! vals val))
                (else (scan (cdr vars) (cdr vals)))))
        (if (eq? env the-empty-environment)
            (error "Unbound variable -- SET!" var)
            (let ((frame (first-frame env)))
              (scan (frame-variables frame)
                    (frame-values frame)))))
   (env-loop env))            
(define (define-variable! var val env)
    (let ((frame (first-frame env)))
      (define (scan vars vals)
         (cond ((null? vars)
                (add-binding-to-frame! var val frame))
               ((eq? var (car vars))
                (set-car! vals val))
               (else (scan (cdr vars) (cdr vals)))))
      (scan (frame-variables frame)
            (frame-values frame))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;作为程序运行这个求值器
(define primitive-procedures
    (list (list 'car car)
          (list 'cdr cdr)
          (list 'list list)
          (list 'eq? eq?)
          (list 'cons cons)
          (list 'null? null?)
          (list '+ +)
          (list '- -)
          (list '* *)
          (list '/ /)
          (list '< <)
          (list '> >)
          (list '= =)
          (list 'not not)
          (list 'abs abs)
          (list 'cadr cadr)
          (list 'caddr caddr)
          (list 'display display)
          (list 'newline newline)
          (list 'map map)))


(define (primitive-procedure-names)
   (map car 
        primitive-procedures))
(define (primitive-procedure-objects)
   (map (lambda (proc) (list 'primitive (cadr proc)))
        primitive-procedures))


(define (setup-environment)
    (let ((initial-env
            (extend-environment (primitive-procedure-names)
                                (primitive-procedure-objects)
                                the-empty-environment)))
     (define-variable! 'true true initial-env)
     (define-variable! 'false false initial-env)
     initial-env))
(define user-initial-environment (setup-environment))


(define (primitive-procedure? proc)
    (tagged-list? proc 'primitive))
(define (primitive-implementation proc) (cadr proc))


(define (apply-primitive-procedure proc args)
   (apply
       (primitive-implementation proc) args))
       
       
(define (prompt-for-input string)
   (newline) (newline) (display string) (newline))
(define (announce-output string)
    (newline) (display string) (newline))
(define (user-print object)
   (if (compound-procedure? object)
       (display (list 'compound-procedure
                      (procedure-parameters object)
                      (procedure-body object)))
       (display object)))      
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Start to test query system
(define (my-input)
   (display "choise input file :")
    (let ((dir (read)))
      (define i (open-input-file dir))
      (read i)))
    
(define i (open-input-file "input.scm"))
(define input (read i))
(query-driver-loop)    

这里的输入端是从文件输入,这样方便点

这个查询系统代码量是有点多,其中有个求值器部分,这里只分析查询系统的工作原理。在这个系统中重点要理解框架流的概念。这里使用的流操作也不分析了。框架内包括了变量的binding,框架流是query系统里过程简调用传递的关键参数。

       查询系统在收到查询时,先对查询做一下处理,使之变成内部形式来表示。这一部分就不说了,还有与之相关的数据操作,这里对查询的改变并不多。如果是assertion的话就使用数据导向技术插入到对应的表里和插入流中。

   对于查询的处理则交由qeval。返回扩充的框架流并实例化后打印出来。

    qeval部分则会判断是简单查询还是复合查询,简单查询的话就调用模式匹配去试图匹配框架中的每一个binding和查询。还要应用可能的规则。以此扩充返回的框架流。

                                                                                     复合查询的话就取出相应的处理过程(and or not  lisp-value )

规则的应用除了书上的无解情况和变量约束来约束去没有实际值的情况外其他都和模式匹配差不多。。。。。。

可怜可怜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值