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

4

2 に答える 2

1

あなたが何を望んでいるかはまだわかりませんが、コメントから、あなたは単に望んでいます:

fillwith(X, ニルス) :-
   長さ(ニル、X)、
   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 = [[], [], [], []] ...
于 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 に答える