Prolog Development Center. Фирма Borland до 1990 Turbo Prolog затем права переданы pdc. С 1993 года под руководство

Вид материалаРуководство

Содержание


1. Основные конструкции языка Visual Prolog
Ключевые слова
2. Разделы программы
3. Дескриптивный, процедурный и машинный смысл программы на Прологе.
2. Представление знаний, структуры данных в программах на языке Пролог.
Внешние базы данных в Visual Prolog
Списки и рекурсия
Что такое список?
Объявление списков
Работа со списками
Использование списков
3. Функциональные возможности Visual Prolog
Глобальные объявления
Глобальные секции фактов
Объекты и классы
Средства создания графического интерфейса
Управляемые событиями приложения
Подобный материал:




Тема 3. Язык программирования ПРОЛОГ

Лекция № 2

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

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

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

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


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


Краткая историческая справка:

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

1. Основные конструкции языка Visual Prolog


Имена
    1. В Прологе, напомним, имена используются для обозначения символических кон­стант, доменов, предикатов и переменных. Имя состоит из буквы (или знака под­черкивания), за которой следует любая комбинация нуля или более букв, цифр или знаков подчеркивания. На имя накладываются два важных ограничения:
    2. О имена символических констант должны начинаться со строчной буквы;
    3. имена переменных должны начинаться с прописной буквы или знака подчерки­вания.

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

MyLongestVariableNameSoFar

или используя знаки подчеркивания:

pair_who_might_make_ar_happy_couple (henry_yiii, ann_boleyn)

Компилятор Visual Prolog, кроме как для первой буквы, не делает отличий между прописными и строчными буквами.Это означает, что две переменные

SourceCode и

SOURCECODE

одинаковы.

Ключевые слова

Следующие слова являются зарезервированными и их нельзя использовать как име­на, определенные пользователем:

abstract elsedef ifndef procedure

align endclass implement protected

as enddef include predicates

and erroneous language reference

class facts multi single

clauses failure nocopy static

constants global nondeterm struct

database goal object this

determ if or

domains ifdef

Специально определенные предикаты

Следующие предикаты обрабатываются компилятором специальным образом; эти имена нельзя переопределять в программе:



assert

consult

msgsend

term replace

asserta

db btrees

not

term str

assertz

db chains

readterm

trap

bound

fail

ref_term

ref term

write

chain_inserta

findall

retract

writef

chain_insertafter

format

retractall



chain_insertz

free

save



chain terms

magrecv

term bin



assert











2. Разделы программы

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

Таблица Содержание разделов программы
Раздел Содержание

Опции компилятора Опции компилятора, заданные в начале модуля

constants Нуль или более символических констант

domains Нуль или более объявлений доменов

facts Нуль или более объявлений предикатов базы данных

predicates Нуль или более объявлений предикатов

goal Цель программы

clauses Нуль или более предложений

class Нуль или более объявлений открытых (и защищенных) предикатов, фактов и доменов

implement Нуль или более объявлений закрытых предикатов, фактов и доменов. Нуль или более предложений, реализующих откры­тые и закрытые предикаты (и инициализирующих факты)

abstract class Нуль или более объявлений открытых предикатов и доменов. не должны иметь реализацию

Чтобы создать программу, вы должны в ней указать цель. Программе необходимы, по меньшей мере, разделы predicates и clauses. Большинству программ нужен раздел domains для объявления списков, сложных структур и ваших собственных доменов.

При модульном программировании вы можете ставить перед ключевыми словами domains, predicates и facts ключевое слово global, указывая, что последующие объявления имеют глобальную область видимости и объявленные имена действи­тельны во всех программных модулях, которые включают объявления этих глобаль­ных разделов.

Программа может содержать несколько разделов domains, predicates, facts и clauses, а также несколько объявлений и реализаций классов,

• секция объявления объектов предметной области (domains sec­tion), которые будут использоваться в логической программе, например:

DOMAINS

title, author = symbol pages = unsigned

секция объявления предикатов (predicates section), которые будут использоваться в логической программе, например:

PREDICATES

book(title, pages) written_by(author, title) long_novel(title)

• секция логических предложений (clauses section), в которой указываются факты и правила, используемые системой Prolog для поиска решений поставленных перед ней задач, например:

CLAUSES

секция цели (goal section), в которой формулируется задача для системы Prolog, например:

GOAL


3. Дескриптивный, процедурный и машинный смысл программы на Прологе.

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

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

2. В Прологе все правила имеют 2 части: заголовок и тело, разделенные специаль­ным знаком : -.
  • Заголовок — это факт, который был бы истинным, если бы были истинными несколько условий. Это называется выводом или зависимым отношением.
  • Тело — это ряд условий, которые должны быть истинными, чтобы Пролог мог доказать, что заголовок правила истинен.


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


Пролог всегда ищет решение, начиная с первого факта и/или правила, и просматри­вает весь список фактов и/или правил до конца.

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

Пролог базируется на предложениях Хорна, являющихся подмножеством формаль­ной системы, называемой логикой предикатов. Логика предикатов — это простейший способ объяснить, как "работает" мышление, и она проще, чем арифметика, которой вы давно пользуетесь.

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

Язык Пролог не предназначен для программирования задач с большим количеством арифметических операций. Для этого используются процедурные языки программирования. Однако в любую Пролог-систему включаются все обычные арифметические операторы:

+ сложение — вычитание * умножение / деление mod остаток от деления целых чисел div целочисленное деление

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

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


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

  1. Представление знаний о предметной области в виде фактов и правил базы знаний Пролога.
  2. структуры данных в программах на Прологе.



  1. Представление знаний о предметной области в виде фактов и правил базы знаний Пролога.


Деревья относятся к рекурсивные структурам данных

Тип данных является рекурсивным, если он допускает структуры, содержащие такие же структуры, как и они сами.

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

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

domains

treetype = tree(string, treetype, treetype)

Эта декларация говорит о том, что дерево записывается как функтор tree, аргумен­тами которого являются строка и два других дерева.


Внутренняя база фактов (данных)

Внутренняя база фактов состоит из фактов, которые вы можете непосредственно добавлять и удалять из вашей программы на Visual Prolog во время ее исполнения. Вы можете объявлять предикаты, описывающие внутреннюю базу данных в разделе facts программы и применять эти предикаты таким же образом, как используются предикаты, описанные в разделе predicates.

Для добавления новых фактов в базу данных в Visual Prolog используются предикаты assert, asserta, assertz, а предикаты retract и retractall служат для удаления существующих фактов. Вы можете изменить содержание вашей базы фактов, снача­ла удалив факт, а потом вставив новую версию этого факта (или совершенно другой факт). Предикаты consult/1 и consult/2 считывают факты из файла и добавляют их к внутренней базе данных, a save/1 и save/2 сохраняют содержимое внутренней базы фактов в файле.

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

Ключевое слово facts (это синоним устаревшего слова database) определяет начало объявления раздела facts

Внешние базы данных в Visual Prolog


Система внутренних баз данных Visual Prolog, использующая предикаты asserta, assertz, retract и retractall, является простой и удобной. Однако она уступает в скорости работы с большими базами данных, отчасти из-за этих соображений была создана система внешних баз данных, с помощью которой можно, например, создать:

- систему управления запасами с большим количеством записей;

- экспертную систему со многими отношениями и небольшим количеством запи­сей сложной структуры;

- учетную систему для запоминания больших текстов в базе данных;

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


  1. структуры данных в программах на Прологе

Списки и рекурсия

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

После этого определяется стандартный предикат Visual Prolog — findall, который дает возможность находить и собирать все решения для одной цели.

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

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

Конечно, есть другие способы объединить несколько объектов в один. Если число объектов заранее известно, то вы можете сделать их аргументами одной составной структуры данных. Если число объектов не определено, то можно использовать ре­курсивную составную структуру данных, такую как дерево. Но работать со списками обычно легче, т. к. 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.

Управляемые событиями приложения

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

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

Вообще, во время работы могут возникать самые разные ситуации, например, поль­зователь может получить срочный телефонный звонок. На него можно ответить, выбрав системную кнопку окна Task или меню файла и закрыв приложение. Опера­ционная система сообщает приложению о событии, посылая сообщение обработчи­ку событий окна Task. В большинстве многозадачных системах операционная сис­тема может приостановить ваше приложение в любое время. Приложение никогда не будет знать, запрашивал ли пользователь закрытие или это операционная система обнаружила сбой питания. Или если приложение хочет закрыть какое-то окно, то оно посылает этому окну запрос на закрытие CloseRequest точно так же, как поль­зователь, когда он выбирает команду Close в меню окна Task.

Конечно, вы можете уменьшить количество возможных событий и сообщений, бло­кируя пункты меню и кнопки управления. Часть обработки сообщений GUI-приложений может быть очень сложной, но это цена за большую гибкость. Про­лог и VPI существенно упрощают работу программиста по связыванию приложения с GUI операционной системы. Эксперт кода и браузер (The Code Expert and the Browser) облегчают поиск и обработку кода, который соответствует определенному событию, отвечая на определенное сообщение, и вы редко будете иметь дело с запу­танными деталями основной логики передачи сообщений.

Окна

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

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

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

Каждое окно или диалоговое окно в приложении представлены не только структу­рой памяти, но также и предикатом обработчика событий окна, которому VPI посы­лает сообщения при возникновении пользовательских или системных событий, свя­занных с окном. Причем эти сообщения не обязательно синхронизированы с при­ложением. Приложение также может посылать события любому из своих обработчиков событий. В VPI названия событий из домена событий всегда имеют префикс е_.

Типы окон

Окна классифицируются по типам. Типы окон должны принадлежать домену windowtype и иметь префиксы w_ (для окон), wc_ (для элементов управления) или wd_ (для диалоговых окон). Тип окна может быть получен по дескриптору окна вызовом предиката win_GetType. Возможные типы окон перечислены.


Обычное окно документа

Дочернее окно

Окно Task

Окно экрана Screen

Модальное диалоговое окно

Немодальное диалоговое окно

Командная кнопка

Переключатель

Флажок

Горизонтальная полоса прокрутки

Вертикальная полоса прокрутки

Поле редактирования

Статический текст

Список

Раскрывающийся список

Поле редактирования с раскрывающимся списком

Групповой блок

Пиктограмма

Специальные (определяемые пользователем) элементы управления

Внутреннее окно, используемое во время печати

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

Внутреннее окно, используемое во время создания метафайлов/