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.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%