Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БИЛЕТЫ 25-26 уч.г..docx
Скачиваний:
0
Добавлен:
19.06.2026
Размер:
42.25 Mб
Скачать
  • 6. Рекурсия списков. Виды различных действий над списками при однократном рекурсивном обращении из правой части правила в левую. Примеры.

Рекурсия списков — это способ обработки списков, при котором правило в правой части обращается к своей левой части, передавая хвост списка, что позволяет последовательно обрабатывать элементы списка.

Обращение правой части к левой приравнивается к обращению к новому предложению (со штрихом).

Список при этом делится на голову и хвост.

Необходимым условием рекурсивности правила является наличие одноимённого предиката в левой и правой частях правила

О днократное рекурсивное обращение означает, что: в правой части правила предикат обращается к самому себе один раз; за один шаг рекурсии выполняется одно действие над списком.

Виды действий при однократной рекурсии:

Чтобы произвести однократное действие мы должны знать его позицию в списке (относительно левого края), т.к. работаем с головой.

  • передача списка без изменений

pass_list([], []).

pass_list([H|T], [H|R]) :-

pass_list(T, R).

  • добавление/удаление головы списка

add_to_head(_, [], []).

add_to_head(X, [H|T], [X,H|R]) :-

add_to_head(X, T, R). remove_head([], []).

remove_head([_|T], R) :-

remove_head(T, R).

  • тригонометрические и арифметические функции над головой списка

arith_head([], []).

arith_head([H,I|T], [H * 2, I+1|R]) :-

arith_head(T, R).

  • поменять местами элементов головы списка

swap_two([], []).

swap_two([X], [X]).

swap_two([A,B|T], [B,A|R]) :- swap_two(T, R).

  • замена первого элемента (головы) анонимной переменной - сохранение структуры списка

replace_head([], []).

replace_head([_|T], [_|R]) :- replace_head(T, R).

  • дублирование элементов в голове списка

dup_head([], []).

dup_head([H|T], [H,H|R]) :- dup_head(T, R).

Действия которые сделать нельзя: удалить последний элемент, поменять местами первый и последний элемент, математически изменить последний элемент, дублировать последний элемент, вернуть последний элемент.

Т.к. не знаем крайний элемент

7. Пошаговое выполнение программы принадлежность элемента списку. Процедуры, обеспечивающие возврат найденного значения в переменную запроса. Схематичное изображение возврата. Пример.

При работе со списком делим его на голову и хвост для обработки элементов, находящихся в голове.

При выполнение программы принадлежности элемента списку, левая часть правила делит список на голову (содержит 1ый элемент) и хвост (содержит все остальные элементы). Если первый элемент не оказался искомым, то он отбрасывается и происходит переход в правую часть правила, где используется рекурсия и так далее до тех пор, пока не будет найден/не найден искомый элемент.

Код программы - примера:

принадлежит([A|_], A). – конечный случай

принадлежит([_|Tail], X):- принадлежит(Tail, X). - универсальное рекурсивное правило

Процедуры, обеспечивающие возврат найденного значения в переменную запроса:

  • сопоставление предложений

  • связывание переменных

  • конкретизация переменной (не факт)

При всех этих процедурах происходит конкретизация не конкретизированных переменных, что позволяет при передаче данных вернуть найденное значение в переменную запроса.

Соседние файлы в предмете Теория обработки информации