Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- woman("Galina", 22).
- woman("Katerina", 32).
- woman("Dasha", 28).
- woman("Nelly", 26).
- woman("Aleksandra", 19).
- man("Vladimir", 24).
- man("Sergey", 21).
- man("Petr", 31).
- man("Trofim", 27).
- man("Aleksey", 19).
- is_odd(_, 0).
- is_odd(X, 1):- write(X), nl.
- findname([]).
- findname([data(X, Y)|Tail]):- findname(Tail), M is Y mod 2, is_odd(X, M).
- getdata(data(Person, Age)) :- man(Person, Age).
- getdata(data(Person, Age)) :- woman(Person, Age).
- getdatalist(PersonList) :- findall(Order, getdata(Order), PersonList).
- printlist([]).
- printlist([data(Person,Age)|Tail]) :- write(Person), write("\t"), write(Age), nl, printlist(Tail).
- /* sorting.pro: Программа на ПРОЛОГЕ для сортировки массива целых чисел по убыванию
- Для сортировки используется метод нахождения наибольшего элемента. */
- /* Аксиомы для нахождения наибольшего элемента списка */
- /* Если головной элемент H списка оказывается больше текущего максимального значения CurMin, процедура
- * запускается рекурсивно для хвостовой части списка со значением CurMin = H. Иначе процедура запускается
- * рекурсивно с сохранением значения CurMin. Рекурсия заканчивается, когда мы приходим к пустому списку.
- * При этом в текущее значение CurMin принимают за искомое максимальное значение: Min = CurMin.
- */
- find_maxelem([data(Person, Age) | Tail], Max) :- find_maxelem_re(Tail, data(Person, Age), Max).
- find_maxelem_re([], Max, Max).
- find_maxelem_re([data(Person, Age) | Tail], data(_, AgeCurMax), Max) :- Age > AgeCurMax, find_maxelem_re(Tail, data(Person, Age), Max), !.
- find_maxelem_re([_ | Tail], data(Person, AgeCurMax), Max) :- find_maxelem_re(Tail, data(Person, AgeCurMax), Max).
- /* Аксиомы для объединения двух списков в один */
- append([], List2, List2).
- append([H1 | Tail1], List2, [H1 | Tail3]) :- append(Tail1, List2, Tail3).
- /* Аксиомы для исключения элемента из списка */
- cut_elem(List, X, NewList) :- cut_elem_re([], List, X, NewList).
- cut_elem_re(Head, [], _, Head). /* на случай, если элемент Х отсутствует в списке. При сортировке невозможно. */
- cut_elem_re(Head, [data(_, Age) | Tail], data(_, AgeX), NewList) :- Age is AgeX, append(Head, Tail, NewList), !.
- cut_elem_re(Head, [data(Person, Age) | Tail], X, NewList) :- append(Head, [data(Person, Age)], NewHead), cut_elem_re(NewHead, Tail, X, NewList).
- /* Процедура исключения заданного элемента из списка.*/
- /* Аксиомы для выполнения сортировки списка по убыванию */
- sort_list_desc([], []).
- sort_list_desc(List, Result) :-
- find_maxelem(List, Max), /* находим наибольший элемент списка */
- cut_elem(List, Max, Rest), /* исключаем его из списка */
- sort_list_desc(Rest, Result0), /* запускаем сортировку рекурсивно на полученном списке */
- Result = [Max | Result0]. /* ставим наибольшитй элемент на первое место */
- execute:-
- getdatalist(List),
- sort_list_desc(List, Sorted),
- printlist(Sorted), nl,
- findname(Sorted).
- goal
- execute, fail.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement