Изучение основных способов представления математических проблем в символьном виде, пригодном для формальной обработки на компьютере, страница 6

minusr(X,mult(Y,flt(F)),R):-F<0, F1=-F, plusr(X,mult(flt(F1),Y),R),!.     

/* End */     

minusr(X,Y,minus(X,Y)).

/*

CLAUSES FOR REDUCTION OF A MULTIPLICATION EXPRESSION

*/

multr(flt(X),flt(Y),flt(Z)):-!,

X*Y=Z.

multr(flt(0),_,flt(0)):-!.

multr(_,flt(0),flt(0)):-!.

multr(flt(1),X,X):-!.

multr(X,flt(1),X):-!.

multr(M,plus(X,Y),plus(X1,Y1)):-!,  

multr(M,X,X1),multr(M,Y,Y1).

multr(M,minus(X,Y),minus(X1,Y1)):-!,

multr(M,X,X1),multr(M,Y,Y1).

multr(plus(X,Y),M,plus(X1,Y1)):-!,

multr(M,X,X1),multr(M,Y,Y1).

multr(minus(X,Y),M,minus(X1,Y1)):-!,

multr(M,X,X1),multr(M,Y,Y1).

multr(mult(flt(I1),X),flt(I2),M1):-!,

I1*I2=I3,

multr(flt(I3),X,M1).

multr(flt(I1),mult(flt(I2),X),M1):-!,

I1*I2=I3,

multr(flt(I3),X,M1).

multr(mult(flt(I1),X),mult(flt(I2),Y),mult(flt(I3),R)):-!,

I1*I2=I3,

multr(X,Y,R).

multr(mult(flt(I),X),Y,mult(flt(I),R)):-!,

multr(X,Y,R).

multr(X,flt(I),mult(flt(I),X)):-!.

multr(var(i),var(i),flt(-1)):-!.

multr(var(i),X,R):-multr(X,var(i),R),!.

multr(mult(X,var(i)),var(i),M1):-!,

multr(flt(-1),X,M1).

multr(var(i),mult(X,var(i)),M1):-!,

multr(flt(-1),X,M1).

multr(mult(X,var(i)),mult(Y,var(i)),mult(flt(-1),R)):-!,

multr(X,Y,R).

multr(mult(X,var(i)),Y,mult(R,var(i))):-!,

multr(X,Y,R).

multr(var(i),X,mult(X,var(i))):-!.

multr(potens(X,flt(I1)),potens(X,flt(I2)),potens(X,flt(I3))):-!,

I3=I1+I2.

multr(X,potens(X,flt(I)),potens(X,flt(I1))):-!,

I1=I+1.

multr(potens(X,flt(I)),X,potens(X,flt(I1))):-!,

I1=I+1.

multr(X,X,potens(X,flt(2))):-!.

multr(tan(X),cos(X),sin(X)):-!.

multr(cos(X),tan(X),sin(X)):-!.

multr(X,Y,mult(X,Y)).

/*

CLAUSES FOR REDUCTION OF A DIVISION EXPRESION

*/

divr(flt(0),_,flt(0)):-!.

divr(X,flt(F),Y):-F<>0, Z=1/F, multr(flt(Z),X,Y),!.

divr(flt(X),flt(Y),flt(Z)):-Y<>0, Z=X/Y, !.

divr(_,flt(0),var("'endless'")):-!,

write("division by zero"),nl.

divr(X,flt(1),X):-!.

divr(sin(X),cos(X),tan(X)):-!.

divr(X,Y,div(X,Y)).

/*

CLAUSES FOR REDUCTION OF A LOGARITHM EXPRESSION

*/

lnr(flt(0),var("endless")):-!,

write("logarithm error"),nl.

lnr(flt(1),flt(0)):-!.

lnr(X,ln(X)).

/*

CLAUSES FOR CONVERTING AN EXPRESSION TO A STRING

*/

% Taken from the old writeexp clauses

strexp(var(NAME),NAME).

strexp(flt(FLT),FLTSTR) :- FLT<0, str_real(S,FLT), concat("(",S,S1),

concat(S1,")",FLTSTR),!.

strexp(flt(FLT),FLTSTR) :str_real(FLTSTR,FLT).

strexp(ln(EXP),STR)  :strPAR(EXP,STRp),

concat("ln",STRp,STR).

strexp(sin(EXP),STR) :-

strPAR(EXP,STRp),

concat("sin",STRp,STR).

strexp(cos(EXP),STR) :-

strPAR(EXP,STRp),

concat("cos",STRp,STR).

strexp(tan(EXP),STR) :-

strPAR(EXP,STRp),

concat("tan",STRp,STR).

strexp(atan(EXP),STR) :-

strPAR(EXP,STRp),

concat("arctan",STRp,STR).     

strexp(asin(EXP),STR) :-

strPAR(EXP,STRp),

concat("arcsin",STRp,STR).     

strexp(sec(EXP),STR) :-

strPAR(EXP,STRp),

concat("sec",STRp,STR).

strexp(abs(EXP),STR) :strexp(EXP, S0),

concat("|",S0,S1),

concat(S1,"|",STR).   

strexp(plus(EXP1,EXP2),STR):strexp(EXP1,STR1),

concat(STR1,"+",STR3),

strexp(EXP2,STR2),

concat(STR3,STR2,STR).

strexp(minus(EXP1,EXP2),STR):strexp(EXP1,STR1),

concat(STR1,"-",STR3),

strMINUS(EXP2,STR2),

concat(STR3,STR2,STR).

strexp(mult(EXP1,EXP2),STR):strMINUS(EXP1,STR1),

concat(STR1,"*",STR3),

strMULT(EXP2,STR2),

concat(STR3,STR2,STR).

strexp(div(EXP1,EXP2),STR):strMULT(EXP1,STR1),

concat(STR1,"/",STR3),

strDIV(EXP2,STR2),

concat(STR3,STR2,STR).

strexp(potens(EXP1,EXP2),STR):strDIV(EXP1,STR1),

concat(STR1,"^",STR3),

strPOTENS(EXP2,STR2),

concat(STR3,STR2,STR).

strPOTENS(div(X,Y),STR):-!,strPAR(div(X,Y),STR).

strPOTENS(X,STR):-strDIV(X,STR).

strDIV(mult(X,Y),STR):-!,strPAR(mult(X,Y),STR).

strDIV(X,STR):-strMULT(X,STR).

strMULT(minus(X,Y),STR):- !,strPAR(minus(X,Y),STR).