home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #20 / NN_1992_20.iso / spool / comp / programm / 2588 < prev    next >
Encoding:
Text File  |  1992-09-11  |  2.5 KB  |  83 lines

  1. Newsgroups: comp.programming
  2. Path: sparky!uunet!gatech!darwin.sura.net!cs.ucf.edu!schnitzi
  3. From: schnitzi@cs.ucf.edu (Mark Schnitzius)
  4. Subject: Re: Expression manipulation
  5. Message-ID: <schnitzi.716224193@eola.cs.ucf.edu>
  6. Sender: news@cs.ucf.edu (News system)
  7. Organization: University of Central Florida
  8. References: <716068330snx@nexnix.demon.co.uk>
  9. Date: Fri, 11 Sep 1992 15:09:53 GMT
  10. Lines: 71
  11.  
  12. gary@nexnix.demon.co.uk (Gary Howland) writes:
  13.  
  14. >Has anyone got a short program (any readable language - ie. not assembler)
  15. >that can take a simple expression (such as 3x + 4y + 5z = 6) and
  16. >produce a report for each of the x, y and z variables, such as
  17.  
  18. >    x = (6 - 4y - 5z)/3
  19. >    etc.
  20.  
  21. >Thanks in advance - Gary.
  22.  
  23. Here is a simple LISP program that should do it.  I assume each of the
  24. operators (+,-,/,*) takes only two parameters and that the variable
  25. you are solving for exists once (and only once) in the expression.
  26.  
  27. Some sample runs:
  28.  
  29.   (solvefor 'b '(= (+ a b) (/ 8 9)))
  30.   ==> (= B (- (/ 8 9) A))
  31.  
  32.   (solvefor 'b '(= (/ a b) (/ 8 9)))
  33.   ==> (= B (/ A (/ 8 9)))
  34.  
  35.   (solvefor 'a '(= (/ (- a b) 3) 4))
  36.   ==> (= A (+ (* 4 3) B))
  37.           
  38.   (solvefor 'b '(= (/ (- a b) 3) 4))
  39.   ==> (= B (- A (* 4 3)))
  40.  
  41. (defun deep-member (a l)
  42.   (cond
  43.     ((atom l) (eq a l))
  44.     ((null l) nil)
  45.     ((eq a (car l)) t)
  46.     (t (deep-member a (cdr l)))))
  47.  
  48. (defun solvefor (var exp)
  49.   (let ((leftside (cadr exp))
  50.     (rightside (caddr exp)))
  51.     (cond
  52.       ((deep-member var (caddr exp))
  53.        (solvefor var (list '= (caddr exp) (cadr exp))))
  54.       ((eq leftside var) exp)
  55.       ((eq (car leftside) '+)
  56.        (if (deep-member var (cadr leftside))
  57.        (solvefor var (list '= (cadr leftside) (list '- rightside (caddr
  58. leftside))))
  59.        (solvefor var (list '= (caddr leftside) (list '- rightside (cadr
  60. leftside))))))
  61.       ((eq (car leftside) '-)
  62.        (if (deep-member var (cadr leftside))
  63.        (solvefor var (list '= (cadr leftside) (list '+ rightside (caddr
  64. leftside))))
  65.        (solvefor var (list '= (caddr leftside) (list '- (cadr leftside)
  66. rightside)))))
  67.       ((eq (car leftside) '*)
  68.        (if (deep-member var (cadr leftside))
  69.        (solvefor var (list '= (cadr leftside) (list '/ rightside (caddr
  70. leftside))))
  71.        (solvefor var (list '= (caddr leftside) (list '/ rightside (cadr
  72. leftside))))))
  73.       ((eq (car leftside) '/)
  74.        (if (deep-member var (cadr leftside))
  75.        (solvefor var (list '= (cadr leftside) (list '* rightside (caddr
  76. leftside))))
  77.        (solvefor var (list '= (caddr leftside) (list '/ (cadr leftside)
  78. rightside))))))))
  79.  
  80. Mark Schnitzius
  81. schnitzi@eola.cs.ucf.edu
  82. University of Central Florida
  83.