vicky
vicky

Reputation: 41

Arithmetic expression in prolog solving

given an expression: (x*0+6)*(x-x+3+y*y) and value of y:2 the Predicate should give only one

solution (x*0+6)*(x-x+3+4).

when 6*(3+x*x) and x:2 is given then it should give the output 42 . I have been coding for hours and i could manage to get only the second part of it .my code is posted below .can some one help me with solution .

partial_eval(Expr0, Var,Val, Expr) :-
   evaluate(Expr0,[Var:Val],Expr).

evaluate(Exp, LstVars, Val) :-
   analyse(LstVars, Exp, NewExp),
   Val is NewExp.

analyse(LstVars, Term,R) :-
   functor(Term, Term, 0), !,
   (   member(Term : V, LstVars)
   ->  R = V
   ;   R = Term ).
analyse(LstVars, Term, V) :-
   functor(Term, Name, _),
   Term =.. [Name | Lst],
   maplist(analyse(LstVars), Lst, LstV),
   V =.. [Name|LstV].

Upvotes: 4

Views: 818

Answers (1)

river
river

Reputation: 1028

This problem can be broken down into two: One is substituting in values for variables. The other is recursively evaluating arithmetic subexpressions. Prolog is nondeterministic but both of these operations are deterministic, so that's something to keep in mind while implementing them.

You seem to have a good generic recursion structure (using =..) for the substitution part. For the arithmetic evaluation part you may find it easier to use + and * terms in the recursion. Hope that helps you get started, ask if you get stuck and need more advice.

Upvotes: 1

Related Questions