这是我遇到的麻烦测试评价的问题。 你怎么写的方法来评估与运营商的代数表达式plus
, minus
和times
。 下面是一些测试查询:
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.
是一个非常好的开始: (+ (* 4 2) (* 3 (- 4 2))) = 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的代码。 但当然我们真正的意思, 很明显 ,是
simplify(A,V,L):- atom(A), getVal(A,L,V).
simplify(C,V,L):- compound(C), C =.. [F|T],
maplist( simp(L), T, VS), % get the values of subterms
calculate( F, VS, V). % calculate the final result
simp(L,A,V):- simplify(A,V,L). % just a different args order
等getVal/3
将需要从某种方式检索值L
列表, calculate/3
实际执行的计算中,给定的一个象征性的操作名称和计算值的列表。
研究maplist/3
和=../2
。
(没有完成,未测试)。
OK, maplist
是矫枉过正,因为是=..
:所有的条款可能会是这样的形式op(A,B)
所以定义可以简化为
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 ...
最后一种可能性是, 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])
这应该是一个简单的事情来实现。