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

Глава 2. Внутренние цели. Механизм возврата

1. Структура пролог-программы

Любая программа, написанная на Турбо-Прологе, состоит из пяти разделов. Таковыми являются раздел описания доменов, раздел базы данных, раздел описания предикатов, раздел описания цели и раздел описания утверждений. Ключевые слова constants, domains, database, predicates, goal и clauses отмечают начала соответствующих разделов.

Назначение этих разделов таково:

— Раздел constants содержит описание констант.

— Раздел domains содержит определения доменов, которые описывают типы данных объектов, используемых в программе.

— Раздел database содержит описания предикатов динамической базы данных. Если программа такой базы данных не требует, то этот раздел может быть опущен.

— Раздел predicates служит для описания используемых программой предикатов.

— В разделе goal на языке Турбо-Пролога формулируется цель. Составными частями при этом могут являться некие подцели, из которых формируется единая цель программы. Такая цель называется внутренней.

— В раздел clauses заносятся факты и правила. О содержимом этого раздела можно говорить как о данных, необходимых для работы программы.

Турбо-Пролог обеспечивает возможность включения в программу комментариев, которые обрамляются символами /* */. Комментарии можно помещать в любом месте программы, причем на их длину нет практически никаких ограничений. Для того, чтобы служить своему назначению, комментарии должны содержать информацию о самой программе, имени программного файла, компиляторе, базе данных, а также о назначении каждого из предикатов и правил, которые не являются в достаточной степени очевидными.

/* комментарии */

constants

< описание констант >

domains

< описание доменов >

database

< описание предикатов динамической базы данных >

predicates

< описание предикатов >

goal

< целевое утверждение >

clauses

< утверждения >

2. Использование внутренних целей

Если цель поиска задается в самой программе, в разделе goal, то она является внутренней. Само предложение, определяющее цель, может состоять из подцелей, разделенных связками. Предложение, описывающее цель, должно оканчиваться точкой.

При доказательстве внутренней цели система найдет ровно одно решение, удовлетворяющее данный запрос.

Если в качестве связок используется конъюнкция, то ответ будет найден в результате выполнения всей совокупности целевых утверждений.

Вернемся к примеру из главы 1, описывающему дерево родственных отношений (рис. 1.2).

Goal

sister(ann,X),write(”Ann — сестра ”,X), nl

Вначале будет согласован предикат sister и переменная X означена значением pat, затем встроенный предикат write напечатает Ann — сестра pat, затем предикат nl переведет строку, и на этом выполнение программы завершится.

Рассмотрим подробно применение дизъюнкции в качестве связки между подцелями.

Пусть дизъюнкция разделяет подцели в теле правила:

ancestor(X,Y):-

pearent(X,Y);

pearent(X,Z), ancestor(Z,Y).

Конъюнкция связывает сильнее, чем дизъюнкция, поэтому это равносильно

pearent(X,Y);

(pearent(X,Z), ancestor(Z,Y))

и, в свою очередь, равносильно двум правилам:

ancestor(X,Y):-

pearent(X,Y).

ancestor(X,Y):-

pearent(X,Z), ancestor(Z,Y).

Если дизъюнкция разделяет подцели внешней цели:

Goal: sister(ann,X); pearent(X,ann)

то это будет аналогично последовательному выполнению двух разных запросов: вначале система найдет всех, для кого ann сестра, затем родителей ann.

Если бы предыдущий запрос был переформулирован как внутренняя цель (с добавлением предикатов write), то система не стала бы согласовывать цель о родителях ann, так как остановка произошла поcле первого успешного согласования подцели sister.

Из предыдущего примера видно, что свойство внутренней цели находить ровно одно решение не всегда является удобным.