Prolog 参数未充分实例化(计算列表长度的函数)

Prolog arguments are not sufficiently instantiated (function which calculates list length)

我制作了一个计算列表长度的函数。下面是我的代码。

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH).
solve([], _).
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD).

当我运行这段代码输入

?- listLength([1, 2, 3, 4, 5, 6, 7]).

然后,解释器向我显示了错误消息 solve/2 : Arguments are not sufficiently instantiated.

当我修改上面的代码时,如下所示。

listLength(LIST) :- LENGTH is 0, solve(LIST, LENGTH), write(LENGTH).
solve([], _).
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD).

当我运行这段代码输入相同时,总是0被写入。

我想计算LENGTH,我想使用listLength函数中的变量。

我怎么了? (请注意,我使用的是 swi-prolog。)

第一个错误是在基本情况下。而不是 solve([], _). 你应该写 solve([], 0). 因为如果你不知道空列表的长度你将如何递归地找到更大的列表。

还有一个问题:

solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD).

当尝试计算 ADD 是 LENGTH + 1 时,长度未被实例化计算。您需要更改顺序,例如:

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH).
solve([], 0).
solve([_|T], LENGTH) :- solve(T, ADD), LENGTH  is ADD+ 1.

正在查询:

?- listLength([1, 2, 3, 4, 5, 6, 7]).
7
true.