Смекни!
smekni.com

Язык логического программирования Visual Prolog (стр. 2 из 9)

Вполне возможно, что Билл любит теннис в реальной жизни, но ответ Visual Prolog основан только на фактах и правилах, которые вы дали ему в тексте программы.

7. ПРОГРАММЫ НА VISUAL PROLOG

Синтаксис VisualProlog разработан для того, чтобы отображать знания о свойствах и взаимосвязях.

В отличие от других версий Пролога, VisualProlog — компилятор, контролирующий типы: для каждого предиката объявляются типы объектов, которые он может использовать. Это объявление типов позволяет программам VisualProlog быть скомпилированными непосредственно в машинные коды, при этом, скорость выполнения сравнима, а в некоторых случаях — и превышает скорости аналогичных программ на языках С и Pascal.

8. Основные разделы Visual Prolog-программ

Обычно программа на VisualProlog состоит из четырех основных программных разделов, к которым относятся:

· раздел clauses (предложений);

· раздел predicates (предикатов);

· раздел domains (доменов);

· раздел goal (целей).

Раздел clauses — это сердце VisualProlog-программы; именно в этот раздел записываются факты и правила, которыми будет оперировать VisualProlog, пытаясь разрешить цель программы.

Раздел predicates — это тот, в котором объявляются предикаты и домены (типы) их аргументов (вам не нужно объявлять предикаты, встроенные в VisualProlog).

Раздел domains служит для объявления доменов, не являющихся стандартными доменами VisualProlog.

В разделgoalпомещается цель VisualProlog-программы.

9. Раздел предложений

В раздел clauses (предложений) помещаются все факты и правила, составляющие программу. Все предложения для каждого конкретного предиката в разделе clauses должны располагаться вместе. Последовательность предложений, описывающих один предикат, называется процедурой.

Пытаясь разрешить цель, VisualProlog (начиная с первого предложения раздела clauses) будет просматривать каждый факт и каждое правило, стремясь найти сопоставление. По мере продвижения вниз по разделу clauses, он устанавливает внутренний указатель на первое предложение, являющееся частью пути, ведущего к решению. Если следующее предложение не является частью этого логического пути, то VisualProlog возвращается к установленному указателю и ищет очередное подходящее сопоставление, перемещая указатель на него (этот процесс называется поиск с возвратом).

10. Раздел предикатов

Если в разделе clauses программы на VisualProlog описан собственный предикат, то его необходимо объявить в разделе predicates (предикатов). В результате объявления предиката сообщается, к каким доменам (типам) принадлежат аргументы этого предиката.

11. ОБЪЯВЛЕНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ПРЕДИКАТА

Объявление предиката начинается с имени этого предиката, за которым идет открывающая (левая) круглая скобка, после чего следует ноль или больше доменов (типов) аргументов предиката:

predicateName (argument_typel OptionalNamel,

argument_type2 OptionalName2, …,

argument_typeN OptionalNameN)

После каждого домена (типа) аргумента следует запятая, а после последнего типа аргумента — закрывающая (правая) скобка. В отличии от предложений в разделе clauses, декларация предиката не завершается точкой. Доменами (типами) аргументов предиката могут быть либо стандартные домены, либо домены, объявленные вами в разделе domains. Можно указывать имена аргументов OptionalNameK — это улучшает читаемость программы, и не сказывается на скорости ее исполнения, т. к. компилятор их игнорирует.

Имена предикатов

Имя предиката должно начинаться с буквы, за которой может располагаться последовательность букв, цифр и символов подчеркивания. Буквы должны быть в нижнем регистре! Имя предиката может иметь длину до 250 символов.

В именах предикатов запрещается использовать пробел, символ минус, звездочку и другие алфавитно-цифровые символы.

Аргументы предикатов

Аргументы предикатов должны принадлежать доменам, известным VisualProlog. Эти домены могут быть либо стандартными, либо пользовательскими.

12. Раздел доменов

Домены позволяют задавать разные имена различным видам данных, которые, в противном случае, будут выглядеть абсолютно одинаково. В программах VisualProlog объекты в отношениях (аргументы предикатов) принадлежат доменам, причем это могут быть как стандартные, так и описанные пользователем специальные домены. Раздел domains служит двум полезным целям. Во-первых, можно задать доменам осмысленные имена, даже если внутренне эти домены аналогичны уже имеющимся стандартным. Во-вторых, объявление специальных доменов используется для описания структур данных, отсутствующих в стандартных доменах.

Иногда очень полезно описать новый домен — особенно, когда вы хотите прояснить отдельные части раздела predicates. Объявление собственных доменов, благодаря присваиванию осмысленных имен типам аргументов, помогает документировать описываемые вами предикаты. Рассмотрим пример, показывающий, как объявление доменов помогает документировать предикаты:

Франк — мужчина, которому 45 лет.

Используя стандартные домены, вы можете так объявить соответствующий предикат:

person(symbol, symbol, integer).

В большинстве случаев такое объявление будет работать хорошо, но не наглядно для чтения программы. Более правильным было бы следующее описание:

domains

name, sex = symbol

age = integer

predicates

person(name, sex, age)

Одним из главных преимуществ объявления собственных доменов является то, что VisualProlog может отслеживать ошибки типов, например, такие:

same_sex(X,Y):-

person(X, Sex, _),

person(Sex, Y, _).

Несмотря на то, что и name и sex описываются как symbol, они не эквивалентны друг другу. Это и позволяет VisualProlog определить ошибку, если вы перепутаете их. Это полезно в тех случаях, когда ваши программы очень велики и сложны.

Аргументы с типами из специальных доменов не могут смешиваться между собой, даже если эти домены одинаковы.

Следующий пример программы при его загрузке приведет к ошибке типа.

Domainsproduct, sum = integer

predicates

add_em_up(sum,sum,sum)

multiply_em(product,product,product)

clauses

add_em_up(X, Y, Sum):-Sum=X+Y.

multiply_em(X,Y,Product):-Product=X*Y.

Эта программа выполняет две операции: складывает и умножает. Зададим ей следующую цель:

add_em_up(32, 54, Sum) .

Visual Prolog (Test Goal) ответит:

Sum=86

1 Solution

что является суммой двух целых чисел, которые вы передали в программу.

С другой стороны, эта же программа с помощью предиката multiply_em умножает два аргумента. Допустим, мы хотим удвоить произведение 31 на 17. Задаем следующую цель:

multiply_em(31, 17, Sum), add_em_up(Sum, Sum, Answer).

иждем, чтоVisual Prolog (Test Goal) ответит:

Sum=527, Answer=1054

1 Solution

Однако вместо этого вы получите ошибку типа. Это случилось из-за того, что имела место попытка передать результирующее значение предиката multiply_em, которое относится к домену product, в качестве первого и второго аргументов (которые должны относится к домену sum) в предикат add_em_up. И хотя оба эти домена соответствуют типу integer — это различные домены.

Если переменная в предложении используется более чем в одном предикате, она должна быть одинаково объявлена в каждом из них.

13. Раздел цели

По существу, раздел goal (цели) аналогичен телу правила: это просто список подцелей. Цель отличается от правила лишь следующим:

· за ключевым словом goal не следует :-;

· при запуске программы VisualProlog автоматически выполняет цель.

Если все подцели в разделе goal истинны, — программа завершается успешно. Если же какая-то подцель из раздела goal ложна, то считается, что программа завершается неуспешно (хотя чисто внешне никакой разницы в этих случаях нет, — программа просто завершит свою работу).

14. Декларации и правила

В VisualProlog есть несколько встроенных стандартных доменов. Их можно использовать при декларации типов аргументов предикатов без описания в разделе domains.

Основные стандартные домены перечислены в табл. 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 проверяет их символ за символом. Вы сами должны определять, какой домен лучше использовать в каждой конкретной программе.