Турбо-Пролог

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

KrsPR_02.doc

— 532.00 Кб (Скачать файл)

Назначение этих разделов таково:

- раздел domains содержит  определения доменов, которые описывают различные классы объектов, используемых в программе;

- раздел database содержит  утверждения базы данных, которые  являются предикатами динамической  базы данных. Если программа такой базы данных не требует, то этот раздел может быть опущен.

- раздел predicates служит  для описания используемых программой  предикатов;

- в разделе goal на  языке Турбо-Пролога формулируется назначение создаваемой программы. Составными частями при этом могут являться некие подцели, из которых формируется единая цель программы;

- в раздел clauses заносятся  факты и правила, известные априорно. О содержимом этого раздела можно говорить как о данных, необходимых для работы программы.

Большинство программ, однако, не содержит всех пяти названных разделов.

Турбо-Пролог обеспечивает возможность включения в программу  комментариев, которые обрамляются  символами /* и */. Комментарии можно помещать в любом месте программы, причем на их длину нет практически никаких ограничений.

 

 

 

 

 

Рис. 1. Структура  программы Турбо-Пролог.

 

 

 

Таб. 3. Таблица основных разделов языка Турбо-Пролог.

 

 

 

 

 

3.2.1 Описание доменов  и предикатов

В главе 2 приводилось несколько примеров использования предиката

likes, как, например, likes(mary, apples).

Вспомним, что likes здесь  является предикатом (термом предиката), а

mary и apples - объектами  предиката. Турбо-Пролог требует  указания типов объектов для  каждого предиката программы.  Некоторые из этих объектов  могут быть, к примеру, числовыми данными, другие же - символьными строками. В разделе predicates, поэтому, Вы должны задать тип объектов каждого из предикатов.

Для того чтобы предикат 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 описаниями подобного  рода работать достаточно легко,  так как имя домена name сразу  же наводит на мысль об именах  людей, а fruit - о названиях фруктов.  Правда, эти описания не возбраняют  написать и такое утверждение, как likes(mary,rain), так как предикат допускает использование любого объекта, коль скоро он представляет собой символическое имя, хотя

бы утверждение и  выглядело странно. 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)

3.2.2 Правила образования  имен в Турбо-Прологе

Любое имя, используемое в Турбо-Прологе, должно состоять не более чем из 250 символов, первый из которых при этом должен обязательно  быть строчной буквой латинского алфавита (от a до z). Пробелы в записи имени недопустимы, однако можно использовать подчерк (_) в качестве разделителя компонент так, как это сделано ниже:

color_of_box

wild_animal_kingdom

beginning_of_year_to_date_activities_report

Большинство программистов, однако, предпочитают пользоваться более краткими именами. Имена, приведенные в качестве примера очень удобны для понимания программы, однако у них есть весьма существенный недостаток - они длинны. В Турбо-Прологе предусмотрена возможность задавать имена, состоящие всего из одной буквы:

domains

a, b = symbol

predicates s(a,b)

clauses

s(brave,daring)

3.3 Предикаты и утверждения

Представленные здесь  программы иллюстрируют основные особенности  языка.

Программа "Конструктор  слов" (листинг 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).

В любом из этих утверждений  на первой позиции стоит некоторое слово, а на второй - его синоним.

3.3.1 Использование внешних  и внутренних целей

Не каждая из программ Турбо-Пролога содержит внутри себя описание своей цели, часто цель задается в процессе работы программы, т.е. является внешней. Программы Турбо-Пролога внешней целью называются интерактивными. Смысл применения внешних целей - дать пользователю полную свободу использования имеющихся данных; программа в этом случае играет роль "нейтральной" базы данных.

Внутренние цели

Целью программы "Конструктор  слов" является, как уже было сказано, поиск и печать синонима к выбранному слову. Цель поиска здесь задана в самой программе, следовательно она является внутренней. Само редложение, определяющее цель, состоит из пяти подцелей, разделенных запятыми. Первая из них – это

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.

Отметим, что предложение, описывающее цель, должно оканчиваться точкой; если точка будет опущена, компилятор выдаст сообщение об ошибке, и трансляция программы будет прекращена.

Внешние цели

Если Вы запустите  на счет программу, в которой будет  отсутствовать описание цели, то Турбо-Пролог попросит Вас ввести цель с экрана. Если,

Информация о работе Турбо-Пролог