List 创建元素的列表乘以n次
所以我的问题是,我有一个谓词,它是repete_el(el,N,L),其中el是一个元素,N是重复的次数,L是包含该元素重复N次的列表 我的问题是我不想重复这个元素,因为它给出的是false,我不明白为什么 例如: 我的输出: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(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
次结束的列表