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 = [[]]、2 番目の呼び出しで list2 = [[],[]]、3 番目の呼び出しで list2 = [[],[],[]] です。ただし、それに到達すると(バックトラックだと思います)、最初の呼び出しのみで終了します。