;;;; -*- Mode: Lisp; Syntax: Common-Lisp -*-
;;;; Code from Paradigms of AI Programming
;;;; Copyright (c) 1991 Peter Norvig

> (simplifier)
SIMPLIFIER> (2 + 2)
4 
SIMPLIFIER> (5 * 20 + 30 + 7)
137 
SIMPLIFIER> (5 * x - (4 + 1) * x)
0 
SIMPLIFIER> (y / z * (5 * x - (4 + 1) * x))
0 
SIMPLIFIER> ((4 - 3) * x + (y / y - 1) * z)
X 
SIMPLIFIER> (1 * f(x) + 0)
(F X) 
SIMPLIFIER> (3 * 2 * X)
(3 * (2 * X))
SIMPLIFIER> [Abort]

> (simplifier)
SIMPLIFIER> (3 * 2 * x)
(6 * X) 
SIMPLIFIER> (2 * x * x * 3)
(6 * (X ^ 2)) 
SIMPLIFIER> (2 * x * 3 * y * 4 * z * 5 * 6)
(720 * (X * (Y * Z))) 
SIMPLIFIER> (3 + x + 4 + x)
((2 * X) + 7) 
SIMPLIFIER> (2 * x * 3 * x * 4 * (1 / x) * 5 * 6)
(720 * X)

SIMPLIFIER> (3 + x + 4 - x)
((X + (4 - X)) + 3) 
SIMPLIFIER> (x + y + y + x)
(X + (Y + (Y + X)))
SIMPLIFIER> (3 * x + 4 * x)
((3 * X) + (4 * X)) 

SIMPLIFIER> (d (x + x) / d x)
2 
SIMPLIFIER> (d (a * x ^ 2 + b * x + c) / d x)
((2 * (A * X)) + B) 
SIMPLIFIER> (d ((a * x ^ 2 + b * x + c) / x) / d x)
((((A * (X ^ 2)) + ((B * X) + C)) - (X * ((2 * (A * X)) + B)))
 / (X ^ 2))
SIMPLIFIER> (log ((d (x + x) / d x) / 2))
0 
SIMPLIFIER> (log(x + x) - log x)
(LOG 2)
SIMPLIFIER> (x ^ cos pi)
(1 / X) 
SIMPLIFIER> (d (3 * x + (cos x) / x) / d x)
((((COS X) - (X * (- (SIN X)))) / (X ^ 2)) + 3)
SIMPLIFIER> (d ((cos x) / x) / d x)
(((COS X) - (X * (- (SIN X)))) / (X ^ 2))
SIMPLIFIER> (d (3 * x ^ 2 + 2 * x + 1) / d x)
((6 * X) + 2)
SIMPLIFIER> (sin(x + x) ^ 2 + cos(d x ^ 2 / d x) ^ 2)
1 
SIMPLIFIER> (sin(x + x) * sin(d x ^ 2 / d x) +
             cos(2 * x) * cos(x * d 2 * y / d y))
1 

SIMPLIFIER> (x + y + y + x)
(X + (Y + (Y + X)))

SIMPLIFIER> (3 * x + 4 * x)
((3 * X) + (4 * X))
SIMPLIFIER> (3 * x + y + x + 4 * x) 
((3 * X) + (Y + (X + (4 * X)))) 

(set-simp-fn 'Int #'(lambda (exp) 
                      (integrate (exp-lhs exp) (exp-rhs exp))))

SIMPLIFIER> (Int x * sin(x ^ 2) d x)
(1/2 * (- (COS (X ^ 2)))) 
SIMPLIFIER> (Int ((3 * x ^ 3) - 1 / (3 * x ^ 3)) d x)
((3 * ((X ^ 4) / 4)) - (1/3 * ((X ^ -2) / -2))) 
SIMPLIFIER> (Int (3 * x + 2) ^ -2/3 d x)
(((3 * X) + 2) ^ 1/3) 
SIMPLIFIER> (Int sin(x) ^ 2 * cos(x) d x)
(((SIN X) ^ 3) / 3) 
SIMPLIFIER> (Int sin(x) / (1 + cos(x)) d x)
(-1 * (LOG ((COS X) + 1))) 
SIMPLIFIER> (Int (2 * x + 1) / (x ^ 2 + x - 1) d x)
(LOG ((X ^ 2) + (X - 1))) 
SIMPLIFIER> (Int 8 * x ^ 2 / (x ^ 3 + 2) ^ 3 d x)
(8 * ((1/3 * (((X ^ 3) + 2) ^ -2)) / -2)) 

(set-simp-fn 'Int 
  #'(lambda (exp)
      (unfactorize
       (factorize
        (integrate (exp-lhs exp) (exp-rhs exp))))))

SIMPLIFIER> (Int 8 * x ^ 2 / (x ^ 3 + 2) ^ 3 d x)
(-4/3 * (((X ^ 3) + 2) ^ -2)) 

