【发布时间】:2020-09-27 18:42:54
【问题描述】:
标题说明了一切,但我们又来了。尝试以递归方式附加到 Prolog 中的列表,虽然我之前已经通过“临时缓冲区”(通过 nb_setval/nb_getval)使其工作,但我想学习如何以稍微更合适的方式递归地附加到列表。
我知道 Prolog 可以在所有绑定中工作,一旦绑定了某些东西就很难操作它,所以一开始我就坐在那里,但我明白为什么这不起作用:
recursiveAppend([], _).
recursiveAppend([H|T], Output):-
append(H, [], Output),
recursiveAppend(T, Output).
这让我更改了代码并转到以下内容:
recursiveAppend([], _).
recursiveAppend([H|T], Output):-
append(H, Output, NewOutput),
recursiveAppend(T, NewOutput).
我曾希望这能奏效,因为这对我自己很有意义,显然对其他人也很有意义,同时也搜索了其他 StackOverflow 问题。不幸的是,在 SWI-Prolog 中调用这个谓词只会返回 false。
?- recursiveAppend([1, 2, 3, 4, 5], L1). false
在这种情况下,预期/期望的结果是:
?- recursiveAppend([1, 2, 3, 4, 5], L1). L1 = [1, 2, 3, 4, 5].
为了清楚起见,如果“充实”,程序的运行时应该如下所示:
recursiveAppend([H|T], Output):-
% H is 1, Output is []
append(H, Output, NewOutput),
% NewOutput is [1]
recursiveAppend(T, NewOutput).
recursiveAppend([H|T], Output):-
% H is 2, Output is [1]
append(H, Output, NewOutput),
% NewOutput is [1, 2]
recursiveAppend(T, NewOutput).
recursiveAppend([H|T], Output):-
% H is 3, Output is [1, 2]
append(H, Output, NewOutput),
% NewOutput is [1, 2, 3]
recursiveAppend(T, NewOutput).
recursiveAppend([H|T], Output):-
% H is 4, Output is [1, 2, 3]
append(H, Output, NewOutput),
% NewOutput is [1, 2, 3, 4]
recursiveAppend(T, NewOutput).
recursiveAppend([H|T], Output):-
% H is 5, Output is [1, 2, 3, 4]
append(H, Output, NewOutput),
% NewOutput is [1, 2, 3, 4, 5]
recursiveAppend(T, NewOutput).
recursiveAppend([], _). % First argument (list) is empty, and the second argument (list) has been populated (with [1, 2, 3, 4, 5]), program done.
感谢任何和所有帮助,即使这个问题可能已经被问过一百万次了!
【问题讨论】:
-
它附加了什么?目前还不清楚。该示例没有说明:
recursiveAppend([1, 2, 3, 4, 5], L1), L1 = [1, 2, 3, 4, 5].可以简单地编码为recursiveAppend(A, L1) :- L1 = A.。请给出更多不能被误解的例子,并更清楚地表明你的意图。 -
@WillNess 现在已经扩展了这个问题,希望能够帮助您理解我想要实现的目标?
-
不,您还没有向我们展示我要求的输入-输出配对的“更多示例”。 “输入”表示“这是我在 REPL 上尝试的测试调用”,“输出”表示“这是我希望看到的响应”。您似乎不了解基本的 Prolog。从一开始就从教程开始。就你不理解的每一个最小的可能的事情提出问题,不要在流沙地基上建造城堡,然后问我们为什么这个大型结构不正确,或者根本不正确。当你学习时,通过编写小程序并在 REPL 中尝试,验证你不断增长的理解中的每一个新步骤。
标签: prolog