В настоящее время я работаю через книгу Братко Пролога, и я смотрю программу сортировки пузырьков. Я не могу понять, почему нужен разрез (!
). Скажите, что разреза нет, и Prolog откажется, как он может найти плохие ответы? Потому что, если я оставлю вырез из него, Пролог начнет, давая мне правильный ответ, но затем также дает альтернативные плохие ответы.Пожалуйста, объясните сокращение в программе Bubblesort Prolog?
Как я вижу, как можно поменять когда-либо возвращенный неупорядоченный список? И как возможно, что не отсортированный список когда-либо попадает в цель bubblesort(Sorted, Sorted)
.
Если, конечно, не изменился и первый список ... Невозможно остричь голову.
программа Prolog BubbleSort:
gt(X,Y) :- X > Y.
bubblesort(List, Sorted) :-
swap(List, List1), !, % A useful swap in List?
bubblesort(List1, Sorted).
bubblesort(Sorted, Sorted). % Otherwise list is already sorted
swap([X,Y|Rest], [Y,X|Rest]) :- % Swap first two elements
gt(X,Y).
swap([Z|Rest], [Z|Rest1]) :- % Swap elements in tail
swap(Rest, Rest1).
Оставляя сокращение внешкольных это дает мне:
?- bubblesort([5,7,3,6,8,9,2,6], Sorted).
Sorted = [2, 3, 5, 6, 6, 7, 8, 9] ;
Sorted = [2, 3, 5, 6, 7, 6, 8, 9] ;
Sorted = [2, 3, 5, 6, 7, 8, 6, 9] ;
Sorted = [2, 3, 5, 6, 7, 8, 9, 6] ;
Я думаю, что как-то я понимаю, но я не уверен. Может быть, в какой-то момент он возвращается к swap(List, List1)
, идя ко второму предикату сорта пузыря и ударяя по цели, что означает, что два списка Sorted равны?
На английском языке, означает ли это, что сортировка пузырьков должна продолжать делать свопы до тех пор, пока не будет возможно больше свопов, но тогда необходимо прекратить? Или это означает, что каждый раз удачный обмен был сделан, нет никакого смысла возвращаться к этому успеху?
Я думаю, что ваше второе понятие о том, почему оно существует, в основном правильное. «Swap» представляет альтернативу, если «gt (X, Y)» терпит неудачу. Эта альтернатива также будет приниматься по возврату, даже если «gt (X, Y)» будет успешным. Способ структурирования предиката 'bubblesort', каждая итерация' bubblesort' ищет только 'swap', чтобы найти следующее вхождение необходимого свопа и выполнить его. Без разреза вы получаете отходы из 'swap', которые не соответствуют необходимым критериям. – lurker