Логическое программирование на языке Visual Prolog. Солдатова О.П - 36 стр.

UptoLike

36
Пример 31: сортировка списков методом перестановки (пузырька).
domains
list=integer*
predicates
puz(list,list)
perest(list,list)
clauses
puz(L1,L2):-perest(L1,L3),!,puz(L3,L2).
puz(L1,L1).
perest([X,Y|T],[Y,X|T]):-X>Y.
perest([Z|T],[Z|T1]):-perest(T,T1).
goal
puz([1,3,4,5,2],L).]
Пример 32: сортировка списков методом вставки.
domains
list=integer*
predicates
insert_sort (list, list)
insert (integer, list, list)
asc_order (integer, integer)
clauses
insert_sort ( [], []).
insert_sort ([H1|T1], L2):- insert_sort (T1, T2),
insert(H1, T2, L2).
insert (X, [H1| T1], [H1| T2]) :- asc_order (X, H1), !,
insert (X, T1, T2).
insert (X, L1, [X| L1]).
asc_order (X, Y):- X>Y.
goal
insert_sort ([4, 7, 3, 9], L).
Для удовлетворения первого правила оба списка должны быть
пустыми. Для того, чтобы достичь этого состояния, по второму правилу
происходит рекурсивный вызов предиката insert_sort, при этом значениями
H1 последовательно
становятся все элементы исходного списка, которые
затем помещаются в стек. В результате исходный список становится пустым
и по первому правилу выходной список также становится пустым.
После того, как произошло успешное завершение первого правила,
Пролог пытается выполнить второй предикат insert, вызов которого
содержится в теле второго правила. Переменной H1 сначала присваивается
первое взятое
из стека значение 9, а предикат принимает вид insert (9, [], [9]).
Так как теперь удовлетворено все второе правило, то происходит
возврат на один шаг рекурсии в предикате insert_sort. Из стека извлекается 3
и по третьему правилу вызывается предикат asc_order, то есть происходит
попытка удовлетворения пятого правила asc_order (3, 9):- 3>9. Так как