我在prolog中做了一个算术表达式。谓词就像表达式(expr,_Val,_Var,N)。如果我测试
- ?表达(Y *(1 + Y * Y),3,Y,R)
结果将是
R = 30
找工作了。但如果我想测试
? - 表达式(x *(1 + y * y),3,y,R)
结果将是
R = X * 10
但它对我不起作用。似乎我必须测试N这个术语是一个数字还是一个原子。如果数字它会计算,否则它应该保留在输出中的情况R = x * 10我很高兴有人可以帮助我。
代码是这样的:
type(N) :-
functor(N,_,_),
number(N).
expression(V,Val,V,Val).
expression(expr, Val, _Var, N).
expression(N, _Var, _Val, N) :-
type(N).
expression(A*B, Var,Val, R) :-
expression(A, Var, Val, RA),
expression(B, Var, Val, RB),
R is RA*RB.
expression(A+B, Var,Val, R) :-
expression(A, Var, Val, RA),
expression(B, Var, Val, RB),
R is RA+RB.
答案 0 :(得分:1)
此
expression(expr, Val, _Var, N).
似乎完全没用。它只是“规范空间”的一部分,而不是“解决方案空间”,只是说。
在通过is / 2进行评估之前,您应该检查递归计算的子表达式是否为数字:
expression(A+B, Var,Val, R) :-
expression(A, Var, Val, RA),
expression(B, Var, Val, RB),
( number(RA), number(RB) ->
R is RA+RB
; R = RA+RB
).