我正在写一个小程序,用于计算列表中有多少个元素不是数字。以下是我的代码:
如果我执行以下代码:
我发现 R = 0(正如应该的那样)。
但是如果我将一个字符放入列表中:
然后我遇到了这个错误:
not_number([],0).
not_number([X|T],R):-
not(number(X)),
R1 is R+1,
not_number(T,R1).
not_number([_|Tail],Result):-
not_number(Tail,Result).
如果我执行以下代码:
?- not_number([1,2,3,5], R).
我发现 R = 0(正如应该的那样)。
R = 0.
但是如果我将一个字符放入列表中:
?- not_number([1,2,3,5,a], R).
然后我遇到了这个错误:
ERROR: not_number/2: Arguments are not sufficiently instantiated
Exception: (10) not_number([a], _G247) ?
有人能解释一下这段代码有什么问题吗?我是Prolog的新手。
not_number([a], R)
这种情况下,你执行了R1 is R+1
,但是R
并没有被实例化。你的递归情况有点颠倒了。你应该执行not_number(T, R1), R is R1+1
。 - lurkeris
的好讨论。 - Yibo Yang