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最好把这个问题作为一个新问题来问。