Программу которая должна выполнять циклический сдвиг - Prolog

Узнай цену своей работы

Формулировка задачи:

Написать программу которая должна выполнять циклический сдвиг в права вправо на заданное с клавиатуры число. Пример [1,2,3,4,5], сдвиг на два [4,5,1,2,3].

Решение задачи: «Программу которая должна выполнять циклический сдвиг»

textual
Листинг программы
domains
int=integer
intl=int*
 
predicates
app(intl,intl,intl)
len(intl,int)
head(intl,int,intl)
cut(intl,int,intl)
rot(intl,int,intl)
 
clauses
app([],X,X).
app([H|T],X, [H|R]) :- app(T,X,R).
 
len([],0).
len([_|T],N) :- len(T,N1), N=N1+1.
 
head(_,0,[]).
head([H|T],N,[H|R]) :- N1=N-1, head(T,N1,R).
 
cut(X,0,X).
cut([_|T],N,R) :- N1=N-1, cut(T,N1,R).
 
rot(X,N,Y) :- len(X,L), NN=N mod L, L1=L-NN, head(X,L1,X1), cut(X,L1,X2), app(X2,X1,Y).

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

  1. В коде используется язык программирования Prolog.
  2. В начале кода определены типы данных и множество утверждений (predicates).
  3. Далее идут правила (clauses) для работы с данными.
  4. Первое правило для функции app([],X,X) говорит, что если первый аргумент пуст, то второй и третий аргументы равны между собой.
  5. Второе правило для функции app([H|T],X, [H|R]) говорит, что если первый аргумент не пуст, то второй и третий аргументы равны между собой, а если первый аргумент пуст, то второй и третий равны между собой.
  6. Третье правило для функции len([],0) говорит, что если аргумент пуст, то результат будет 0.
  7. Четвертое правило для функции len([_|T],N) :- len(T,N1), N=N1+1 говорит, что если аргумент не пуст, то результат будет равен сумме результата для пустого списка и единицы.
  8. Пятое правило для функции head(_,0,[]) говорит, что если аргументы равны нулю, то результат будет пустым списком.
  9. Шестое правило для функции head([H|T],N,[H|R]) :- N1=N-1, head(T,N1,R) говорит, что если первый аргумент не пуст, то результат будет равен второму аргументу, уменьшенному на единицу, и третьему аргументу без изменений.
  10. Седьмое правило для функции cut(X,0,X) говорит, что если третий аргумент равен нулю, то результат будет равен второму аргументу.
  11. Восьмое правило для функции cut([_|T],N,R) :- N1=N-1, cut(T,N1,R) говорит, что если третий аргумент не равен нулю, то результат будет равен второму аргументу, уменьшенному на единицу, и третьему аргументу без изменений.
  12. Девятое правило для функции rot(X,N,Y) :- len(X,L), NN=N mod L, L1=L-NN, head(X,L1,X1), cut(X,L1,X2), app(X2,X1,Y) говорит, что результат будет равен третьему аргументу, если длина списка равна L, NN - это результат деления N на L, L1 - это результат вычитания NN из L, head(X,L1,X1) - это результат получения головы списка длиной L1, cut(X,L1,X2) - это результат получения хвоста списка длиной L1, app(X2,X1,Y) - это результат объединения двух списков.

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

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