Определить предикат циклический_сдвиг (Список 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).

Объяснение кода листинга программы

  1. В коде определен predicate app(intl,intl,intl), который принимает три аргумента типа intl. Предполагается, что этот предикат определяет, является ли элемент списка X приложением к списку Y элементов списка Z.
  2. Также определен predicate last(intl,int), который принимает два аргумента типа intl и возвращает последний элемент списка X.
  3. Определен predicate butlast(intl,intl), который принимает два аргумента типа intl и возвращает список X без его последнего элемента.
  4. Определен predicate rot(intl,intl), который принимает два аргумента типа intl и возвращает список X, полученный путем вращения списка Z элементов списка Y.
  5. В коде определены три clauses для предиката app:
    • app([],X,X). - если список X пуст, то он не является приложением ни к какому другому списку.
    • app([H|T],X,[H|R]) :- app(T,X,R). - если список X не пуст, то он является приложением к списку Y, полученному путем удаления его первого элемента.
  6. В коде определены два clauses для предиката last:
    • last([X],X). - если список X состоит только из одного элемента, то он является последним элементом этого списка.
    • last([_|H],X) :- last(H,X). - если список X содержит более одного элемента, то его последний элемент является последним элементом списка, полученного путем удаления его первого элемента.
  7. В коде определено одно clause для предиката butlast:
    • butlast([_],[]). - если список X пуст, то после удаления его последнего элемента он останется пустым.
  8. В коде определено одно clause для предиката rot:
    • rot(X,R) :- last(X,LX), butlast(X,IX), app([LX],IX,R). - если список X не пуст, то его можно вращать путем замены его последнего элемента на первый элемент списка Y, полученного путем удаления его последнего элемента.

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


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

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

12   голосов , оценка 4.083 из 5
Похожие ответы