prolog从列表中生成数字列表[x,y]
问题描述:
你好,我想生成一个列表如下。给定一个像[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]).
但由于某种原因失败。你可以帮我吗?
答
问题在于你的第二个条款。当你有[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).
答
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
的复数。
'generate([e,3],Xs)'不会终止。 – false 2014-11-22 11:45:18
尝试使用,例如'产生([e,3],Xs),Xs = []'应该失败 – false 2014-11-22 11:54:15