anchor.diff:  (defun term* (term1 term2)
     (make-term (* (coeff term1) (coeff term2)) (vars* (vars term1) (vars term2))))
   
  +(defun make-var (sym pwr)
  +  (cons sym pwr))
  +
  +(defun sym (var) (car var))
  +(defun pwr (var) (cdr var))
  +
   (defun vars* (vars1 vars2)
     (cond ((and (null vars1) (null vars2)) '())
           ((or (null vars1) (null vars2)) (or vars1 vars2))
  
positive.code: (load "qsort.lisp")
  
  (defun poly+ (poly1 poly2)
    (make-poly (append (terms poly1) (terms poly2))))
  
negative.code: (defun poly* (poly1 poly2)
    (make-poly (terms* (terms poly1) (terms poly2))))
  
  (defun make-term (coeff . vars)
    (list 'term coeff (sort-by-sym vars)))
  
  (defun coeff (term) (cadr term))
  (defun vars (term) (caddr term))
  
  (defun sort-by-sym (vars)
    (qsort vars sym->val))
  
  (defun terms* (terms1 terms2)
    (reduce poly+ (terms*-inner terms1 terms2)))
  