(define (make-grammar-rules)
  (clear-assertions)
  (clear-rules)
  (remember-grammar-rules
   ;; Grammar
   '(:grule (NP ?agr) (VP ?agr) -> (S))
   '(:grule (NP ?agr) (VP ?agr) (PP) -> (S))
   '(:grule (V ?agr) (PP) -> (VP ?agr))
   ;; Lexicon
   '(:wrule he (NP sg3))
   '(:wrule he (PP))
   '(:wrule saw (VP sg3))
   '(:wrule saw (V sg3))
   ))

(define (parse)
  (define (parse-loop)
    (newline)
    (display* "Enter a sentence as a list, or (quit):")
    (let ((input (read)))
      (cond ((equal? input '(quit))
	     (display* "Game over..."))
	    (else
	     (clear-assertions)
	     (print (backchain `((S (? syn) ,input ()))))
	     (parse-loop)))))
  (make-grammar-rules)
  (parse-loop))

(define (print-s-parses assertions)
  (if (null? assertions)
      #f
      (cond ((eq? 's (first (first assertions)))
	     (pretty-print (first assertions))
	     (newline)
	     (print-s-parses (rest assertions)))
	    (else
	     (print-s-parses (rest assertions))))))

