2014-11-22 36 views
2

你好,我想生成一个列表如下。给定一个像[x,y]这样的列表,我想生成一个x,x,...,x:y的列表,例如[2,3]=[2,2,2],但我无法弄清楚。prolog从列表中生成数字列表[x,y]

这是我的执行至今:

generate([T,1],[T]). 
generate([X,S],[X|T]):-S1 is S-1,generate([X,S1],[T]). 

但由于某种原因失败。你可以帮我吗?

回答

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). 
+1

'generate([e,3],Xs)'不会终止。 – false 2014-11-22 11:45:18

+1

尝试使用,例如'产生([e,3],Xs),Xs = []'应该失败 – false 2014-11-22 11:54:15

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的复数。