Структура программы на 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 /*внутри комментария */ как здесь*/