1

I am writing a function that returns distinct sublists of a size n.

When I run the following prolog code with a query gen_list_n(4,D,[1,2,3,4]) it runs into an infinite loop after returning the first answer. How do I prevent this?

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 。可能是一个简单的选择/ 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 回答