鉴于
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
答案 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