Prolog 在新的列表序言中复制一个列表的所有元素N次

Prolog 在新的列表序言中复制一个列表的所有元素N次,prolog,Prolog,如何使用Prolog的简单命令,在不使用Maplist、findall或库的情况下,将一个列表中的所有元素复制N次到一个新列表中 例如,我询问Prolog的查询: ?- copy_list([a,b,c,d],3,List). 该问题的答案如下: List = [a,b,c,d,a,b,c,d,a,b,c,d]. 我们可以首先生成一个N子列表列表,然后使用以下命令展平该列表: 因此,我们可以将复制列表/3谓词定义为: copy_list(L, N, R) :- copy_list(N

如何使用Prolog的简单命令,在不使用Maplist、findall或库的情况下,将一个列表中的所有元素复制N次到一个新列表中

例如,我询问Prolog的查询:

?- copy_list([a,b,c,d],3,List).
该问题的答案如下:

List = [a,b,c,d,a,b,c,d,a,b,c,d].

我们可以首先生成一个
N
子列表列表,然后使用以下命令展平该列表:

因此,我们可以将
复制列表/3
谓词定义为:

copy_list(L, N, R) :-
    copy_list(N, L, LL),
    append(LL, R).
或者我们可以在这里使用,这样每次减少这个数字

copy_list(_, 0, []).
copy_list(L, N, R) :-
    N > 0,
    N1 is N-1,
    copy_list(L, N1, R2),
    append(L, R2, R).

威廉第一个解决方案的一个转折点:

copy_list(L, N, Copies) :-
    length(Lists, N),           % List of length N
    maplist(=(L), Lists),       % Each element of Lists is unified with L
    append(Lists, Copies).      % Lists is flattened

7 ?- copy_list([a,b,c], 3, L).
L = [a, b, c, a, b, c, a, b, c].

8 ?-
对违反OPs原始“未使用地图列表、findall或库”规则表示歉意。在Prolog语言中,我考虑了<代码> > MAPIST> <代码> > <代码> >附录< /代码> Basic。

< P>“否>代码> MAPLIST ,<代码> FUNDALL 或库>:

copy\u列表(\u,0,[])。
复制列表(Xs、I、Ys):-I>0,复制列表(
Xs,I,Ys,Xs)。
复制_列表(Xs,1,Xs,u)。
复制列表([X|Xs],I[X|Ys],Xs0):-I>1,复制列表(Xs,I,Ys,Xs0)。
复制列表([],I,Ys,Xs0):-I>1,I1是I-1,
复制_列表(Xs0、I1、Ys、Xs0)。

你尝试了什么,什么不起作用?我尝试递归地这样做,我在一个列表中得到了许多具有相同元素的列表=[[a,b,c,d],[a,b,c,d],[a,b,c,d]]。提示,看看
append/2
我知道append我已经尝试过了,但它不起作用。不,这很可能是
append/3
,这是
append/2
。非常感谢!我会用最后一个@hellfireworld您说“没有库”,但append来自.s(x)。。。Dang我有时会忽略OPs关于“没有库”的评论,尽管公认的答案是使用
append/3
:)“虽然接受了……”是的所以你也不应该删除你的。:)这是一个非常好的解决方案。我建议在示例中使用clpfd:clpfd的推广对于Prolog非常重要。使用
Xs
Ys
而不是
X
Y
将大大有助于此解决方案的清晰性。令人困惑的是,arity从
copy_list(X,I,Y)
增长到
copy_list(X,X2,I,Y)
。它应该是
复制列表(X2,X,I,Y)
复制列表(X,I,Y,X2)
。应保持
(X,I,Y)
的原始三元结构。
copy_list(L, N, Copies) :-
    length(Lists, N),           % List of length N
    maplist(=(L), Lists),       % Each element of Lists is unified with L
    append(Lists, Copies).      % Lists is flattened

7 ?- copy_list([a,b,c], 3, L).
L = [a, b, c, a, b, c, a, b, c].

8 ?-