% COSC 2P93 Assignment 4 % Winter 2013 % B. Ross % Q1: expression simplifier % simp(A, S) simplifies expression A, resulting in S. % Not guaranteed to be the simplest expression! simplify(E, F) :- simp(E,F), !. simp(X, A) :- X =.. [Op, E, F], is_an_operator(Op), simp(E, E2), E \= E2, !, Y =.. [Op, E2, F], simp(Y, A). simp(X, A) :- X =.. [Op, E, F], is_an_operator(Op), simp(F, F2), F \= F2, !, Y =.. [Op, E, F2], simp(Y, A). simp(X+0, X). simp(0+X, X). simp(1*X, X). simp(X*1, X). simp(0*_, 0). simp(_*0, 0). simp(-1*X, -X). simp(X^1, X). simp(_^0, 1). simp(-(-X), X). simp(N+M, R) :- number(N), number(M), R is N+M. simp(N-M, R) :- number(N), number(M), R is N-M. simp(N*M, R) :- number(N), number(M), R is N*M. simp(N/M, R) :- number(N), number(M), M\=0, R is N/M. simp(E, E). is_an_operator('+'). is_an_operator('-'). is_an_operator('/'). is_an_operator('*'). is_an_operator('^'). % ------------------------------------------------------------------------ % Symbolic differentiation example. % From "Programming in Prolog", Clocksin & Mellish, 4e, pp. 165-167 /* These are differentiation rules, found in any intro calculus text: dc/dx -> 0 dx/dx -> 1 d(-U)/dx -> -(dU/dx) d(U+V)/dx -> dU/dx + dV/dx D(U-V)/dx -> dU/dx - dV/dx d(cU)/dx -> c(dU/dx) d(UV)/dx -> U(dV/dx) + V(dU/dx) d(U/V)/dx -> d(UV(^-1))/dx d(U^c)/dx -> cU^(c-1) (dU/dx) d(loge U)/dx) -> U^(-1)(dU/dx) */ ?- op(300, yfx, '^'). d(X, X, 1) :- !. d(C, _, 0) :- atomic(C). d(-U, X, -A) :- d(U,X,A). d(U+V, X, A+B) :- d(U,X,A), d(V,X,B). d(U-V, X, A-B) :- d(U,X,A), d(V,X,B). d(C*U, X, C*A) :- atomic(C), C\=X, d(U,X,A), !. d(U*V, X, B*U+A*V) :- d(U, X, A), d(V, X, B). d(U/V, X, A) :- d(U*V^(-1), X, A). d(U^C, X, C*U^(C-1)*W) :- atomic(C), C\=X, d(U, X, W). d(log(U), X, A*U^(-1)) :- d(U,X,A). % ?- d(2*x - 3*(x^2)/log(2*x), x, A).