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),!.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.