Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- clauses
- woman("Galina", 23). /*average = 24*/
- woman("Katerina", 31).
- woman("Dasha", 21).
- woman("Nelly", 27).
- woman("Aleksandra", 18).
- man("Vladimir", 23).
- man("Sergey", 21).
- man("Petr", 31).
- man("Trofim", 27).
- man("Aleksey", 18).
- sumlist([], 0, 0).
- sumlist([H|T], Sum, N):-
- sumlist(T, S1, N1),
- Sum=H+S1, N=1+N1.
- less(Average,Age,_):- Average@<Age.
- less(Average,Age,X):- Average@>=Age, write(X),nl.
- listofages(AgeList) :- findall(Age, man(_, Age), L1), findall(Age, woman(_, Age), L2), append(L1, L2, AgeList).
- average(Sum, N, Average) :- Average is Sum/N.
- findname(Average, []) :- man(X, Y), less(Average, Y, X).
- findname(Average, [data(X, Y)|Tail]):- findname(Average, Tail), man(X, Y), less(Average, Y, X).
- 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: Программа на ПРОЛОГЕ для сортировки массива целых чисел по убыванию
- Для сортировки используется метод нахождения наибольшего элемента. */
- /* Аксиомы для нахождения наибольшего элемента списка */
- find_maxelem([data(Person, Age) | Tail], Min) :- find_maxelem_re(Tail, data(Person, Age), Min).
- find_maxelem_re([], Min, Min).
- find_maxelem_re([data(Person, Age) | Tail], data(_, AgeCurMin), Min) :- Age < AgeCurMin, find_maxelem_re(Tail, data(Person, Age), Min), !.
- find_maxelem_re([_ | Tail], data(Person, AgeCurMin), Min) :- find_maxelem_re(Tail, data(Person, AgeCurMin), Min).
- /* Если головной элемент H списка оказывается больше текущего максимального значения CurMin, процедура
- * запускается рекурсивно для хвостовой части списка со значением CurMin = H. Иначе процедура запускается
- * рекурсивно с сохранением значения CurMin. Рекурсия заканчивается, когда мы приходим к пустому списку.
- * При этом в текущее значение CurMin принимают за искомое максимальное значение: Min = CurMin.
- */
- /* Аксиомы для объединения двух списков в один */
- 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, Min), /* находим наибольший элемент списка */
- cut_elem(List, Min, Rest), /* исключаем его из списка */
- sort_list_desc(Rest, Result0), /* запускаем сортировку рекурсивно на полученном списке */
- Result = [Min | Result0]. /* ставим наибольшитй элемент на первое место */
- goal
- getdatalist(List),
- listofages(AgeList),
- sort_list_desc(List, Sorted),
- printlist(Sorted), nl,
- sumlist(AgeList, Sum, N),
- average(Sum, N, Average),
- write("Average = "), write(Average), nl,
- findname(Average, Sorted),
- fail.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement