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

这里的问题是,一旦它到达目标,它就会开始做一些奇怪的事情,它会回到它发出的第一个调用。例如:

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

这里在第一个调用 List2 = [[]],在第二个调用 list2 = [[],[]],在第三个调用 list2 = [[],[],[]]。但是,当它开始(我猜是回溯)时,我最终只接到了第一个电话。

4

2 回答 2

1

I am still not sure, what you want, but from the comments, you simply want:

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

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

The goal nils(Nils) could be equally expressed as maplist(=([]),Nils).

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

?- fillwith(X, Xs).
X = 0,
Xs = [] ;
X = 1,
Xs = [[]] ;
X = 2,
Xs = [[], []] ;
X = 3,
Xs = [[], [], []] ;
X = 4,
Xs = [[], [], [], []] ...
于 2012-04-27T17:17:37.430 回答
1
fillwith(X,List2):- 
   must_be(nonneg, X),
   length(List2, X),
   maplist(=([]), List2).

如果您想追加使用:

fillwith(X, List2), append(List1, List2, List3).
于 2012-04-27T14:16:13.977 回答