Структура программы на Visual Prolog

Программа на Visual Prolog имеет следующую обобщенную структуру:

domains /* ...

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

predicates /* ...

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

clauses /* ...

предложения (правила и факты) */

goal /* ...

подцель _1,

подцель _2, и т. д. */

В разделе clauses вы размещаете факты и правила, с которыми будет работать Visual Prolog, пытаясь разрешить цель программы.

Программы на языке Пролог состоят из двух типов фраз: фактов и правил, называемых предложениями.

- Факты — это отношения или свойства, о которых известно, что они имеют значение "истина".

Факты имеют общий вид:

property(objectl, object2, ..., objectN)

ИЛИ

relation(objectl, object2, ..., objectN)

- Правила — это связанные отношения; они позволяют Прологу логически вы водить одну порцию информации из другой. Правило принимает значение "истина", если доказано, что заданный набор условий является истинным.

Правилаимеют общую форму заголовок:- тело, которые выглядят так:

relation(object,object,...,object):-relation(object,...,object), relation(obj ect,...,obj ect).

Прологе все правила имеют 2 части: заголовок и тело, разделенные специальным знаком :-.

- Заголовок — это факт, который был бы истинным, если бы были истинными несколько условий. Это называется выводом или зависимым отношением.

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

Факты и правилаПролога получают информацию при вызове с аргументами, которые могут быть константами или связанными переменными; они возвращают информацию в вызывающую процедуру путем связывания аргументов, которые являются несвязанными переменными.

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

В разделе predicates вы объявляете предикаты и домены (типы) аргументов этих предикатов. Имена предикатов должны начинаться с буквы (желательно строчной), за которой следует последовательность букв, цифр и символов подчеркивания (до 250 знаков). В именах предикатов нельзя использовать символы пробел, минус, звездочка, слэш. Объявление предиката имеет следующую форму:

predicates

predicateName(argumentTypel OptionalNamel, argumentType2 OptionalName2, < ... >; argumentTypeN OptionalNameN)

Здесь argument_type1, ..., argument_typeN — либо стандартные домены, либо домены, объявленные в разделе domains. Объявление домена аргумента и описание типа аргумента — суть одно и то же. Имена аргументов OptionalNamel будут игнорироваться компилятором.

В разделе domains объявляются любые нестандартные домены, используемые для аргументов предикатов. Домены в Прологе являются аналогами типов в других языках. Основные стандартные домены Visual Prolog: char, byte, short, ushort, word, integer, unsigned, long, ulong, dword, real, string И symbol.

Основная форма объявления доменов имеет вид:

domains

myDomainl, . . ., myDomainN = <standardDomain>

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

myDomainl,..., myDomainN = <compoundDomain_l>;

<compoundDomain_2>; < ... >; <compoundDoma i n_M>

Домены позволяют задавать разные имена различным видам данных. В программах Visual Prolog объекты в отношениях (аргументы предикатов) принадлежат доменам, причем это могут быть как стандартные, так и описанные вами специальные домены.

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

 

Таблица 1 - Основные стандартные предикаты

Домен Описание и реализация
short Короткое, знаковое, количественное. Все платформы 16 бит (-32 768-32 767)
ushort Короткое, беззнаковое, количественное, Все платформы 16 бит (0—65 535)
long Длинное, знаковое, количественное, Все платформы 32 бит (-2 147 483 648-2 147 483 647)
ulong Длинное, беззнаковое, количественное, Все платформы 32 бит (0-4 294 967 295)
integer Знаковое, количественное, имеет платформо-зависимый размер, Платформы 16 бит (-32 768-32 767), Платформы 32 бит (-2 147 483 648-2 147 483 647)
unsigned Беззнаковое, количественное имеет платформо-зависимый размер. Платформы 16 бит (0—65 535) Платформы 32 бит (0-4 294 967 295)
byte Все платформы 8 бит (0— 55)
word Все платформы 16 бит (0-65 535)
dword Все платформы 32 бит (0-4 294 967 295)
char Символ, реализуемый как беззнаковый byte. Синтаксически это символ, заключенный между двумя одиночными кавычками: ' а'
real Число с плавающей запятой, реализуемое как 8 байт в соответствии с соглашением IEEE; эквивалентен типу double в С. Синтаксически числа с необязательным знаком (+ или -), за которым следует несколько цифр DDDDDDD, затем необязательная десятичная точка (.) и еще цифры ddddddd, за которыми идет необязательная экспоненциальная часть (е(+ или -)ddd): <+|-> DDDDD <.> DDDDDDD <е <+|-> DDD> Примеры действительных чисел (real): 42705...9999...86.72 9111.929437521е238...79.83е+21 Здесь 79.83е+21 означает 79.83х1021, как и в других языках. Допустимый диапазон чисел: от 1x10""307 до 1х10+зое (от 1е-307 до 1е+308). При необходимости, целые автоматически преобразуются в real
string Последовательность символов, реализуемых как указатель на байтовый массив, завершаемый нулем, как в С. Для строк допускается два формата: 1. Последовательность букв, цифр и символов подчеркивания, причем первый символ должен быть строчной буквой. 2. Последовательность символов, заключенных в двойные кавычки.
symbol Последовательность символов, реализуемых как указатель на вход в таблице идентификаторов, хранящей строки идентификаторов. Синтаксис — как для строк

 

В разделе goal вы задаете внутреннюю цель программы; это позволяет программе быть скомпилированной, запускаться и выполняться независимо от среды визуальной разработки (VDE).

Правила имеют форму:

HEAD: - <Subgoall>, <Subgoal2>, ..., <SubgoalN>.

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

Оператор Пролога :- (if) отличается от if, используемых в других языках: правило Пролога работает в соответствии с условной формой тогда/если, тогда как этот оператор в других языках работает в соответствии с условной формой если/тогда.

Пролог всегда ищет решение, начиная с первого факта и/или правила, и просматривает весь список фактов и/или правил до конца.

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

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

Анонимные переменные позволяют "привести в порядок" наши программы. Если вам нужна только определенная информация запроса, можно использовать анонимные переменные для игнорирования ненужных значений. В Прологе анонимные переменные обозначаются символом подчеркивания (_). Анонимная переменная может быть использована на месте любой другой перемен ной и ей никогда не присваивается значение.

Хорошим стилем программирования является включение в программу комментариев, объясняющих все то, что может быть непонятно кому-то другому (или даже вам, спустя полгода). Если вы подберете подходящие имена для переменных, предикатов и доменов, то вам понадобится меньше комментариев, т. к. программа будет объяснять себя "сама".

Многострочные комментарии должны начинаться с символов /* (косая черта, звездочка) и завершаться символами */ (звездочка, косая черта). Для установки одно строчных комментариев можно использовать либо эти же символы, либо начинать комментарий символом процента (%).

/* Это первый пример комментария */ % Это второй пример комментария

А эти три строчки — пример многострочного комментария

/*Вы также можете поместить комментарий Visual Prolog /*внутри комментария */ как здесь*/