Автор работы: Пользователь скрыл имя, 15 Февраля 2013 в 20:44, курсовая работа
Турбо-Пролог (Turbo Prolog) является языком искусственного интеллекта (ИИ). Разработан этот язык компанией Borland International и характеризуется высокой скоростью работы и низкой стоимостью, что делает Турбо-Пролог весьма популярным в широких кругах обладателей персональных компьютеров.
Содержание 1
Глава 1. Описание языка Турбо-Пролог 2
1.1 Введение 2
1.2 Пакет системы Турбо-Пролог 5
1.2.1 Главное меню системы Турбо-Пролог 6
1.2.2 Запуск на счет программы, написанной на Турбо-Прологе 7
1.2.3 "Добро пожаловать в систему Турбо-Пролог!" 7
1.2.4 Сохранение программного файла 8
1.2.5 Просмотр каталога директории 8
1.2.6 Загрузка и редактирование программного файла 9
1.3 Заключение 10
Глава 2. Основные понятия языка Турбо-Пролог 11
2.1 Ведение 11
2.2 Декларативные и императивные языки 11
2.2.1 Логика предикатов 12
2.2.2 Пролог и логика предикатов 14
2.3 Управление программой 16
2.3.1 Цели программы 16
2.3.3 Результат доказательства цели 17
2.3.4 Связки и другие символы 17
2.3.5 Цели и подцели 18
2.4 Внутренние подпрограммы унификации Турбо-Пролога 18
2.4.1 Представление данных при помощи фактов и правил 19
2.4.2 Обработка правил и фактов во время унификации 19
2.4.3 Откат 22
2.5 Заключение 23
Глава 3. Основы программирования на Турбо-Прологе 24
3.1 Введение 24
3.2 Структура программ Турбо-Пролога 24
3.2.1 Описание доменов и предикатов 26
3.2.2 Правила образования имен в Турбо-Прологе 29
3.3 Предикаты и утверждения 29
3.3.1 Использование внешних и внутренних целей 30
3.3.2 Предикаты и утверждения разных арностей 33
3.3.3 Отрицание 33
3.4 Арифметика в Турбо-Прологе 35
3.5 Заключение 36
4. Примеры программ на языке Турбо-Пролог 37
5. Заключение 41
Список литературы 43
тами, а подцели разделены запятыми и точка завершает цель как целое.
Самая левая подцель likes(mary,
likes(mary,apples), так что эта подцель успешна. Следующая подцель справа сопоставима с утверждением color(apples, red), и поэтому вся цель является успешной. Информация, выведенная на экран, уведомит вас, что эта цель истинна. По-русски, цель есть "Мэри любит яблоки и яблоки красные".
Турбо-Пролог (как и другие реализации Пролога) имеет внутренние подпрограммы для выполнения сопоставления и связанных с ним процессов. Эти неотъемлемые части языка называются внутренними подпрограммами унификации. Эти подпрограммы выполняют сопоставление целей и подцелей
с фактами и головами правил для того, что чтобы доказать (или вычислить) эти цели или подцели.
Эти же подпрограммы также определяют, сгенерированы ли новые подцели правой часть правила.
Программист в соответствии с логическим
синтаксисом Турбо-Пролога
В программах на Турбо-Прологе данные представляются при помощи фактов и правил. Хотя факт может быть предикатом, не содержащим объектов, большинство фактов записывается как предикат с одним или
более объектами.
Некоторые примеры:
likes(mary,apples).
employee(smith,john,1984).
Если имя объекта начинается со строчной буквы, то этот объект имеет
известное значение. Другими словами, объект есть в этом случае константа. Когда Турбо-Пролог пытается сопоставить две константы, то это сопостав- ление успешно только в том случае, если константы равны.
Переменные в Турбо-Прологе являются аналогами местоимений в естественном (в частности, русском) языке. В определенный момент переменная может получить некоторое значение. Иногда этого может не
произойти.
Следующий пример включает кое-что из того, что вы узнали в предыдущем разделе о внутренних подпрограммах унификации. Данными является факт
likes(mary, apples). /* Мэри любит яблоки */
Вы хотите сформулировать цель, чтобы узнать, что любит Мэри (если таковые объекты имеются). Вид этой цели следующий:
likes(mary, What). /* Мэри любит Что */
Вспомним, что в Турбо-Прологе объект, начинающийся с прописной буквы, есть переменная. Переменная в этой цели есть What (что). Когда
внутренние унификационные подпрограммы пытаются сопоставить эту цель с фактами или правилами программы, переменная What не имеет значения. What не равна нулю и не равна пробелу. Эта переменная не имеет даже значения, являющегося "мусором" (какой бы мусор не оказался в памяти, отведенной для переменной).
Переменная What не имеет значения, так как она неозначена, или не- инициализирована. Эти два термина используются как взаимозаменяемые. Неозначенные переменные еще называются свободными переменными. Когда свободная переменная цели What сопоставляется с соответствующим объектом apples, значением What становится apples. Теперь переменная What означена (или инициализирована) объектом apples. Другими словами, эта переменная более не свободна (связана).
Пока What имеет значение apples, эта переменная для Турбо-Пролога
"означает" apples. Фактически всякий раз, когда неозначенная переменная сопоставляется с константой, она получает значение этой константы. Тур-
бо-Пролог выдает на экран, что What=apples , и, что внутренняя подпрограмма унификации нашла все (единственный) объекты, сопоставимые с целью.
Теперь предположим, что программа содержит следующие факты:
likes(mary, apples). /* Мэри любит яблоки */
likes(mary, pears). /* Мэри любит персики */
likes(mary, popcorn). /* Мэри любит кукурузные зерна */
Такая же цель, что и выше likes(mary, What) сопоставима со всеми этими фактами. Поэтому Турбо-Пролог выдает все значения для What, которые удовлетворяют этой цели. Внешние цели заставляют внутренние унификационные подпрограммы Турбо-Пролога найти все решения, удовлетворяющие цели. Но внутренние цели заставляют внутренние унификационные подпрограммы останавливаться после первого успешного сопоставления цели.
Может показаться, что переменная What получает значения apples,
pears и popcorn в одно и тоже время, но это не так. Подпрограммы внутренней унификации присваивают переменной конкретное значение только во время сопоставления. Переменная становится вновь свободной, когда сопоставление оказывается неуспешным или цель оказывается успешно вычисленной.
Может показаться, что в Прологе нельзя управлять значениями, которые присваиваются переменным. Действительно, Пролог не имеет "грубых средств" для управления значениями, точно также в Прологе нет "грубых средств" для управления ходом выполнения программы.
Но, понимая принцип работы внутренних унификационных подпрограмм, программист может использовать логический синтаксис Турбо-Пролога для указания того, что необходимо выполнить и какие данные должны быть найдены.
Пример использования оператора = поможет лучше понять процесс означивания переменой. В языке программирования, таком как Бэйсик, оператор = может означать "Сделать два терма равными", например в выражении X=6. Здесь оператор = является оператором присвоения значения. Его действие состоит в том, чтобы сделать X равным 6, т. е. присвоить значение 6 переменной X. Но в Бейсике оператор = имеет еще и другой смысл - проверить равенство двух термов. Такое использование символа = встречается в условных выражениях, таких как IF X=6 GOSUB 3010. Оператор = , использованный таким образом, выражает следующее: "Два терма, между которыми я нахожусь, должны быть равными для того, чтобы весь оператор был истинным". Оператор = интерпретируется как оператор
присваивания или как оператор проверки равенства в зависимости от контекста. (Но некоторые языки для присваивания и равенства используют различные символы ).
Турбо-Пролог также использует оператор = , но используется ли он как оператор сравнения или как оператор присваивания определяется в зависимости от того, являются ли значения термов свободными или означенными.
Рассмотрим, например, выражение
apples = apples .
Это выражение может быть подцелью, сгенерированной внутри Турбо-
Пролога. Так как оба значения известны, то оператор = является оператором сравнения. В этом случае равенство истинно, и подцель является успешной.
Рассмотрим выражение
apples = oranges .
Так как эти два
терма имеют различные
Рассмотрим пример, в котором используется переменная:
X = apples .
Это выражение так же могло бы быть подцелью, сгенерированной внутри Турбо-Пролога во время попытки вычислить цель. Но здесь знак равенства не обязательно является оператором присваивания. Эта подцель присваивает значение apples переменной X (означивает эту переменную) только в том случае, если X еще не была означена. Но если X уже имеет значение, то оно известно внутренним подпрограммам унификации и сравнивается с константой apples. Если эти два значения одинаковы, то подцель успешна; если они различны, то подцель неуспешна.
Интерпретация Турбо-Прологом оператора = зависит от того, известны ли оба значения или нет. Если оба значения известны, то оператор интерпретируется как оператор сравнения, даже если оба терма переменные. Если известно только одно из значений, то это известное значение будет присвоено другому. Для Турбо-Пролога несущественно, известно ли значение справа или слева от = ; в любом случае неизвестное получит значение известного. Например, предположим, что переменная Fruit (фрукт) неозначена. Подцель apples=Fruit вызовет присвоение значения apples переменной Fruit. Теперь предположим, что подцель Fruit=X непосредственно следует за предыдущей, и что X свободная переменная. Результат попытки выполнить эту подцель состоит в присваивании переменной X значения apples. Вы видите, что даже если оба терма Fruit и X переменные, Турбо-Пролог присваивает (означивает) неозначенной переменной известное значение. Во многих языках программирования присваивание встречается только в форме присваивания правого терма левому. Но в Турбо-Прологе
присваивание может иметь место в обоих направлениях.
Оператор = ведет себя точно так же, как ведут себя внутренние унификационные подпрограммы при сопоставлении целей и подцелей с фактами или правилами программы. Переменным могут быть присвоены значения во время попыток выполнить цели, и они же могут сравниваться для проверки равенства. Результаты означивания передаются дальше другим подцелям, которые используют соответствующие объекты во время присваивания значений или сравнения значений. Если некоторая подцель оказывается неуспешной или последующие подцели не используют значений означенных переменных, то эти переменные становятся неозначенными, т.е. они становятся снова свободными.
Откат - это механизм, который Турбо-Пролог использует для нахождения дополнительных фактов и правил, необходимых при вычислении цели, если текущая попытка вычислить цель оказалась неудачной.
Типичная программа на Турбо-Прологе содержит факты и правила, основанные на самых различных взаимосвязях предикатов. Правила могут иметь несколько правосторонних частей, которые соединены связками. Цель может состоять из нескольких подцелей, а переменные могут быть объектами предиката как в утверждениях, так и в подцелях. Другими словами, типичные программы на Турбо-Прологе представляют собой комбинации всех элементов, о которых вы узнали до сих пор в этой главе.
Турбо-Пролог пытается вычислить цель при помощи сопоставления терма предиката и объектов цели с соответствующими элементами в фактах и головах правил. Сопоставление выполняется слева направо. Некоторые подцели, вероятно, будут неуспешными при сопоставлении с некоторыми
фактами или правилами, поэтому Турбо-Прологу требуется способ "запо- минания точек", в которых он может продолжить альтернативные попытки найти решение. Прежде чем попробовать один из возможных путей решения подцели, Турбо-Пролог фактически помещает в программу "указатель".
Указатель определяет точку, в которую может быть выполнен откат, если текущая попытка будет неудачной.
По мере того, как Турбо-Пролог успешно заканчивает свои попытки вычисления подцелей слева направо, указатели отката расставляются во
всех точках, которые могут привести к решению. Если некоторая подцель оказывается неуспешной, то Турбо-Пролог откатывается влево и останавли-
вается у ближайшего указателя отката. С этой точки Турбо-Пролог начинает попытку найти другое решение для неуспешной цели.
До тех пор, пока следующая цель на данном уровне не будет успеш-
ной, Турбо-Пролог будет
повторять откат к ближайшему
указателю отката. Эти попытки
выполняются внутренними
Таб. 2. Таблица основных понятий Турбо-Пролога.
В данной главе Турбо-Пролог рассматривался на концептуальном уровне. Как вы узнали, Турбо-Пролог является декларативным языком, основанным на логике предикатов. Предикаты в общем случае определяют отношения между объектами.
Факты и правила являются утверждениями, которые образуют данные программы на Турбо-Прологе. Правила имеют левую часть (голову) и пра- вую часть(тело). Левая часть правила истинна, если истинна правая часть правила. Правила генерируют новые факты, когда все утверждения в теле оказываются вычисленными.
Цели - это конструкции на основе предикатов, которые объявляют,
что должна доказать программа на Турбо-Прологе. Связки в целях и правилах выполняют генерацию подцелей в качестве шага процесса доказательства цели.
Внутренние унификационные подпрограммы означивают переменные. Означенные переменные и константы имеют значения, "известные" Турбо- Прологу. Свободные переменные значений не имеют. Турбо-Пролог использует откаты для определения альтернативных путей вычисления цели или подцели. Если подцель оказалась неуспешной, а указатели отката были установлены, то для предыдущей подцели будет сделана попытка добиться успеха, начиная с точки отката.
Эта глава дала возможность познакомиться с несколькими примерами, иллюстрирующими связь между переменными и унификацией во время работы системы.
Синтаксис и структура программ Турбо-Пролога, описанию которых посвящена данная глава, отражают концепции логики предикатов, преставленье в главе 2.
В настоящей главе рассматривается вопрос создания программ на языке Турбо-Пролог. Приведенные примеры программ ставят целью продемонстрировать методы программирования на языке Пролог. Прочитав главу, Вы уже будете иметь достаточно знаний об использовании некоторых полезных приемов программирования на Турбо-Прологе.
Любая программа, написанная на Турбо-Прологе, состоит из пяти разделов. Таковыми являются раздел описания доменов, раздел базы данных, раздел описания предикатов, раздел описания цели и раздел описания утверждений. Ключевые слова domains, database, predicates, goal и clauses отмечают начала соответствующих разделов.