Доработка программы (сдвиг элементов списка) - Prolog

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

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

Помогите пожалуйста доделать программу Надо написать предикат p(+X, +N, ?Y), осуществляющий циклическую перестановку элементов в любом списке на N позиций (знак N говорит о направлении сдвига). ?– p([a,b,c,d],1,Y). Y=[d,a,b,c] Вот программа:
Листинг программы
  1. shift(L, [E|RL]):-
  2. getLast(L, E, RL),!.
  3. shift(0, L, L):- !.
  4. shift(N, L, R):-
  5. check(N), % проверка N,если больше 0, то:
  6. NN is N-1,
  7. shift(L, TL),
  8. shift(NN, TL, R).
  9.  
  10. shift(0,L,L).
  11. shift(K,L,NewL):-K1 is K+1, shift(K1,L,L1), left(L1,NewL).
  12.  
  13. left([],[]).
  14. left([H|T],L):-conc(T,[H],L).
  15. conc([],L,L).
  16. conc([H|T],L,[H|L1]):-conc(T,L,L1).
  17.  
  18. getLast([], _, _):- !, fail.
  19. getLast([H], H, []):- !.
  20. getLast([H|T], R, [H|RL]):-
  21. getLast(T, R, RL).
  22. check(N):-N>0.
Необходимо сделать так, что бы программа выполняла сдвиг не больше чем L раз, где L - длина списка. Например:
Листинг программы
  1. ?– p([a,b,c,d],6,Y).
  2. Y=[a,b,c,d]
Не могу понять как доделать второе условие, что бы проверялась ещё и длина списка. Заранее спасибо

Решение задачи: «Доработка программы (сдвиг элементов списка)»

textual
Листинг программы
  1. % если левый список пуст, то итоговый список совпадает с правым списком
  2. my_append([], RightList, RightList).
  3. % иначе, взять голову из левого списка и перенести в голову итогового списка,
  4. my_append([LeftHead|LeftTeil], RightList, [LeftHead|RightPart]) :-
  5.     % продолжить для хвоста левого списка
  6.     my_append(LeftTeil, RightList, RightPart).
  7.  
  8. my_length(L, N) :-
  9.     my_length(L, N, 0).
  10.  
  11. my_length([], N, N0) :-
  12.     integer(N),
  13.     N = N0,
  14.     !.
  15. my_length([], N, N).
  16. my_length([_|T], N, N0) :-
  17.     N1 is N0 + 1,
  18.     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

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

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

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