Costas-Tyros_rus_MS
.pdf
•Атомарный факт есть соединение объектов (An atomic fact is a combination of objects).
•Объект прост (The object is simple).
•Объекты содержат возможность всех положений вещей (Objects contain the possibility of all states of affairs). В Visual Prolog объектные факты и переменные ис пользуются для отображения состояния объекта.
•Возможность вхождения объекта в атомарные факты есть его форма (The
possibility of its occurrence in atomic facts is the form of the object).
Можно увидеть, что идея классов и объектов – это старая идея в западной философии. То же
верно и для состояний. В данном примере, объектами являются индивидуальные счета. Состояние счёта (нашего объекта) определяет фонды, имя владельца счёта, его/её Social Security Number – но
мер социального страхования, пароль, и т.д. Это состояние отображается фактом и переменной:
facts customer funds:real := 3.0.
personalData:(string Name,string SocialSecurity) single.
Предикаты интерфейса используются для доступа к фактам, которые выдают состояние объекта.
% Файл account.i interface account open core
predicates
ssN:(string SocialSecurity) procedure (o). setSocialSecurity:(string SSN) procedure(i). deposit:(real).
end interface account
Около восьми человек написало мне, утверждая, что названием книги Витгенштейна должно быть “Tratactus LogicusPhilosophicus”. Доктор Мари Розе Шапиро (Mary Rose Shapiro) завела долгую
дискуссию о различиях между классической и философской латынью. Она утверждала, что название в таком виде, в каком я его написал является ошибкой, совершённой Огденом (Ogden), когда тот пе реводил книгу на английский язык. Мои знания в этой теме не простираются настолько глубоко, я решил сохранить название книги таким, под которым она есть на любой книжной полке.
101
Глава 13: Джузеппе Пеано
Джузеппе Пеано (Giuseppe Peano) был одним из величайших математиков всех времён. Он напи сал маленькую книжку, под названием
Arithmetices Principia Novo Methodo Exposita
Уже отсюда вы можете понять, насколько он был велик. Не много людей пишут на латыни в это время и находят читателей. Гаусс (Gauss) был одним из тех немногих математиков, способных позво лить себе писать на латыни. Пеано был ещё одним. Конечно же, Гаусс писал в основном на латыни. Пеано писал в основном на французском, языке науки начала прошлого века, и итальянском, языке его матери. Единственной вещью, написанной им на латинском языке, была Arithmetices Principia, очень короткая книга на 29 страницах. Там он предлагал миру современную форму записи для фор мальной логики – ветви математики, давшей начало Прологу. Он также говорил о других вещах, та ких, как теория чисел и рекурсия. Я сильно советую вам выучить латынь и прочесть книгу Пеано.
13.1.Черепашья графика
Перед погружением во вклад Пеано в науку (а там их много), давайте реализуем в Прологе чере пашью графику – turtle graphics. Создайте объектно ориентированный GUI со следующими настрой ками проекта:
General
Project name: peano
UI Strategy: Object oriented GUI (pfc/gui)
Target type: Exe
•Создайте новую форму в новом пакете: canvas (раздел 2.1) Название формы canvas и
она находится в корне проекта peano.
•Создайте класс под названием curve: отправляйтесь в окно проекта, выберите папку plotter, выберите пункт меню File/New in Existing Package и создайте класс. Уберите га лочку Create Objects. Постройте приложение.
•Создайте пакет под названием turtleGraphics в каталоге C:\vispro и вставьте в него класс под названием turtle. Чтобы сделать это, нажмите File/New in New Package; нахо дясь в диалоговом окне Create Project Item, нажмите на кнопку Browse под Parent Directo ry, и выберите каталог C:\vispro\ в диалоговом окне Set New Directory. Не забудьте от ключить Create Objects. Удостоверьтесь, что положили пакет turtleGraphics вне проекта peano. Так будет легче многократно его использовать. Постройте приложение.
•Включите пункт File/New в TaskMenu.mnu.
•Добавьте следующий код
clauses
onFileNew(S, _MenuTag) : X= canvas::new(S), X:show().
к TaskWindow.win/Code Expert/Menu/TaskMenu/id_file/id_file_new.
•Отредактируйте curve.cl и curve.pro как показано на рис. 13.1. Отредактируйте turtle.cl и turtle.pro как показано на рис. 13.2 и 13.3. Постройте программу.
•Добавьте следующий код к PaintResponder формы canvas.frm:
clauses
onPaint(S, _Rectangle, _GDIObject) :
W= S:getVPIWindow(), curve::drawCurve(W).
102
Откомпилируйте и запустите проект. Когда вы выберете пункт File/New в меню приложения, на экране окно появится с нарисованной на нём звездой.
%Файл curve.cl class curve
open core, vpiDomains predicates
classInfo : core::classInfo. drawCurve:(windowHandle).
end class curve
%Файл curve.pro
implement curve
open core, vpi, vpiDomains, math class predicates
star:(windowHandle, integer, real, integer) procedure (i, i, i, i).
clauses
classInfo("plotter/curve", "1.0"). star(_Win, 0, _A, _L) : !.
star(Win, N, A, L) : turtle::right(A), turtle::forward(Win, L),
star(Win, N 1, A, L).
drawCurve(Win) : star(Win, 10, 3*pi/5, 40). end implement curve
Рисунок 13.1 Файлы curve.cl и curve.pro
13.2.Черепашьисостояния
Класс turtle реализует рисующую turtle – черепаху, как в Logo, языке, созданном Папертом (Pa pert) в попытке продолжить идеи Жана Пиажета (Jean Piaget). Черепаха – это объект, который дви
жется по окну, оставляя за собой след. Черепаха имеет две переменные состояния, а именно, её по ложение и направление её движения. Эти переменные состояния заданы фактом:
class facts
turtle:(pnt, real) single. clauses
turtle(pnt(200, 200), pi/2).
…
Рассмотрим следующий предикат:
forward(Win, L) :
turtle(P1, Facing), P1= pnt(X1, Y1), X2= math::round(X1+ L*cos(Facing)), Y2= math::round(Y1+L*sin(Facing)),
P2= pnt(X2, Y2), drawline(Win, P1, P2), assert(turtle(P2, Facing)).
103
Он реализует движение черепахи вперёд. Если черепаха находится в точке P1=pnt(X1, Y1) и движется на расстояние L в направлении Facing, можно найти её новую позицию, проецируя L на
оси X и Y:
cos sin
% Файл turtle.cl class turtle
open core, vpiDomains predicates
classInfo : core::classInfo. forward:(windowHandle, integer) procedure. move:(integer) procedure.
right:(real) procedure. left:(real) procedure.
end class turtle
Рисунок 13.2 Файл turtle.cl
% Файл turtle.pro implement turtle
open core, vpiDomains, vpi, math class facts
turtle:(pnt, real) single. clauses
classInfo("turtleGraphics/turtle", "1.0"). turtle(pnt(80, 80), pi/2).
forward(Win, L) : turtle(P1, Facing), P1= pnt(X1, Y1),
X2= math::round( X1+ L*cos(Facing)), Y2= math::round(Y1+L*sin(Facing)),
P2= pnt(X2, Y2), drawline(Win, P1, P2), assert(turtle(P2, Facing)).
move(L) : turtle(P1, Facing), P1= pnt(X1, Y1), X2= round( X1+ L*cos(Facing)),
Y2= round(Y1+L*sin(Facing)),
P2= pnt(X2, Y2), assert(turtle(P2, Facing)). right(A) : turtle(P1, Facing),
NewAngle= Facing+A, assert(turtle(P1, NewAngle)).
left(A) : turtle(P1, Facing), NewAngle= Facing A, assert(turtle(P1, NewAngle)).
end implement turtle
Рисунок 13.3 Файл turtle.pro
104
После получения новой позиции P2=pnt(X2, Y2), forward/2 использует
drawline(Win, P1, P2)
для соединения точки P1 с точкой P2. Наконец, информация о новом положении черепахи до бавляется в базу данных:
assert(turtle(P2, Facing))
Предикат move/1 похож на forward/2, но он не соединяет новое положение черепахи со старым. Предикаты right/1 и left/1 поворачивают черепаху соответственно направо и налево. Их реализа ции просты.
13.3.Рекурсия
Постулат рекурсии Пеано может быть сформулирован так: Для того, чтобы доказать, что пре дикат истинен для любого натурального числа,
•Докажите, что он истинен для 0.
•Докажите, что он истинен для N, если он истинен для N 1.
Конечно, эта версия постулата начинается с 0, и написана на английском. Оригинал начинался с ∞ и был на латыни. Мило, не правда ли? В любом случае, давайте рассмотрим предикат star/4 (см. рис. 13.1) в свете постулата Пеано. Первое предложение
star(_Win, 0, _A, _L) : !.
гласит: вы пририсовываете ноль сторон1 к звезде, если вы ничего не делаете. Второе предложе
ние
star(Win, N, A, L) : turtle::right(A), turtle::forward(Win, L),
star(Win, N 1, A, L).
гласит: вы пририсовываете N сторон к звезде, если вы пририсовываете одну сторону (поворачи ваетесь на A радиан направо и идёте L пикселей прямо), и переходите к рисованию остальных N 1 сторон.
13.4.Кривая Пеано
Пеано разработал рекурсивную кривую, которая заполняет пространство, что математики рас сматривают как очень интересное свойство кривых. Что я на самом деле хотел нарисовать, когда я создал проект peano, это как раз кривую Пеано, но тогда я решил начать с более лёгкого примера. В любом случае, чтобы получить кривую Пеано, всё, что вам надо сделать, это заменить curve.pro данный на рис. 13.1 файлом curve.pro данным на рис. 13.4.
1 В оригинале автор описывал работу этого предиката рисованием звезды по точкам, но это не совсем верно. Я позволил себе заменить «точки» на «стороны».
105
implement curve
open core, vpi, vpiDomains, math class predicates
peano:(windowHandle, integer, real, integer) procedure (i, i, i, i).
clauses
classInfo("plotter/curve", "1.0"). peano(_Win, N, _A, _H) : N<1, !. peano(Win, N, A, H) : turtle::right(A),
peano(Win, N 1, A, H), turtle::forward(Win, H), peano(Win, N 1, A, H), turtle::forward(Win, H), peano(Win, N 1, A, H), turtle::left(A).
drawCurve(Win) :
turtle::move( 60), peano(Win, 6, pi/2, 5). end implement curve
Рисунок 13.4 Кривая Пеано
13.5.Latino Sine Flexione1
Вы увидели, что Пеано создал современную форму записи для логики. Он также выдвинул идею рекурсии. Так как рекурсия является базовой схемой программирования в Прологе, можно сказать,
что Пеано внёс два важных вклада в логическое программирование. Однако он на этом не остано вился. Прежний Пролог был изобретён Колмероэ (Colmerauer) для обработки естественных языков:
Язык программирования Пролог родился из проекта, нацеленного не на создание языка программирования, но на обработку естественных языков; в данном случае, французского
Колмероэ.
В случае естественных языков, Пеано сделал интересное предложение. Так как большинство ев ропейских языков заимствовали большое число латинских слов, почему не использовать латынь для научного общения? Всё, что вам нужно – это выбрать латинские слова, обычные для главных евро пейских языков, и вы получите словарь достаточно большой, чтобы выразить практически любую идею. Проблема в том, что латынь – сложный язык, со всеми этими склонениями и словоформами.
Пеано позаботился и об этом: из своей разновидности латинского языка он убрал все флексии2. Да вайте взглянем на несколько цитат из Key to Interlingua, где Interlingua – официальное название ла тыни без флексий.
1Латинский без словоизменения
2Флексия (от лат. flexio – сгибание, изгиб) – показатель комплекса грамматических категорий, выражающихся в словоизменении; сама система словоизменения, пользующаяся такими показателями; то же, что окончание. – БСЭ, III издание, 1977 г.
106
13.6.Цитаты изKey to Interlingua
1.Interlingua заимствует каждое слово, обычное для английского, немецкого, французского, испанского, итальянского, португальского, русского языков, и каждое англо латинское слово;
2.Каждое слово имеет форму латинской основы или корня.
Словарь Interlingua собран из великого множества латинских слов, которые пришли в англий ский, и, следовательно, легко понимаемых англоговорящим человеком. Он включает в себя все тер мины, используемые в научной номенклатуре ботаники, химии, медицины, зоологии и других наук. Многие из этих терминов также греческие или греко латинские. Несколько классических латинских слов без международных эквивалентов являются частью словаря, а именно
|
Latino |
|
Английский |
|
Русский |
|
Пример |
|
que |
|
that |
|
Что, который |
|
Interlingua adopta vocabulo que existe in Anglo, Germano, Franco et |
|
|
|
|
|
|
|
Russo. |
|
de |
|
of |
|
Из |
|
Latino habe praecisione de expressione. |
|
|
|
|
|
|
|
|
|
et |
|
and |
|
И |
|
et cetera, et al. |
|
sed |
|
but |
|
Но |
|
Vocabulario de Latino non es formato ad arbitrio sed consiste de vo |
|
|
|
|
|
|
|
cabulos in usu in Anglo, Russo et Germano. |
|
isto |
|
this, that |
|
Это, что |
|
pro isto («потому что») |
|
illo |
|
he, it |
Он, оно |
|
Illo es Americano. |
|
|
illa |
|
she |
|
Она |
|
Illa es Americana |
|
me |
|
I, me |
Я |
|
Me programma in Prolog. |
|
|
te |
|
you |
|
Ты |
|
Te programma in Prolog. |
|
nos |
|
we |
|
Мы |
|
Nos programma in Prolog. |
|
vos |
|
you guys |
|
Вы |
|
Vos programma in Prolog. |
|
id |
|
it |
Это |
|
i.e., id est |
|
|
qui? |
|
who? |
|
Кто? |
|
Qui programma in Prolog? |
|
que? |
|
what, which |
Что, который |
|
Te programma in que? |
|
|
omne |
|
all |
|
Всё |
|
Illo es omnepotente= Он всемогущ. |
Латинский не должен иметь никакой вид флексий. Множественное число формируется исполь зованием слова plure, как в:
Plure vocabulo in Latino es in usu in Anglo
Латинские слова используются в английском языке.
Однако Пеано был демократом, и, так как большинство людей [англоговорящих людей – прим. пер.] хочет образовывать множественное число с s, он одобрил опциональное s множественное.
Прилагательные могут быть созданы из существительных с помощью предлога de:
•de fratre=fraternal – братский
•de amico=friendly, amicable – дружеский
Конечно же, есть множество слов, которые являются прилагательными от природы: internacio nale, breve (short – короткий), magno (large, big большой), commune (common – обычный), и т.д. Вы
можете использовать эти прилагательные как наречия, без изменений. Вы можете также образовать наречие используя слово modo: in modo de fratre (fraternally братски), in mode de patre (paternally
отечески), in modo rapido (rapidly быстро). Я думаю, что этого достаточно. Вот пример текста на Lati no sine flexione:
Interlingua es lingua universale que persona in modo facile scribe et intellige sine usu de speciale studio. Interlingua adopta vo cabulo que existe in Anglo, Germano, Franco et Russo. Usu de Interlingua es indicato pro scienti.co communicatione et pro com merciale correspondentia. Usu de Interlingua in internationale congressu facilita intelligentia et economiza tempore. In addi
107
tione Interlingua es de valore educationale nam (because) illo es de logico et naturale formatione.
Зачем нам нужен международный язык, как Interlingua Пеано, если у нас уже есть английский? Я думаю, что незачем. Однако, люди, предлагающие Interlingua, предлагают несколько интересных аргументов в защиту своего проекта. Например, человечество не может позволить международному языку измениться, как только экономическая гегемония и культурный престиж сдвигается от одной нации к другой. В XIX веке французский был языком дипломатии. Затем, американская экономика превзошла французскую, и английский язык стал международным языком. В этом столетии Китай будет доминирующей суперсилой и будет навязывать письменный китайский другим нациям. Есть интересная история об этой точке зрения. Люди всё ещё используют латынь для описания растений. Так, если вы откроете новое растение, вы должны описать его на латинском. Это было верно и для зоологов и анатомов, но не так давно они перешли на английский. Поэтому, некоторые ботаники предложили последовать их примеру и принять современный язык и в ботанике. Проблема в том, что язык, который они хотят, китайский, а не английский!
Есть другой аргумент в пользу латыни. Языки вроде французского, английского и китайского сложны для изучения даже для людей, которые говорят на них как на родных. Не много французов могут писать на приемлемом французском. Очень немного американцев могут приблизиться к анг лийскому письменному общению. Мой сын в восьмом классе средней школы Mount Logan, так я час то хожу туда проверить его успехи. Большинство его одноклассников не могут читать, не говоря уже о том, чтобы писать. Если это происходит с американцами, что я могу сказать про японцев, которые пробуют учить английский? Подводя итоги: десяти лет недостаточно для того, чтобы научить амери
канца писать английскую прозу, но за десять дней мы сможем писать на приемлемой латыни. Но да вайте оставим эту дискуссию для мудрых, и соберём проект, который берёт текст на LsF (Latino sine Flexione) и объясняет трудные слова и выражения.
•Создайте новый GUI проект: LsF.
•Добавьте новый пакет к дереву проекта: LsF/editor. Добавьте пакет
editorControl
к корню дерева проекта. Для этого, выберите File/Add в меню задач, найдите каталог ус тановки Visual Prolog и выберите файл
\pfc\gui\controls\editorControl\editorcontrol.pack
Постройте приложение.
•Создайте новую форму: editor/txtWin. Измените размер формы, потому что editor Control должен быть довольно большим. Добавьте нестандартный элемент управления на форму. Нестандартный изображается иконкой ключа. Система предложит вам список названий нестандартных элементов управления; выберите editorControl. Измените размеры панели редактора.
•Build/Build приложение.
•Создайте класс editor/grammar с отключенным Creates Objects. Если вы не помните, как это делать, взгляните на раздел 4.4. Постройте приложение ещё раз.
•Измените файлы grammar.cl и grammar.pro как показано ниже
108
%File: grammar.cl class grammar
open core predicates
classInfo : core::classInfo. dic:(string).
end class grammar
%File: grammar.pro implement grammar open core
clauses
classInfo( "editor/grammar", "1.0"). dic(S) : stdio::write(S), stdio::nl.
end implement grammar
•Включите пункт File/New (раздел 2.2) меню приложения. Добавьте фрагмент
clauses
onFileNew(S, _MenuTag) : X= txtWin::new(S), X:show().
кProjWin/TaskWindow.win/Code Expert/Menu/TaskMenu/id_file/id_file_new.
•Добавьте фрагмент
onHelpClick(_Source) = button::defaultAction : editor_ctl:getSelection(Start, End), Txt=editor_ctl:getText(Start, End), grammar::dic(Txt).
к ClickResponder кнопки help_ctl формы txtWin.frm. В том же файле, в который вы до бавляли последний код для onHelpGrammar (txtWin.pro), измените определение преди ката new как показано на рис. 13.5. Наконец, создайте файл LsF.txt в каталоге \exe с ни жеприведённым текстом.
Interlingua es lingua universale que persona in modo facile scribe et intellige sine usu de speciale studio. Interlingua es indicato pro scientifico communicatione et pro commerciale correspondentia. Usu de Interlingua in internationale congressu economiza tempore.
Если вы откроете новое txtWin из приложения, на окне появится вышеприведённый текст. Если вы выделите часть текста и выберете пункт Help из TaskMenu приложения, вы отразите выделенный текст в message window – окне сообщений. Следующий шаг – добавить словарные статьи в выбран
ный текст, до того, как писать его в окне сообщений (см. рис. 13.6). Мы начнём с разделения выде ленного текста на список слов. На рис. 13.6 это сделано следующим предикатом:
strTok:(string, string_list) procedure (i, o).
Обработка естественных языков – наиболее сложная ветвь компьютерной науки, и выходит за рамки этого документа. Если вы хотите постигнуть это искусство, вы можете начать с добавления элементов в программу на рис. 13.6.
13.7.Примеры
Примеры этой главы находятся в папках peano и LsF.
109
class predicates tryGetFileContent:(
string FileName, string InputStr,
string UpdatedFileName) procedure (i, o, o).
clauses
tryGetFileContent( "", "", "LsF.txt") : !. tryGetFileContent(FileName, InputStr, FileName) :
trap(file::existFile(FileName), _TraceId, fail), !, InputStr= file::readString(FileName, _).
tryGetFileContent(FileName, "", FileName). new(Parent): formWindow::new(Parent),
generatedInitialize(), PossibleName= "LsF.txt",
tryGetFileContent(PossibleName, InputStr, _FileName), !, XX=string::concat("Here: ", InputStr), editorControl_ctl:pasteStr(XX).
Рисунок 13.5 Вставка файла в редактор
% Файл grammar.pro implement grammar
open core, string class predicates
strTok:(string, string_list) procedure (i, o). addExplanation:(string, string) procedure (i, o).
class facts
entry:(string, string). clauses
classInfo( "editor/grammar", "1.0").
entry("que", "that"). entry("sine", "without").
entry("es", "am, are, is, was, were, to be"). entry("de", "of").
entry("et", "and").
addExplanation(T, R) : entry(T, Meaning), !, R= format("%s= %s\n", T, Meaning). addExplanation(_T, "").
strTok(S, [T1|L]) : frontToken(S, T, Rest), !, addExplanation(T, T1), strTok(Rest, L).
strTok(_S, []).
dic(S) : strTok(S, SList), Resp= concatList(SList),
stdio::write(Resp), stdio::nl. end implement grammar
Рисунок 13.6: Словарь «сложных» слов LsF
110
