home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.programming
- Path: sparky!uunet!gatech!darwin.sura.net!cs.ucf.edu!schnitzi
- From: schnitzi@cs.ucf.edu (Mark Schnitzius)
- Subject: Re: Expression manipulation
- Message-ID: <schnitzi.716224193@eola.cs.ucf.edu>
- Sender: news@cs.ucf.edu (News system)
- Organization: University of Central Florida
- References: <716068330snx@nexnix.demon.co.uk>
- Date: Fri, 11 Sep 1992 15:09:53 GMT
- Lines: 71
-
- gary@nexnix.demon.co.uk (Gary Howland) writes:
-
- >Has anyone got a short program (any readable language - ie. not assembler)
- >that can take a simple expression (such as 3x + 4y + 5z = 6) and
- >produce a report for each of the x, y and z variables, such as
-
- > x = (6 - 4y - 5z)/3
- > etc.
-
- >Thanks in advance - Gary.
-
- Here is a simple LISP program that should do it. I assume each of the
- operators (+,-,/,*) takes only two parameters and that the variable
- you are solving for exists once (and only once) in the expression.
-
- Some sample runs:
-
- (solvefor 'b '(= (+ a b) (/ 8 9)))
- ==> (= B (- (/ 8 9) A))
-
- (solvefor 'b '(= (/ a b) (/ 8 9)))
- ==> (= B (/ A (/ 8 9)))
-
- (solvefor 'a '(= (/ (- a b) 3) 4))
- ==> (= A (+ (* 4 3) B))
-
- (solvefor 'b '(= (/ (- a b) 3) 4))
- ==> (= B (- A (* 4 3)))
-
- (defun deep-member (a l)
- (cond
- ((atom l) (eq a l))
- ((null l) nil)
- ((eq a (car l)) t)
- (t (deep-member a (cdr l)))))
-
- (defun solvefor (var exp)
- (let ((leftside (cadr exp))
- (rightside (caddr exp)))
- (cond
- ((deep-member var (caddr exp))
- (solvefor var (list '= (caddr exp) (cadr exp))))
- ((eq leftside var) exp)
- ((eq (car leftside) '+)
- (if (deep-member var (cadr leftside))
- (solvefor var (list '= (cadr leftside) (list '- rightside (caddr
- leftside))))
- (solvefor var (list '= (caddr leftside) (list '- rightside (cadr
- leftside))))))
- ((eq (car leftside) '-)
- (if (deep-member var (cadr leftside))
- (solvefor var (list '= (cadr leftside) (list '+ rightside (caddr
- leftside))))
- (solvefor var (list '= (caddr leftside) (list '- (cadr leftside)
- rightside)))))
- ((eq (car leftside) '*)
- (if (deep-member var (cadr leftside))
- (solvefor var (list '= (cadr leftside) (list '/ rightside (caddr
- leftside))))
- (solvefor var (list '= (caddr leftside) (list '/ rightside (cadr
- leftside))))))
- ((eq (car leftside) '/)
- (if (deep-member var (cadr leftside))
- (solvefor var (list '= (cadr leftside) (list '* rightside (caddr
- leftside))))
- (solvefor var (list '= (caddr leftside) (list '/ (cadr leftside)
- rightside))))))))
-
- Mark Schnitzius
- schnitzi@eola.cs.ucf.edu
- University of Central Florida
-