2012-04-26 37 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 = [[], [], [], []] ...