Symbolic vs. Numeric Computation - Polynomials

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Symbolic vs. Numeric Computation - Polynomials %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Nicolaie Popescu-Bodorin, 2009 % http://fmi.spiruharet.ro/bodorin/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Prolog, TP 2.0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DOMAINS i=integer r=real lr=r* li=i* c=real % coefficient v=string % symbolic variable p=integer % power mon=m(real,integer) % monomial monom=mon* poly=mon* % polynomial PREDICATES cinmon(monom) % read a monomial in console cinpoly(poly) % read a polynomial in console cinpoly(integer,poly,poly) continue(poly,integer) % end or continue to read with cinpoly liststopoly(lr,li,poly) % from two lists to a polynomial and conversely pow(r,i,r) % natural power of a real number pow(r,i,r,r) polyfeval(poly,r,r) % evaluate a polynomial function in a given point polyfeval(poly,r,r,r) CLAUSES % Read a monomial in console: cinmon(M):- write("Give a coefficient:"),readreal(C),nl, write("Give an exponent:"),readint(P),nl, M = [m(C,P)], write("Your monomial is: "),nl, %write(C),write("X"),write(P),nl, write(M),nl. % Read a polynomial in console (symbolic computation): cinpoly(P):-write("Give a polynomial."),nl, cinpoly(1,[],P). cinpoly(0,Ri,Ri):- write("Your polynomial is: "),nl, write(Ri),nl. cinpoly(1,Ri,R):- cinmon([M]), continue([M|Ri],Fa), cinpoly(Fa,[M|Ri],R). % End a reading (cinpoly): continue(Ri,B):- write("Until now, your polynomial is: "),nl, write(Ri),nl, write("Do you want to continue?[1/0]"),readint(B). % Convert two lists (coefficients and exponents) % into a polynomial and conversely (symbolic computation): % usage: (i,i,o),(o,o,i) - (lr,li,poly) liststopoly([],[],[]). liststopoly([HC|TC],[HE|TE],[m(HC,HE)|T]):- liststopoly(TC, TE, T). % Evaluate a polynomial function at a given point % (converting a symbolic expression to a number, giving a numerical meaning to a symbolic expression): % usage: (i,i,o) - (poly,real,real) polyfeval([m(C,E)],X,R):-pow(X,E,P),R=C*P,!. polyfeval(P,X,R):-polyfeval(P,X,0,R). polyfeval([],_,Ri,Ri). polyfeval([H|T],X,Ri,R):- polyfeval([H],X,RH), Ria=Ri+RH, polyfeval(T,X,Ria,R). % natural power of a real number: % usage: (i,i,o) - (real,integer,real) pow(_,0,1):-!. pow(X,N,R):-pow(X,N,1,R). pow(_,0,Ri,Ri). pow(X,N,Ri,R):-N>0,Na=N-1,Ria=Ri*X,pow(X,Na,Ria,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Homework assignment: % Implement sum, product, and derivation of polynomials. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%