Сдвиг элементов списка влево или вправо - Prolog

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

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

Прошу помочь новичку в прологе разобраться с одной программой Напишите предикат p(+X, +N, ?Y), осуществляющий циклическую перестановку элементов в любом списке на N позиций (знак N говорит о направлении сдвига). Подсказка: используйте рекурсию по N; базовые случаи: N=0, N=1, N= –1.
Листинг программы
  1. ?– p([a,b,c,d],1,Y).
  2. Y=[d,a,b,c]
  3. Yes
  4. ?– p([a,b,c,d],–1,Y).
  5. Y=[ b,c,d,a]
  6. Yes
Получилось что то вот такое (наверняка там что то совсем бредовое, но прошу не ругать):
Листинг программы
  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. %иначе:
  11. shift_l(0,L,L).
  12. shift_l(K,L,NewL):-K1 is K+1, shift_l(K1,L,L1), left(L1,NewL).
  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.  
  23. check(N):-N>0.
Сдвиг вправо работает, но вот влево не хочет. Хотя если запускать сдвиг влево отдельно, то все нормально

Решение задачи: «Сдвиг элементов списка влево или вправо»

textual
Листинг программы
  1. shift(0, L, L):- !.    % Отдельное правило для выхода из рекурсии
  2. shift(N, L, R):-
  3.     check(N),          % проверка N,если больше 0
  4.     NN is N - 1,       % если проверка проходит успешно, продолжается выполнение
  5.     shift(L, TL),
  6.     shift(NN, TL, R),
  7.     !;                 % отсечение не дает выполниться второй части правила,
  8.                        % если первая дошла до этого места
  9.                        % точка с запятой начинает новую часть правила
  10.     NN is -N,          % сюда Пролог перейдет, если в первой части будет неуспех (например, N < 0)
  11.     shift_l(NN, L, R).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

11   голосов , оценка 4 из 5

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

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

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