2013-05-07 74 views
0

我想build/3列表中的Prolog爲N元素,每個元素應該是X建立n個長度相同的值列表Prolog

?- build(30,3,L). 
L = [30,30,30]. 

花了好幾個小時,結束了無限循環或變量未正確實例化。

build(_,0,[]). 
build(X,N1,[X]):- N1>0, N1 is N - 1, build(X,N,[]). 
build(X,N1,[X|L]) :- N1 > 0, N1 is N - 1, build(X,N,L). 

回答

4
build(_,0,[]). 

好。

build(X,N1,[X|L]) :- N1 > 0, N1 is N - 1, build(X,N,L). 

優秀。 ??你的意思是N is N1 - 1

build(X,N1,[X]):- N1>0, N1 is N - 1, build(X,N,[]). 

爲什麼? [X]已與之前的規則[X] = [X | [] ]相匹配。

您不需要此規則根本不需要

4

使用元謂詞使得它很短:

(1)用maplist/2:創建的長度爲N的列表,然後它的所有元素

build(X, N, List) :- 
    length(List, N), 
    maplist(=(X), List). 

(2)與findall/3 X.匹配:使循環N次並完成帶X的列表N次

build(X, N, List) :- 
    findall(X, between(1, N, _), List).