Структура программы на Турбо-Прологе



МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ГРОЗНЕНСКИЙ ГОСУДАРСТВЕННЫЙ НЕФТЯНОЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Им. акад. М.Д. Миллионщикова

Институт прикладных информационных технологий

Кафедра «Информационные технологии»

КУРСОВАЯ РАБОТА

по дисциплине: «Предикаты и логическое программирование»

на тему: «Основы Турбо-Пролога»

                                                                           

Выполнила студентка

группы ВИСТ-17М

Абубакаров Б.З.

Руководитель: Моисеенко Н.А.

 

 

«___»______________2017 г. ____________________ оценка ____________________ подпись
Допущен(а) к защите «__»__________2017 г. Зав.кафедрой ИТ __________/ Моисеенко Н.А

 


Грозный 2017


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ГРОЗНЕНСКИЙ ГОСУДАРСТВЕННЫЙ НЕФТЯНОЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Им. акад. М.Д. Миллионщикова

Институт прикладных информационных технологий

Кафедра «Информационные технологии»

ЗАДАНИЕ:

На курсовую работу по дисциплине: «Предикаты и логическое программирование»

СтудентуАбубакарову Беслану Зелимхажиевичу

Ф.И.О.

На тему:«Основы Турбо-Пролога»

СОДЕРЖАНИЕ

Введение

Глава 1.Аналитическая часть

1.1.Структура программы на Турбо-Прологе

1.2.Стандартные предикаты ввода-вывода в Турбо-Прологе

Глава 2. Проектная часть

2.1. Описание задачи

2.2. Решение задачи на языкепрограммирования Турбо-Пролог

Заключение

 Литература:

1. Ин Ц., Соломон Д. Использование Турбо­Пролога /Пер. с англ. ­ М.: Мир, 2010.

2. Янсон А. Турбо­Пролог в сжатом изложении /Пер. с нем. ­ М.: Мир, 2012.

3. Логическое программирование: Пер. с англ. и фр. - М.: Мир, 2009.

4. Братко И. Программирование на языке Пролог для искусственного интеллекта: Пер. с англ. - М.: Мир, 2011.

5. Абилов В. Г., Зинченко Н. И. Turbo и Arity : два подхода к логическому программированию. // Мир ПК - 2010 - N2 - c. 32-42. - (часть 1).

 

 

Руководитель курсового проекта: ________________/Моисеенко Н.А.

                                                                  подпись                 Ф.И.О.

Задание выдано «___» _____________2017 г.

Задание сдано на кафедру «___» ________________2017 г.

Грозный 2017
СОДЕРЖАНИЕ

 

Введение. 4

Глава 1. Аналитическая часть. 6

1.1 Структура программы на Турбо-Прологе. ………6

1.2 Стандартные предикаты ввода-вывода в Турбо-Прологе. 15

Глава 2. Практическая часть. 19

2.1. Описание задачи …………………………………………………… ..19

2.2. Решение задачи на языке программирования Турбо-Пролог ..…….19

Заключение. 23

Список использованной литературы: 25

 


Введение

 

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

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

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

Наряду с Турбо-Прологом в США созданы еще несколько реализаций Пролога: Arity Prolog, Prolog II, Wisdom Prolog и Micro Prolog. В отличие от них Турбо-Пролог имеет великолепный полноэкранный редактор, множество рабочих окон и Интерактивный диалоговый отладчик. Он поддерживает цветную графику IBM PC, снабженного цветным графическим адаптером (CGA) и расширенным графическим адаптером (EGA). Предикаты графики и система с графическим экранным пером являются составной частью Турбо-Пролога. Он также снабжен средствами работы с последовательными файлами, файлами прямого доступа и двоичными файлами.

Еще одной причиной предпочтительности выбора Турбо-Пролога является то, что написанные на нем программы компилируются, в отличие от других версий Пролога, где программа интерпретируется. Интерпретатор выбирает предложения программы одно за другим и последовательно исполняет их. Компилятор транслирует в машинные коды сразу весь текст программы. Турбо-Пролог транслирует исходный текст программы особенно быстро (быстрее всех других версий Пролога для компьютеров IBM PC). Также он позволяет легко создавать отдельные выполнимые файлы. Далее, Турбо-Пролог имеет прекрасный пользовательский интерфейс для отладки программ. Другими словами, Турбо-Пролог - это наилучший товар на рынке программного обеспечения на сегодняшний день.

Цель курсового проекта–изучение основы языка программирования Турбо-Пролога.

Объектом исследованиявыступает среда программирования Турбо-Пролога.

Задачи курсового проекта:

· Рассмотреть теоретические основы языка программирования Турбо-Пролога.

· Решить задачи на языке программирования Турбо-Пролога.


 

Глава 1. Аналитическая часть

Структура программы на Турбо-Прологе

 

Программа на Турбо Прологе состоит из следующих семи разделов:

  • директивы компилятора ;
  • CONSTANTS - раздел описания констант ;
  • DOMAINS - раздел описания доменов ;
  • DATABASE - раздел описания предикатов внутренней базы данных;
  • PREDICATES - раздел описания предикатов;
  • CLAUSES - раздел описания предложений ;
  • GOAL - раздел описания внутренней цели.

В программе не обязательно должны быть все эти разделы. Так, например, она может состоять из одного описания цели:

GOAL

write("hello"),readchar(_).

Эта программа, вполне в императивном духе, выведет сообщение (с помощью стандартного предиката write ) и будет ожидать нажатия пользователем любой клавиши (стандартный предикат readchar читает символ).[1]

Однако, как правило, программа содержит, по меньшей мере, разделы PREDICATES и CLAUSES.

Если программа запускается в среде разработки Турбо Пролога, то раздел GOAL необязателен. При написании же программы, не зависящей от среды разработки, в ней необходимо указать внутреннюю цель.

В программе может быть несколько разделов описаний DOMAINS, PREDICATES, DATABASE и CLAUSES. Однако разделов GOAL не может быть в программе более одного.

Порядок разделов может быть произвольным, но при этом константы, домены и предикаты должны быть определены до их использования. Однако в разделе DOMAINS можно ссылаться на домены, которые будут объявлены позже. [1]

 

Директивы компилятора

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

Давайте для примера рассмотрим несколько наиболее широко используемых директив компилятора.

Директива trace применяется при отладке программы для трассирования. Этот процесс немного похож на пошаговое выполнение императивной программы с отслеживанием значений переменных. Трассировка позволяет пользователю наблюдать за ходом выполнения программы. Если после ключевого слова trace указаны имена предикатов через запятую, то трассировка идет только по этим предикатам. В противном случае - по всем предикатам программы. После завершения отладки трассировку нужно выключить, чтобы компилятор мог осуществить оптимизацию хвостовой рекурсии, о которой рассказывалось в предыдущей лекции.

Во время исполнения программы при включенной трассировке в специальном окне трассировки будет отображаться следующая информация:

  • после слова "CALL" будет указано имя выполняемого предиката (текущая подцель) и его параметры; *
  • после слова "FAIL" будет выводиться имя текущей подцели, которая не была достигнута;
  • после слова "RETURN" будет выводиться результат вычисления текущей подцели, в случае успеха. При этом если у подцели есть еще альтернативы, к которым возможен возврат, то перед именем предиката высвечивается звездочка (" * ");
  • слово "REDO" перед именем предиката указывает на то, что произошел возврат и происходит вычисление альтернативного решения.

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

Директива nowarnings используется для подавления предупреждения системы о том, что какая-то переменная встречается в предложении только один раз. Эту директиву стоит использовать только в хорошо отлаженных программах. Как правило, для подавления такого предупреждения ( "WARNING: The variable is only used once" ) достаточно заменить переменную, которая встретилась только один раз, на анонимную переменную.[2]

С помощью директивы include, при компиляции в исходный текст, можно вставить содержимое некоторого файла.

Заметим, что многие директивы компилятора могут быть не только расположены в тексте программы, но и установлены в меню среды разработки Турбо Пролога ( Options->Compiler Directives ). Значение директивы компилятора, указанное в тексте программы, имеет более высокий приоритет, чем значение, установленное в меню.

Раздел описания констант

Раздел, озаглавленный зарезервированным словом CONSTANTS, предназначен для описания констант. Объявление константы имеет вид:

<имя константы>=<значение>

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

Каждое определение константы должно размещаться в отдельной строке.

Например:

CONSTANTS

pi=3.14

bgi_path="c:\\prolog\\bgi"

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

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

 

Раздел описания доменов

Раздел описания доменов является аналогом раздела описания типов в обычных императивных языках программирования и начинается с ключевого слова DOMAINS.

В Турбо Прологе имеются стандартные домены, которые не нужно указывать в разделе описания доменов. Основные стандартные домены - это:

integer - целое число (из промежутка -32768...32767);

real - действительное число (лежащее между ±1e-307...±1e308);

char - символ, заключенный в одиночные апострофы;

string - последовательность символов, заключенная в двойные кавычки;

symbol - символическая константа (начинающаяся со строчной буквы последовательность букв латинского алфавита, цифр и знаков подчеркивания или последовательность любых символов, заключенная в кавычки). Этот домен соответствует понятию атома, с которым мы познакомились во второй лекции;

file - файл (подробному изучению файлов будет посвящена лекция 12).

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

Объявление домена имеет следующий вид:

<имя домена>=<определение домена>

или

file=<имя файлового домена1>;...;<имя файлового доменаN>

Удобно использовать описание доменов для сокращения имен стандартных доменов. Например, чтобы не писать каждый раз integer, можно написать следующее:

DOMAINS

i=integer

и далее использовать вместо ключевого слова integer односимвольное обозначение i.

Из доменов можно конструировать составные или структурныедомены ( структуры ). Структура описывается следующим образом:

<имя структуры>=<имя функтора>(<имя домена первой

компоненты>,...,<имя домена последней компоненты>)

[;<имя функтора>(...)]*

Каждая компонента структуры в свою очередь может быть структурой. Например, структура, описывающая точку на плоскости и имеющая две компоненты (координаты точки)

point = p(integer, integer)

может входить в качестве компоненты в более сложную структуру, описывающую треугольник:

triangle = tr(point, point, point)

В описание структуры могут входить альтернативы, разделенные символом " ; " или ключевым словом " or ".

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

point = p(integer, integer);p(integer, integer, integer).

Описание файлового домена имеет вид:

file = <символическое имя файла 1>;...;

<символическое имя файла N>

Для представления данных в Турбо Прологе, в отличие от стандартных алгоритмических языков программирования, используются не массивы, а списки. Подробнее списки будут рассмотрены в следующей лекции, а пока заметим, что списковый домен задается следующим образом:

<имя спискового домена>=<имя домена элементов списка>*

Например, список целых чисел описывается так:

list_of_integer=integer*

 

Раздел описания предикатов внутренней базы данных

Работа с внутренними (динамическими) базами данных в Прологе будет рассмотрена в лекции 13. Начинается раздел описания предикатов внутренней базы данных с зарезервированного слова DATABASE и описываются в нем те предикаты, которые можно в процессе выполнения программы добавлять во внутреннюю базу данных или удалять оттуда. Описываются предикаты базы данных аналогично предикатам в разделе описания предикатов PREDICATES, который мы сейчас рассмотрим.

 

Раздел описания предикатов

В разделе, озаглавленном зарезервированным словом PREDICATES, содержатся описания определяемых пользователем предикатов. В традиционных языках программирования подобными разделами являются разделы описания заголовков процедур и функций. Описание n -местного предиката имеет следующий вид:

<имя предиката>(<имя домена первого аргумента>,...,

<имя домена n-го аргумента>).

Домены аргументов должны быть либо стандартными, либо объявленными в разделе описания доменов. Обратите внимание на то, что имя предиката в Турбо Прологе должно быть идентификатором, т.е. оно должно состоять только из английских букв, цифр и символа подчеркивания, причем не может начинаться с цифры.[3]

Например, предикат, описывающий отношение "мама", которым мы пользовались в третьей лекции, может быть описан следующим образом:

PREDICATES

mother(string,string)

Это описание означает, что у предиката два аргумента, причем оба строкового типа.

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

PREDICATES

member(integer,integer*)

member(real,real*)

member(char,char*)

member(string,string*)

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

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

Для того чтобы указать, что предикат является детерминированным (недетерминированным), нужно перед его именем поместить зарезервированное слово determ ( nondeterm ). Если ни determ, ни nondeterm при описании предиката не использовались, то, по умолчанию, предикат считается детерминированным.

В Турбо Прологе имеется директива компилятора check_determ, которая принудительно включает проверку предикатов на детерминированность.

В Турбо Прологе есть так называемые стандартные (встроенные) предикаты, которые не нужно описывать в разделе описания предикатов PREDICATES. Наиболее употребляемые из них мы рассмотрим чуть позже. Все встроенные предикаты являются детерминированными.[5]

 

Раздел описания предложений

Этот раздел можно считать основным разделом программы, потому что именно в нем содержатся факты и правила, реализующие пользовательские предикаты. Все предикаты, которые применяются в этом разделе и не являются стандартными предикатами, должны быть описаны в разделе описания предикатов или в разделе описания предикатов базы данных. Начинается этот раздел со служебного слова CLAUSES.

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

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

Эти правила не являются обязательными, но они делают программу более "читабельной".

Раздел описания внутренней цели

С зарезервированного слова GOAL начинается раздел описания внутренней цели программы. Если этот раздел отсутствует, то после запуска программы Пролог-система выдает приглашение вводить вопросы в диалоговом режиме ( внешняя цель ). При выполнении внешней цели Пролог-система ищет все решения, выводя все возможные значения для переменных, участвующих в вопросе. Если же выполняется внутренняя цель, то осуществляется поиск только первого решения, а для получения всех решений нужно предпринимать дополнительные действия.[6]

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

Внешние и внутренние цели уже обсуждались в третьей лекции, они еще будут рассматриваться в следующей лекции, поэтому сейчас мы не будем останавливаться на этом вопросе более подробно.[7]

Пример. Запишем полностью реализацию на Турбо Прологе той базы знаний про мам и бабушек, которую мы рассматривали в качестве примера в третьей лекции. Нажимаем комбинацию клавиш Alt+E (от Editor), попадаем в редактор. Набираем код, приведенный ниже.

DOMAINS /* раздел описания доменов */

s=string /* вводим синоним для строкового типа данных */

PREDICATES /* раздел описания предикатов */

mother(s,s) /* предикат мама будет иметь два аргумента

          строкового типа */

grandmother(s,s) /* то же имеет место и для предиката

               бабушка */

CLAUSES /* раздел описания предложений */

mother("Наташа","Даша"). /* "Наташа" и "Даша" связаны

                       отношением мама */

mother("Даша","Маша"). /* "Даша" и "Маша" также

                      принадлежат отношению мама */

grandmother(X,Y):- /* X является бабушкой Y, если

                 найдется такой Z, что */

    mother(X,Z), /* X является мамой Z, а */

    mother(Z,Y). /* Z является мамой Y */

Для запуска программы нажимаем Alt+R (Run). Так как раздела описания внутренней цели в нашей программе не было, Пролог система выведет приглашение на ввод внешней цели (" GOAL:"). Вводим вопросы, наблюдаем результаты. Повтор предыдущей цели F8.

 


Дата добавления: 2018-02-28; просмотров: 477; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!