Рекурсивная версия программы

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

% Текущее состояние Следующее состояние

% добыча хищники добыча хищники

переход (б (рост, без_изменений), б (без_изменений, рост)).

переход (б (без_изменений, рост), б (уменьшение, без изменений)).

переход (б (уменьшение, без_изменений), б (без изменений, уменьшение)).

переход (б (без_изменений, уменьшение), б (рост, без_изменений)).

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

% Имена переменных:

% Тдоб - текущая популяция добычи;

% Тхищ - текущая популяция хищников;

% Сдоб - популяция добычи в следующий период времени;

% Схищ - популяция хищников в следующий период времени.

% +

рпоп (б (Тдоб, Тхищ), б (Сдоб. Схищ)): - % (1)

переход (б (Тдоб, Тхищ), б (Сдоб, Схищ)).

рпоп (б (Тдоб, Тхищ). б (Сдоб1, Схищ!)): - % (2)

переход (б (Тдоб, Тхищ), б (СдобО, СхищО)),

рпоп (б (СдобО, СхищО), б (Сдоб1, Схищ!)).

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

|? - рпоп ( б (уменьшение,_), б (Доб, Хищ)).

Доб = без_изменений

Хищ =уменьшение; % Фаза 1

Доб = рост

Хищ = без_изменений; % Фаза 2

Доб = без_изменений

Хищ = рост; % Фаза 3

Доб = уменьшение

Хищ = без_изменений; % Фаза 4

Доб = без_изменений

Хищ =уменьшение; % Фаза 5,

%совпадает с фазой 1.

В рекурсивной процедуре "рпоп" (в отличие от процедуры "популяция", в которой использован алгоритм поиска с возвратом) порядок следования ответов не зависит от порядка, в котором расположены факты "переход", поскольку для каждого из этих фактов выполняется сопоставление с эталоном. Здесь каждый факт выражает причинную связь между двумя состояниями экосистемы. В программе, которая более точно моделировала бы экологический процесс, каждый факт "переход" можно было бы превратить в правило. К примеру, можно было бы ввести правило "переход", которое не допускало бы увеличения популяции хищников, если бы местные власти поощряли охоту на хищников. Другое правило могло бы разрешить рост популяции добычи только в том случае, когда имеется достаточно пищи и воды:

% Текущее состояние Следующее состояние

% добыча хищники добыча хищники

переход ( б (без_изменений, уменьшение), б (рост, без_изменений): -

текущий_сезон (Сезон),

достаточно_пищи (добыча, Сезон),

достаточно_воды (Сезон).

В обеих приведенных версиях программы (рекурсивная версия и версия, в которой применяется поиск с возвратом) будет вырабатываться бесконечное множество ответов. Однако рекурсивная версия потребует большего объема памяти, и в некоторых версиях Пролога она закончится аварийно, когда интерпретатор исчерпает доступную ему стековую память.

Описание множества ответов

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

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие