Prolog 代数表达式的求值

Prolog 代数表达式的求值,prolog,Prolog,这是一个我遇到麻烦的考试复习问题。如何使用运算符plus编写计算代数表达式的方法, 减和次。以下是一些测试查询: simplify(Expression, Result, List) ?- simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]). V = 14 ?- simplify(times(2,plus(a,b)),Val,[a:1,b:5]). Val = 12 ?- simpl

这是一个我遇到麻烦的考试复习问题。如何使用运算符
plus
编写计算代数表达式的方法,
。以下是一些测试查询:

simplify(Expression, Result, List)

?- simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]).
          V = 14

?- simplify(times(2,plus(a,b)),Val,[a:1,b:5]).
          Val = 12

?- simplify(times(2,plus(a,b)),Val,[a:1,b:(-5)]).
          Val = -8 .
我得到的只是这些示例查询,没有其他解释。但是我很确定这个方法应该分解第一个参数,它是代数表达式,用x和y替换第三个参数(列表)中的值。第二个参数应该是计算表达式后的结果

我认为其中一种方法应该是
simplify(V,Val,L):-member(V:Val,L)。

理想情况下,应该只有4种以上的方法。。。但我不知道该怎么做。

从小事做起,把你知道的写下来

simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]):- V = 14.
这是一个非常好的开始:
(+(*42)(*3(-42))=8+3*2=14
。但是,当然

simplify(times(x,y),V,[x:4,y:2]):- V is 4*2.
甚至更好。而且

simplify(minus(x,y),V,[x:4,y:2]):- V is 4-2.
simplify(plus(x,y),V,[x:4,y:2]):- V is 4+2.
simplify(x,V,[x:4,y:2]):- V is 4.
所有完美的Prolog代码。当然,我们真正的意思是,很明显

等。
getVal/3
将需要以某种方式从
L
列表中检索值,并
calculate/3
以实际执行计算,给定符号操作名称和计算值列表

学习和学习

(未完成,未测试)


好的,
maplist
是一种过分的手段,就像
=…
一样:你所有的术语可能都是
op(A,B)
的形式。因此,定义可以简化为

最后一种可能性是,
x
y
等,满足
atom/1

simplify(A,V,L):-
  atom(A),
  retrieve(A,V,L).

因此,来自上述子句的最后一个调用可能看起来像
retrieve(x,V,[x:4,y:3])
,也可能看起来像
retrieve(y,V,[x:4,y:3])
。实现起来应该很简单。

您编写过可以显示的代码吗?这个社区的做法不是为人们编写代码。@Brad,除了我写的一种方法之外,没有。这是一个测试回顾问题,对于如何进行这项工作仍然感到困惑。我想起来越来越困惑。。。如果朝着正确的方向推进,您将非常感激。您将希望使用左表达式树和右表达式树递归调用simplify,并使用结构名称(times、plus等)适当地组合这些值。您将把变量列表传递给每个调用。这就是我能从评论框中给出的所有提示。
simplify(plus(A,B),V,L):-
  simplify(A,V1,L),
  simplify(B,V2,L),
  V is V1 + V2.         % we add, for plus

simplify(minus(A,B),V,L):-
  % fill in the blanks
  .....
  V is V1 - V2.         % we subtract, for minus

simplify(times(A,B),V,L):-
  % fill in the blanks
  .....
  V is .... .           % for times we ...

simplify(A,V,L):-
  number(A),
  V = .... .            % if A is a number, then the answer is ...
simplify(A,V,L):-
  atom(A),
  retrieve(A,V,L).