Алфавит языка Турбо-Пролог включает следующие символы:
В Прологе имена используются для обозначения символических констант, доменов, предикатов и переменных. В общем случае имя должно начинаться с буквы или знака подчеркивания, за которым идет любая комбинация букв, цифр или знаков подчеркивания. При этом правила именования различных типов объектов в Пролог-программе имеют свои особенности:
В качестве имени переменной в предикатах может использоваться знак подчеркивания, такая переменная называется анонимной, применяется это в случаях, когда значение переменной безразлично для Пролог-программы.
К ключевым (служебным ) словам в языке Турбо-Пролог относятся следующие слова:
and | domains | goal | include |
clauses | elsedef | if | or |
constants | enddef | ifdef | predicates |
database | global | ifndef |
Программа на Турбо-Прологе имеет следующую структуру:
/*-----------------------------------------------------------* /
/* Комментарии */
/*-----------------------------------------------------------* /
constants
/*определение констант */
domains
/* определение типов данных программы*/
database
/*определение предикатов динамической базы данных*/
predicates
/*определение предикатов*/
clauses
/*определение правил и фактов*/
goal
/*Определение целей*/
/*----------------------------------------------*/
/* Комментарии */
/*----------------------------------------------*/
309
В разделе constants объявляются используемые в программе константы.
В разделе domains объявляются нестандартные типы данных для переменных, используемых в качестве аргументов предикатов.
В Прологе типы данных называют доменами. Связывание типа домена с конкретным аргументом (местом) предиката осуществляется в разделе predicates. Домен описывает множество значений, которые может принимать переменная предиката в ходе выполнения программы.
Домены подразделяются на простые и структурированные, стандартные и нестандартные. К стандартным доменам относятся:
symbol - символьная константа (длина не более 250 символов), имеет две формы записи: последовательность букв, цифр и знаков подчеркивания, начинающаяся со строчной буквы; последовательность символов, заключенная в двойные кавычки. Примеры: apple, sortl, "personal", "Курсант Петров С.В."
string - строка символов: любая последовательность символов, заключенная в двойные кавычки.
char - отдельный символ, заключенный между двумя апострофами.
integer - целое число в диапазоне от-32768 до +32767.
real - действительное число, допускается обычная и экспоненциальная формы записи. Значение экспоненты должно быть в диапазоне от Е-307 до Е+308. Примеры: -34.567, 0.654, 9.76Е+3.
file - файловая переменная, значение ее определяется по правилам именования файлов и устройств в MS DOS. При выполнении операций с файлом ее необходимо связать с конкретным файлом или устройством.
Объявление новых доменов с использованием стандартных имеет вид:
=
Примеры объявлений:
domains
a=integer
fas=symbol
ret,das=real
Такие объявления новых доменов улучшают читабельность программы и обеспечивают контроль типов значений переменных - смешивать в ходе выполнения программы переменные разных типов (доменов) нельзя.
Кроме стандартных типов доменов, в Турбо-Прологе допускается использовать структуры доменов, состоящие из нескольких простых или сложных объектов. Объявление структуры имеет следующий вид:
=(,...).
Здесь называют функтором, а домены ,..., - это либо простые домены, либо имена ранее объявленных доменов, либо, в свою очередь, структуры. Структуры позволяют сортировать объекты по категориям.
Ссылки на доменную структуру осуществляются по имени функтора.
В одном объявлении можно описать несколько альтернативных вариантов структуры, разделяя варианты точкой с запятой или служебным словом or.
310
Примеры объявления структур:
domains
d1,d2,d3=symbol
fr=fruits(d1,d2,d3); pot(d1)
Раздел описания предикатов predicates содержит перечень предикатов пользователя, используемых в программе. Описание предиката содержит имя предиката и список доменов его аргументов:
(,...)
Здесь ,...- имена стандартных доменов или имена доменов, объявленных в разделе domains.
Один и тот же предикат может иметь различное число аргументов, такие предикаты объявляются для каждого варианта отдельно. В программе допускается использовать не более 300 предикатов, число аргументов у предиката не должно превышать 50.
Примеры объявления предикатов:
predicates
add(integer,integer,integer)
Ik(fr)
Ik(d1,d2)
В разделе database описываются предикаты динамической базы данных. Перечисленные здесь предикаты после подстановки в них вместо переменных констант (т.е. превращения их в факты) могут быть помещены и, если потребуется, удалены во время выполнения программы в динамическую базу данных. Делается это с помощью стандартных (встроенных в систему) предикатов: assert, asserta, assertz, consult, retract, retractall. В программе можно использовать несколько разделов database, при этом каждому из них можно назначить уникальное имя. Если имя разделу database не назначено, компилятор по умолчанию назначает имя dbasedom.
Раздел database имеет следующий формат:
database [-]
dbpred1(...)
dbpred2(...)
В разделе clauses описываются утверждения, каждое из которых является правилом или фактом. В конце каждого утверждения ставится точка.
Факт состоит из имени предиката и заключенного в скобки списка аргументов - констант.
Правило состоит из заголовка - предиката, объявленного в разделе predicates, за которым следует сперва двоеточие с дефисом (:-), а затем список вызовов предикатов (пользовательских и/или стандартных), разделенных запятыми или точками с запятой.
Вместо двоеточия с дефисом можно использовать ключевое слово if, вместо запятой - ключевое слово and, вместо точки с запятой - ключевое слово or.
Правила и факты, имеющие в качестве заголовка один и тот же предикат, должны быть сгруппированы в рамках одного блока, т.е. следовать в программе друг за другом.
311
Переменные в предикатах во время выполнения Пролог-программы могут находиться в двух состояниях: конкретизированном или свободном (неконкретизированном). Переменная является свободной, если ей не присвоено значение, в противном случае переменная является конкретизированной.
В теле правила, кроме объявленных в программе предикатов, могут использоваться стандартные предикаты и операции сравнения.
Стандартные предикаты выполняют разнообразные функции по вводу-выводу, работе с файлами, выполнению функций DOS, обработке строк, поддержке графического режима, обеспечению интерфейса с другими системами программирования и т.д. Описание основных стандартных предикатов Турбо-Пролога рассматривается ниже.
В правилах можно использовать следующие основные операции сравнения: < (меньше), > (больше), = (больше или равно), = (равно), <> или >< (не равно). Сравнивать между собой можно выражения и переменные.
Операция = (равно) устанавливает соответствие между выражениями правой и левой частей предиката Х=Y - предикат этот записан в привычной инфиксной форме. В процессе согласования переменных используются следующие соглашения: