计算构建列表的检查次数

时间:2013-12-29 22:47:01

标签: prolog

当我计算检查次数以构建列表时,我出错了。

这是我的代码:

  find(_R1, _R2, [], [],0).
  find(R1, R2, [[Mark, CName] | T], L,N) :-
     (  (R1 =< Mark, Mark =< R2),N is N+1
     -> L = [CName | L1]
     ;  L = L1
     ),
     find(R1, R2, T, L1,N).

我收到以下错误:

ERROR: is/2: Arguments are not sufficiently instantiated.

1 个答案:

答案 0 :(得分:0)

N是N + 1在Prolog中总是假的,Prolog不是C,你必须写N1是N + 1,因为当N与一个值统一时,它不能被改变,所以N永远不等于N + 1。 你的代码必须这样写,必须在N的演算之前调用递归。

find(_R1, _R2, [], [],0).

find(R1, R2, [[Mark, CName] | T], L,N):-
  find(R1, R2, T, L1,N1),
  ( (R1 =< Mark, Mark =< R2)
   ->  L = [CName | L1],N is N1+1
   ;   L = L1, N = N1).

[编辑]在你的帖子中,当你调用N是N + 1时N没有值,因为N在 find(R1,R2,T,L1,N)的调用返回后得到一个值