2016-11-20 60 views
1

我做了一个计算列表长度的函数。以下是我的代码。Prolog参数没有被充分实例化(计算列表长度的函数)

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

当运行此代码具有相同的输入,则总是被写入。

我想计算LENGTH,并且我想在listLength函数中使用该变量。

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

回答

0

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

还存在另一个问题:

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

尝试计算ADD时长+ 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. 
+0

这是像'listLength(L,10000)查询很慢' – false

+0

你怎么能查询,由于只需要一参数列表? – coder

+1

你是对的!我只看到最后的加法。应该读'解决(L,100000'我承认,这不会发生。 – false

相关问题