您好我想生成如下列表。给定像[x,y]这样的列表,我想生成一个x,x,...,x:y列表,例如[2,3]=[2,2,2]
,但我无法弄清楚如何。
这是我到目前为止的实施:
generate([T,1],[T]).
generate([X,S],[X|T]):-S1 is S-1,generate([X,S1],[T]).
但由于某种原因,它失败了。你能救我吗?
答案 0 :(得分:2)
generate([E,R], Es) :-
length(Es, R),
maplist(=(E), Es).
你说你的版本失败了。但事实上并非如此:
?- generate([a,0], Xs).
false.
?- generate([a,1], Xs).
Xs = [a] ;
false.
?- generate([a,2], Xs).
Xs = [a|a] ;
false.
?- generate([a,3], Xs).
false.
它不适用于0,似乎适用于长度1,然后,为长度2产生不正确的解Xs = [a|a]
,最后从长度3开始失败。 [a|a]
是一个很好的提示,在您定义的某个位置,列表及其元素会混淆。为了更好地区分它们,请使用复数形式的变量作为列表,例如Es
的复数E
。
答案 1 :(得分:0)
问题在于你的第二个条款。当你有[X|T]
时,这意味着T是一个列表。在正文中你写generate([X,S1],[T])
:通过写[T]
你现在说生成的第二个参数是一个列表,其中唯一的元素是这个列表T.你想说的是它是只需这个清单T:
generate([T,1], [T]).
generate([X,S], [X|T]) :- S1 is S-1, generate([X,S1], T).