Структура программы состоит из раздела 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 end class main |
implement main объявление доменов 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:- Res = X*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,X + 2) :- 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).