2012-04-26 123 views
0
fillwith(X,List2):- 
    length(List2,Y) 
    ,Y>=X; 
    append(List2,[[]],List3) 
    ,fillwith(X,List3). 

這裏的問題是,一旦它達到目標,它會啓動它做一些奇怪的事情,它會回到它所做的第一個調用。 例如:用X [](空列表)填充列表

fillwith(3,List2):- 
    length(List2,Y) 
    ,Y>=X; 
    append(List2,[[]],List3) 
    ,fillwith(X,List3). 

在這裏的第一呼叫列表2 = [[]],在第二呼叫列表2 = [[],[]],在第三呼叫列表2 = [[],[], []]。然而,當它達到它開始(我猜想回到軌道),並且我最終只與第一個電話。

+1

請給出一個具體的例子,當你的程序應該是真的。我不清楚「X」是關於什麼的。 fillwith(X,[[],[]])是否成功?假裝你已經編寫了程序:顯示你將如何使用它的例子。 – false 2012-04-27 00:29:02

+0

X是要追加到列表中的空列表的數量, ,正如我之前在X爲2時表示的那樣,如果List等於[[],[]],pred應該成功,如果4應該是[[], [],[],[]]。 – 2012-04-27 10:45:57

回答

1
fillwith(X,List2):- 
    must_be(nonneg, X), 
    length(List2, X), 
    maplist(=([]), List2). 

如果您想追加使用:

fillwith(X, List2), append(List1, List2, List3). 
1

我現在還不能確定,你想要什麼,但是從評論,您只是想:

 
fillwith(X, Nils) :- 
    length(Nils, X), 
    nils(Nils). 

nils([]). 
nils([[]|Nils]) :- 
    nils(Nils). 

的目標nils(Nils)可以等同地表示爲maplist(=([]),Nils)

?- fillwith(4, Xs). 
Xs = [[], [], [], []]. 

?- fillwith(X, Xs). 
X = 0, 
Xs = [] ; 
X = 1, 
Xs = [[]] ; 
X = 2, 
Xs = [[], []] ; 
X = 3, 
Xs = [[], [], []] ; 
X = 4, 
Xs = [[], [], [], []] ...