Учебное пособие: Язык логического программирования Visual Prolog
Основные стандартные домены перечислены в табл. 1.
Таблица 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 | Знаковое, количественное, имеет платформо-зависимый | Платформы 1 6 бит (-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) |
Синтаксически значение, принадлежащее одному из целочисленных доменов, записывается как последовательность цифр, которой в случае знакового домена может предшествовать не отделенный от нее пробелом знак минус. Имеются также восьмеричные и шестнадцатеричные синтаксисы для основных.
Домены типов byte, word и dword наиболее удобны при работе с машинными числами. В основном используются типы integer и unsigned, а также short и long (и их беззнаковые аналоги) для более специализированных приложений.
В объявлениях доменов ключевые слова signed и unsigned могут использоваться вместе со стандартными доменами типов byte, word и dword для построения новых базовых доменов. Так:
domains
i8 = signedbyte
создает новый базовый домен в диапазоне от -128 до +127.
Другие базовые домены показаны в табл. 2[1] .
Таблица 2. Основные стандартные домены
Домен | Описание и реализация |
char | Символ, реализуемый как беззнаковый byte. Синтаксически это символ, заключенный между двумя одиночными кавычками: 'а' |
real | Число с плавающей запятой, реализуемое как 8 байт в соответствии с соглашением IEEE; эквивалентен типу double в С. При необходимости, целые автоматически преобразуются в real |
string |
Последовательность символов, реализуемых как указатель на байтовый массив, завершаемый нулем, как в С. Для строк допускается два формата:1. Последовательность букв, цифр и символов подчеркивания, причем первый символ должен быть строчной буквой.2. Последовательность символов, заключенных в двойные кавычки. Примеры строк: telephone_number "railwayticket" "DoridInc" Строки, которые пишутся в программе, могут достигать длины в 255 символов, в то время как строки, которые система VisualProlog считывает из файла или строит внутри себя, могут достигать (теоретически) до 4 Гбайт на 32-битных платформах |
symbol | Последовательность символов, реализуемых как указатель на вход в таблице идентификаторов, хранящей строки идентификаторов. Синтаксис — как для строк |
Идентификаторы и строки взаимозаменяемы в программе, однако VisualProlog хранит их раздельно. Идентификаторы хранятся в таблице идентификаторов, а для представления используются лишь их индексы в этой таблице, но не сами строки идентификаторов. Это означает, что сопоставление идентификаторов выполняется очень быстро, а в случае если они встречаются в программе несколько раз, то и хранение их компактно. Строки же не хранятся в поисковой таблице, и при необходимости сопоставления VisualProlog проверяет их символ за символом. Вы сами должны определять, какой домен лучше использовать в каждой конкретной программе.
Задание типов аргументов при декларации предикатов
Объявление доменов аргументов в разделе predicates называется заданием типов аргументов. Предположим, имеется следующая связь объектов:
Франк — мужчина, которому 45 лет.
Факт Пролога, соответствующий этому предложению естественного языка, может быть следующим:
person(frank, male, 45).
Для того чтобы объявить person (человек), как предикат с этими тремя аргументами, вы можете разместить в разделе predicates следующую строку:
person(symbol, symbol, unsigned).
Здесь для всех трех аргументов использованы стандартные домены. Отныне всякий раз при работе с предикатом person, вы должны передавать ему три аргумента, причем первые два должны быть типа symbol, а третий — типа integer.
Если в программе используются только стандартные домены, то нет необходимости использовать раздел domain; вы уже видели несколько программ такого типа.
Или, предположим, что вы хотите описать предикат, который сообщал бы позицию буквы в алфавите, т. е. цель
alphabet_position(Letter, Position)
должна вернуть вам Position = 1, если Letter = a, Position = 2, если Letter = Ь и т. д. Предложения этого предиката могут выглядеть следующим образом:
alphabet_position(A_character, N).
Если при объявлении предиката используются только стандартные домены, то программе не нужен раздел domains. Предположим, что вы хотите описать предикат так, что цель будет истинна, если A_character является N-м символом алфавита. Предложения этого предиката будут такими:
alphabet_position('а', 1). alphabet_position('b', 2).