我做了一个计算列表长度的函数。以下是我的代码。
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。)
答案 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.