Сортировка пузырьком списка списков - 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.
Листинг программы
- domains
- listI = integer*
- listL = listI*
- predicates
- nondeterm printlist(listL) %вводим списки с клавиатуры
- nondeterm permutation(listL,listL) %сравнение двух соседних элементов
- nondeterm bubble(listL,listL) %собственно сортировка
- nondeterm pred (listL, integer, listL) %здесь должна выполняться основная часть программы
- clauses
- %printlist ([ ]):- !.
- %printlist ([H | T]):- write (H), nl, printlist (T).
- permutation([X,Y|T],[Y,X|T]):- X>Y,!.
- permutation([X|T],[X|T1]):- permutation(T,T1).
- bubble(L,L1):- permutation(L,LL),!,bubble(LL,L1).
- bubble(L,L).
- pred ([[H|T2]|T],X,[L|R]) :- H>X, bubble ([H|T2],L). %начинаем обрабатывать элементы первого подсписка
- pred (T,X,R), !. %остальные заносим в хвост
- %pred ([[H|T2]|T],X,[H1|T1]) :- % здесь надо написать условие, если H<=X
- pred ([],_,[]). %если все списки обработали
- goal
- pred ([[1],[2,3],[0,2],[7,3],[0,0,0]],2, F).
Решение задачи: «Сортировка пузырьком списка списков»
textual
Листинг программы
- domains
- listI = INTEGER
- listL = listI*
- listD = listL*
- predicates
- nondeterm permutation(listL,listL)
- nondeterm bubble(listL,listL)
- nondeterm sort (listD, INTEGER, listD)
- clauses
- permutation([X,Y|T],[Y,X|T]):- X>Y,!.
- permutation([X|T],[X|T1]):- permutation(T,T1).
- bubble(L,L1):- permutation(L,LL),!,bubble(LL,L1).
- bubble(L,L).
- sort ([],_,[]).
- sort ([[H1|T1]|T],N,[L|R]) :- H1>N, bubble ([H1|T1], L), sort (T,N,R), !.
- sort ([[H1|T1]|T],N,[L|R]) :- H1<=N, !, sort (T,N,R). % вот здесь надо как-то по другому иначе выводит пустое значение
- goal
- sort ([[3,2,4],[5,4],[1,2,1,0],[7,3,2],[3,0,0]],1, F).
Объяснение кода листинга программы
В коде используется сортировка пузырьком для списка списков. Вот список элементов кода с их номерами:
- domains: определяются три типа данных - listI, listL и listD.
- predicates: определяются три предиката - permutation, bubble и sort.
- clauses: задаются три правила для предиката permutation и одно правило для предиката bubble.
- goal: задается цель сортировки списка списков. Вот как работает код:
- Функция permutation используется для перестановки элементов в списке. Она изменяет порядок элементов, если текущий элемент больше следующего. Если элементы уже находятся в правильном порядке, функция заканчивает свою работу.
- Функция bubble вызывает функцию permutation и рекурсивно вызывает саму себя, пока список не будет отсортирован. Если список уже отсортирован, функция просто завершает свою работу.
- Функция 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]].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д