首页 > 解决方案 > 在序言递归中将元素一一添加到新列表中

问题描述

给定add(X,InputList,OutputList) whereOutputlist是来自 的 X 元素的序列InputList。我们读取InputList元素的数量并添加元素,Outputlist直到达到 X 个元素。

我曾尝试使用该成员,然后尝试附加元素,但我似乎无法弄清楚如何返回新列表也使大小获得输入列表的大小

size([],0).
size([H|T],N) :- size(T,N1), N is N1+1.
append2([], List2, List2).
append2([H|T], List2, [H|Result]) :- append2(T, List2, Result)

实际结果应该是这样的

add(4, [1,2,3], X)
(0, [a,b,c,d], X).  

这些失败了

add(0,[q],[q]).
add(3,[a,b,z,c],[a,b,c]).

标签: recursionprolog

解决方案


我很高兴您尝试使用库谓词来完成这项任务。例如,您可以执行以下操作:

add(N, List, Prefix) :-
    length(Prefix, N),
    append(Prefix, _, List).

这实际上是说,“前缀是长度为 N 的列表,可以附加到某物或其他东西以产生输入列表。” 当然,您没有理由费心实现自己的版本,length/2因为append/3它们是 ISO。

如果你想手动完成,你可以通过案例分析和 using 来完成succ/2,看起来像这样:

add(0, _, []).
add(N, [X|Xs], [X|Result]) :-
   succ(N0, N),
   add(N0, Xs, Result).

通常,调用这个谓词是take/3因为它好像 OutputList 只是从 InputList 中获取 N 个元素的结果。


推荐阅读