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

时间:2016-11-20 14:58:02

标签: prolog instantiation-error

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

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

1 个答案:

答案 0 :(得分: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.