2013-04-21 2 views
1

Я пишу функцию, которая возвращает отдельные подсписные буквы размером n.Infinite loop prolog

Когда я запускаю следующий пролог с запросом 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). 

ответ

0

member_rem/3 вызываются только с L реализованными, то первым членом 2/3 на возвраты генерировать бесконечные списки.

Вот снимок переменных member_rem»после некоторого шага BACKTRACK:

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] ; 
...