1. Раздел констант
В Прологе константа может быть атомом или числом. Атом представляет собой произвольную последовательность символов, заключенную в одинарные кавычки. Одинарный символ кавычки, встречающийся внутри атома, записывается дважды. Когда атом выводится на печать, внешние символы кавычек обычно не печатаются. Существует несколько исключений, когда атомы необязательно записывать в кавычках. Вот эти исключения:
1) атом, состоящий только из чисел, букв и символа подчеркивания и начинающийся со строчной буквы;
2) атом, состоящий целиком из специальных символов. К специальным символам относятся: + - * / ^ = ~ : ;? @ $ &
Атом, начинающийся с /*, будет воспринят как начало комментария, если он не заключен в одинарные кавычки. Как правило, в программах на Прологе используются атомы без кавычек. Атом, который необязательно заключать в кавычки, может быть записан и в кавычках. Запись с внешними кавычками и без них определяет один и тот же атом. Допустимы случаи, когда атом не содержит ни одного символа (так называемый 'нулевой атом') или содержит непечатаемые символы.
Примеры: <имя константы>=<значение>. Имя константы должно быть идентификатором. Каждое определение константы должно размещаться в отдельной строке.
food=”мясо”
pi=3.1415…
null=0
bgi_path="c:\\prolog\\bgi"
При компиляции идентификатор константы заменяется ее определением. Константы глобальны и не могут дублироваться. В разделе описания констант можно использовать в качестве первого символа имени константы прописные символы, потому что в этом разделе прописные и строчные символы не различаются. Однако при использовании констант в разделе описания предложений нужно задействовать в качестве первого символа имени константы только строчные символы, чтобы Пролог-система не восприняла константу как переменную. Разделов описания констант может быть несколько, но каждая константа должна быть определена до ее первого использования.
2. Домены
Раздел является аналогом раздела описания типов в обычных императивных языках программирования. Домен – это множество значений, которые может принимать аргумент предиката, то же что тип данных. В прологе существуют следующие стандартные домены:
integer - целое число (из промежутка -32768...32767);
real - действительное число (лежащее между ±1e-307...±1e308);
char - символ, заключенный в одиночные апострофы;
string - последовательность символов, заключенная в двойные кавычки;
symbol - символическая константа (начинающаяся со строчной буквы последовательность букв латинского алфавита, цифр и знаков подчеркивания или последовательность любых символов, заключенная в кавычки). Этот домен соответствует понятию атома;
file - файл.
В разделе объявляются нестандартные, пользовательские домены. Объявление домена имеет следующий вид:
<имя домена>=<определение домена>
или
file=<имя файлового домена1>;...;<имя файлового доменаN>
<имя спискового домена>=<имя домена элементов списка>*
Например:
int=integer, list=integer*
Структура:
point = p(integer, integer)
triangle = tr(point, point, point)
В описание структуры могут входить альтернативы, разделенные символом ";" или ключевым словом "or".
point = p(integer, integer);p(integer, integer, integer).
3. Раздел predicates
В прологе есть встроенные предикаты (write(Х), window(Х)…). Список встроенных предикатов приведен в приложении методички. Например, если программист определяет в разделе clauses свой собственный предикат, то он ДОЛЖЕН объявить его в разделе predicates. В противном случае ТП не будет знать, о чем идет речь. Когда объявляется предикат, Турбо-Прологу сообщается о том, к каким доменам принадлежат аргументы этого предиката. В разделе predicates программы просто перечисляется каждый предикат со своими аргументами. Имя предиката должно начинаться с буквы; после этой буквы могут следовать буквы, цифры и символы подчеркивания. Величина букв значения не имеет, но все-таки не рекомендуется использовать в качестве первой буквы заглавную. Можно объявлять несколько предикатов с одним и тем же именем, но разным числом аргументов или аргументами разных типов. Например:
man(string)
man(string,string)
arg(integer,integer,integer)
arg(real,real,real)
4 Clauses.
В разделе выражений clauses программист размещает все включаемые в программу факты и правила. Выражения, относящиеся к определенному предикату, должны размещаться в разделе clauses вместе(подобно процедуре):
somth(Х,1):-Х>0.
somth (Х,0):-Х = 0.
somth (Х,-1):-Х<0.
При попытке удовлетворения цели ТП работает с самого начала раздела clauses, просматривая в процессе поиска последовательно каждый факт или правило. По мере прохождения раздела clauses ТП устанавливает внутренние указатели после каждого выражения, которое удовлетворяет текущей подцели. Если такое выражение не является частью ведущего к решению логического пути, то ТП возвращается к установленному указателю и ищет другое соответствие. Такой процесс называется поиском с возвратом (backtracking).
В теле правила его составные части соединяются «,» или служебным словом and (если соединены конъюнктивно) или «;» или служебным словом or если соединены дизъюнктивно).
can_buy(Х,У):-man(Х), car(У), for_sail(У).
eq(Х,У):-А=sqrt(Х), У=А+1.
В программе не обязательно должны быть все эти разделы. Так, например, она может состоять из одного описания цели:
GOAL
write("hello world!"),readchar(_).