Назад | Содержание| Вперёд 16. 2. Простой интерпретатор программ,управляемы...

Назад | Содержание| Вперёд

16. 2.    Простой интерпретатор программ,управляемых образцами

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

        ЧастьУсловия --->ЧастьДействия

Часть условия представляет собой списокусловий:

        [ Условие1, Условие2,Условие3, . . .]

где Условие1, Условие2 и т.д. -обычные прологовские цели. Предварительноеусловие запуска модуля считается выполненным,если все цели, содержащиеся в списке, достигнуты.Часть действия - это список действий:

        [ Действие1,Действие2, . . .]

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

На рис. 16.4 показано, как выглядит наша программавычисления наибольшего общего делителя,записанная в соответствии с введенным намисинтаксисом.

% Продукционные правила для нахождениянаибольшего общего

% делителя (алгоритм Евклида)

        :- ор( 300, fx, число).

        [ число X, число Y, X >Y ] --->

        [ НовХ is X - Y, заменить(число X, число НовХ) ].

        [ число X ] ---> [ write(X), стоп ].

% Начальное состояние базы данных

        число 25.

        число 10.

        число 15.

        число 30.

Рис. 16. 4.  Программа,управляемая образцами, для получения

наибольшего общего делителя множества чисел.

Самый простой способ реализации этого языка -использовать механизмы управления базой данных,встроенные в Пролог. Добавить объект в базуданных или удалить объект из базы данных можно,применяя встроенные процедуры

        assert ( Объект)                                                   retract( Объект)

Заменить один объект на другой также просто:

        заменить( Объект1,Объект2) :-

               retract( Объект1),  !,

               assert( Объект2).

Здесь задача оператора отсечения - недопустить, чтобы оператор retract удалил избазы данных более чем один объект (при возвратах).

% Простой интерпретатор дляпрограмм, управляемых образцами

% Работа с базой данных производится при помощипроцедур

% assert и retract

        :- ор( 800, xfx, --->).

        пуск :-

               Условие ---> Действие,                               % правило

               проверить( Условие),                                   % Условие выполнено?

               выполнить( Действие).

        проверить( [ ]).                                                      % Пустое условие

        проверить( [Усл |Остальные]) :-                       % проверить конъюнкцию

               call( Усл),                                                        % условий

               проверить( Остальные).

        выполнить( [ стоп] ) :-  !.                                     % Прекратить выполнение

        выполнить( [ ]) :-                                           % Пустое действие (цикл завершен)

               пуск.                                                        % Перейти к следующему циклу

        выполнить [Д |Остальные] ) :-

               саll( Д),

               выполнить( Остальные).

        заменить( А, В) :-                                           % Заменить в базе данных А на В

               retract( A),  !,

               assert( В).

Рис. 16. 5.  Простойинтерпретатор для программ, управляемыхобразцами.

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

        ?-  пуск.

Назад | Содержание| Вперёд









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх