Автор работы: Пользователь скрыл имя, 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
Назначение этих разделов таково:
- раздел domains содержит определения доменов, которые описывают различные классы объектов, используемых в программе;
- раздел database содержит
утверждения базы данных, которые
являются предикатами
- раздел predicates служит
для описания используемых
- в разделе goal на языке Турбо-Пролога формулируется назначение создаваемой программы. Составными частями при этом могут являться некие подцели, из которых формируется единая цель программы;
- в раздел clauses заносятся факты и правила, известные априорно. О содержимом этого раздела можно говорить как о данных, необходимых для работы программы.
Большинство программ, однако, не содержит всех пяти названных разделов.
Турбо-Пролог обеспечивает
возможность включения в
Рис. 1. Структура программы Турбо-Пролог.
Таб. 3. Таблица основных разделов языка Турбо-Пролог.
В главе 2 приводилось несколько примеров использования предиката
likes, как, например, likes(mary, apples).
Вспомним, что likes здесь является предикатом (термом предиката), а
mary и apples - объектами
предиката. Турбо-Пролог
Для того чтобы предикат likes можно было использовать в программе,
необходимо сделать следующее описание:
predicates
likes(symbol, symbol)
Это описание означает, что оба объекта предиката likes относятся к
типу symbol. Этот тип является одним из базисных типов Турбо-Пролога; базисные типы будут описаны в следующем разделе главы.
В некоторых случаях, однако, представляется необходимым иметь возможность несколько больше конкретизировать тип используемого предикатом объекта. Например, в предикате likes объекты имеют смысл "тот, кто любит" и "вещь, которую любят". Турбо-Пролог позволяет конструировать свои собственные типы объектов из базисных типов доменов. Предположим, для примера, что объектам предиката likes Вы хотите присвоить соответственно имена person и thing. Тогда в разделе программы domains должны появиться такие описания:
domains
person, thing = symbol predicates
likes(person, thing)
Имена person и thing при этом будут обозначать некие совокупности (домены) значений.
Любое значение домена person может в утверждениях занимать место объекта person из соответствующего предиката. То же самое можно сказать и про домен thing. Рассмотрим, например, такие три утверждения:
likes(john, camera). likes(tom, computer). likes(kathy, computer).
Термы john, tom и kathy принадлежат здесь к домену person,а термы
camera и computer - к домену thing. Все три утверждения восходят к одному и тому же предикату - likes; отличие состоит лишь в значениях, которые принимают объекты. Другими словами, все три утверждения являются вариациями одного и того же предиката.
Турбо-Пролог имеет 6 встроенных типов доменов: символы, целые числа, действительные числа, строки, символические имена и файлы. Тип каждого из доменов должен быть объявлен в разделе программы domains.
В таблице 4 приведены все 6 стандартных типов доменов Турбо-Пролога.
Таб. 4. Стандартные домены Турбо-Пролога.
В программах, написанных на Турбо-Прологе, предикаты используются для представления, как данных, так и правил для оперирования данными. Описываются предикаты в разделе predicates. Терм предиката представляет собой строку символов, первым из которых является строчная буква. Предикаты могут иметь очень простой вид, как, например,
go
do_menu
search_for_items
Такие имена пригодны для именования и правил, и целей программы.
Например, имя предиката
go ассоциируется с началом
Имя do_menu более специфично, оно может служить в качестве имени правила, создающего меню.
Предикаты подобные только что приведенным обычно называют "голыми", поскольку у них отсутствуют объекты.
Однако, в большинстве случаев, особенно, когда правило используется в качестве подцели другого правила, значения переменных одного из пра-вил используются при попытке удовлетворить другое. Так, значение Х из левой части правила
likes(beth, X) if likes(mary, X).
используются при попытке удовлетворить правую часть.
В подобных случаях объекты
предикатов определяются при описании
этих правил в разделе программы predicates
book(symbol,symbol,integer)
/* книга (название, автор, количество страниц) */
person(symbol,char,integer)
/* некто (имя, пол (м или ж), возраст) */
do_search(integer)
sum(real, real, real, real)
Заметим, что перечень объектов предиката заключается в круглые скобки, а в качестве разделителя используется запятая. Так предикат likes имеет два объекта, каждый из которых относится к базисному типу symbol. Этот предикат можно использовать для создания утверждений типа
likes(mary,peaches).
likes(john, plums).
likes(jack,oranges).
Поскольку все термы: mary, peaches, john, plums, jack и oranges удовлетворяют требованиям, предъявляемым к символическим именам, то эти утверждения не противоречат описанию предиката в разделе predicates.
Ввиду того, что Вы используете стандартные базисные типы доменов,
нет необходимости отдельно описывать домены объектов этих утверждений. Если, однако, задаться целью явно описать все домены объектов, используемые предикатами, то в разделах domains и predicates в
этом случае должны были
бы появиться следующие
domains
name, fruit = symbol
predicates likes(name,fruit)
C описаниями подобного
рода работать достаточно
бы утверждение и выглядело странно. rain (дождь) трудно зачислить в разряд фруктов. Лучше поэтому дать соответствующему домену имя thing или item. Тогда peaches и rain не противоречили бы друг другу.
Предположим теперь, что Вы хотите создать картотеку своих книг.
Тогда предикат book логично было бы использовать в виде
book("Tom Sawyer","Mark Twain",1855).
book("Man and Superman","Bernard Shaw",1905).
Отметим, что первые два объекта предиката принадлежат к типу symbol, тогда как третий - к типу integer. Сам предикат можно было бы описать как
book(symbol,symbol,integer)
или, что то же самое,
domains
title, author = symbol
year = integer
predicates
book(title, author , year)
Любое имя, используемое в Турбо-Прологе, должно состоять не более чем из 250 символов, первый из которых при этом должен обязательно быть строчной буквой латинского алфавита (от a до z). Пробелы в записи имени недопустимы, однако можно использовать подчерк (_) в качестве разделителя компонент так, как это сделано ниже:
color_of_box
wild_animal_kingdom
beginning_of_year_to_date_
Большинство программистов, однако, предпочитают пользоваться более краткими именами. Имена, приведенные в качестве примера очень удобны для понимания программы, однако у них есть весьма существенный недостаток - они длинны. В Турбо-Прологе предусмотрена возможность задавать имена, состоящие всего из одной буквы:
domains
a, b = symbol
predicates s(a,b)
clauses
s(brave,daring)
Представленные здесь программы иллюстрируют основные особенности языка.
Программа "Конструктор слов" (листинг 1) является примером законченной программы с использованием предикатов и утверждений. Целью программы является поиск и печать синонима некоторого слова. Синонимом слова brave является daring. Следующее утверждение указывает на синонимичность этих слов:
synonym(brave, daring). /* daring - синоним brave */
Термом предиката здесь является synonym, а объекты это brave и daring. Описание предиката для этого утверждения будет выглядеть так:
synonym(word,syn)
где word и syn - объекты описываемого предиката.
______________________________
Листинг 1.
/* Программа: Конструктор слов Файл: PROG001.PRO */
/* Назначение: Демонстрация ассоциаций слов при */
/* помощи небольшого словаря. */
domains
word, syn ,ant = symbol
predicates
synonym(word,syn) antonym(word,ant)
goal
synonym(brave,X),
write("A synonym for 'brave' is "),
nl,
write("'",X,"'."),
nl.
clauses
synonym(brave,daring).
synonym(honest,truthful).
synonym(modern,new).
synonym(rare,uncommon).
antonym(brave,cowardly).
antonym(honest,dishonest).
antonym(modern,ancient).
antonym(rare,common).
/***** конец программы *****/
______________________________
Описание их доменов - это
word, syn = symbol
Данное описание показывает, что оба объекта предиката synonym
представляют собой символические имена. Предикат synonyn используется в четырех утверждениях: synonym(brave,daring). synonym(honest,truthful). synonym(modern,new). synonym(rare,uncommon).
В любом из этих утверждений на первой позиции стоит некоторое слово, а на второй - его синоним.
Не каждая из программ Турбо-Пролога содержит внутри себя описание своей цели, часто цель задается в процессе работы программы, т.е. является внешней. Программы Турбо-Пролога внешней целью называются интерактивными. Смысл применения внешних целей - дать пользователю полную свободу использования имеющихся данных; программа в этом случае играет роль "нейтральной" базы данных.
Целью программы "Конструктор слов" является, как уже было сказано, поиск и печать синонима к выбранному слову. Цель поиска здесь задана в самой программе, следовательно она является внутренней. Само редложение, определяющее цель, состоит из пяти подцелей, разделенных запятыми. Первая из них – это
synonym(brave, X)
Х здесь является свободной переменной, ее значение не конкретизировано. Говоря обычным языком, в данном предложении сформулирована такая цель: "Найти утверждение, использующее предикат synonym, такое, что первым объектом в нем является brave, и связать переменную Х с его вторым объектом".
После запуска программы, Турбо-Пролог будет просматривать утверждения, содержащие synonym. Если таковое с объектом brave будет обнаружено, то Х примет значение второго объекта. В нашем случае им будет daring..Второй подцелью является печать следующей строки символов на экране:
A synonym for 'brave' is
Эта подцель образована при помощи предиката write, одного из многих "встроенных" предикатов Турбо-Пролога. Подобные предикаты не требуют специального описания в программе, их можно использовать сразу.
Встроенный предикат write в данной программе встречается в виде
write("A synonym for 'brave' is ")
Двойные кавычки при этом применяются для ограничения символьной строки A synonym for 'brave' is ; подобным образом должны выделяться все символьные строки.
Предикат write может также содержать имена переменных, в этом случае кавычки не требуются. Простейшим примером может служить
write(X),
где Х - это имя переменной. Если Х принял значение daring, то write это
daring и напечатает.
В обоих случаях как символьная строка, так и переменная являются аргументами предиката write. Так же как и у других предикатов аргументы
write разделяются запятыми. Аргументы можно произвольно смешивать при условии соблюдения описываемых соглашений. Компилятор Турбо-Пролога поправит Вас, если Вы пропустите кавычки, или сделаете какую-либо другую ошибку того же порядка.
Пример смешанной записи аргументов:
write("Today is the ",N,"th day of ",M,", a ",D,".").
Этот предикат напечатает предложение
Today is the 19th day of August, a Tuesday.
(Сегодня 19 августа, вторник)
если значениями переменных N, M и D будут соответственно 19, August и
Tuesday.
Третья подцель задается еще одним встроенным предикатом: nl. Пре-
дикат nl сдвигает курсор в начало следующей строки. Четвертая подцель -
печать всех трех объектов, заключенных в круглые скобки. Первый из них представляет собой обычную кавычку; второй, обозначенный как Х, - это daring; третий состоит из кавычки и точки. Пятая подцель, еще один предикат nl, сдвигает курсор к началу строки, следующей за строкой с daring.
Отметим, что предложение, описывающее цель, должно оканчиваться точкой; если точка будет опущена, компилятор выдаст сообщение об ошибке, и трансляция программы будет прекращена.
Если Вы запустите на счет программу, в которой будет отсутствовать описание цели, то Турбо-Пролог попросит Вас ввести цель с экрана. Если,