Логическое программирование. Элементы и конструкции языка Турбо-Пролог. Средства отладки Турбо-Пролога, страница 7

Замечание: не допускается рекурсивное определение символических констант, т.е. не допустимо, например, следующее выражение: sto = 2 * sto / 2

Раздел domains предназначен для объявления доменов, описывающих типы областей значений используемых в программе объектов (термов). Например, если мы хотим определить предикат person(familia, pol, vozrast) характеризующий людей (person) с точки зрения фамилии (familia), пола (pol)  и возраста (vozrast), и позволяющий описывать конкретные факты о  людях в разделе clauses  программы, то необходимо в разделе domains программы объявить соответствующие этим термам типы доменов:

 domains 

  familia, pol = symbol   vozrast = integer

Раздел predicates предназначен для объявления предикатов пользователя с указанием имени предиката и его доменов. Домены указываются в скобках и разделяются запятыми. Домены задаются либо явно, либо неявно. Декларация предиката не заканчивается точкой, в отличие от утверждений в разделе clauses.Предикат может состоять и из одного имени. Обычно такие предикаты используются для обозначения цели или заголовка правила. Например, предикат start часто используют в качестве имени программы, а предикат menu может служить заголовком правила, определяющего возможности меню программы.

Раздел clauses служит для размещения фактов и правил, которые используются для оперирования этими фактами. Порядок расположения утверждений в разделе clauses не имеет значения, однако важным требованием Турбо-Пролога является расположение утверждений с одноименным предикатом последовательно друг за другом в одном месте программы (т.е. без “разрывов”).

Рассмотрим, например, следующий фрагмент программы:

     domains 

           familia, pol = symbol           vozrast = integer      predicates

           person(familia, pol, vozrast)    clauses       person("Петров","муж",35).     person("Волков","муж",21).     person("Полякова","жен",28).

В разделе clauses приведенного фрагмента программы имеется три утверждения-факта с предикатом person. В этих утверждениях на месте аргументов данного предиката, выступающих в роли доменов, появляются конкретные значения, принадлежащие домену familia (symbol); “муж”, ”жен”, принадлежащие домену pol (symbol); 35, 21, 28, принадлежащие домену vosrast (integer).

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

                 predicates

           person(symbol, symbol, integer)      clauses       person("Петров","муж",35).     person("Волков","муж",21).     person("Поляков","жен",28).

Программа стала короче (раздел domains исчез), раздел clauses не изменился, однако восприятие и понимание программы (особенно в случае большого количества различных предикатов) становится более сложным. Поэтому предпочтительным является описание типов доменов с использованием раздела domains.

Форматы объявления доменов предикатов следующие:

а. Для одного домена:

<имя домена>=<ключевое слово типа домена>

б. Для группы однотипных доменов:

<имя домена1>,…,<имя доменаN>=<ключевое слово типа домена>

Раздел database служит для описания предикатов динамической базы данных (ДБД). ДБД состоит из фактов, которые предполагается модифицировать (удалять, добавлять, изменять) во время работы программы. Если такая база не используется, то раздел database в программе отсутствует.

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