Ghost
Ghost

Reputation: 407

Compute addition and subtraction of an arithmetic expression without 'is'

How can I find the result of an arithmetic expression composed of pluses and minuses without using 'is'?

For example, to find the result of 1+2+3+4-6, I do: X is 1+2+3+4-6 and I get: X = 4.

What I've tried so far:


    eval(EXPR, EXPR) :- 
        integer(EXPR), 
        !.
    eval(X+Y, RES) :- 
        eval(X, X1), 
        eval(Y, Y1), 
        plus(X1, Y1, RES).
    eval(X-Y, RES) :- 
        eval(X, X1), 
        eval(Y, Y1), 
        Y2 = -Y1, 
        plus(X1, Y2, RES).

but when I try to compute an expression containing negative numbers, I get the error: `integer' expected, found `- number` (a compound).

How can I solve it?

Upvotes: 1

Views: 88

Answers (1)

tiffi
tiffi

Reputation: 683

Add plus(Y1,Y2,0) instead of Y2 = -Y1.

In the latter case, Y2 is a structure with functor - and Argument Y1, whereas in the former case, Y1 is a number.

Take Y1 = 3 for example. [Just for fun: try it with Y1 = -3]

?- Y1 = 3, Y2 = -Y1, Y2 =.. L.
Y1 = 3,
Y2 = - 3,
L = [-, 3].

?- Y1 = 3, plus(Y1,Y2,0), Y2 =.. L.
Y1 = 3,
Y2 = -3,
L = [-3].

However, Y2 is supposed to be an argument in the predicate plus/3, which does not allow structures as arguments.

Maybe you prefer this solution:

eval(X-Y, RES) :- 
    eval(X, X1), 
    eval(Y, Y1), 
    plus(Y1, RES, X1).

Upvotes: 2

Related Questions