/* packax.
Packing and Unpacking Rewrite Rules
Alan Bundy 13.5.81 */

/* Unpack Rules */

unpackax((U+V)^2, U^2 + 2*U*V + V^2).

unpackax((U+V)^3, U^3 + 3*U^2*V + 3*U*V^2 + V^3).

unpackax((U+V)^4, U^4 + 4*U^3*V + 6*U^2*V^2 + 4*U*V^3 + V^4).

unpackax(U*V*W*(V+W), U*V^2*W + U*V*W^2).	/* Nasty hack!! Improve matcher */

unpackax(U*(V+W), U*V + U*W).

unpackax(U*(1+W), U + U*W).

unpackax(2*U, U + U).

unpackax(3*U, U + U + U).

unpackax(4*U, U + U + U + U).

unpackax(U^2, U * U).

unpackax(U^3, U * U * U).

unpackax(U^4, U * U * U * U).

/* Pack is Unpack backwards */
packax(X,Y) :- !, unpackax(Y,X).
