Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на языке Turbo Prolog.doc
Скачиваний:
23
Добавлен:
09.11.2019
Размер:
563.2 Кб
Скачать

3. Структурные диаграммы

Диаграммы — средство анализа и наглядного представления составных структур. На рис. 3.1 показана доменная структурная диаграмма (ДСД) программы 3.1.

рис 3.1

Имя домена здесь personal_library, имя структуры — book. Структура содержит четыре объекта: title, author, publisher и year.

рис 3.2

Отметим, что ДСД является компонентой ПСД. book здесь является функтором. Как видно из рисунка, ПСД программы содержит 2 уровня.

Эти диаграммы хорошо демонстрируют организацию доменов и предикатов. ДСД и ПСД являются удобным средством при разработке и документировании программ Турбо-Пролога. Они также могут оказать помощь при написании эффективных правил.

Разработка доменных и предикатных структур облегчит пользование базой данных. Чем больше функторов, тем более определенные запросы можно адресовать базе данных, а именно такие запросы представляют наибольший интерес.

4. Использование в запросах анонимных переменных

/* Программа 3.1 «Библиотека». Назначение: */

/* демонстрация одноуровневого */

/* составного объекта */

domains

/* персональная библиотека = книга (название, автор, издательство,год издания) */

personal_library = book(title, author,

publisher, year)

name, title, author, publisher = symbol

year = integer

predicates

/* коллекция (имя коллекционера, библиотека) */

collection(name,personal_library)

clauses

collection(kahn, book("The Computer and the Brain", "von Neumann", "Yale University Press",1958)).

collection(kahn, book("Symbolic Logic", "Lewis Carroll", "Dower Publications", 1958)).

collection(johnson, book("Database: A Primer", "C.J.Date", "Addison-Wesley", 1983)).

collection(johnson, book("Problem-Solving Methods in AI", "Nils Nilsson", "McGraw Hill", 1971)).

collection(smith, book("Alice in Wonderland", "Lewis Carroll", "The New American Library", 1960)).

collection(smith, book("Fables of Aesop", "Aesop-Calder", "Dover Publications", 1967)).

/* Конец программы */

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

collection(smith,Books).

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

collection(Collector,book(Title,_,_,1967)).

Здесь свободными переменными являются уже Collector и Title. Подчерки (_) указывают на то, что нас не интересуют объекты с типами author и publisher.

Задайте вопрос:

как зовут коллекционера, которому принадлежит книга «Database.A Primer."?

collection(Collector,book("Database:A Primer", _,_,_)).

Каковы названия книг, опубликованных после 1980 года?

collection(_,book(Title,_,_,Year)), Year > 1980.

5. Использование альтернативных доменов

Представление данных часто требует наличия большого числа структур, и все они должны быть описаны. Чтобы один и тот же предикат мог работать с объектами разных типов, Турбо-Пролог предлагает альтернативные описания доменов. Программа 3.2 «Предметы» использует эти альтернативные описания:

/* Программа 3.2 «Коллекция». Назначение: */

/* демонстрация использования конструкций */

/* альтернативных доменов. */

domains

thing = book(author,title) ;

record(artist,album,type)

name, author, title, artist, album = symbol

predicates

owns(name, thing)

clauses

owns("Bill", book("J.R.R. Tolkein", "Return of the Ring")).

owns("Bill", record("Elton John", "Ice Fair")).

/* Конец программы */

Для разделения альтернативных доменов здесь применена точка с запятой (;). Использование альтернативных доменов позволяет писать в утверждениях предикат owns применительно к различным классам вещей. В отсутствие этой конструкции требовалось бы ввести два разных предиката owns.

Упражнение 3.1.

Сформулируйте сокращенные внутренние запросы

1) перечислить названия всех книг;

show_books :-

2) перечислить все записии и их владельцев;

show_records :-

3) перечислить все предметы коллекции одного владельца, используя только предикат owns.