;;; -*- Mode:LISP; Package:SIM; Readtable:CL; Base:10 -*-


;;; DERIV -- This is a Common Lisp version of a symbolic
;;; derivative benchmark written by Vaughan Pratt.
;;; It uses a simple subset of Lisp and does a lot of 
;;; CONSing.

(defun deriv-aux (a)
  (list '/ (deriv a) a))


(DEFKFUN DERIV-AUX (A)
  TAG::P_5
     (TAIL-OPEN)
     (OPEN-CALL DERIV '1 O1 (O0 A0))
  TAG::C_10
     (MOVE O0 '/)
     (TAIL-CALL KWRAP::LIST3 '3 (O2 A0)))



(defun deriv (a)
  (cond 
    ((atom a)
     (cond ((eq a 'x) 1) (t 0)))
    ((eq (car a) '+)
     (cons '+ (mapcar #'deriv (cdr a))))
    ((eq (car a) '-) 
     (cons '- (mapcar #'deriv 
		      (cdr a))))
    ((eq (car a) '*)
     (list '* 
	   a 
	   (cons '+ (mapcar #'deriv-aux (cdr a)))))
    ((eq (car a) '/)
     (list '- 
	   (list '/ 
		 (deriv (cadr a)) 
		 (caddr a))
	   (list '/ 
		 (cadr a) 
		 (list '*
		       (caddr a)
		       (caddr a)
		       (deriv (caddr a))))))
     (t 'error)))


(DEFKFUN DERIV (A)
  TAG::P_29
         (OPEN-CALL KWRAP::ATOM '1 A1 (O0 A0))
  TAG::C_286
         (ALU L-R GARBAGE A1 'NIL)
         (TEST BR-EQUAL)
         (BRANCH TAG::C_40)
  TAG::C_32
         (ALU L-R GARBAGE A0 'X)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_36)
  TAG::C_35
         (MOVE RETURN '1 CH-RETURN)
  TAG::C_36
         (MOVE RETURN '0 CH-RETURN)
  TAG::C_40
         (OPEN-CALL KWRAP::CAR '1 A2 (O0 A0))
  TAG::C_279
         (ALU L-R GARBAGE A2 '+)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_101)
  TAG::C_43
         (MOVE A3 'NIL CH-TAIL-OPEN)
         (MOVE O1 'NIL)
         (OPEN-CALL KWRAP::CDR '1 A4 (O0 A0))
  TAG::C_93
  TAG::MAP4680_51
         (ALU L-R GARBAGE A4 'NIL)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_54)
  TAG::C_81
  TAG::B_96
         (TAIL-CALL KWRAP::CONS '2 (O0 '+))
  TAG::C_54
         (KOPEN)
         (KOPEN)
         (OPEN-CALL KWRAP::CAR '1 O0 (O0 A4))
  TAG::C_67
         (KCALL DERIV '1 O0 NIL)
  TAG::C_70
         (KCALL KWRAP::NCONS '1 A5 NIL)
  TAG::C_73
         (ALU L-R GARBAGE A3 'NIL)
         (TEST BR-EQUAL)
         (BRANCH TAG::C_61)
  TAG::C_58
         (MOVE O0 A3 CH-OPEN)
         (KCALL KWRAP::RPLACD '2 IGNORE (O1 A5))
  TAG::B_62
         (MOVE A3 A5)
         (OPEN-CALL KWRAP::CDR '1 A4 (O0 A4))
  TAG::C_78
         (JUMP TAG::MAP4680_51)
  TAG::C_61
         (MOVE O1 A5)
         (JUMP TAG::B_62)
  TAG::C_101
         (OPEN-CALL KWRAP::CAR '1 A3 (O0 A0))
  TAG::C_273
         (ALU L-R GARBAGE A3 '-)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_157)
  TAG::C_104
         (MOVE A4 'NIL CH-TAIL-OPEN)
         (MOVE O1 'NIL)
         (OPEN-CALL KWRAP::CDR '1 A5 (O0 A0))
  TAG::C_149
  TAG::MAP4685_111
         (ALU L-R GARBAGE A5 'NIL)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_114)
  TAG::C_137
  TAG::B_152
         (TAIL-CALL KWRAP::CONS '2 (O0 '-))
  TAG::C_114
         (KOPEN)
         (KOPEN)
         (OPEN-CALL KWRAP::CAR '1 O0 (O0 A5))
  TAG::C_124
         (KCALL DERIV '1 O0 NIL)
  TAG::C_127
         (KCALL KWRAP::NCONS '1 A6 NIL)
  TAG::C_130
         (ALU L-R GARBAGE A4 'NIL)
         (TEST BR-EQUAL)
         (BRANCH TAG::C_120)
  TAG::C_118
         (MOVE O0 A4 CH-OPEN)
         (KCALL KWRAP::RPLACD '2 IGNORE (O1 A6))
  TAG::B_121
         (MOVE A4 A6)
         (OPEN-CALL KWRAP::CDR '1 A5 (O0 A5))
  TAG::C_134
         (JUMP TAG::MAP4685_111)
  TAG::C_120
         (MOVE O1 A6)
         (JUMP TAG::B_121)
  TAG::C_157
         (OPEN-CALL KWRAP::CAR '1 A4 (O0 A0))
  TAG::C_267
         (ALU L-R GARBAGE A4 '*)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_217)
  TAG::C_160
         (TAIL-OPEN)
         (MOVE A5 'NIL CH-OPEN)
         (MOVE O1 'NIL)
         (OPEN-CALL KWRAP::CDR '1 A6 (O0 A0))
  TAG::C_206
  TAG::MAP4690_168
         (ALU L-R GARBAGE A6 'NIL)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_171)
  TAG::C_194
  TAG::B_209
         (KCALL KWRAP::CONS '2 O2 (O0 '+))
  TAG::C_215
         (MOVE O0 '*)
         (TAIL-CALL KWRAP::LIST3 '3 (O1 A0))
  TAG::C_171
         (KOPEN)
         (KOPEN)
         (OPEN-CALL KWRAP::CAR '1 O0 (O0 A6))
  TAG::C_181
         (KCALL DERIV-AUX '1 O0 NIL)
  TAG::C_184
         (KCALL KWRAP::NCONS '1 A7 NIL)
  TAG::C_187
         (ALU L-R GARBAGE A5 'NIL)
         (TEST BR-EQUAL)
         (BRANCH TAG::C_177)
  TAG::C_175
         (MOVE O0 A5 CH-OPEN)
         (KCALL KWRAP::RPLACD '2 IGNORE (O1 A7))
  TAG::B_178
         (MOVE A5 A7)
         (OPEN-CALL KWRAP::CDR '1 A6 (O0 A6))
  TAG::C_191
         (JUMP TAG::MAP4690_168)
  TAG::C_177
         (MOVE O1 A7)
         (JUMP TAG::B_178)
  TAG::C_217
         (OPEN-CALL KWRAP::CAR '1 A5 (O0 A0))
  TAG::C_261
         (ALU L-R GARBAGE A5 '/)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_258)
  TAG::C_220
         (TAIL-OPEN)
         (KOPEN)
         (KOPEN)
         (KOPEN)
         (OPEN-CALL KWRAP::CADDR '1 O0 (O0 A0))
  TAG::C_239
         (KCALL DERIV '1 O3 NIL)
  TAG::C_246
         (OPEN-CALL KWRAP::CADDR '1 O1 (O0 A0))
  TAG::C_244
         (OPEN-CALL KWRAP::CADDR '1 O2 (O0 A0))
  TAG::C_242
         (KCALL KWRAP::LIST4 '4 O2 (O0 '*))
  TAG::C_251
         (OPEN-CALL KWRAP::CADR '1 O1 (O0 A0))
  TAG::C_249
         (KCALL KWRAP::LIST3 '3 O2 (O0 '/))
  TAG::C_256
         (KOPEN)
         (KOPEN)
         (OPEN-CALL KWRAP::CADR '1 O0 (O0 A0))
  TAG::C_224
         (KCALL DERIV '1 O1 NIL)
  TAG::C_231
         (OPEN-CALL KWRAP::CADDR '1 O2 (O0 A0))
  TAG::C_229
         (KCALL KWRAP::LIST3 '3 O1 (O0 '/))
  TAG::C_254
         (TAIL-CALL KWRAP::LIST3 '3 (O0 '-))
  TAG::C_258
         (MOVE RETURN 'ERROR CH-RETURN))


(defun run ()
 (declare (fixnum i))
 (do ((i 0 (1+ i)))
     ((= i 1000.))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
   (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))))


(DEFKFUN RUN NIL
  TAG::P_7
         (MOVE A0 '0)
  TAG::DO4805_14
         (ALU L-R GARBAGE A0 '1000)
         (TEST BR-NOT-EQUAL)
         (BRANCH TAG::C_18)
  TAG::C_17
         (MOVE RETURN 'NIL CH-RETURN)
  TAG::C_18
         (OPEN-CALL DERIV '1 IGNORE (O0 '(+ (* 3 X X) (* A X X) (* B X) 5)))
  TAG::B_24
         (OPEN-CALL DERIV '1 IGNORE (O0 '(+ (* 3 X X) (* A X X) (* B X) 5)))
  TAG::B_26
         (OPEN-CALL DERIV '1 IGNORE (O0 '(+ (* 3 X X) (* A X X) (* B X) 5)))
  TAG::B_28
         (OPEN-CALL DERIV '1 IGNORE (O0 '(+ (* 3 X X) (* A X X) (* B X) 5)))
  TAG::B_30
         (OPEN-CALL DERIV '1 IGNORE (O0 '(+ (* 3 X X) (* A X X) (* B X) 5)))
  TAG::B_35
         (ALU L+R+1 A0 A0 '0)
         (JUMP TAG::DO4805_14))





