Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 3.84 KB | None | 0 0
  1.     woman("Galina", 22).
  2.     woman("Katerina", 32).
  3.     woman("Dasha", 28).
  4.     woman("Nelly", 26).
  5.     woman("Aleksandra", 19).
  6.      
  7.     man("Vladimir", 24).
  8.     man("Sergey", 21).
  9.     man("Petr", 31).
  10.     man("Trofim", 27).
  11.     man("Aleksey", 19).
  12.      
  13.     is_odd(_, 0).
  14.      is_odd(X, 1):- write(X), nl.
  15.      
  16.      findname([]).
  17.      findname([data(X, Y)|Tail]):- findname(Tail), M is Y mod 2, is_odd(X, M).
  18.      
  19.       getdata(data(Person, Age)) :- man(Person, Age).
  20.       getdata(data(Person, Age)) :- woman(Person, Age).
  21.       getdatalist(PersonList) :- findall(Order, getdata(Order), PersonList).
  22.      
  23.      
  24.       printlist([]).
  25.       printlist([data(Person,Age)|Tail]) :- write(Person), write("\t"), write(Age), nl, printlist(Tail).
  26.      
  27.      
  28.     /* sorting.pro: Программа на ПРОЛОГЕ для сортировки массива целых чисел по убыванию
  29.        Для сортировки используется метод нахождения наибольшего элемента. */
  30.       /* Аксиомы для нахождения наибольшего элемента списка */
  31.      
  32.         /* Если головной элемент H списка оказывается больше текущего максимального значения CurMin, процедура
  33.          * запускается рекурсивно для хвостовой части списка со значением CurMin = H. Иначе процедура запускается
  34.          * рекурсивно с сохранением значения CurMin. Рекурсия заканчивается, когда мы приходим к пустому списку.
  35.          * При этом в текущее значение CurMin принимают за искомое максимальное значение: Min = CurMin.
  36.          */
  37. find_maxelem([data(Person, Age) | Tail], Max) :- find_maxelem_re(Tail, data(Person, Age), Max).
  38.       find_maxelem_re([], Max, Max).
  39.       find_maxelem_re([data(Person, Age) | Tail], data(_, AgeCurMax), Max) :- Age > AgeCurMax, find_maxelem_re(Tail, data(Person, Age), Max), !.
  40.       find_maxelem_re([_ | Tail], data(Person, AgeCurMax), Max) :- find_maxelem_re(Tail, data(Person, AgeCurMax), Max).
  41.      
  42.       /* Аксиомы для объединения двух списков в один */
  43.       append([], List2, List2).
  44.       append([H1 | Tail1], List2, [H1 | Tail3]) :- append(Tail1, List2, Tail3).
  45.      
  46.       /* Аксиомы для исключения элемента из списка */
  47.       cut_elem(List, X, NewList) :- cut_elem_re([], List, X, NewList).
  48.       cut_elem_re(Head, [], _, Head).   /* на случай, если элемент Х отсутствует в списке. При сортировке невозможно. */
  49.       cut_elem_re(Head, [data(_, Age) | Tail], data(_, AgeX), NewList) :- Age is AgeX, append(Head, Tail, NewList), !.
  50.       cut_elem_re(Head, [data(Person, Age) | Tail], X, NewList) :- append(Head, [data(Person, Age)], NewHead), cut_elem_re(NewHead, Tail, X, NewList).
  51.         /*  Процедура исключения заданного элемента из списка.*/
  52.          
  53.       /* Аксиомы для выполнения сортировки списка по убыванию */
  54.       sort_list_desc([], []).
  55.       sort_list_desc(List, Result) :-
  56.         find_maxelem(List, Max),        /* находим наибольший элемент списка */
  57.         cut_elem(List, Max, Rest),      /* исключаем его из списка */
  58.         sort_list_desc(Rest, Result0),  /* запускаем сортировку рекурсивно на полученном списке */
  59.         Result = [Max | Result0].   /* ставим наибольшитй элемент на первое место */
  60.      
  61. execute:-
  62.          getdatalist(List),  
  63.     sort_list_desc(List, Sorted),
  64.     printlist(Sorted), nl,
  65.     findname(Sorted).
  66.  
  67. goal
  68.     execute, fail.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement