Язык программирования Visual Prolog

Автор работы: Пользователь скрыл имя, 04 Июня 2013 в 13:39, лекция

Краткое описание

В начале 70 х годов группа специалистов Марсельского университета во главе с А. Колмероэ разработали специализированную систему для доказательств теорем на базе языка Фортран, которую использовали для обработки высказываний на естественном языке. В начале 80 годов в Отделении Вычислительных наук Датского Технического Университета сформировался коллектив программистов, которым в 1982 году был разработан интерпритатор языка пролог для VAX. В 1984 Лео Йенсен, Джон Гофман, Финн Гронсков разработали компилятор для IBM PC возникла фирма PDC (Prolog Development Center). Фирма Borland до 1990 Turbo Prolog затем права переданы PDC.

Содержание

1. Основные конструкции языка Visual Prolog, разделы программы, дескриптивный, процедурный и машинный смысл программы на Прологе
2. Представление знаний, структуры данных в программах на языке Пролог.
3. Функциональные возможности Visual Prolog

Вложенные файлы: 1 файл

Lekc2ozo (1).doc

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

Что такое список?

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

Конечно, есть другие способы  объединить несколько объектов в  один. Если число объектов заранее  известно, то вы можете сделать их аргументами одной составной структуры данных. Если число объектов не определено, то можно использовать рекурсивную составную структуру данных, такую как дерево. Но работать со списками обычно легче, т. к. Visual Prolog обеспечивает для них более четкую запись.

Список, содержащий числа 1, 2 и 3, записывается так:

[1,   2,   3]

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

[dog,   cat,   canary]

["valerie ann",   "Jennifer caitlin", "benjamin thomas"]

Объявление  списков

Чтобы объявить домен  для списка целых, надо использовать декларацию домена, такую как:

domains

integerlist = integer*

Символ (*) означает "список чего-либо"; таким образом, integer* означает "список целых".

Обратите внимание, что  у слова "список" нет специального значения в Visual Prolog. С тем же успехом можно назвать список "Занзибаром". Именно обозначение * (а не название), говорит компилятору, что это список.

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

domains

elementlist = elements*

elements   = ....

Здесь elements имеют единый тип (например: integer, real или symbol) или являются набором отличных друг от друга элементов, отмеченных разными функторами. В Visual Prolog нельзя смешивать стандартные типы в списке. Например, следующая декларация неправильно определяет список, составленный из элементов, являющихся целыми и действительными числами или идентификаторами:

Головы и хвосты

Список является рекурсивным  составным объектом. Он состоит из двух частей — головы, которая является первым элементом, и хвоста, который  является списком, включающим все последующие элементы. Хвост списка — всегда список, голова списка — всегда элемент. Например:

голова [а, b,  с] есть a

хвост [а,  b,  с] есть [b,   с]

Что происходит, когда  вы доходите до одноэлементного списка? Ответ таков

голова[с] есть с

хвост [с] есть  []

Работа со списками

В Прологе есть способ явно отделить голову от хвоста. Вместо разделения элементов запятыми, это  можно сделать вертикальной чертой "|". Например:

[а, b,  с] эквивалентно [а| [b,  с]] и, продолжая процесс,

[а | [b,  с] ] эквивалентно [а | [b | [с] ]], что эквивалентно [а| [b | [с| []]] ]

Можно использовать оба  вида разделителей в одном и том  же списке при условии, что вертикальная черта есть последний разделитель. При желании можно набрать [а, b, с, d] как [а, b [с, d] ].

Использование списков

Список является рекурсивной  составной структурой данных, поэтому  нужны алгоритмы для его обработки. Главный способ обработки списка — это просмотр и обработка каждого его элемента, пока не будет достигнут конец.

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

Подсчет элементов  списка

Проверка нахождения в списке

 

 

 

3. Функциональные возможности Visual Prolog

  1. Модульное программирование
  2. объектный механизм
  3. Средства создания графического интерфейса

 

  1. Модульное программирование

 

            Способность системы работать  с программами, разбитыми на  модули, — это еще одна положительная черта Visual Prolog. Вы можете писать, компоновать и компилировать модули раздельно, а затем связывать их вместе, чтобы создать одну выполняемую программу. Если вам надо изменить программу, то достаточно только отредактировать и перекомпилировать отдельные модули, а не всю программу в целом. Это вы непременно оцените при написании больших программ. Кроме того, модульное программирование имеет еще и такое преимущество — по умолчанию все имена предикатов и доменов являются локальными. Это значит, что различные модули могут использовать одинаковые имена для разных целей. Visual Prolog использует две концепции для управления модульным программированием: глобальные объявления и проекты.

Глобальные  объявления

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

Начиная с  версии 5.2, Visual Prolog обеспечивает управление глобальными объявлениями. А именно:

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

Глобальные  домены

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

Visual Prolog версии 5.2 предоставляет усовершенствованное управление глобальными доменами. Теперь не требуется, чтобы все модули содержали одинаковые объявления всех глобальных доменов в определенном порядке (в PDC Prolog и в версиях Visual Prolog до 5.2 для проверки этой идентичности использовалась специальная утилита chkdoms.exe). Теперь же вам нужно следовать  двум правилам:

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

 

Среда визуальной разработки Visual Prolog предоставляет гибкий автоматический механизм для управления включением объявлений глобальных доменов  в модули проекта. Ядро этого механизма — диалоговое окно File Inclusion for Module, которое активизируется при создании нового модуля. Для небольших проектов вы можете использовать упрощенную стратегию обеспечения включения всех глобальных доменов в каждый проектный модуль. Для этого вам нужно:

Глобальные  секции фактов

Раздел facts будет  глобальным, если перед ключевым словом facts (можно использовать и устаревшее ключевое слово database) вставлено ключевое слово global.

Замечание

Размещать обязательно требующиеся инициализирующие предложения для single-фактов из глобальных секций фактов (баз данных) можно только после раздела goal в главном модуле проекта.  

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

проекты

 

Если вы используете VDE, то эксперт приложений автоматически  управляет созданием новых проектов и добавлением/удалением проектных модулей. Построитель программ (Make facility) VDE автоматически совершает операции компиляции и компоновки, необходимые для создания целевого модуля из исходных модулей проекта.

Следовательно, нужно объяснить здесь всего  две особенности, которые будут важны в случае использования командной строки для вызова компилятора:

  Как Visual Prolog-проект использует таблицу  символов.

Visual Prolog-программы  должны иметь цель (содержать  Goal-секцию).

По умолчанию  компилятор проверяет, имеет ли компилируемый файл раздел цели (Goal), и, если не имеет, — генерирует ошибку. Но в многомодульных проектах только один (главный) модуль проекта содержит раздел цели. Чтобы скомпилировать другие модули проекта, компилятор нужно проинформировать о том, что эти модули являются частями проекта и именно поэтому не содержат раздел цели. Это делается опцией компилятора командной строки -г[ProjectName].

Классы и  объекты

Visual Prolog включает  в себя объектный механизм, объединяющий  парадигмы логического и объектно-ориентированного программирования (ООП).

Для того чтобы  система могла рассматриваться  как объектно-ориентированная, необходимо, чтобы она удовлетворяла четырем критериям. Это:

  • инкапсуляция;
  • классы;
  • наследование;
  • индивидуальность.

Инкапсуляция

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

ООП также  известно как программирование, управляемое  данными. Фактически, вы позволяете объектам делать работу самим. Они содержат методы, которые вызываются при создании объектов, при их удалении и, вообще, при любых обращениях к объектам. Методы могут вызывать и методы других объектов.

 

Объекты и классы

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

Объект — гораздо более сложная структура данных, чем список. На элементарном уровне, объект — это объявление согласованных между собой данных. Это объявление может содержать предикаты, которые работают с этими данными. В соответствии с терминологией ООП эти предикаты называются методами. Каждый класс представляет собой уникальный тип объектов и операций (методов), способных создавать такие объекты, удалять и манипулировать ими.

Класс — это определяемый пользователем тип объекта; класс может создавать объекты этого типа. Экземпляр — это фактическое состояние объекта. Вы можете определить столько экземпляров (объектов) класса, сколько вам необходимо.

Наследование

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

Индивидуальность

Каждый объект уникален. Объекты изменяют свое состояние, и, т. к. состояния объектов можно наблюдать только посредством их предикатов-членов (т. е. предикатов, объявленных внутри определения класса), объект идентичен лишь самому себе. Таким образом, даже если состояния двух объектов одинаковы, объекты не являются идентичными, ибо мы можем изменять состояние одного объекта, не изменяя при этом состояния другого, и в этом случае объекты становятся не идентичными.

Очень важной характеристикой объекта является то, что индивидуальность сохраняется, даже несмотря на изменение его атрибутов. Мы всегда получаем доступ к объекту через ссылку на него. К нему можно получить доступ и через множество различных ссылок, а, т. к. объект идентичен только самому себе, мы можем организовать несколько ссылок на один и тот же объект.

 

 

Средства  создания графического интерфейса

Визуальный  интерфейс программирования VPI (Visual Programming Interface) — высокоуровневый программный интерфейс, разработанный для облегчения создания программ на Visual Prolog, способный поддерживать сложные интерфейсы, использующие графические возможности современных операционных систем. Окна, меню, диалоговые окна, элементы управления, перья, кисти, курсоры, рисунки и т. д. — все эти ресурсы и инструментальные средства входят в состав Visual Prolog как простые структуры,

VPI делает возможным создание переносимого исходного кода, который может быть откомпилирован, чтобы работать в 16-разрядной конфигурации под MS Windows 3.1*, 32-разрядной — под Windows 95/98/ME, Windows NT/2000, под администратором представлений OS/2.

Информация о работе Язык программирования Visual Prolog