Доработка программы (сдвиг элементов списка) - Prolog
Формулировка задачи:
Помогите пожалуйста доделать программу
Надо написать предикат p(+X, +N, ?Y), осуществляющий циклическую перестановку элементов в любом списке на N позиций (знак N говорит о направлении сдвига).
?– p([a,b,c,d],1,Y).
Y=[d,a,b,c]
Вот программа:
Необходимо сделать так, что бы программа выполняла сдвиг не больше чем L раз, где L - длина списка.
Например:
Не могу понять как доделать второе условие, что бы проверялась ещё и длина списка.
Заранее спасибо
Решение задачи: «Доработка программы (сдвиг элементов списка)»
textual
Листинг программы
% если левый список пуст, то итоговый список совпадает с правым списком my_append([], RightList, RightList). % иначе, взять голову из левого списка и перенести в голову итогового списка, my_append([LeftHead|LeftTeil], RightList, [LeftHead|RightPart]) :- % продолжить для хвоста левого списка my_append(LeftTeil, RightList, RightPart). my_length(L, N) :- my_length(L, N, 0). my_length([], N, N0) :- integer(N), N = N0, !. my_length([], N, N). my_length([_|T], N, N0) :- N1 is N0 + 1, my_length(T, N, N1).
Объяснение кода листинга программы
my_append([], RightList, RightList).- если левый список пуст, то итоговый список совпадает с правым спискомmy_append([LeftHead|LeftTeil], RightList, [LeftHead|RightPart]) :-- иначе, взять голову из левого списка и перенести в голову итогового списка, а для хвоста левого списка продолжить рекурсивно вызыватьmy_appendmy_length(L, N) :-- функция для вычисления длины спискаLи сохранения результата в переменнойNmy_length([], N, N0) :-- базовый случай: если список пуст, то его длина равна 0 и передается вN0N = N0, !.- факт, чтоNравноN0my_length([], N, N).- конечный случай: если список пуст, то его длина равна 0my_length([_|T], N, N0) :-- общий случай: рекурсивный вызов функцииmy_lengthдля хвоста спискаTс обновленным значениемN0N1 is N0 + 1- обновление значения переменнойNна 1my_length(T, N, N1).- рекурсивный вызов функцииmy_lengthдля хвоста спискаTс обновленным значениемN1