1

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

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。)

4

1 回答 1

0

第一个错误是在基本情况下。而不是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.
于 2016-11-20T15:10:14.490 回答