val(X,N) :- expr(X,[],N). expr(S1,S2,N):-term(S1,S3,N1), plus(S3,S4), expr(S4,S2,N2), N is N1+N2. expr(S1,S2,N):- term(S1,S2,N). term(S1,S2,N):- factor(S1,S3,N1), times(S3,S4), term(S4,S2,N2), N is N1*N2. term(S1,S2,N) :- factor(S1,S2,N). factor(S1,S2,N) :- num(S1,S2,N). factor(S1,S2,N) :- left_p(S1,S3),expr(S3,S4,N), right_p(S4,S2). plus([P|S],S):- "+"= [P]. times([T|S],S):- "*" = [T]. left_p([L|S],S):- "(" = [L]. right_p([R|S],S):- ")" = [R]. num(S1,S2,N):- headMembers(S1,S2,"0123456789",N1), name(N,N1). headMembers([],[],_,[]):- !. headMembers([X|Y],Z,S,[X|W]) :- member(X,S),!,headMembers(Y,Z,S,W). headMembers(X,X,_,[]). member(X,[X|_]):- !. member(X,[_|Y]):- member(X,Y).