1

サイズ n の個別のサブリストを返す関数を作成しています。

クエリ gen_list_n(4,D,[1,2,3,4]) を使用して次のプロローグ コードを実行すると、最初の回答が返された後、無限ループに陥ります。これを防ぐにはどうすればよいですか?

member_rem(E,L,R) :- 
append(X,Y,R), 
append( X ,[E], L0), 
append( L0,Y, L).

gen_list_n(0,[],_).

gen_list_n(N,[X|Xs],L) :- 
N > 0, 
N1 is N-1, 
member_rem(X,L,R), 
gen_list_n(N1,Xs,R).
4

1 に答える 1

0

member_rem/3 がインスタンス化された状態でのみ呼び出されL、バックトラッキングの最初の 2 つの member/3 が無限リストを生成します。

バックトラックステップ後の member_rem' 変数のスナップショットを次に示します。

L   = [4]
R   = [_G5662, _G5668, _G5674, _G5680|Y]
X   = [_G5662, _G5668, _G5674, _G5680]
L0  = [_G5662, _G5668, _G5674, _G5680, E]

member_rem をもっと簡単に言い換えるべきだと思います。単純なselect/3が適切かもしれません。それを使って、私は得る

member_rem(E,L,R) :-
    select(E, L, R).

?- gen_list_n(4,D,[1,2,3,4]).
D = [1, 2, 3, 4] ;
D = [1, 2, 4, 3] ;
D = [1, 3, 2, 4] ;
...
于 2013-04-21T22:32:07.870 に答える