Доработка программы (сдвиг элементов списка) - 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).

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

  1. my_append([], RightList, RightList). - если левый список пуст, то итоговый список совпадает с правым списком
  2. my_append([LeftHead|LeftTeil], RightList, [LeftHead|RightPart]) :- - иначе, взять голову из левого списка и перенести в голову итогового списка, а для хвоста левого списка продолжить рекурсивно вызывать my_append
  3. my_length(L, N) :- - функция для вычисления длины списка L и сохранения результата в переменной N
  4. my_length([], N, N0) :- - базовый случай: если список пуст, то его длина равна 0 и передается в N0
  5. N = N0, !. - факт, что N равно N0
  6. my_length([], N, N). - конечный случай: если список пуст, то его длина равна 0
  7. my_length([_|T], N, N0) :- - общий случай: рекурсивный вызов функции my_length для хвоста списка T с обновленным значением N0
  8. N1 is N0 + 1 - обновление значения переменной N на 1
  9. my_length(T, N, N1). - рекурсивный вызов функции my_length для хвоста списка T с обновленным значением N1

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

6   голосов , оценка 4.167 из 5
Похожие ответы