Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Costas-Tyros_rus_MS

.pdf
Скачиваний:
31
Добавлен:
14.04.2015
Размер:
5 Мб
Скачать
☆

•Атомарный факт есть соединение объектов (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 Logicus­Philosophicus”. Доктор Мари Розе Шапиро (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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]