Skip to content

Instantly share code, notes, and snippets.

@shawntan
Created September 13, 2011 16:11
Show Gist options
  • Save shawntan/1214228 to your computer and use it in GitHub Desktop.
Save shawntan/1214228 to your computer and use it in GitHub Desktop.
See the parse tree rotation portion at the bottom.
%simplify(X,Y).
sterms(N+M,S):- number(N),number(M),S is N+M,!.
sterms(N-M,S):- number(N),number(M),S is N-M,!.
sterms(N+(-M),S):- number(N),number(M),S is N-M,!.
sterms(X,Y) :-
X =.. [Op,L,R],sterms(L,LR),sterms(R,RR),
X1 =.. [Op,LR,RR],tr(X1,Op1,LR1,LR2),
X2 =.. [Op1,LR1,LR2],sterms(X2,Y),!.
sterms(X-Y,XR-YR) :- sterm(X,XR),sterm(Y,YR).
sterms(X+Y,YR+XR) :- sterm(X,XR),sterm(Y,YR).
sterms(X+Y,XR+YR) :- sterms(X,XR),sterm(Y,YR).
sterms(X+Y,YR+XR) :- sterm(X,XR),sterms(Y,YR).
sterms(X-Y,XR-YR) :- sterms(X,XR),sterm(Y,YR).
sterms(X-Y,-XR+YR) :-sterm(X,XR),sterms(Y,YR).
tr(L+(R1+R2),+, L+R1, R2).
tr(L+(R1-R2),-, L+R1, R2).
tr(L-(R1+R2),-, L-R1, R2).
tr(L-(R1-R2),+, L-R1, R2).
tr(L+(R1+N) ,+, L+N, R1) :- number(N).
tr(L+(R1-N) ,+, L-N, R1) :- number(N).
tr(L-(R1+N) ,-, L-N, R1) :- number(N).
tr(L-(R1-N) ,-, L+N, R1) :- number(N).
tr(X-N ,+, -N, X) :- number(N).
tr(X+N ,+, N, X) :- number(N).
tr(-(X+Y) ,-, -X, Y).
tr(-(X-Y) ,-, Y, X).
tr(X-(-Y) ,+, X, Y).
sterm(0*_,0).
sterm(_*0,0).
sterm(X*Y,XR*Y) :-sterm(X,XR),(atom(Y);number(Y)).
sterm(X*Y,Res) :-
sterm(X,XR),sterm(Y,YR),
tx(XR*YR,L,R),
sterm(L*R,Res).
sterm(1*X,Y) :- sterm(X,Y).
sterm(X*1,Y) :- sterm(X,Y).
sterm(X,X) :- atom(X).
tx(X*(Y*Z),X*Y,Z).
expand(Xs + X, EXs + EX) :- expand(Xs,EXs),expand(X,EX).
expand(Xs*X*Y, R) :- expand(X*Y,XY),expand(Xs*XY,R).
expand((Xs+X)*Y,RR+LR) :- expand(X*Y,LR),expand(Xs*Y,RR).
expand((Xs-X)*Y,RR-LR) :- expand(X*Y,LR),expand(Xs*Y,RR).
expand(Y*(Xs+X),R) :- expand((Xs+X)*Y,R).
expand(Y*(Xs-X),R) :- expand((Xs+X)*Y,R).
expand(X,X).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment