prolog从列表[x,y]生成数字列表

时间:2014-11-22 11:02:53

标签: prolog

您好我想生成如下列表。给定像[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]).

但由于某种原因,它失败了。你能救我吗?

2 个答案:

答案 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).