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 = [[],[],[]]。 然而,当它达到它开始(我想回到赛道),我最终只有第一个电话。
答案 0 :(得分:1)
fillwith(X,List2):-
must_be(nonneg, X),
length(List2, X),
maplist(=([]), List2).
如果您希望追加,请使用:
fillwith(X, List2), append(List1, List2, List3).
答案 1 :(得分: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 = [[], [], [], []] ...