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