Сортировка пузырьком списка списков - Prolog

Узнай цену своей работы

Формулировка задачи:

Добрый день! Помогите, пожалуйста, с кодом. Задача звучит так: "Применить сортировку пузырьком к тем элементам списка списков атомов, если их первый элемент больше заданного числа n" Например, есть такой список списков: [[2,3,5,6],[3,9,0,12,2],[4,0,0,1]]. Пусть n=2. Тогда получим [[2,3,5,6],[0,2,3,9,12],[0,0,1,4]] Набросал такой код. Но не уверен в его правильности, а также необходимо как-то обработать ситуацию, когда первый элемент не больше числа n.
Листинг программы
  1. domains
  2. listI = integer*
  3. listL = listI*
  4. predicates
  5. nondeterm printlist(listL) %вводим списки с клавиатуры
  6. nondeterm permutation(listL,listL) %сравнение двух соседних элементов
  7. nondeterm bubble(listL,listL) %собственно сортировка
  8. nondeterm pred (listL, integer, listL) %здесь должна выполняться основная часть программы
  9. clauses
  10. %printlist ([ ]):- !.
  11. %printlist ([H | T]):- write (H), nl, printlist (T).
  12. permutation([X,Y|T],[Y,X|T]):- X>Y,!.
  13. permutation([X|T],[X|T1]):- permutation(T,T1).
  14. bubble(L,L1):- permutation(L,LL),!,bubble(LL,L1).
  15. bubble(L,L).
  16. pred ([[H|T2]|T],X,[L|R]) :- H>X, bubble ([H|T2],L). %начинаем обрабатывать элементы первого подсписка
  17. pred (T,X,R), !. %остальные заносим в хвост
  18. %pred ([[H|T2]|T],X,[H1|T1]) :- % здесь надо написать условие, если H<=X
  19. pred ([],_,[]). %если все списки обработали
  20. goal
  21. pred ([[1],[2,3],[0,2],[7,3],[0,0,0]],2, F).

Решение задачи: «Сортировка пузырьком списка списков»

textual
Листинг программы
  1. domains
  2. listI = INTEGER
  3. listL = listI*
  4. listD = listL*
  5.  
  6. predicates
  7. nondeterm permutation(listL,listL)
  8. nondeterm bubble(listL,listL)
  9. nondeterm sort (listD, INTEGER, listD)
  10.  
  11. clauses
  12. permutation([X,Y|T],[Y,X|T]):- X>Y,!.
  13. permutation([X|T],[X|T1]):- permutation(T,T1).
  14.  
  15. bubble(L,L1):- permutation(L,LL),!,bubble(LL,L1).
  16. bubble(L,L).
  17.  
  18. sort ([],_,[]).
  19. sort ([[H1|T1]|T],N,[L|R]) :- H1>N, bubble ([H1|T1], L), sort (T,N,R), !.
  20. sort ([[H1|T1]|T],N,[L|R]) :- H1<=N, !, sort (T,N,R). % вот здесь надо как-то по другому иначе выводит пустое значение
  21.  
  22. goal
  23. sort ([[3,2,4],[5,4],[1,2,1,0],[7,3,2],[3,0,0]],1, F).

Объяснение кода листинга программы

В коде используется сортировка пузырьком для списка списков. Вот список элементов кода с их номерами:

  1. domains: определяются три типа данных - listI, listL и listD.
  2. predicates: определяются три предиката - permutation, bubble и sort.
  3. clauses: задаются три правила для предиката permutation и одно правило для предиката bubble.
  4. goal: задается цель сортировки списка списков. Вот как работает код:
  5. Функция permutation используется для перестановки элементов в списке. Она изменяет порядок элементов, если текущий элемент больше следующего. Если элементы уже находятся в правильном порядке, функция заканчивает свою работу.
  6. Функция bubble вызывает функцию permutation и рекурсивно вызывает саму себя, пока список не будет отсортирован. Если список уже отсортирован, функция просто завершает свою работу.
  7. Функция sort используется для сортировки списка списков. Она разбивает список на два подсписка - один с элементами, большими или равными N, и другой с элементами, меньшими N. Затем она рекурсивно вызывает саму себя для подсписка с элементами, меньшими N, пока весь список не будет отсортирован. В данном случае, код пытается отсортировать список списков [[3,2,4],[5,4],[1,2,1,0],[7,3,2],[3,0,0]] в порядке возрастания первого элемента каждого подсписка. Отсортированный список должен быть [[1,2,1,0],[3,0,0],[3,2,4],[5,4],[7,3,2]].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы