Сдвиг элементов списка влево или вправо - Prolog
Формулировка задачи:
Прошу помочь новичку в прологе разобраться с одной программой
Напишите предикат p(+X, +N, ?Y), осуществляющий циклическую перестановку элементов в любом списке на N позиций (знак N говорит о направлении сдвига). Подсказка: используйте рекурсию по N; базовые случаи: N=0, N=1, N= –1.
Получилось что то вот такое (наверняка там что то совсем бредовое, но прошу не ругать):
Сдвиг вправо работает, но вот влево не хочет. Хотя если запускать сдвиг влево отдельно, то все нормально
Листинг программы
- ?– p([a,b,c,d],1,Y).
- Y=[d,a,b,c]
- Yes
- ?– p([a,b,c,d],–1,Y).
- Y=[ b,c,d,a]
- Yes
Листинг программы
- shift(L, [E|RL]):-
- getLast(L, E, RL),!.
- shift(0, L, L):- !.
- shift(N, L, R):-
- check(N), % проверка N,если больше 0, то:
- NN is N - 1,
- shift(L, TL),
- shift(NN, TL, R), !;
- %иначе:
- shift_l(0,L,L).
- shift_l(K,L,NewL):-K1 is K+1, shift_l(K1,L,L1), left(L1,NewL).
- left([],[]).
- left([H|T],L):-conc(T,[H],L).
- conc([],L,L).
- conc([H|T],L,[H|L1]):-conc(T,L,L1).
- getLast([], _, _):- !, fail.
- getLast([H], H, []):- !.
- getLast([H|T], R, [H|RL]):-
- getLast(T, R, RL).
- check(N):-N>0.
Решение задачи: «Сдвиг элементов списка влево или вправо»
textual
Листинг программы
- shift(0, L, L):- !. % Отдельное правило для выхода из рекурсии
- shift(N, L, R):-
- check(N), % проверка N,если больше 0
- NN is N - 1, % если проверка проходит успешно, продолжается выполнение
- shift(L, TL),
- shift(NN, TL, R),
- !; % отсечение не дает выполниться второй части правила,
- % если первая дошла до этого места
- % точка с запятой начинает новую часть правила
- NN is -N, % сюда Пролог перейдет, если в первой части будет неуспех (например, N < 0)
- shift_l(NN, L, R).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д