home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / lang / misc / 2800 < prev    next >
Encoding:
Internet Message Format  |  1992-08-29  |  22.0 KB

  1. Path: sparky!uunet!usc!elroy.jpl.nasa.gov!ames!sun-barr!news2me.ebay.sun.com!exodus.Eng.Sun.COM!exodus!vladimir
  2. From: vladimir@Eng.Sun.COM (Vladimir Ivanovic)
  3. Newsgroups: comp.lang.misc
  4. Subject: Summary: Constraint Programming Languages: Bertrand, etc.
  5. Date: 28 Aug 92 19:50:12
  6. Organization: Sun Microsystems, Inc.
  7. Lines: 640
  8. Message-ID: <VLADIMIR.92Aug28195012@cocteau.Eng.Sun.COM>
  9. References: <VLADIMIR.92Aug25222304@ronnie.Eng.Sun.COM>
  10. NNTP-Posting-Host: cocteau
  11. In-reply-to: vladimir@Eng.Sun.COM's message of 25 Aug 92 22:23:04
  12.  
  13. Apparently Wm (pronounced "Whim") Leler is now working at Ithaca Software
  14. in Oakland, CA.  Mail to wm@cse.ogi.edu bounced.
  15.  
  16. A copy of the augmented term rewriting system in the appendix of Leler's
  17. book, "Constraint Programming Languages", Addison-Wesley, 1988, ISBN
  18. 0-201-06243-7 can be found in nexus.yorku.ca:/pub/scheme/scm/bevan.sha (a
  19. shar file) in atr.scm.  Also, below, I include the copies from weems and
  20. then bernied.
  21.  
  22. Thanks to:
  23.  
  24.     bernied@ncsa.uiuc.edu (Bernhard Damberger)
  25.     weems@cse.uta.edu (Bob Weems) 
  26.     bevan@computer-science.manchester.ac.uk (Stephen J Bevan)
  27.  
  28. for doing the typing.
  29.  
  30. Enjoy!
  31.  
  32. -- Vladimir
  33.  
  34. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  35. (define constant? (lambda (x) (and (pair? x)
  36.                                    (eq? (car x) 'constant))))
  37. (define parameter? (lambda (x) (and (pair? x)
  38.                                (eq? (car x) 'parameter))))
  39. (define typed? (lambda (x) (and (pair? x) (eq? (car x) 'typed))))
  40. (define var? (lambda (x) (and (pair? x) (eq? (car x) 'var))))
  41. (define term? (lambda (x) (and (pair? x) (eq? (car x) 'term))))
  42. (define isis? (lambda (x) (and (pair? x) (eq? (car x) 'is))))
  43.  
  44. (define head (lambda (x) (vector-ref x 0)))   ; head of rule
  45. (define body (lambda (x) (vector-ref x 1)))   ; body of rule
  46. (define tag                                   ; tag of rule
  47.    (lambda (x)
  48.       (if (=? (vector-length x) 3)
  49.           (vector-ref x 2)
  50.           #f)))   ; return false if no tag
  51.  
  52. (define make-state (lambda (s g t n) (vector s g t n)))
  53. (define subject (lambda (x) (vector-ref x 0)))
  54. (define globals (lambda (x) (vector-ref x 1)))
  55. (define typesp (lambda (x) (vector-ref x 2)))
  56. (define newname (lambda (x) (vector-ref x 3)))
  57.  
  58. (define replace-s     ; replace subject expression in state
  59.    (lambda (state new-subject)
  60.       (vector new-subject
  61.               (globals state)
  62.               (typesp state)
  63.               (newname state))))
  64.  
  65. (define replace-g     ; replace globals in state
  66.    (lambda (state new-globals)
  67.       (vector (subject state)
  68.               new-globals
  69.               (typesp state)
  70.               (newname state))))
  71.  
  72. (define replace-t     ; replace type space in state
  73.    (lambda (state new-typesp)
  74.       (vector (subject state)
  75.               (globals state)
  76.               new-typesp
  77.               (newname state))))
  78.  
  79. (define incr-n     ; increment label generator in state
  80.    (lambda (state)
  81.       (vector (subject state)
  82.               (globals state)
  83.               (typesp state)
  84.               (+ 1 (newname state)))))
  85.  
  86. (define augmented-term-rewriter
  87.    (lambda (subject-exp rules)
  88.       (rewrite
  89.         (make-state   ;  state
  90.          subject-exp      ; subject expression
  91.          init-phi         ; initial global name space
  92.          init-phi         ; initial type space
  93.          0)               ; initial generated label name
  94.        rules)))       ;  rules
  95.  
  96. (define init-phi '((*reserved* . *reserved*)))
  97.  
  98. (define rewrite
  99.    (lambda (state rules)
  100.       (let ((no-bv-state (rewrite-globals state)))
  101.            (if no-bv-state       ; bound var was found
  102.                (rewrite no-bv-state rules)
  103.                (let ((new-state (rewrite-exp state rules rules)))
  104.                     (if new-state  ; match (or "is") found
  105.                         (rewrite new-state rules)
  106.                         state))))))
  107.  
  108. (define rewrite-exp
  109.    (lambda (state rules-left-to-try rules)
  110.       (if (null? rules-left-to-try)
  111.           (rewrite-subexpressions state rules)
  112.           (let ((new-state (try-rule
  113.                             state
  114.                             (car rules-left-to-try))))
  115.                (if new-state
  116.                    new-state
  117.                    (rewrite-exp state
  118.                                 (cdr rules-left-to-try)
  119.                                 rules))))))
  120.  
  121. (define rewrite-subexpressions
  122.    (lambda (state rules)
  123.       (let ((expr (subject state)))
  124.            (cond ((constant? expr) #f)
  125.                  ((var? expr) #f)
  126.                  ((term? expr)
  127.                   (rewrite-args (first3 expr)
  128.                                 (cdddr expr)
  129.                                 state
  130.                                 rules))
  131.                  ((isis? expr) (rewrite-is state))
  132.                  (else (error "Invalid subject expression:"
  133.                               expr))))))
  134.  
  135. (define rewrite-args
  136.    (lambda (previous-terms terms-to-try state rules)
  137.       (if (null? terms-to-try)
  138.           #f
  139.           (let ((new-state (rewrite-exp
  140.                             (replace-s state (car terms-to-try))
  141.                             rules rules)))
  142.                (if new-state
  143.                    (replace-s
  144.                      new-state
  145.                      (append previous-terms
  146.                              (cons (subject new-state)
  147.                                    (cdr terms-to-try))))
  148.                    (rewrite-args
  149.                      (append previous-terms
  150.                              (list (car terms-to-try)))
  151.                      (cdr terms-to-try) state rules))))))
  152.  
  153. (define first3    ; return the first 3 elements of a list
  154.    (lambda (alist)
  155.       (list (car alist) (cadr alist) (caddr alist))))
  156.  
  157. (define rewrite-is
  158.    (lambda (state)
  159.       (let ((expr) (subject state))
  160.             (space (globals state)))
  161.            (if (and (pair? (cdr expr))    ; two args?
  162.                     (var? (cadr expr))    ; first is var?
  163.                     (pair? (cddr expr))   ; second is expr?
  164.                     (not (lookup (cdadr expr)
  165.                                  space))  ; var not bound?
  166.                     (not (rewrite-globals ; var not in expr?
  167.                           (make-state (caddr expr)
  168.                                       (bind (cdadr expr)
  169.                                             '()
  170.                                             init-phi 0))))
  171.                (replace-g (replace-s state true-expr)
  172.                           (bind (cdadr expr) (caddr expr) space))
  173.                (error "invalid "is" expression:" expr)))))
  174.  
  175. (define true-expr '(expr (:) true))
  176.  
  177. (define try-rule
  178.    (lambda (state rule)
  179.       (let ((phi (match state (head rule) init-phi)))
  180.            (if phi
  181.                (let ((label (get-label (subject state)
  182.                                        (newname state))))
  183.                     (replace-s
  184.                      (bind-type
  185.                       (if (eq? (last label) (newname state))
  186.                           (incr-n state)
  187.                           state)
  188.                       rule label)
  189.                     (transform (body rule) phi label)))
  190.                #f))))
  191.  
  192. (define match
  193.    (lambda (state pattern phi)
  194.       (let ((expr (subject state)))
  195.            (cond
  196.             ((parameter? pattern) (bind (cadr pattern) expr phi))
  197.             ((and (typed? pattern) (var? expr))
  198.              (let ((var-type (lookup (cdr expr) (typesp state))))
  199.                   (if (and var-type
  200.                            (memq var-type (cddr pattern)))
  201.                       (bind (cadr pattern) expr phi)
  202.                       #f)))
  203.             ((and (typed? pattern) (constant? expr)
  204.                   (eq? (caddr pattern) 'constant))
  205.              (bind (cadr pattern) expr phi))
  206.             ((and (constant? pattern) (constant? expr)
  207.                   (=? (cdr pattern) (cdr expr))) phi)
  208.             ((and (term? pattern) (term? expr)
  209.                   (eq? (caddr pattern) (caddr expr)))
  210.              (match-args (replace-s state (cdddr expr))
  211.                          (cdddr pattern) phi))
  212.             ((var? pattern)
  213.              (error "Local variable in head of rule"))
  214.             (else #f)))))
  215.  
  216. (define match-args
  217.    (lambda (state patterns phi)
  218.       (let ((args (subject state)))
  219.            (cond
  220.             ((and (null? args) (null? patterns)) phi)
  221.             ((null? args) #f)
  222.             ((null? patterns) #f)
  223.             (else
  224.                (let ((new-phi (match (replace-s state (car args))
  225.                                      (car patterns) phi)))
  226.                     (if new-phi
  227.                         (match-args (replace-s state (cdr args))
  228.                                     (cdr patterns) new-phi)
  229.                         #f)))))))
  230.  
  231. (define get-label
  232.    (lambda (expr lgen)
  233.       (if (eq? (last (cadr expr)) ':)
  234.           (replace-last (cadr expr) lgen)
  235.           (cadr expr))))
  236.  
  237. (define last      ; return the last element of a proper list
  238.    (lambda (lst)
  239.        (if (pair? lst)
  240.            (if (null? (cdr lst))
  241.                (car lst)
  242.                (last (cdr lst)))
  243.            (error "Cannot return last element of atom:" lst))))
  244.  
  245. (define replace-last    ; replace the last element of a list
  246.    (lambda (lst val)
  247.       (if (and (pair? lst) (null? (cdr lst)))
  248.           (list val)
  249.           (cons (car lst) (replace-last (cdr lst) val)))))
  250.  
  251. (define bind-type
  252.    (lambda (state rule label)
  253.       (let ((rule-tag (tag rule)))
  254.            (if rule-tag
  255.                (replace-t state
  256.                           (bind label rule-tag (typesp state)))
  257.                state))))
  258.  
  259. (define transform
  260.    (lambda (rule-body phi label)
  261.       (cond
  262.        ((parameter? rule-body)
  263.         (let ((param-val (lookup (cadr rule-body) phi)))
  264.              (if param-val
  265.                  (if (=? (length (cdr rule-body)) 1)
  266.                      param-val    ; not qualified parameter
  267.                      (if (var? param-val)
  268.                          (cons (car param-val)
  269.                                (append (cdr param-val)
  270.                                        (cddr rule-body)))
  271.                          (error
  272.                           "A qualified parameter matched a "
  273.                           "non-variable:"
  274.                           param-val)))
  275.                  (error "Parameter in body that is not in head:"
  276.                         rule-body))))
  277.        ((var? rule-body)
  278.         (cons (car rule-body) (append label (cdr rule-body))))
  279.        ((constant? rule-body) rule-body)
  280.        ((term? rule-body)
  281.         (append (list
  282.                  (car rule-body)          ; 'term
  283.                  (append label (cadr rule-body))
  284.                  (caddr rule-body))
  285.                 (transform-args (cdddr rule-body) phi label)))
  286.        ((isis? rule-body)
  287.         (cons (car rule-body)
  288.               (transform-args (cdr rule-body) phi label)))
  289.        (else (error "Invalid body of rule:" rule-body)))))
  290.  
  291. (define transform-args
  292.    (lambda (args phi label)
  293.       (if (null? args)
  294.           '()
  295.           (cons (transform (car args) phi label)
  296.                 (transform-args (cdr args) phi label)))))
  297.  
  298. (define bind
  299.    (lambda (var val name-space)
  300.       (cons (cons var val) name-space)))
  301.  
  302. (define lookup
  303.    (lambda (var name-space)
  304.       (let ((entry (assoc var name-space)))
  305.            (if entry
  306.                (cdr entry)
  307.                #f))))
  308.  
  309. (define rewrite-globals
  310.    (lambda (state)
  311.       (let ((expr (subject state))
  312.             (space (globals state)))
  313.            (cond
  314.             ((var? expr)
  315.              (let ((val (lookup (cdr expr) (globals state))))
  316.                   (if val   ; variable is bound
  317.                       (replace-s state val)   ; replace by value
  318.                       #f)))
  319.             ((constant? expr) #f)
  320.             ((term? expr)
  321.              (rewrite-g-args (first3 expr) (cdddr expr) state))
  322.             ((isis? expr)
  323.              (rewrite-g-args (list (car expr)) (cdr expr) state))
  324.             (else (error "invalid subject expression:" expr))))))
  325.  
  326. (define rewrite-g-args
  327.    (lambda (previous-terms terms state)
  328.       (if (null? terms)
  329.           #f
  330.           (let ((new-state (rewrite-globals
  331.                             (replace-s state (car terms)))))
  332.                (if new-state
  333.                    (replace-s new-state
  334.                          (append previous-terms
  335.                                  (cons (subject new-state)
  336.                                        (cdr terms))))
  337.                    (rewrite-g-args
  338.                     (append previous-terms (list (car terms)))
  339.                     (cdr terms) state))))))
  340. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  341. ;---------------------------------------------------------------------
  342. ; This is an Augmented Term Rewriter.  It is taken out of appendix C
  343. ; in Wm Leler's "Constraint Programming Languages"
  344. ; This is untested.  bhd: 4/23/92
  345. ;---------------------------------------------------------------------
  346.  
  347. (define constant? (lambda (x) (and (pair? x) (eq? (car x) 'constant))))
  348. (define parameter? (lambda (x) (and (pair? x) (eq? (car x) 'parameter))))
  349. (define typed? (lambda (x) (and (pair? x) (eq? (car x) 'typed))))
  350. (define var? (lambda (x) (and (pair? x) (eq? (car x) 'var))))
  351. (define term? (lambda (x) (and (pair? x) (eq? (car x) 'term))))
  352. (define isis? (lambda (x) (and (pair? x) (eq? (car x) 'is))))
  353.  
  354. (define head (lambda (x) (vector-ref x 0)))  ; head of rule
  355. (define body (lambda (x) (vector-ref x 1)))  ; body of rule
  356.  
  357. (define tag
  358.   (lambda (x)
  359.     (if (=? (vector-length x) 3)
  360.         (vector-ref x 2)
  361.         #f)))  ; return false if no tag
  362.  
  363. (define make-state (lambda (s g t n) (vector s g t n)))
  364.  
  365. (define subject (lambda (x) (vector-ref x 0)))
  366.  
  367. (define globals (lambda (x) (vector-ref x 1)))
  368.  
  369. (define typesp (lambda (x) (vector-ref x 2)))
  370.  
  371. (define newname (lambda (x) (vector-ref x 3)))
  372.  
  373. (define replace-s
  374.   (lambda (state new-subject)
  375.     (vector new-subject
  376.             (globals state)
  377.             (typesp state)
  378.             (newname state))))
  379.  
  380. (define replace-g
  381.   (lambda (state new-globals)
  382.     (vector (subject state)
  383.             new-globals
  384.             (typesp state)
  385.             (newname state))))
  386.  
  387. (define replace-t
  388.   (lambda (state new-typesp)
  389.     (vector (subject state)
  390.             (globals state)
  391.             new-typesp
  392.             (newname state))))
  393.  
  394. (define incr-n
  395.   (lambda (state)
  396.     (vector (subject state)
  397.             (globals state)
  398.             (typesp state)
  399.             (+ 1 (newname state)))))
  400.  
  401. (define augmented-term-rewriter
  402.   (lambda (subject-exp rules)
  403.     (rewrite
  404.      (make-state
  405.       subject-exp
  406.       init-phi
  407.       init-phi
  408.       0)
  409.      rules)))
  410.  
  411. (define init-phi '((*reserved* . *reserved*)))
  412.  
  413. (define rewrite
  414.   (lambda (state rules)
  415.     (let ((no-bv-state (rewrite-globals state)))
  416.       (if no-bv-state
  417.           (rewrite no-bv-state rules)
  418.           (let ((new-state (rewrite-exp state rules rules)))
  419.             (if new-state
  420.                 (rewrite new-state rules)
  421.                 state))))))
  422.  
  423. (define rewrite-exp
  424.   (lambda (state rules-left-to-try rules)
  425.     (if (null? rules-left-to-try)
  426.         (rewrite-subexpressions state rules)
  427.         (let ((new-state (try-rule
  428.                           state
  429.                           (car rules-left-to-try))))
  430.           (if new-state
  431.               new-state
  432.               (rewrite-exp state
  433.                            (cdr rules-left-to-try)
  434.                            rules))))))
  435.  
  436. (define rewrite-subexpressions
  437.   (lambda (state rules)
  438.     (let ((expr (subject state)))
  439.       (cond ((constant? expr) #f)
  440.             ((var? expr) #f)
  441.             ((term? expr)
  442.              (rewrite-args (first3 expr)
  443.                            (cdddr expr)
  444.                            state
  445.                            rules))
  446.             ((isis? expr) (rewrite-is state))
  447.             (else (error "Invalid subject expression:"
  448.                          expr))))))
  449.  
  450. (define rewrite-args
  451.   (lambda (previous-terms terms-to-try state rules)
  452.     (if (null? terms-to-try)
  453.         #f
  454.         (let ((new-state (rewrite-exp
  455.                           (replace-s state (car terms-to-try))
  456.                           rules rules)))
  457.           (if new-state
  458.               (replace-s
  459.                new-state
  460.                (append previous-terms
  461.                        (cons (subject new-state)
  462.                              (cdr terms-to-try))))
  463.               (rewrite-args
  464.                (append previous-terms
  465.                        (list (car terms-to-try)))
  466.                (cdr terms-to-try) state rules))))))
  467.  
  468. (define first3
  469.   (lambda (alist)
  470.     (list (car alist) (cadr alist) (caddr alist))))
  471.  
  472. (define rewrite-is
  473.   (lambda (state)
  474.     (let ((expr (subject state))
  475.           (space (globals state)))
  476.       (if (and (pair? (cdr expr))
  477.                (var? (cadr expr))
  478.                (pair? (cddr expr))
  479.                (not (lookup (cdadr expr)
  480.                             space))
  481.                (not (rewrite-globals
  482.                      (make-state (caddr expr)
  483.                                  (bind (cdadr expr)
  484.                                        '()
  485.                                        init-phi)
  486.                                  init-phi 0))))
  487.           (replace-g (replace-s state true-expr)
  488.                      (bind (cdadr expr) (caddr expr) space))
  489.           (error "invalid "is" expression:" expr)))))
  490.  
  491. (define true-expr '(expr (:) true))
  492.  
  493. (define try-rule
  494.   (lambda (state rule)
  495.     (let ((phi (match state (head rule) init-phi)))
  496.       (if phi
  497.           (let ((label (get-label (subject state)
  498.                                   (newname state))))
  499.             (replace-s
  500.              (bind-type
  501.               (if (eq? (last label) (newname state))
  502.                   (incr-n state)
  503.                   state)
  504.               rule label)
  505.              (transform (body rule) phi label)))
  506.           #f))))
  507.  
  508. (define match
  509.   (lambda (state pattern phi)
  510.     (let ((expr (subject state)))
  511.       (cond
  512.        ((parameter? pattern) (bind (cadr pattern) expr phi))
  513.        ((and (typed? pattern) (var? expr))
  514.         (let ((var-type (lookup (cdr expr) (typesp state))))
  515.           (if (and var-type
  516.                    (memq var-type (cddr pattern)))
  517.               (bind (cadr pattern) expr phi)
  518.               #f)))
  519.        ((and (typed? pattern) (constant? expr)
  520.              (eq? (caddr pattern) 'constant))
  521.         (bind (cadr pattern) expr phi))
  522.        ((and (constant? pattern) (constant? expr)
  523.              (=? (cdr pattern) (cdr expr))) phi)
  524.        ((and (term? pattern) (term? expr)
  525.              (eq? (caddr pattern) (caddr expr)))
  526.         (match-args (replace-s state (cdddr expr))
  527.                     (cdddr pattern) phi))
  528.        ((var? pattern)
  529.         (error "Local variable in head of rule"))
  530.        (else #f)))))
  531.  
  532. (define get-label
  533.   (lambda (expr lgen)
  534.     (if (eq? (last (cadr expr)) ':)
  535.         (replace-last (cadr expr) lgen)
  536.         (cadr expr))))
  537.  
  538. (define last
  539.   (lambda (lst)
  540.     (if (pair? lst)
  541.         (if (null? (cdr lst))
  542.             (car lst)
  543.             (last (cdr lst)))
  544.         (error "Cannot return last element of atom:" lst))))
  545.  
  546. (define replace-last
  547.   (lambda (lst val)
  548.     (if (and (pair? lst) (null? (cdr lst)))
  549.         (list val)
  550.         (cons (car lst) (replace-last (cdr lst) val)))))
  551.  
  552. (define bind-type
  553.   (lambda (state rule label)
  554.     (let ((rule-tag (tag rule)))
  555.       (if rule-tag
  556.           (replace-t state
  557.                      (bind label rule-tag (typesp state)))
  558.           state))))
  559.  
  560. (define transform
  561.   (lambda (rule-body phi label)
  562.     (cond
  563.      ((parameter? rule-body)
  564.       (let ((param-val (lookup (cadr rule-body) phi)))
  565.         (if param-val
  566.             (if (=? (length (cdr rule-body)) 1)
  567.                 param-val
  568.                 (if (var? param-val)
  569.                     (cons (car param-val)
  570.                           (append (cdr param-val)
  571.                                   (cddr rule-body)))
  572.                     (error
  573.                      "A qualified parameter "
  574.                      "matched a non-variable:"
  575.                      param-val)))
  576.             (error "Parameter in body that is not in head:"
  577.                    rule-body))))
  578.      ((var? rule-body)
  579.       (cons (car rule-body) (append label (cdr rule-body))))
  580.      ((constant? rule-body) rule-body)
  581.      ((term? rule-body)
  582.       (append (list
  583.                (car rule-body)
  584.                (append label (cadr rule-body))
  585.                (caddr rule-body))
  586.               (transform-args (cdddr rule-body) phi label)))
  587.      ((isis? rule-body)
  588.       (cons (car rule-body)
  589.             (transform-args (cdr rule-body) phi label)))
  590.      (else (error "Invalid body of rule:" rule-body)))))
  591.  
  592. (define transform-args
  593.   (lambda (args phi label)
  594.     (if (null? args)
  595.         '()
  596.         (cons (transform (car args) phi label)
  597.               (transform-args (cdr args) phi label)))))
  598.  
  599. (define bind
  600.   (lambda (var val name-space)
  601.     (cons (cons var val) name-space)))
  602.  
  603. (define lookup
  604.   (lambda (var name-space)
  605.     (let ((entry (assoc var name-space)))
  606.       (if entry
  607.           (cdr entry)
  608.           #f))))
  609.  
  610. (define rewrite-globals
  611.   (lambda (state)
  612.     (let ((expr (subject state))
  613.           (space (globals state)))
  614.       (cond
  615.        ((var? expr)
  616.         (let ((val (lookup (cdr expr) (globals state))))
  617.           (if val
  618.               (replace-s state val)
  619.               #f)))
  620.        ((constant? expr) #f)
  621.        ((term? expr)
  622.         (rewrite-g-args (first3 expr) (cdddr expr) state))
  623.        ((isis? expr)
  624.         (rewrite-g-args (list (car expr)) (cdr expr) state))
  625.        (else (error "invalid subject expression:" expr))))))
  626.  
  627. (define rewrite-g-args
  628.   (lambda (previous-terms terms state)
  629.     (if (null? terms)
  630.         #f
  631.         (let ((new-state (rewrite-globals
  632.                           (replace-s state (car terms)))))
  633.           (if new-state
  634.               (replace-s new-state
  635.                          (append previous-terms
  636.                                   (cons (subject new-state)
  637.                                         (cdr terms))))
  638.                          (rewrite-g-args
  639.                           (append previous-terms (list (car terms)))
  640.                           (cdr terms) state))))))
  641.  
  642. -----
  643. Have a bajillion brilliant Jobsian lithium licks.
  644. Bernhard Damberger
  645. bernied@ncsa.uiuc.edu
  646.  
  647. --
  648. Vladimir G. Ivanovic                            Sun Microsystems, Inc
  649. (415) 336-2315                                  MTV12-33
  650. vladimir@Eng.Sun.COM                            2550 Garcia Ave.
  651. {decwrl,hplabs,ucbvax}!sun!Eng!vladimir         Mountain View, CA 94043-1100
  652.                          Disclaimer: I speak for myself.
  653.