Чтение онлайн

на главную - закладки

Жанры

Неизвестно

Шрифт:

Рис. 16. 3. Процесс вычисления наибольшего общего делителя

множества чисел. Первоначально база данных содержит числа

25, 10, 15 и 30. Вертикальная стрелка соединяет число с его

"заменителем". Конечное состояние базы данных: 5, 5, 5, 5.

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

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

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

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

Поделиться:
Популярные книги

Жребий брошен

Прозоров Александр Дмитриевич
10. Ведун
Фантастика:
фэнтези
8.90
рейтинг книги
Жребий брошен

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
7.33
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Тринадцатый

Северский Андрей
Фантастика:
фэнтези
рпг
7.12
рейтинг книги
Тринадцатый

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Черный Рассвет

Кейн Рейчел
12. Морганвилльские вампиры
Фантастика:
ужасы и мистика
8.94
рейтинг книги
Черный Рассвет

Страж Кодекса

Романов Илья Николаевич
1. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса

Кодекс Крови. Книга ХVII

Борзых М.
17. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХVII

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.25
рейтинг книги
Чужая семья генерала драконов

Правь, Британия!

дю Морье Дафна
Проза:
современная проза
6.25
рейтинг книги
Правь, Британия!

Николай Гоголь

Труайя Анри
Проза:
историческая проза
6.40
рейтинг книги
Николай Гоголь

Иисус неизвестный

Мережковский Дмитрий Сергеевич
Научно-образовательная:
философия
4.00
рейтинг книги
Иисус неизвестный

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХVI

Виконт. Книга 4. Колонист

Юллем Евгений
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Виконт. Книга 4. Колонист