во-первых, посмотрите на следующий пример:Сортировка списка только два элементов в прологе
?- fp(X,[b,a,b]).
ложные Ok, потому что второй аргумент должен быть двух элементов отсортированного списка. (В моей программе я предполагаю, что a<b
)
?-fp(X,[a,b,b]).
X = [a, b, b] ;
X = [b, a, b] ;
X = [b, b, a] ;
false.
Да, это правильный результат.
Однако для
?-fp ([b,a,b], X)
X = [a,b,b].
Да, это ожидаемый результат.
Однако в случае
?-fp ([b,a,b], X)
X = [a,b,b];
Вот обхват ....
Есть ли существует способ борьбы с этим зацикливанием? Я долго думал, но не успел. Можете ли вы попытаться мне помочь?
fp(L, F) :-
fp(L, [], [], F).
fp([], AccA, AccB, F):-
append(AccA, AccB, F), !.
fp([a|L], AccA, AccB, F) :-
append([a|AccA], _, F),
fp(L, [a|AccA], AccB, F).
fp([b|L], AccA, AccB, F) :-
append(_, [b|AccB], F),
fp(L, AccA, [b|AccB], F).
вы пробовали делать 'trace', чтобы увидеть, что происходит? – lurker
Да, я попробовал. Когда мы добавляем '!' После 'fp (L, AccA, [c | AccB], F) .' это не цикл, но он не дает правильных (не всех возможных), когда первым аргументом является' X'. –
В вашем последнем пункте 'X' и' AccA' являются singleton. Это намеренно? Кроме того, второе предложение в 'fp/4' вызывает' fp ([b | AccA], _, F) '(' fp/3'), которого не существует. – lurker