Определить предикат циклический_сдвиг (Список 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
, полученного путем удаления его последнего элемента.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д