Определить предикат циклический_сдвиг (Список 1, Список 2) - Prolog
Формулировка задачи:
определить предикат циклический_сдвиг(Список 1,Список 2),истинный тогда и только тогда,когда Список2 получается из Списка1 путем сдвига его элементов на одну позицию вправо.Последний элемент при этом перемещается на первое место.Пример:?-циклический_сдвиг([1,2,3,4],L).
L=[4,1,2,3];
no
Решение задачи: «Определить предикат циклический_сдвиг (Список 1, Список 2)»
textual
Листинг программы
domains int=integer intl=int* predicates app(intl,intl,intl) last(intl,int) butlast(intl,intl) rot(intl,intl) clauses app([],X,X). app([H|T],X,[H|R]) :- app(T,X,R). last([X],X). last([_|H],X) :- last(H,X). butlast([_],[]). butlast([H|T],[H|R]) :- butlast(T,R). rot(X,R) :- last(X,LX), butlast(X,IX), app([LX],IX,R).
Объяснение кода листинга программы
- В коде определен predicate
app(intl,intl,intl), который принимает три аргумента типаintl. Предполагается, что этот предикат определяет, является ли элемент спискаXприложением к спискуYэлементов спискаZ. - Также определен predicate
last(intl,int), который принимает два аргумента типаintlи возвращает последний элемент спискаX. - Определен predicate
butlast(intl,intl), который принимает два аргумента типаintlи возвращает списокXбез его последнего элемента. - Определен predicate
rot(intl,intl), который принимает два аргумента типаintlи возвращает списокX, полученный путем вращения спискаZэлементов спискаY. - В коде определены три clauses для предиката
app:app([],X,X).- если списокXпуст, то он не является приложением ни к какому другому списку.app([H|T],X,[H|R]) :- app(T,X,R).- если списокXне пуст, то он является приложением к спискуY, полученному путем удаления его первого элемента.
- В коде определены два clauses для предиката
last:last([X],X).- если списокXсостоит только из одного элемента, то он является последним элементом этого списка.last([_|H],X) :- last(H,X).- если списокXсодержит более одного элемента, то его последний элемент является последним элементом списка, полученного путем удаления его первого элемента.
- В коде определено одно clause для предиката
butlast:butlast([_],[]).- если списокXпуст, то после удаления его последнего элемента он останется пустым.
- В коде определено одно clause для предиката
rot:rot(X,R) :- last(X,LX), butlast(X,IX), app([LX],IX,R).- если списокXне пуст, то его можно вращать путем замены его последнего элемента на первый элемент спискаY, полученного путем удаления его последнего элемента.