- •Глава 4
- •Введение
- •Три точки зрения на Пролог-программу
- •4. 1. Реляционный подход
- •Изображение отношений
- •Ограничения, обеспечивающие целостность, которые накладываются при записи отношений в программу
- •Ограничения, обеспечивающие целостность, накладываемые при выборке фраз
- •Реализация свойств отношений
- •Нерефлексивность
- •Симметричное и транзитивное отношение
- •Первая попытка
- •Вторая попытка
- •Запоминание списка посещенных мест
- •4. 2. Взгляд на программу с точки зрения потока данных Переход от выходного потока данных к программе
- •Упорядоченные множества ответов
- •Генерирование бесконечного множества
- •Экологический процесс
- •Версия программы, в которой применяется поиск с возвратом
- •Рекурсивная версия программы
- •Планирование производственных операций
- •Сильные и слабые стороны подхода к программе с позиций потока данных
- •4.3. Бихевиористический подход Приведенные ранее примеры, в которых проявился бихевиористический подход
- •Ограничение сферы действия эффектов поведения
- •Программа "найти_или_спросить"
- •Оценка бихевиористического подхода
- •Библиографические заметки
- •Упражнения
Рекурсивная версия программы
Можно получить это же множество ответов и при помощи рекурсивной процедуры. Начнем с определения базы данных, содержащей информацию о переходах экологической модели из одних состояний в другие. Первым аргументом каждого факта "переход" является структура "б", характеризующая баланс популяций "добыча "/"хищники" в текущем состоянии системы, а вторым аргументом служит такая же структура, характеризующая последующее состояние этой системы. Предполагается, что ситуация, сложившаяся в текущем состоянии, с необходимостью вызывает переход к другой ситуации в следующем состоянии.
% Текущее состояние Следующее состояние
% добыча хищники добыча хищники
переход (б (рост, без_изменений), б (без_изменений, рост)).
переход (б (без_изменений, рост), б (уменьшение, без изменений)).
переход (б (уменьшение, без_изменений), б (без изменений, уменьшение)).
переход (б (без_изменений, уменьшение), б (рост, без_изменений)).
Первым аргументом рекурсивной процедуры "рпоп" (сокращение от слов "рекурсивная популяция") является структура "б", представляющая начальное состояние баланса "добыча"/"хищники" а вторым аргументом служит структура "б", представляющая следующее состояние этого баланса.
% Имена переменных:
% Тдоб - текущая популяция добычи;
% Тхищ - текущая популяция хищников;
% Сдоб - популяция добычи в следующий период времени;
% Схищ - популяция хищников в следующий период времени.
% +
рпоп (б (Тдоб, Тхищ), б (Сдоб. Схищ)): - % (1)
переход (б (Тдоб, Тхищ), б (Сдоб, Схищ)).
рпоп (б (Тдоб, Тхищ). б (Сдоб1, Схищ!)): - % (2)
переход (б (Тдоб, Тхищ), б (СдобО, СхищО)),
рпоп (б (СдобО, СхищО), б (Сдоб1, Схищ!)).
Правило (!) только лишь отыскивает факт "переход" с требуемым первым аргументом и возвращает второй аргумент этого факта. Правило (2) находит тот же самый факт "переход", а затем выполняет рекурсивный вызов процедуры "рпоп", при котором второй аргумент найденного факта служит первым аргументом этой процедуры. Запишем запрос к процедуре "рпоп", начиная с точки, в которой популяция добычи уменьшается:
|? - рпоп ( б (уменьшение,_), б (Доб, Хищ)).
Доб = без_изменений
Хищ =уменьшение; % Фаза 1
Доб = рост
Хищ = без_изменений; % Фаза 2
Доб = без_изменений
Хищ = рост; % Фаза 3
Доб = уменьшение
Хищ = без_изменений; % Фаза 4
Доб = без_изменений
Хищ =уменьшение; % Фаза 5,
%совпадает с фазой 1.
В рекурсивной процедуре "рпоп" (в отличие от процедуры "популяция", в которой использован алгоритм поиска с возвратом) порядок следования ответов не зависит от порядка, в котором расположены факты "переход", поскольку для каждого из этих фактов выполняется сопоставление с эталоном. Здесь каждый факт выражает причинную связь между двумя состояниями экосистемы. В программе, которая более точно моделировала бы экологический процесс, каждый факт "переход" можно было бы превратить в правило. К примеру, можно было бы ввести правило "переход", которое не допускало бы увеличения популяции хищников, если бы местные власти поощряли охоту на хищников. Другое правило могло бы разрешить рост популяции добычи только в том случае, когда имеется достаточно пищи и воды:
% Текущее состояние Следующее состояние
% добыча хищники добыча хищники
переход ( б (без_изменений, уменьшение), б (рост, без_изменений): -
текущий_сезон (Сезон),
достаточно_пищи (добыча, Сезон),
достаточно_воды (Сезон).
В обеих приведенных версиях программы (рекурсивная версия и версия, в которой применяется поиск с возвратом) будет вырабатываться бесконечное множество ответов. Однако рекурсивная версия потребует большего объема памяти, и в некоторых версиях Пролога она закончится аварийно, когда интерпретатор исчерпает доступную ему стековую память.
Описание множества ответов
Про множество ответов на запрос к процедурам "популяция" и "рпоп" можно сказать, что оно представляет из себя цикл, состоящий из четырех фаз. За один раз выдаются два интересующих нас ответа, которые перемещаются по этому циклу со смещением на одну фазу друг относительно друга. Порядок выдаваемых ответов соответствует нормальному ходу времени.
