There is something about Prolog that you can easily deconstruct an arithmetic expression. Your main template will look like this:
simplify(X, X) :- number(X) ; atom(X) ; var(X).
simplify(X+Y, X1+Y1) :- simplify(X, X1), simplify(Y, Y1).
simplify(X-Y, X1-Y1) :- simplify(X, X1), simplify(Y, Y1).
simplify(X*Y, X1*Y1) :- simplify(X, X1), simplify(Y, Y1).
simplify(X/Y, X1/Y1) :- simplify(X, X1), simplify(Y, Y1).
This does nothing but recursively traverse the expression. We recursively call simplification on both sides of the operator so that simplification patterns are matched regardless of where they appear in the expression. But at the moment he is not doing anything:
?- simplify(3+X*y, Q).
Q = 3+X*y
. , " " . - , :
simplify(1*X, X1) :- simplify(X, X1).
simplify(X*1, X1) :- simplify(X, X1).
simplify(0+X, X1) :- simplify(X, X1).
simplify(X+0, X1) :- simplify(X, X1).
:
?- simplify(x*1+0, Q).
Q = x
, :
?- simplify(x+(y+(z*43)+0)*1, Q).
Q = x+(y+z*43)
+0 , . :
simplify(_*0, 0).
simplify(0*_, 0).
, :
?- simplify(x+(y+(z*43)+1)*0, Q).
Q = x+0 ;
:
simplify(X*Y+Z*Y, Y1*(X1+Z1)) :-
simplify(X, X1), simplify(Y, Y1), simplify(Z, Z1).
:
?- simplify(34*z+17*z, X).
X = z* (34+17)
?- simplify(34*z+z*17, X).
X = 34*z+z*17
, . . , , , , , . , .
, , , Prolog. Prolog; , , . . , !