Costas-Tyros_rus_MS
.pdf
Глава 2: Формы
В этой главе вы добавите форму к пустому проекту, который вы создали в главе 1. Форма – это поверхность окна, куда вы можете добавлять компоненты вроде кнопок, которые запускают какие либо действия, строки ввода, которые вы можете использовать для ввода текста, и поля для рисова ния, где вы сможете что либо рисовать.
2.1.Создайтеформу: folder/name
Чтобы создать форму, выберите команду File/New in New Package из меню задач, как на рис. 2.1. Выберите на левой панели пункт Form и заполните диалоговое окно Create Project Item соответствен но рис. 2.2. Название новой формы – query. Так как вы выбрали вариант New in New Package, Visual Prolog создаст форму в пакете с таким же названием. После нажатия на кнопку Create диалогового окна Create Project Item, IDE покажет вам прототип новой формы, как на рис. 2.3. Вы можете изменить размеры прямоугольника окна, сделав его немного больше прототипа. Чтобы сделать это, нажмите мышкой на нижнем правом углу формы и тяните его, как вы делаете, когда изменяете размеры обычного окна.
Рисунок 2.1 Добавление нового предмета к дереву проекта
Рисунок 2.2 Создание новой формы
11
Рисунок 2.3 Изменение размеров формы
2.2.Включитепанельзадач: в частности, пункт File/New
Когда вы запускали пустое приложение, вы, скорее всего, заметили, что пункт меню File/New от
ключен. Чтобы включить его, дважды щелкните по ветке дерева проекта под названием TaskMe nu.mnu (рис. 2.4). Затем, разверните дерево, находящееся в нижней части диалогового окна TaskMenu, и уберите галочку Disabled, относящуюся к пункту &New/tF7, как на рис. 2.5.
Рисунок 2.4 Дерево проекта/меню задач
2.3.В Эксперте Кода добавьте код к элементу дерева проекта
Чтобы добавить код к пункту File/New, нажмите на ветке дерева проекта TaskWindow.win правой кнопкой мыши, перед вами откроется контекстное меню. Выберите пункт Code Expert (рис 2.6). Сле
дуя рис. 2.7, дважды щелкните на
12
Наконец, нажмите кнопку Add (ориентируйтесь по рис. 2.7), и дважды щелкните по ветке
__
Это откроет текстовый редактор со следующим фрагментом кода в нём:
clauses
onFileNew(_Source, _MenuTag).
Постройте1 программу, а затем измените этот фрагмент так:
clauses
onFileNew(W, _MenuTag) : X = query::new(W), X:show().
Снова постройте программу, выбрав пункт Build/Build на панели задач, согласно рис. 1.4. Запус тив программу, вы увидите, что, когда вы нажимаете File/New, создается новая форма.
Рисунок 2.5 Включение элемента меню задач
Рисунок 2.6 Переход в Code Expert
1 Имеется в виду выполнение команды build (строить – англ.). Другими вариантами перевода могут быть глаголы «компоновать» и «собирать» (сам я употребляю «собирать», и в тексте кое где пользуюсь этим переводом).
13
Рисунок 2.7 Dialog and Window Expert
Рисунок 2.8 Появляющаяся форма
2.4.Примеры
Пример для этой главы показывает, как создавать новую форму с помощью выбора пункта File/New, и заполнения затем диалогового окна Create Project Items.
14
2.5. Представления о логике:СиллогистикаАристотеля
По Аристотелю, «утверждение» состоит из квантора: «каждый», «ни один», «некоторые», «не каждый», и двух терминов: субъекта и предиката. Термин субъект происходит от латинского пере ложения греческого термина ύποχείμενον, который обозначает, о чём (или о ком) это утверждение.
Предикат – это то, что утверждение говорит о субъекте.
Португальский логик, медик и математик Pedro Julião (также известный как Пётр Испанский (Peter of Spain)) внес значительный вклад во многие области знания, до того как был избран папой Иоанном
XXI; например, он считается отцом офтальмологии и превентивной медицины. Он написал оказав ший большое влияние научный труд (Summulae Logicales), и считается, что именно он ввёл следую
щие аббревиатуры для кванторов в логике:
Квантор |
Тип высказывания |
Аббревиатура |
Пример |
a |
Общеутвердительное |
PaQ |
Каждый P является Q |
e |
Общеотрицательное |
PeQ |
Ни один P не является Q |
i |
Частноутвердительные |
PiQ |
Некоторые P являются Q |
o |
Частноотрицательные |
PoQ |
Некоторые P не являются Q |
Высказывания делятся на противоречия, противоположности и соподчинения. Вот определения этих классов:
a.Два высказывания P и Q противоположности тогда и только тогда, когда I. P и Q не одновременно истинны, и
II.необходимо, чтобы или P, или Q был истинен. Типы a и o – противоположности; то же верно и для e и i.
b. P и Q противоречия тогда и только тогда, когда
I.P и Q не одновременно истинны и
II.P и Q оба могут быть ложными. a и e – противоречия.
c. P и Q соподчинения тогда и только тогда, когда
I.P и Q не могут быть одновременно ложными
II.P и Q оба могут быть истинны
iи o – соподчинения.
Силлогизм – это утверждение, состоящее из трёх высказываний (двух посылок и заключения), в котором присутствуют ровно три термина, каждый из которых использован ровно дважды. Пусть P изображает предикат заключения (больший термин), а S – субъект заключения (меньший термин). Аристотель называл эти термины экстремумами. M представляет термин, общий для обеих предпо сылок, но отсутствующий в заключении; он называется средним термином. Предпосылка, содержа щая P называется большей посылкой; посылка, содержащая S – меньшая посылка.
Пусть символ * заменяет собой кванторы (`a', `e', `i', `o'). В таком случае, силлогизмы классифи цируются на три фигуры, а именно:
Первая фигура |
Вторая фигура |
Третья фигура |
P*M |
M*P |
P*M |
M*S |
M*S |
S*M |
P*S |
P*S |
P*S |
Если заменить звёздочки кванторами, мы получим кортеж высказываний: {большая посылка, меньшая посылка, заключение}. Согласно Петру Испанскому, каждый отдельный кортеж ({a, a, a}, {a, i, o}…) представляет собой модус, или наклонение. Для того, чтобы подсчитать, сколько всего существует наклонений, нам понадобится вспомнить уроки комбинаторики.
Перестановки – это способы построения списков вещей; в списке порядок следования имеет большое значение. С другой стороны, комбинации – это группы вещей, и порядок следования эле ментов в группе значения не имеет. Так как порядок следования кванторов в силлогизме имеет зна чение, мы имеем дело с перестановками. Мы по разному переставляем три элемента из множества, состоящего из четырёх элементов; повторы допустимы. Если у вас есть n предметов, из которых вам
15
нужно выбирать, и вы выбираете p из них, то количество возможных перестановок задаётся форму
лой
…
раз
В нашем случае нужно выбирать три квантора из множества {a, e, i, o}. Таким образом, существу ет 43=64 возможностей для каждой фигуры; так как у нас три фигуры, количество возможностей воз растает до 192.
2.5.1. Допустимые силлогизмы
Не все возможные силлогизмы допустимы с точки зрения логики. Аристотель признавал четыре допустимых наклонения для первой и второй фигур, и шесть наклонений для третьей. С другой сто роны, современная логика признаёт четыре наклонения для всех трёх фигур. Пётр Испанский ввёл латинскую мнемонику для облегчения запоминания допустимых наклонений; по его схеме, гласные обозначают наклонение; например, BARBARA обозначает {a, a, a}, и является допустимым наклоне нием для первой фигуры. Знатоки классической латыни заметят, что имена основаны на средневеко вом произношении латинского, где слово вроде СÆSARE записывается как CESARE, и произносится соответственно. В любом случае, вот полный список допустимых наклонений:
Первая фигура
{a, a, a} – Barbara {e, a, e} – celarent {a, i, i} – Darii
{e, i, o} – ferio
Вторая фигура
{e, a, e} – Cesare {a, e, e} – Camestes {e, i, o} – Festino {a, o, o} – baroco
Третья фигура
{o, a, o} – Bocardo {e, i, o} – Ferison {i, a, i} – Disamis {a, i, i} – Datisi
Рисунок 2.9 Силлогизм Barbara
Согласно [Lewis Caroll], Венн (Venn) предложил диаграммы для проверки допустимости силло гизмов. Рис. 2.9 иллюстрирует венновский метод для наклонения Barbara. Первая посылка наклоне ния гласит, что все M являются P; значит, закрашиваем часть M, не принадлежащую P (левая сторона рисунка). Вторая посылка гласит, что все S являются M; следовательно, закрашиваем часть S, нахо
дящуюся снаружи M. Оставшаяся часть S полностью внутри P. Тогда можно заключить, что все S яв ляются P.
Давайте теперь рассмотрим силлогизм Darii, который гласит, что
|
|
|
является |
|
|
|
является |
Где символ означает |
Все |
, а символ |
является |
|
означает Некоторые. Венн утверждал, что общие посылки |
должны быть отмечены на диаграмме до частных посылок. Поэтому, с левой стороны рис. 2.10 мы
расположить символ в области, соответствующей посылке |
|
является. Рис. 2.10 показывает, |
||
закрасили область P, не принадлежащую M, чего требует посылка |
|
|
. Следующий шаг – |
|
|
|
является. |
||
что этот символ может располагаться в области |
, или в области |
SPM |
Так как мы не знаем точно, |
|
|
||||
16
в какой области он должен быть, мы ставим символ на линии. Заключением является Некоторые S
являются P.
Рисунок 2.10 Силлогизм Darii
Отец Алисы Лидделл (Alice Liddell) хотел дать ей очень хорошее образование. Когда он заметил, отсутствие какого бы то ни было хорошего англо греческого словаря, он подготовил такой со своим другом Скоттом, (и этоим словарем до сих пор пользуются почти все изучающие греческий язык). Он также нанял великого писателя Льюиса Кэролла ([Lewis Carroll]) учителем логики для своих двоих до
черей. Для того, чтобы сделать уроки интересными, Льюис Кэролл написал для детей несколько книг:
Алиса в Стране Чудес (Alice in the Wonderland), Through the Looking Glass, и Game of Logics. Приведён ный ниже пример – из книги Game of Logics.
Ни один философ не самоуверен; Некоторые самоуверенные люди не мошенники.
Следовательно некоторые не мошенники– не философы.
Следующее решение вышеприведённого силлогизма было любезно предоставлено мне лично мистером Венном: меньшая посылка утверждает, что некоторые элементы, составляющие my’ должны быть сохранены – отметим их крестиком. Большая утверждает, что все xm должны
быть уничтожены; сотрём их. Тогда, так как некоторые my’ должны быть сохранены, это опре делённо должен быть my’x’. Значит, должен существовать my’x’; или, отбрасывая m, y’x’. Обыч ным языком, некоторые не мошенники – не философы.
17
Глава 3: События мыши
В первых двух главах этого документа, вы научились строить приложение с формой, которая по является, когда вы выбираете пункт File/New из меню этого приложения.
3.1.Добавим код кMouseDownListener
Нажмите на ветку query.frm в дереве проекта, чтобы заново открыть форму запросов, как показа но на рис. 2.3; затем нажмите кнопку Events диалогового окна Properties. Перед Вами откроется спи
сок событий, как изображено ниже.
Дважды щёлкните по событию MouseDownListener и замените процедуру onMouseDown/4 сле дующим кодом:
clauses
onMouseDown(S, Point, _ShiftControlAlt, _Button): W= S:getVPIWindow(),
Point=pnt(X, Y),
vpi::drawText(W, X, Y, “Hello, World!”).
Откомпилируйте программу, и запустите её. Выберите File/New, чтобы создать новую форму. Ка ждый раз, когда вы нажимаете где либо внутри на форме, программа размещает на ней знаменитое приветствие.
18
3.2.onPaint
Вы использовали обработчик события onMouseDown/4 чтобы нарисовать что нибудь на форме. Есть программисты, которые не считают это хорошей идеей. На самом деле, существуют языки, кото рые делают такой подход очень трудноосуществимым. Java один из таких языков; и, между прочим, он при этом очень популярен. В Java любое рисование следует производить внутри следующего ме тода:
public abstract void doPaint(java.awt.Graphics g)
Конечно, это ограничение можно обойти, и даже в Java. В любом случае, давайте научимся рисо вать с помощью обработчика событий onPaint/3.
1.Создайте проект с именем plot0.
2.Добавьте новую форму query в новый пакет query.
3.Включите пункт меню задач File/New, и добавьте фрагмент
clauses
onFileNew(S, _MenuTag) :
Q= query::new(S), Q:show().
кProjTree/TaskWindow.win/Menu/TaskMenu/id_file/id_file_new.
4.Постройте приложение.
Следующий шаг – добавить фрагмент
class facts
mousePoint:pnt := pnt( 1, 1). predicates
onMouseDown : drawWindow::mouseDownListener. clauses
onMouseDown(_S, Point, _ShiftControlAlt, _Button) : mousePoint := Point,
Point=pnt(X,Y),
R=rct(X 8, Y 8, X+60, Y+8), invalidate(R).
в MouseDownListener. Теперь вы готовы применить обработчик события onPaint для формы query. onPaint будет вызван каждый раз, когда прямоугольная область на форме становится уста ревшей или неверной. Когда изображение становится неверным? Когда окно частично или полно стью перекрыто другим окном, или когда вы обновляете его с помощью предиката invalidate(R), где R – прямоугольник. Прямоугольник описывается координатами его левого верхнего и правого нижнего углов.
R=rct(X 8, Y 8, X+60, Y+8)
Вы, возможно, заметили, что обработчик события onMouseDown/4 делает неверной прямоуголь ную область вокруг места щелчка мыши. В этом случае с этой «неверной» областью будет работать
обработчик события onPaint, перерисовывая её. Чтобы всё это заработало, добавьте фрагмент с рис. 3.2 в PaintResponder. В дереве проекта дважды щёлкните по ветке query.frm. Нажмите на закладку Event диалогового окна Properties (см. рис. 3.1 и 2.3); в появившемся списке событий вы и найдёте PaintResponder. Этот новый подход потребует от вас понимания множества новых вещей, таких, как
конструкция if then else и глобальные переменные. Не беспокойтесь пока об этих понятиях. Вы все изучите в свое время.
19
Рисунок 3.1 PaintResponder
predicates
onPaint : drawWindow::paintResponder. clauses
onPaint(_Source, _Rectangle, GDIObject) : if pnt(X, Y)= mousePoint, X>0
then
mousePoint := pnt( 1, 1), GDIObject:drawText(pnt(X, Y), "Hello, World!", 1)
else succeed() end if.
Рисунок 3.2 Код для PaintResponder
3.3.Примеры
Примеры в этой главе показывают, как обрабатывать события мыши, такие, как щелчок левой кнопкой мыши.
3.4. Представления о логике:Булеваалгебра
Исчисление высказываний – это формальная система, в которой формула, изображающая выска зывание, может быть образована комбинированием атомарных высказываний с использованием логических связок. Формула исчисления высказываний подчиняется следующим грамматическим правилам:
1.α множество содержит атомарные формулы; в общем случае – строчные буквы латинско го алфавита. Любой элемент α множества является верной формулой.
2. |
Если p формула, то p – тоже формула. Символ изображает логическое отрицание. Та |
||
|
ким образом, p истинно, если p ложно, и ложно в противном случае. |
||
3. |
Если p и q формулы, то |
(логическая дизъюнкция), |
(логическая конъюнкция), |
, |
тоже формулы. Семантически, формула |
означает p или q, |
и истинна, |
|
если p или q истинны; формула |
истинна, только если и p и q истинны; |
означа |
||
ет, что p предполагает1 q, то есть, если p истинно, то q истинно. Наконец, |
означает, |
|||
что p эквивалентно q: Если p истинно, то q тоже истинно, и если q истинно то p тоже ис тинно.
1 Здесь имеется в виду известная операция импликации. Использованный автором английский глагол to imply означает предполагать, подразумевать.
20
