Программа на 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, как и в других языках. Допустимый диапазон чисел: от 1×10307 до 1х10+зое (от 1е-307 до 1е+308). При необходимости, целые автоматически преобразуются в real |
| string | Последовательность символов, реализуемых как указатель на байтовый массив, завершаемый нулем, как в С. Для строк допускается два формата: 1. Последовательность букв, цифр и символов подчеркивания, причем первый символ должен быть строчной буквой. 2. Последовательность символов, заключенных в двойные кавычки. |
| symbol | Последовательность символов, реализуемых как указатель на вход в таблице идентификаторов, хранящей строки идентификаторов. Синтаксис — как для строк |
В разделе goal вы задаете внутреннюю цель программы . это позволяет программе быть скомпилированной, запускаться и выполняться независимо от среды визуальной разработки (VDE).
Правила имеют форму:
HEAD: — < .Subgoall> ., < .Subgoal2> .,…, < .SubgoalN> ..
Для разрешения правила Пролог должен разрешить все его подцели, создав при этом соответствующее множество связанных переменных. Если же одна из под целей ложна, Пролог возвратится назад и просмотрит альтернативные решения предыдущих подцелей, а затем вновь пойдет вперед, но с другими значениями переменных. Этот процесс называется поиск с возвратом.
Оператор Пролога:- (if) отличается от if, используемых в других языках: правило Пролога работает в соответствии с условной формой тогда/если, тогда как этот оператор в других языках работает в соответствии с условной формой если/тогда.
Пролог всегда ищет решение, начиная с первого факта и/или правила, и просматривает весь список фактов и/или правил до конца.
Механизм логического вывода Пролога берет условия из правила (тело правила) и просматривает список известных фактов и правил, пытаясь удовлетворить условиям. Если все условия истинны, то зависимое отношение (заголовок правила) считается истинным. Если все условия не могут быть согласованы с известными фактами, то правило ничего не выводит.
Переменные в Прологе инициализируются при сопоставлении с константами в фактах или правилах. До инициализации переменная свободна . после присвоения ей значения она становится связанной. Переменная остается связанной только то время, которое необходимо для получения решения по запросу, затем Пролог освобождает ее и ищет другое решение. Нельзя сохранить информацию, присвоив значение переменной. Переменные используются как часть процесса поиска решения, а не как хранилище информации.
Анонимные переменные позволяют привести в порядок наши программы. Если вам нужна только определенная информация запроса, можно использовать анонимные переменные для игнорирования ненужных значений. В Прологе анонимные переменные обозначаются символом подчеркивания (_). Анонимная переменная может быть использована на месте любой другой перемен ной и ей никогда не присваивается значение.
Хорошим стилем программирования является включение в программу комментариев, объясняющих все то, что может быть непонятно кому-то другому (или даже вам, спустя полгода). Если вы подберете подходящие имена для переменных, предикатов и доменов, то вам понадобится меньше комментариев, т. к. программа будет объяснять себя сама.
Многострочные комментарии должны начинаться с символов /* (косая черта, звездочка) и завершаться символами */ (звездочка, косая черта). Для установки одно строчных комментариев можно использовать либо эти же символы, либо начинать комментарий символом процента (%).
/* Это первый пример комментария */ % Это второй пример комментария
А эти три строчки — пример многострочного комментария
/*Вы также можете поместить комментарий Visual Prolog /*внутри комментария */ как здесь*/