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

Программа реализована на основе предиката конкатенация(L1, L2, L3), где L1 и L2 – объединяемые списки, L3 – результирующий список.

Работа правила: [X|L1] некий список, поделенный на голову и хвост, где X - головной элемент, а L1 - хвост. Предикат берет 1ый элемент X, добавляет его к результирующему списку [X|L3], и затем вызывает рекурсивно конкатенацию хвоста L1 и второго списка L2. Выделяется 1ый элемент L1(Голова) и ставится на соответствующее место в L3. Процедура продолжается до тех пор, пока L1 не станет пустым.

Если первый аргумент пуст, тогда второй и третий аргументы представляют собой один и тот же список (назовем его L), что выражается в виде следующего факта: конкатенация([],L,L).

Если не пуст, то имеет голову и хвост: конкатенация([X|L1], L2, [X|L3]):- конкатенация (L1,L2,L3). % пр1

конкатенация([1,2,3,],[4,5], L). % запрос даст L=[1,2,3,4,5]

  • 9 . Передача данных при рекурсии в прямом и обратном направлении. Условия передачи данных. Схематичное изображение. Пример. Обобщение.

Действия, выполняемые функцией до входа на следующий уровень рекурсии, называются выполняющимися на прямом ходу рекурсии, а действия, выполняемые по возврату с более глубокого уровня к текущему, – выполняющимися на обратном ходу рекурсии.

В прямом ходе передаётся информация, чтобы «добраться» до базового случая (глубины рекурсии),

т.е. данные передаются от одного рекурсивного вызова к другому.

В обратном ходе результат вычисляется при возврате из глубины.

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

count([], 0).

count([_|T], N) :- count(T, N1), N = N1 + 1.

Обратная передача данных происходит, когда результат рекурсивного вызова используется для вычисления значения в текущем вызове. Например, при объединении двух списков мы создаем новый список, добавляя элементы первого списка в начало второго: append([], L, L).

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

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

Необходимые условия

  • В правой части правила есть рекурсивный вызов.

  • Должны быть данные для передачи.

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

Для обратного хода рекурсии еще правило:

  • Есть базовый случай для завершения рекурсии.

  • 10. Алгоритм разработки рекурсивных правил (действие и результат каждого шага). Пример на основе индивидуального задания ЛР 2.

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

Алгоритм:

  1. Интерпретация и декомпозиция задачи: определить данные для решения задачи и рекурсии.

Декомпозиция: разбиваем на части итоговое решение, получаем мини программы, которые нужны для реализации.

Первым шагом будет разделение элементов исходного списка на группы по чётным и нечётным позициям (нечётные: [1, 3, 5, 7], чётные: [2, 4, 6]). Далее список элементов, стоящих на нечётных позициях, разворачиваем ([7, 5, 3, 1]). Затем мы объединяем последовательно элементы из развернутого списка и списка с элементами с чётных позиций поэлементно ([7, 2, 5, 4, 3, 6, 1])

Результат:

Получена схема решения задачи в виде набора подзадач, каждая из которых может быть реализована отдельным предикатом.

  1. Разработку и тестирование варианта программы с безусловными утверждениями (фактами) (ввод предикатов, формирование фактов, тестирование на простых запросах).

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

  1. Разработку и тестирование варианта с нерекурсивными частными правилами (правила с константами), факты в данном случае становятся базовым случаем.

  1. Разработку и тестирование варианта с нерекурсивными универсальными правилами (правила с переменными).

  2. Разработку и тестирование варианта с рекурсивными универсальными правилами (правила с переменными).

  1. Контроль ограничений на аргументы предиката при обращении к правилу.

  1. з V ф1

первое решение получено, оно отправляется в стек и продолжается поиск решений.

  1. з V лев.ч.пр.

Переменные В и С становятся связанными, поэтому при конкретизации одной из них наступит конкретизация другой.

  1. прав.ч.пр V ф1

Как итог, получаем истину у правила и второе решение. Продолжаем поиск решений.

  1. прав.ч.пр V лев.ч.пр’

Рекурсивное обращение пр. части к его левой эквивалентно обращению к новому предложению.

В и В’ во время сопоставления независимы и стали связанными, при этом при сопоставлении В’ должно быть не конкретизировано.

  1. прав.ч.пр’ V ф1

Получили истину у правила и третье решение, далее продолжается поиск решений по аналогии (6)

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