List 创建元素的列表乘以n次

List 创建元素的列表乘以n次,list,prolog,List,Prolog,所以我的问题是,我有一个谓词,它是repete_el(el,N,L),其中el是一个元素,N是重复的次数,L是包含该元素重复N次的列表 我的问题是我不想重复这个元素,因为它给出的是false,我不明白为什么 例如: 我的输出: ?- repete_el(a,3,L). false 正确输出: ?- repete_el(a,3,L). L = [a,a,a]. 节目: repete_el(El,0,[]) :- !. repete_el(El,N,L) :- repete_el(El,N

所以我的问题是,我有一个谓词,它是repete_el(el,N,L),其中el是一个元素,N是重复的次数,L是包含该元素重复N次的列表

我的问题是我不想重复这个元素,因为它给出的是false,我不明白为什么

例如:

我的输出:

?- repete_el(a,3,L).
false

正确输出:

?- repete_el(a,3,L).
L = [a,a,a].

节目:

repete_el(El,0,[]) :- !.

repete_el(El,N,L) :- repete_el(El,N,L,[],N).

repete_el(El,N,L,L2) :- length(L2,C),
                        C =< N,
                        append(L2,[N],NL),
                        repete_el(El,N,L,NL).
repete_el(el,0,[]):-!。
repete_el(el,N,L):-repete_el(el,N,L,[],N)。
重复(el,N,L,L2):-长度(L2,C),
C=

顺便说一句,我只能迭代地这样做。

您可以使用标准
findall/3
谓词和事实上的标准
between/3
谓词。例如:

| ?- findall(a, between(1,5,_), List).
List = [a, a, a, a, a]
yes

您可以使用标准
findall/3
谓词和事实上的标准
between/3
谓词。例如:

| ?- findall(a, between(1,5,_), List).
List = [a, a, a, a, a]
yes

这不起作用的原因是,在调用
repete_el/4
时,
L2
是一个自由变量,因此
length(L2,C)
将开始构建各种长度的列表。然后,您对一个列表
NL
进行递归调用,并额外添加一个元素,然后您要求该列表再次具有长度
C
(该长度应再次小于
N
)。但最终
C
将大于
N
,因此谓词将失败

您可以编写如下谓词:

repete_el(_, 0, []).  %% (1)
repete_el(X, N, [X|T]) :-        %% (2)
    N > 0,
    N1 is N-1,
    repete_el(X, N1, T).
这里我们这样说:

(1) 重复元素
0
次的列表是空列表;和 (2) 重复
X
N
次,且
N
大于
0
的列表是以
X
开始,以重复
X
N-1
次结束的列表


这不起作用的原因是,在调用
repete_el/4
时,
L2
是一个自由变量,因此
length(L2,C)
将开始构建各种长度的列表。然后,您对一个列表
NL
进行递归调用,并额外添加一个元素,然后您要求该列表再次具有长度
C
(该长度应再次小于
N
)。但最终
C
将大于
N
,因此谓词将失败

您可以编写如下谓词:

repete_el(_, 0, []).  %% (1)
repete_el(X, N, [X|T]) :-        %% (2)
    N > 0,
    N1 is N-1,
    repete_el(X, N1, T).
这里我们这样说:

(1) 重复元素
0
次的列表是空列表;和 (2) 重复
X
N
次,且
N
大于
0
的列表是以
X
开始,以重复
X
N-1
次结束的列表