Пример программы на турбо прологе

Turbo Prolog – это язык логического программирования высокого уровня, который относится к языкам компиляторного типа, с характерной для него быстротой счёта и компиляции, предназначенный, в основном, для решения задач из области искусственного интеллекта.

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

Замечание 1

Turbo Prolog представляет собой одну из реализаций языка программирования Prolog, название которого происходит от словосочетания «PROgramming in LOGic», что означает «программирование при помощи логики».

Сдай на права пока
учишься в ВУЗе
Вся теория в удобном приложении. Выбери инструктора и начни заниматься!

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

Три примера решения задачек на Прологе

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

Отметим, что конструкции языка Prolog являются достаточно понятными для восприятия, так как они получаются похожими на выражения естественного языка, основываясь на упрощённом синтаксисе логики предикатов.

Замечание 2

В отличие от большинства известных языков программирования, которые являются императивными (например, Visual Basic, Pascal, C), язык Turbo Prolog относится к другой категории, являясь декларативным языком программирования.

«Программирование на Turbo Prolog»
Готовые курсовые работы и рефераты
Решение учебных вопросов в 2 клика
Помощь в написании учебной работы

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

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

Особенности создания программы на языке Turbo Prolog

Программы, написанные на языке Turbo Prolog, содержат в себе набор утверждений, т.е. деклараций различных логических взаимосвязей, соответствующих условию задачи, и тем самым объявляется, какие результаты могут получаться в зависимости от определённых ситуаций. Далее программист предоставляет самой системе выбрать подходящий способ решения задачи, и затем внутренние процедуры компьютерной программы будут искать её решение.

Пролог — попытка объяснить без программирования

Программист на языке Turbo Prolog рассматривает объекты и задаёт отношения между ними, а также правила, при которых эти отношения будут истинными.

В программах, написанных на Prolog, существует три типа утверждений:

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

По правилам синтаксиса языка Turbo Prolog каждое предложение (факт или правило) должно заканчиваться точкой. Все имена переменных начинаются с заглавной буквы, а имена символических констант (объектов) – со строчной буквы. Любое имя может включать латинские буквы, цифры и символ подчёркивания, только не начинаясь при этом с цифры.

Структура программы на языке Turbo Prolog

Программа на Turbo Prolog состоит из нескольких основных частей. К ним относятся область объявления констант, область описания доменов (типов объектов), раздел внутренней базы данных, блок описания предикатов, блок описания фактов и правил, а также раздел, в котором задаются цели. Ключевые слова constants, domains, database, predicates, clauses и goal указывают, соответственно, на начало каждой из этих секций.

Отметим, что не все из перечисленных разделов являются обязательными. Так, в Turbo Prolog включено более 200 встроенных стандартных предикатов и более 12 стандартных доменов, и они не требуют дополнительного объявления в случае их использования.

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

В разделе constants можно задавать используемые в программе константы (например, zero = 0).

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

К встроенным типам доменов относятся: char (символьный), integer (целый), real (вещественный), string (строковый), symbol (для последовательности из букв, цифр и символов подчеркивания, начинающейся с некоторой строчной буквы, либо для последовательности знаков в двойных кавычках), file (файловый).

domains / определение доменов /

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

Читайте также:
Программа сотрудники предприятия как работать

Обязательный раздел predicates служит для описания используемых в программе предикатов. Предикаты представляют собой строку символов, начинающуюся со строчной буквы. Они могут быть как без аргументов (например, «go» или «repeat»), так и с аргументами (в этом случае их типы объявляются вместе с определением предиката).

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

predicates / определение предикатов /

mother (symbol, symbol)

father (symbol, symbol).

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

При формировании правил часто используются следующие символы: запятая (означает and), символ :- (соответствует слову if) и символ ; (означает or).

likes(ann,apples). / Анна любит яблоки /

fruit(apple). / Яблоко – это фрукт /

likes(mary,X) :- likes(ann,X). / Мэри любит то же, что и Анна /

В обязательном разделе goal формулируется цель (запрос) созданной программы. Цель в Turbo Prolog – это вопрос пользователя к системе о том, какие утверждения являются истинными.

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

likes(ann,What). / Что любит Анна? (ответом будет слово «яблоки») /

likes(mary,apples). / Любит ли Мэри яблоки? (ответ – TRUE) /

likes(ann,pineapples). / Любит ли Анна ананасы? (ответ – FALSE) /

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

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

Источник: spravochnick.ru

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

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

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

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

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

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

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

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

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

Пример. Запишем полностью реализацию на Турбо Прологе той базы знаний про мам и бабушек, которую мы рассматривали в качестве примера в третьей лекции. Нажимаем комбинацию клавиш 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.

Теперь давайте рассмотрим некоторые наиболее употребляемые стандартные предикаты. Начнем с предикатов, предназначенных для вывода и ввода.

Читайте также:
Название программы на 1 июня
Предикаты ввода-вывода

Турбо Пролог имеет отдельные предикаты для чтения с клавиатуры или из файла данных целого, вещественного, символьного и строкового типа. Работе с файлами будет посвящена лекция 12, а сейчас мы рассмотрим чтение из стандартного устройства ввода информации (клавиатуры) и, соответственно, запись на стандартное устройство вывода информации (монитор).

Предикат readln считывает строку с текущего устройства ввода и связывает ее со своим единственным выходным параметром.

Предикат readint читает с текущего устройства целое число и связывает его со своим единственным выходным параметром.

Предикат readreal отличается от предиката readint тем, что он считывает не целое, а вещественное число.

Для чтения символа с текущего устройства ввода используется предикат readchar . Есть еще предикат inkey , который так же, как и readchar , читает символ со стандартного устройства ввода. Разница между ними в том, что предикат readchar приостанавливает работу программы до тех пор, пока не будет введен символ, а предикат inkey не прерывает выполнение программы. Если нужно просто проверить, нажата ли клавиша, можно воспользоваться предикатом keypressed , не имеющим аргументов.

Предикат readterm предназначен для чтения сложных термов. У него два параметра: первый входной указывает имя домена , второй параметр конкретизируется термом домена , записанного в первом параметре. Если считанная этим предикатом строка не соответствует домену , указанному в его первом параметре, предикат выдаст сообщение об ошибке.

Для записи данных в текущее устройство записи служит предикат write . Он может иметь произвольное количество параметров. Кроме того, в Турбо Прологе есть еще и предикат writef , который служит для форматного вывода данных.

Для осуществления перехода на следующую строку (возврат каретки и перевод строки) применяется предикат nl , не имеющий параметров.

Описанная ниже группа предикатов служит для преобразования типов.

Предикат upper_lower имеет два аргумента и три варианта использования. Если в качестве первого аргумента указана строка (или символ), а второй аргумент свободен, то второй аргумент будет означен строкой (символом), полученной из первого аргумента преобразованием к нижнему регистру. Если в исходной строке были прописные английские буквы, то они будут заменены строчными.

Если же, наоборот, первый аргумент свободен, а второй аргумент — это строка (или символ), то первый аргумент получит значение, равное строке (символу), полученной из второго аргумента преобразованием к верхнему регистру. Если в строке, находящейся во втором аргументе, были строчные английские буквы, то они будут заменены прописными. И, наконец, имеется третий вариант использования. Если и первый, и второй аргументы связаны, то предикат будет истинным только в том случае, если во втором аргументе находится строка (символ), которая получается из строки, находящейся в первом аргументе, путем замены всех прописных английских букв на строчные. В противном случае предикат будет ложным.

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

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

Немного по-другому работает предикат char_int . Он позволяет переходить от символа к его ASCII-коду и обратно.

Хотя Пролог — не самый лучший инструмент для выполнения большого объема вычислений, в нем имеются стандартные средства для реализации обычных вычислений. При этом можно использовать четыре арифметических операции (сложение ( + ), вычитание ( — ), умножение ( * ) и деление ( / )), а также целочисленное деление ( div ) и взятие остатка от деления одного целого числа на другое ( mod ). Для сравнения чисел можно воспользоваться операциями равно ( = ), не равно ( <> ), больше ( > ), больше или равно ( >= ), меньше ( < ), меньше или равно (

Кроме того, можно использовать обычные математические функции, такие как: логарифмы натуральный ( ln ) и десятичный ( log ), квадратный корень ( sqrt ), модуль ( abs ), экспонента ( exp ). Тригонометрические функции: синус ( sin ), косинус ( cos ), тангенс ( tan ), арктангенс ( arctan ). Величины углов указываются в радианах.

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

Для вычисления псевдослучайных чисел имеется два варианта предиката random . Первый вариант имеет один выходной параметр, в который помещается сгенерированное вещественное число, лежащее в промежутке между нулем и единицей. Второй вариант этого предиката — двухаргументный. В качестве первого входного аргумента указывается целое число. Второй аргумент означивается целым числом, лежащим между нулем и первым аргументом.

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

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

Читайте также:
Требования к учебной программе

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

Источник: intuit.ru

Глава 18. Примеры программ 347

«дружественности» и «интеллигентности» прологовских программ.

Программа на Прологе задает компьютеру, используя для этого

некоторое число правил и фактов, описание проблемы, а затем

просит его найти все возможные решения этой проблемы. В

процедурных языках программист должен точно «рассказать»

компьютеру, как тот должен решать задачи. На Прологе же

программист лишь описывает что нужно вычислить, а Пролог-система

сама заботится о том, как организовать эти вычисления.

Из-за такого декларативного (а не процедурного) подхода всем

известные источники ошибок в Паскале и Бейсике (такие как циклы,

выполняющие на единицу меньше или на единицу больше, чем нужно

операций) исключаются с самого начала. А кроме того, Пролог учит

программистов делать хорошо структуризованное описание задачи и

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

Хотя Пролог делает программирование намного проще, он

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

это первая реализация Пролога для персональных компьютеров IBM PC

и совместимых с ними по мощности и памяти.

Турбо Пролог обеспечивает больше возможностей, чем многие

реализации на больших компьютерах. Например:

# Новая мощнейшая система внешних баз данных, включающая более

30 предикатов для разработки и ведения больших баз данных,

поддерживающих B+-деревья и расширенную память типа EMS.

Система внешних баз данных позволяет выполнять «сцепление»

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

данным) индексные ссылки типа B+дерева и предоставляет средства

для создания и копирования баз данных между ОЗУ, EMS и жестким

# Исходные тексты для обладающего всеми возможностями

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

и обрабатываются предложения в Турбо Прологе. С помощью Турбо

Пролога 2.0 мы объясняем, как в процессе работы добавляются и

интерпретируются правила; для этого включены файлы PIE.* —

интерпретатор, написанный на Турбо Прологе и обладающий всеми

возможностями Пролога. Этот интерпретатор, подробно

рассказывающий, как он написан и объясняющий, как его расширить

для ваших собственных программ, явялется мощнейшим средством для

изучения того, как работает сам Пролог, и как вы можете добавить

множество возможностей в свои программы. Вы можете изменять этот

интерпретатор с тем, чтобы создать свой собственный логический

язык программирования, механизм вывода, оболочки экспертных

систем или программные интерфейсы.

# Стандарт графического интерфейса фирмы Borland.

Теперь Турбо Пролог поддерживает ту же мощную графическую

систему, что и в текущих версиях Турбо Паскаля и Турбо Си. 60

графических предикатов Турбо Пролога предоставляют мощные, высо-

коуровневые графические средства с профессиональным качеством вы-

Кроме всех этих новых возможностей Турбо Пролог 2.0 включает

несколько улучшенных возможностей из тех, что были в версиях 1.x,

# Больше средств для управления окнами: в пакет версии 2.0 мы

включили целый набор программ, обеспечивающих управление окнами.

# Устанавливаемый пользователем интерфейс: пользовательский

интерфейс теперь польностью перенастраиваемый, включая «горячие»

клавиши, функции редактора, режимы экрана и т.д.

# Улучшенный компилятор: Компилятор Турбо Пролога оптимизиро-

ван и теперь версия 2.0 создает программы более эффективные и

меньшие по размеру, чем программы версии 1.1.

# Обработка исключительных состояний и контроль ошибок: теперь

Тубро Пролог включает мощный механизм для обработки ошибочных си-

туаций, а также для управления пользовательскими прерываниями

программы. Кроме этого включены различные уровни по контролю за

ошибками и по выдаче соответствующих сообщений.

# Множественные внутренние базы данных: вы можете теперь ис-

пользовать в своих программах несколько внутренних баз

они могут быть локальными в одном модуле или глобальными по отно-

шению ко всему приложению.

# Вызовы из других языков: Турбо Пролог может создавать

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

является обобщенным и может работать со всеми

генерирующими .OBJ модули. (Однако, мы можем лишь полностью

гарантировать, что он будет работать с Турбо Си версий 1.x).

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

Турбо Пролога как мощнейший вспомогательный пакет программ;

причем теперь не нужен ни CPINIT, ни другие «приклеиваемые»

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

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

преимуществ, используя лучшие черты этих двух языков.

# Поддержка максимального видеоразрешения: в среде разработки

и в пользовательских программах Турбо Пролог 2.0 поддерживает

режимы в 25, 43 и 50 строк по 80, 90, 120 или 132 колонки

(обеспечивая корректную установку аппаратуры).

# Расширенный предикат редактирования: новый предикат edit,

включающий несколько расширений, позволяет программистам вызывать

из своих программ редактор, обладающий широким спектром

# Описание констант и условная компиляция: эти возможности

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru