Доработка программы (сдвиг элементов списка) - Prolog
Формулировка задачи:
Помогите пожалуйста доделать программу
Надо написать предикат p(+X, +N, ?Y), осуществляющий циклическую перестановку элементов в любом списке на N позиций (знак N говорит о направлении сдвига).
?– p([a,b,c,d],1,Y).
Y=[d,a,b,c]
Вот программа:
Необходимо сделать так, что бы программа выполняла сдвиг не больше чем L раз, где L - длина списка.
Например:
Не могу понять как доделать второе условие, что бы проверялась ещё и длина списка.
Заранее спасибо
Листинг программы
- 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(0,L,L).
- shift(K,L,NewL):-K1 is K+1, shift(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.
Листинг программы
- ?– p([a,b,c,d],6,Y).
- Y=[a,b,c,d]
Решение задачи: «Доработка программы (сдвиг элементов списка)»
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_append
my_length(L, N) :-
- функция для вычисления длины спискаL
и сохранения результата в переменнойN
my_length([], N, N0) :-
- базовый случай: если список пуст, то его длина равна 0 и передается вN0
N = N0, !.
- факт, чтоN
равноN0
my_length([], N, N).
- конечный случай: если список пуст, то его длина равна 0my_length([_|T], N, N0) :-
- общий случай: рекурсивный вызов функцииmy_length
для хвоста спискаT
с обновленным значениемN0
N1 is N0 + 1
- обновление значения переменнойN
на 1my_length(T, N, N1).
- рекурсивный вызов функцииmy_length
для хвоста спискаT
с обновленным значениемN1
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д