В предыдущий пост, в конце концов я понял, как написать программу gprolog, которая проверяет, является ли один список перестановкой другого. Насколько я знаю, это работает.
Теперь я создаю предикат mysort
, который объединяет предикат перестановки с этим (насколько я могу судить, тоже работает):
sorted([]).
sorted([L]) :- !.
sorted([L|[T|TT]]) :- L @=< T, sorted([T|TT]).
Поскольку мой первоначальный предикат perm
был разработан таким образом, чтобы заканчиваться !
, как только он достигает ответа, я внес некоторые изменения, чтобы позволить mysort
проверять возможные варианты. Вот mysort
, его особый backtrack_perm
и перекрытие со старым perm
(которое я просто изменил как небольшое изменение на backtrack_perm
):
perm([],[]).
perm([LH|LT],R) :-
backtrack_perm([LH|LT],R),
!.
perm_recurse([],X).
perm_recurse([LH|LT],R) :-
member(LH,R),
select(LH,[LH|LT],X),
select(LH,R,Y),
perm_recurse(X,Y),
!.
mysort(L,M) :-
backtrack_perm(L,M),
sorted(M),
!.
backtrack_perm([],[]).
backtrack_perm([LH|LT],R) :-
length([LH|LT],A),
length(R,B),
A == B,
member(LH,R),
select(LH,[LH|LT],X),
select(LH,R,Y),
perm_recurse(X, Y).
Хотя его компоненты, как уже упоминалось, работают нормально, mysort
вызывает переполнение стека для некоторых входных данных, таких как mysort([5,3,2],X)
. В уже отсортированном списке, таком как mysort([2,3,5],X)
, или даже частичном, таком как mysort([3,2,5],X)
, трассировка может быть длинной, но она дает ответ. Из-за этого - и поскольку меньший полностью обратный список, такой как [2,1]
, работает нормально - я думаю, проблема в том, что сам процесс занимает слишком много места/времени со всеми этими перестановками.
Не углубляясь слишком в более длинные трассировки, можно ли с уверенностью предположить, что дело обстоит именно так? Или Пролог/компьютер должен справиться с этим без проблем, то есть мне нужно переосмыслить алгоритмы?
length(R,B)
, когдаR
иB
изначально не связаны? - person Fred Foo   schedule 06.07.2013perm
, для которого R будет известно и связано, а B будет "вычислено" и затем использовано в сравнении с A. - person norman   schedule 06.07.2013