Compress и uncompress палидромов - Prolog
Формулировка задачи:
Нужна помощь с зачётом, в прологе я 0, а дэдлайн уже в пятницу.(В далнейшем не собираюсь использовать этот язык, так как не специализируюсь в логических языках, больше предпочитаю java и pascal).
Надо составить программму из 3-ёх частей:
1) palindrome(Xs), которая определяет, является ли Xs палиндромом. Например:
[], [aa], [bb], [baab], [abba], [a], [bab], [aaa] являются палиндромами.
2) compressed(odd, Zs) и compressed(even, Zs) которые сжимают слово-палидром. Примеры инпутов и аутпутов:
?- compress([a,b,a,b,a], Z).
Z = compressed(odd, [a, b, a])
?- compress([a,b,b,a], Z).
Z = compressed(even, [a, b])
3)uncompress(C,Xs) которая для сжатого палиндрома C устанавливает несжаты палиндром Xs.
Очень надеюсь на вашу помощь.
Первую часть уже нашёл, оказалось всё очень просто
palindrome(L) :- reverse(L, L).
Но помощь с двумя другими всё ещё нужна.
Решение задачи: «Compress и uncompress палидромов»
textual
Листинг программы
compress1(Xs, compressed(Method, Ys)) :- length(Xs, Len), Rem is rem(Len, 2), (Rem = 0 -> Method = even ; Method = odd), Cut is div(Len, 2) + Rem, length(Ys, Cut), append(Ys, _, Xs). uncompress1(compressed(Method, Xs), Ys) :- length(Xs, Len), (Method = even -> Rem = 0 ; Method = odd, Rem = 1), Grow is Len - Rem, length(Xs1, Grow), append(Xs1, _, Xs), reverse(Xs1, Xs2), append(Xs, Xs2, Ys).
Объяснение кода листинга программы
- В функции
compress1
входной списокXs
сжимается до спискаYs
. - Если длина списка
Xs
четная, то метод сжатия будетeven
, иначеodd
. - В функции
uncompress1
списокXs
разворачивается до спискаYs
. - Если метод сжатия
even
, то списокXs
будет сдвинут вправо на 1 позицию, иначе на 2 позиции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д