- •Методические указания к выполнению лабораторных работ
- •Лабораторная работа «Установка и проверка работы Visual Prolog»
- •ПрОграммирование в лоГике
- •Описание окон Visual Prolog, перечень окон
- •Задание Создание проекта и настройка компилятора
- •Запуск и тестирование работы программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание программы с использованием предложений, предикатов, доменов и целей. Создание составных целей»
- •Файлы используемые в проекте
- •Структура программы на Visual Prolog
- •Создание программы на языке Visual Prolog
- •1. В первую очередь необходимо определить факты.
- •2. Необходимо определить правила
- •3. После определения предложений необходимо сформулировать цель на языке Пролог
- •3. Далее в разделе предикатов необходимо описать пользовательские предикаты. Это можно сделать двумя способами
- •Задание Создание программы с использованием предложений, предикатов, доменов и целей
- •Организация запросов
- •Вопросы для самоконтроля
- •Лабораторная работа «Создание составных целей с конъюнкцией и дизъюнкцией»
- •Сложная цель с конъюнкцией и дизъюнкцией
- •Задание Внесение правил
- •Настроить проект как в лабораторной работе №1. * применить к каждой лабораторной работе
- •Организация запросов
- •Лабораторная работа «Использование отладчика приложения для составления целевого дерева»
- •Унификация и поиск с возвратом
- •Поиск с возвратом
- •Детальный поиск с возвратом
- •Задание
- •Создание программы
- •Использование отладчика приложения (Debugger)
- •Вопросы для самоконтроля
- •Лабораторная работа «Управление поиском решения»
- •Управление поиском решений
- •Прерывание поиска с возвратом (отсечение)
- •Использование предиката Fail
- •Предотвращение поиска с возвратом к предыдущей подцели в правиле
- •Использование предиката Not
- •Задание Создание программы поиска с предикатами !, not
- •Лабораторная работа «Организация пользовательского меню»
- •Детерминизм и отсечение
- •Использование правил для условного ветвления
- •Задание
- •Вопросы для самоконтроля
- •Лабораторная работа «Составные объекты»
- •Простые и составные объекты
- •Простые объекты данных
- •Составные объекты данных и функторы
- •Унификация составных объектов
- •Объявление составных доменов
- •Задание
- •Создание программы
- •Вопросы для самоконтроля
- •Лабораторная работа «Списки»
- •Задание
- •Вопросы для самоконтроля
- •Используемая литература
Структура программы на Visual Prolog
Программа на 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, как и в других языках. Допустимый диапазон чисел: от 1x10""307 до 1х10+зое (от 1е-307 до 1е+308). При необходимости, целые автоматически преобразуются в real |
string |
Последовательность символов, реализуемых как указатель на байтовый массив, завершаемый нулем, как в С. Для строк допускается два формата:
|
symbol |
Последовательность символов, реализуемых как указатель на вход в таблице идентификаторов, хранящей строки идентификаторов. Синтаксис — как для строк |
В разделе goal вы задаете внутреннюю цель программы; это позволяет программе быть скомпилированной, запускаться и выполняться независимо от среды визуальной разработки (VDE).
Правила имеют форму:
HEAD: - <Subgoall>, <Subgoal2>, ..., <SubgoalN>.
Для разрешения правила Пролог должен разрешить все его подцели, создав при этом соответствующее множество связанных переменных. Если же одна из под целей ложна, Пролог возвратится назад и просмотрит альтернативные решения предыдущих подцелей, а затем вновь пойдет вперед, но с другими значениями переменных. Этот процесс называется поиск с возвратом.
Оператор Пролога :- (if) отличается от if, используемых в других языках: правило Пролога работает в соответствии с условной формой тогда/если, тогда как этот оператор в других языках работает в соответствии с условной формой если/тогда.
Пролог всегда ищет решение, начиная с первого факта и/или правила, и просматривает весь список фактов и/или правил до конца.
Механизм логического вывода Пролога берет условия из правила (тело правила) и просматривает список известных фактов и правил, пытаясь удовлетворить условиям. Если все условия истинны, то зависимое отношение (заголовок правила) считается истинным. Если все условия не могут быть согласованы с известными фактами, то правило ничего не выводит.
Переменные в Прологе инициализируются при сопоставлении с константами в фактах или правилах. До инициализации переменная свободна; после присвоения ей значения она становится связанной. Переменная остается связанной только то время, которое необходимо для получения решения по запросу, затем Пролог освобождает ее и ищет другое решение. Нельзя сохранить информацию, присвоив значение переменной. Переменные используются как часть процесса поиска решения, а не как хранилище информации.
Анонимные переменные позволяют "привести в порядок" наши программы. Если вам нужна только определенная информация запроса, можно использовать анонимные переменные для игнорирования ненужных значений. В Прологе анонимные переменные обозначаются символом подчеркивания (_). Анонимная переменная может быть использована на месте любой другой перемен ной и ей никогда не присваивается значение.
Хорошим стилем программирования является включение в программу комментариев, объясняющих все то, что может быть непонятно кому-то другому (или даже вам, спустя полгода). Если вы подберете подходящие имена для переменных, предикатов и доменов, то вам понадобится меньше комментариев, т. к. программа будет объяснять себя "сама".
Многострочные комментарии должны начинаться с символов /* (косая черта, звездочка) и завершаться символами */ (звездочка, косая черта). Для установки одно строчных комментариев можно использовать либо эти же символы, либо начинать комментарий символом процента (%).
/* Это первый пример комментария */ % Это второй пример комментария
А эти три строчки — пример многострочного комментария
/*Вы также можете поместить комментарий Visual Prolog /*внутри комментария */ как здесь*/
