prolog求解中的算术表达式

prolog求解中的算术表达式,prolog,Prolog,给出一个表达式: (x*0+6)*(x-x+3+y*y)和y:2的值,谓词应该只给出一个 解决方案(x*0+6)*(x-x+3+4)。 当给出6*(3+x*x)和x:2时,它应该给出输出42。 我已经写了几个小时了,我只能设法得到它的第二部分。我的代码贴在下面。有人能帮我解决吗 partial_eval(Expr0, Var,Val, Expr) :- evaluate(Expr0,[Var:Val],Expr). evaluate(Exp, LstVars, Val) :- an

给出一个表达式:
(x*0+6)*(x-x+3+y*y)
和y:2的值,谓词应该只给出一个

解决方案
(x*0+6)*(x-x+3+4)。

当给出
6*(3+x*x)和x:2时,它应该给出输出42。
我已经写了几个小时了,我只能设法得到它的第二部分。我的代码贴在下面。有人能帮我解决吗

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

这个问题可以分为两个方面:一个是用值替换变量。另一种是递归计算算术子表达式。Prolog是不确定的,但这两个操作都是确定的,所以在实现它们时要记住这一点


对于替换部分,您似乎有一个很好的通用递归结构(使用=…)。对于算术计算部分,您可能会发现在递归中更容易使用+和*项。希望这能帮助您入门,询问您是否陷入困境并需要更多建议。

您如何调用代码?你期望的和你看到的相比是什么?我可能更喜欢使用
component/1
atomic/1
来区分我的案例,而不是functor/3。我想你期待的是
x+1+y+2=。。V
来统一
V=[+,x,1,y,2]
,但不幸的是它反而产生
V=[+,x+1+y,2]
;这是问题的一部分吗?也许在
analysis/3
的第二条规则中,您需要递归调用
analysis/3
。您找到问题的解决方案了吗?您好,您能提供一些关于如何继续解决问题的代码吗?我有一个几乎相似的问题要解决。@Katherine最好把这个问题作为一个新问题来问。