【问题标题】:Prolog arguments are not sufficiently instantiated (function which calculates list length)Prolog 参数没有充分实例化(计算列表长度的函数)
【发布时间】:2016-11-20 14:58:01
【问题描述】:

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

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

【问题讨论】:

    标签: prolog instantiation-error


    【解决方案1】:

    第一个错误是在基本情况下。而不是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.
    

    【讨论】:

    • 这对于像listLength(L, 10000)这样的查询来说非常慢
    • 你怎么能查询它,因为它只需要一个参数列表??
    • 你是对的!我只看到最后的补充。应该读 solve(L, 100000 但我承认,这不会发生。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多