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

write("                                             \n"),

cursor(2,0),!.

check(EXP,Rest,NewExp):-

strexp(EXP,Str1),

lstcat(Rest,Str2),

str_len(Str1,LenStr1),

ErrPos = 22 + LenStr1,

cursor(2,ErrPos),

write("^ syntax error"),

cursor(1,22),

concat(Str1,Str2,Str3),

!,

readexp(NewExp,Str3,LenStr1).

tokl(STR,[TOK|TOKL]):fronttoken(STR,TOK,STR1),!,

tokl(STR1,TOKL).

tokl(_,[]).

/*

CLAUSES FOR PARSING OF AN EXPRESSION

*/

s_exp(IL,OL,EXP):-plusexp(IL,OL,EXP).

plusexp(IL,OL,EXP2):multexp(IL,OL1,EXP1),

plusexp1(OL1,OL,EXP1,EXP2).

plusexp1(["+"|IL],OL,EXP1,EXP3):-!,

multexp(IL,OL1,EXP2),

plusexp1(OL1,OL,plus(EXP1,EXP2),EXP3).

plusexp1(["-"|IL],OL,EXP1,EXP3):-!,

multexp(IL,OL1,EXP2),

plusexp1(OL1,OL,minus(EXP1,EXP2),EXP3).

plusexp1(IL,IL,EXP,EXP).

multexp(IL,OL,EXP2):potensexp(IL,OL1,EXP1),

multexp1(OL1,OL,EXP1,EXP2).

multexp1(["*"|IL],OL,EXP1,EXP3):-!,

potensexp(IL,OL1,EXP2),

multexp1(OL1,OL,mult(EXP1,EXP2),EXP3).

multexp1(["/"|IL],OL,EXP1,EXP3):-!,

potensexp(IL,OL1,EXP2),

multexp1(OL1,OL,div(EXP1,EXP2),EXP3).

multexp1(IL,IL,EXP,EXP).

potensexp(IL,OL,EXP2):elmexp(IL,OL1,EXP1),

potensexp1(OL1,OL,EXP1,EXP2).

potensexp1(["^"|IL],OL,EXP1,EXP3):-!,

elmexp(IL,OL1,EXP2),

potensexp1(OL1,OL,potens(EXP1,EXP2),EXP3).

potensexp1(IL,IL,EXP,EXP).

elmexp(["("|IL],OL,EXP):s_exp(IL,OL1,EXP),

front(")",OL1,OL),!.

elmexp(["ln","("|IL],OL,ln(EXP)):s_exp(IL,OL1,EXP),

front(")",OL1,OL),!.

elmexp(["sin","("|IL],OL,sin(EXP)):s_exp(IL,OL1,EXP),

front(")",OL1,OL),!.

elmexp(["cos","("|IL],OL,cos(EXP)):s_exp(IL,OL1,EXP),

front(")",OL1,OL),!.

elmexp(["tan","("|IL],OL,tan(EXP)):s_exp(IL,OL1,EXP),

front(")",OL1,OL),!.

elmexp(["-",TALSTR|IL],IL,flt(FLT)):str_real(TALSTR,FLTp),

FLT = -FLTp.

elmexp([S1,".",S2|IL],IL,flt(FLT)):-concat(S1,".",S3), concat(S3,S2,S4),

str_real(S4,FLT),!.

elmexp([STR|IL],IL,flt(FLT)):-str_real(STR,FLT),!.   

elmexp([NAME|IL],IL,var(NAME)).

front(TOK,[TOK|L],L).

/*

CLAUSE FOR WRITING OF AN EXPRESSION

*/

writeexp(EXP) :strexp(EXP,STR),

write(STR).

/*

CLAUSES FOR REDUCTION OF AN EXPRESSION

*/

doreduce(EXP1,EXP1):-reduce(EXP1,EXP0), EXP1=EXP0, !.

doreduce(EXP1,EXP2):-reduce(EXP1,EXP0), doreduce(EXP0,EXP2), !.

reduce(plus(X,Y),R):- !,

reduce(X,X1),

reduce(Y,Y1),

plusr(X1,Y1,R).

reduce(minus(X,Y),R):-!,

reduce(X,X1),

reduce(Y,Y1),

minusr(X1,Y1,R).

reduce(mult(X,Y),R):-!,

reduce(X,X1),

reduce(Y,Y1),

multr(X1,Y1,R).

reduce(div(X,Y),R):-!,

reduce(X,X1),

reduce(Y,Y1),

divr(X1,Y1,R).

reduce(ln(X),R):-!,

reduce(X,X1),

lnr(X1,R).   

reduce(potens(E,flt(1)),E):-!.

reduce(potens(E,flt(0)),flt(1)):-!.

reduce(R,R).

/*

CLAUSES FOR REDUCTION OF AN ADDITION EXPRESSION

*/

plusr(flt(0),X,X):-!.

plusr(X,flt(0),X):-!.

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

X+Y=Z.

plusr(X,X,mult(flt(2),X)):-!.

plusr(flt(X),Y,Z) :-

X < 0,

T = -X, !,

minusr(flt(T),Y,Z).

plusr(Y,flt(X),Z) :- 

X < 0,

T = -X, !,

minusr(flt(T),Y,Z).

plusr(mult(flt(I),X),X,mult(flt(I1),X)):-!,

I+1=I1.

plusr(X,mult(flt(I),X),mult(flt(I1),X)):-!,

I+1=I1.

plusr(mult(flt(I1),X),mult(flt(I2),X),mult(flt(I3),X)):-!,

I1+I2=I3.

plusr(flt(I),X,plus(X,flt(I))):-!.

plusr(plus(X,flt(I1)),flt(I2),plus(X,flt(I3))):-!,

I1+I2=I3.

plusr(plus(X,flt(I1)),plus(Y,flt(I2)),plus(R,flt(I3))):-!,

I1+I2=I3,

plusr(X,Y,R).

plusr(plus(X,flt(I)),Y,plus(R,flt(I))):-!,

plusr(X,Y,R).

plusr(X,mult(flt(F),Y),minus(X,mult(flt(T),Y))):-F<0, T=-F.

plusr(X,Y,plus(X,Y)).

/*

CLAUSES FOR REDUCTION OF A MINUS EXPRESSION

*/

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

Z=X-Y.

minusr(X,flt(0),X):-!.

minusr(X,X,flt(0)):-!.

minusr(X,flt(I),plus(flt(I1),X)):- !,

I1=-I.

/* Additional rules */

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

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