测试术语N是一个数字还是一个原子计算,如果它在prolog中的数字

时间:2015-10-08 07:34:20

标签: prolog expression

我在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.

1 个答案:

答案 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
   ).