Структура программы состоит из раздела Goal(цель), раздела Interfaces(раздел интерфейса), Class declarations(объявления классов) и Class implementations(реализация классов), которые содержат объявления и определения сущностей языка Пролога (факты, правила, цель).  Сущности Пролога объявляются в следующих разделах:

раздел описания доменов (Domains), раздел констант (Constants), раздел описания предикатов (Predicates), раздел описания предложений (Clauses) и раздел описания цели (Goal).

В общем смысле программа на Прологе состоит из набора правил, которые находятся в разделе Class implementations, выполняющие предикаты из раздела Predicates, где, в свою очередь, набор правил располагается в секции правил Clauses.

Рассмотирм основные разделы программы и их назначение:

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

Синтаксис объявления доменов в программе имеет вид:

имя домена =  <стандртный домен>.

Основные стандартные домены представлениы в таблице 4.

Например, определим в программе три домена отвечающие за имя, пол и возраст.

domains

name = symbol.

sex = symbol.

age = integer.

 

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

Синтаксис предикатных доменов для обычных предикатов определяется следующим образом:

<имя предикатного домена> = (аргументы предиката).

аргументы предиката определяется списком аргументов через запятую, где аргумент определяется как:

<тип аргумента имя аргумента>.

Например:

domains

pdomain1 = (real Arg1, real Arg2,  real Rez).

Синтаксис для предикатов с возращаемым значением определяется так:

<имя предикатного домена> = (аргументы предиката)-> тип возвращаемого значения ReturnType.

Например:

domains

pdomain2 = (real Arg1, real Arg2) -> real ReturnType.

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

Синтаксис объявления констант следующий:

имя константы = <значение константы>.

Например:

constants

zero = 0.

pi  = 3.141592653.


Таблица 4. Список стандартных доменов

 

Домен

Описание

Реализация

char

UNICODE символ

2 байта

string

Строка, состоящая из последовательности UNICODE (2 байта) символов

 

string8

Строка, состоящая из последовательности ASCII(1байт) символов.

 

Symbol

Строка состоящая из последовательности символов типа char.

 

integer

Целое число.

4 байта

(2147483648 – 2147483647).

 

integer64

Длинное целое число.

8 байт-

(263 = -9,223,372,036,854,775,808 –

263-1 =9,223,372,036,854,775,807.)

unsigned

Беззнаковое число

4 байт(0-4294967295)

unsigned64

Длинное беззнаковое число

8 байт

(0-264-1 = 18,446,744,073,709,551,615)

real

Длинное вещественное число.

8 байт(-1.7e+308 – 1.7e+308)

real32

Вещественное число.

4 байт(-3.4e+38 – 3.4e+38)

Boolean

Булевые значения.

false(); true()

 

• Раздел Predicates служит для описания предикатов.

Аргументы предикатов должны быть либо стандартными доменами, либо некоторыми из тех, что были объявлены в разделе доменов. Аргументов у предиката может быть несколько, если у предиката определено N аргументов, то говорят что предикат N-арный. Здесь, нужно заметить, что предикаты с различной арностью являются разными, даже если их имена совпадают. Предикат с одним аргументом является фактом и может быть определен в разделе фактов.

Как было замечено ранее, предикат, который возвращает некоторое значение является функцией и для дальнейшего определения различия между предикатом и функцией введем следующая обозначения:

имя предиката/N – такое обозначение соответствует определению N- арного предиката.

имя предиката/N–> – такое обозначение соответствует определению функции с N аргументами.

Рассмотрим синтаксис объявления предиката.

<имя предиката>: (список аргументов)[режим предиката][схема ввода/вывода]

Здесь синтаксис для определения списка аргументов соответствует синтаксису определения списка аргументов при определении доменов. Должное внимание здесь нужно уделить определению режима предиката и определению схемы ввода /вывода для аргументов предиката.

Режимы предиката или иначе их называют режимы детерминизма предиката, указывают на то, сколько предикат может иметь решений, единственное или несколько и варианты завершения работы предиката(удачно / неудачно) . Определить эти режимы можно с помощью ключевых слов:

1. nondeterm

Данный режим указывает на то, что выполнение предиката может быть либо удачным,  либо неудачным и  имеет несколько решений.

2. determ

Данный режим указывает на то, что выполнение предикат может иметь только одно решение и может завершиться удачно либо не удачно.

3. procedure

Предикат такого вида всегда заканчивается успешно и имеет только одно решение.

4. multi

Такой предикат всегда заканчивается удачно и имеет множество решений.

Схема ввода/вывода определяется комбинациями символов (i),(o), где символ i для соответствующего аргумента указывает на то, что этот аргумент является входным, символ o указывает на то, что соответствующий аргумент является выходным.

В качестве примера рассмотрим объявление предиката поиска минимального числа из двух:

minimum:(real Arg1, real Arg2,real Res)procedure(i, i, o).

В раздел Clauses заносятся факты и правила самой программы.

В разделе Goal задается внутренняя цель программы, что позволяет запустить программу на выполнение. Данный раздел программы является обязательным.

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

 

Таблица 5. Основные блоки программы

Блок описания программы

Блок реализации программы

class main
predicates
объявление предикат

end class main

implement main
domains

объявление доменов

class predicates

объявление предикат

clauses

объявление правил

end implement main

goal

определение цели программы

 

Более подробно описание классов, реализацию классов, а также  раздел implement мы рассмотрим в главе 3.

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

Этот пример демонстрирует использование домена. Здесь определяется домен с двумя входными аргументами и возвращаемым значением. С помощью данного домена определим предикат умножения двух чисел.

implement main

domains

pdomain = (real Arg1, real Arg2) -> real ReturnType.

class predicates

multiply: pdomain.

clauses

multiply (X,Y)=Res:- ResX*Y.

run():- console::init(),

stdio::write( prod(stdio::read(),stdio::read())),

stdio::nl.

end implement main

goal

mainExe::run(main::run).

В этом примере определяется предикат поиска минимума из двух чисел, причем минимальное число увеличивается на два.

implement main

class predicates

minimum:(real Arg1, real Arg2,real Res)procedure(i,i,o).

clauses

minimum(X,Y,X2) :- X<=Y,!.

run():- console::init(),

minimum(stdio::read(), stdio::read(), T),

stdio::write("Mininmum is "), stdio::write(T),

stdio::nl.

end implement main

goal

mainExe::run(main::run).