Prolog - 用值替换原子并进行评估

时间:2014-03-02 06:34:42

标签: prolog

鉴于

Result = 4* (3*x)^3*3,

VarValue = x:2,

如何获得以下输出

Value = 2592 ;

如果我必须定义以下谓词:

evaluate(Result,Value,VarValue)

我尝试了以下操作:

evaluate(Result, Value, VarValue) :- member(VarValue, [x:X]).

试图用X代替等式......我想不出一个很好的方法去那里。

编辑:有没有办法只使用以下内置谓词:

 //, /, +, -, ^, *,=..,>, <,
 atom, is_list, functor, arg, integer, number, member, append

3 个答案:

答案 0 :(得分:2)

我认为joel76解决方案可以更加紧凑:

exp_symbols(Symbols, Expr, WithSym) :-
    Expr =.. [F|Args],
    ( memberchk(F:V, Symbols) -> G = V ; G = F ),
    maplist(exp_symbols(Symbols), Args, ArgsSWithSym),
    WithSym =.. [G|ArgsSWithSym].

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

答案 1 :(得分:1)

您可以使用= ..:

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].

例如:

?- evaluate(4* (3*x)^3*y, [x:2, y:(-3)], L). 
L = -2592.

?- evaluate(4* (3*x)^3*3, [x:2], L). 
L = 2592.

编辑我删除成员(术语:(V),LstVars) - &gt; R =(V)没用。

答案 2 :(得分:0)

这是让你入门的东西。它只支持加法和减法,没有大括号。添加更多操作是微不足道的,添加括号支持更加棘手。

evaluate(X, X, _) :- number(X).
evaluate(Var, Val, Var:Val).
evaluate(A-B, Val, VarVal) :-
    evaluate(A, Aval, VarVal),
    evaluate(B, Bval, VarVal),
    Val is Aval - Bval.
evaluate(A+B, Val, VarVal) :-
    evaluate(A, Aval, VarVal),
    evaluate(B, Bval, VarVal),
    Val is Aval + Bval.

我们试一试:

?- evaluate(2+2, Result, x:10).
Result = 4 

?- evaluate(2+x, Result, x:10).
Result = 12 

?- evaluate(2+x-34+x, Result, x:10).
Result = -12