gpt4 book ai didi

list - 使用 Prolog 折叠添加列表中的所有项目

转载 作者:行者123 更新时间:2023-12-02 13:40:21 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数以递归方式添加列表中的前两项,并在剩余一项时返回。示例:

addList([1,2,3,4], X) 
x = [10]

(这里的步骤是:[1,2,3,4] -> [3,3,4] -> [6,4] -> [10] )

这就是我所拥有的:

addList([],[]).
addList([H|[H2|T]], []) :- L is H+H2, addList(T, [L|T]).
addList([H|T], [H2|_]) :- L is H+H2, addList(T, [L|T]).

在我看来,这会执行如下操作:

addList([1,2,3,4], X).
L=1+2 --> addList([3,4], [3,3,4])
L=3+3 --> addList([4], [6, 4])
L=6+4 --> addList([], [10])

这实际上会导致错误 - “参数没有充分实例化”

如果我将第一个 addList 放入 addList([],[_]). 中,它将首先输出 X = [] .,然后输出相同的内容如果我使用 ; 继续,则会出错。它应该以 false 结尾。

(在具有 X = [1,2,3,4] ; X = [3,3,4] ; X = [6,4] ; X = [10] ; false 的链之后。

最佳答案

首先,请注意,您可以将 [H|[H2|T]] 等同于 [H,H2|T]

此外,据我所知,Prolog 中的首选样式是使用 snake_case 而不是 camelCase

add_list([H1,H2|T], []) :- ...

在上面的子句中,您已经将第二项与空列表统一起来,... 中发生的情况只是检查关系是否成立的一种方法。正文中出现的L只是一个局部变量;同样,对 add_list 的递归调用不用于计算“结果”(第二个参数)。

您希望结果始终是包含值总和的单例列表,除非列表为空(在这种情况下结果为空)。基本情况是:

add_list([], []).
add_list([N], [N]).

一般情况必然是这样的:

add_list([H1,H2|T], [Sum]) :- ...

并且您必须用 H1H2TSum 来表达递归关系。事实上,在达到基本情况之前,您可能只会不加修改地传递第二个参数,因此您不需要显式编写 [Sum] ,您可以只编写 Res:

add_list([H1,H2|T], Res) :-
...,
add_list(..., Res).

关于list - 使用 Prolog 折叠添加列表中的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58985904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com