%	Simplify arithmetic expression.
%	Not very efficient, and will not work for all cases


simp1(X + Y, Z) :-
	integer(X),
	integer(Y),
	(Z is X + Y).
simp1(X + 0, Y) :- simp(X, Y).
simp1(0 + X, Y) :- simp(X, Y).
simp1(X + X, 2 * Y) :- simp(X, Y).
simp1(N * X + X, N1 * Y) :-
	integer(N),
	(N1 is N + 1),
	simp(X, Y).
simp1(X + N * X, N1 * Y) :-
	integer(N),
	(N1 is N + 1),
	simp(X, Y).
simp1(N * X + N1 * X, (N + N1) * X) :- !.
simp1(X + Y, SX + SY) :-
	simp(X, SX),
	simp(Y, SY).
simp1(X - Y, Z) :-
	integer(X),
	integer(Y),
	(Z is X - Y).
simp1(X - X, 0).
simp1(X - 0, Y) :- simp(X, Y).
simp1(0 - X, - Y) :- simp(X, Y).
simp1(- X - X, -2 * Y) :- simp(X, Y).
simp1(- N * X - X, - N1 * Y) :-
	integer(N),
	(N1 is N + 1),
	simp(X, Y).
simp1(X - Y, SX - SY) :-
	simp(X, SX),
	simp(Y, SY).
simp1(- X, - SX) :- simp(X, SX).
simp1(X * Y, Z) :-
	integer(X),
	integer(Y),
	(Z is X * Y).
simp1(X * 0, 0).
simp1(0 * X, 0).
simp1(X * 1, Y) :- simp(X, Y).
simp1(1 * X, Y) :- simp(X, Y).
simp1(X * X, Y ^ 2) :- simp(X, Y).
simp1(X * X ^ N, Y ^ N1) :-
	integer(N),
	(N1 is N + 1),
	simp(X, Y).
simp1(X ^ N * X, Y ^ N1) :-
	integer(N),
	(N1 is N + 1),
	simp(X, Y).
simp1(X ^ 1, X).
simp1(X * Y, SX * SY) :-
	simp(X, SX),
	simp(Y, SY).
simp1(X / Y, Z) :-
	integer(X),
	integer(Y),
	(Z is X / Y).
simp1(X / X, 1).
simp1(X / 1, Y) :- simp(X, Y).
simp1(0 / X, 0).
simp1(X / Y, SX / SY) :-
	simp(X, SX),
	simp(Y, SY).
simp1(ln(0), 1).
simp1(ln(X), ln(Y)) :- simp(X, Y).
simp1(sin(X), sin(Y)) :- simp(X, Y).
simp1(cos(X), cos(Y)) :- simp(X, Y).
simp1(e ^ X, e ^ Y) :- simp(X, Y).
simp1(X, X).

simp2(X, Y) :-
	!,
	simp1(X, Y).
simp2(X, X) :- !.

simp(X, Y) :-
	simp1(X, Z),
	simp2(Z, Y),
	!.
