Text
                    ЛЕНИНГРАДСКИЙ ОРДЕНА ЛЕНИНА И ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ
ГОСУДАРСТВЕННЫ:! УНИВЕРСИТЕТ
В.А.Тузов
ЯЗЫКИ ПРЕДСТАВЛЕНИЯ ЗНАНИЙ
Учебное пособие
Ленинград 1990


Печатается по постановлению Редакционно-издательского совета Ленинградского университета Тузов В.А. Языки представления знаний: Учебное пособие. Л., 1990. 120 с. Методы процессно-ориентированного программирования, в основе которых лежит принцип активизации исходной информации, применяются для построения класса языков представления знаний. Принцип активизации позволяет стереть грань между их деклара¬ тивным и процедурным представлением. Предлагается конкретный язык этого класса и его реализация на языке Форт. Обсуждаются перспективы использования русского языка как языка представле¬ ния знаний. Для студентов и аспирантов, изучающих теоретические осно¬ вы программирования, для специалистов в области информатики, для всех, кто интересуется перспективами развития вычислитель¬ ных машин и языков представления сложно-организованной инфор¬ мации. Рецензенты: кавд. физ.-мат.наук В.В.Клюев (Ленингр.ун-т), канд. физ. -мат.наук С.В.Мшагский (Ленингр.отд.Научно- исслед.ин-та связи) С Тузов В.А., 1990
ВВЕДЕНИЕ В основе любой теории лежит ряд фундаментальных понятий, которые невозможно точно определить через другие понятия, но ко¬ торые можно описать, перечислив основные наиболее характерные для них черты.■Говоря о языках представления знаний, необходимо прежде всего описать ряд фундаментальных понятий, имеющих к ним непосредственное отношение. I. Знания. Понятие "знания” выделилось в самостоятельное из составного понятия "база знаний", появление которого было вызвано необходимостью противопоставления понятию "база дан¬ ных". В базе данных хранится пассивная информация, обработка ко¬ торой в основном ограничена операциями выборки и переупорядоче¬ ния, выполняемыми по запросам пользователя. База знаний содер¬ жит активную информацию. Таким обрезом, знания - это специ¬ фический тип информации. Понятие "информация" является фундаментальным понятием, которое вряд ли можно свести к каким-либо более фундаментальным понятиям. Оно является объектом исследования многих научных дис¬ циплин. В данной работе это понятие рассматривается с позиций информатики. Информатика - бурно развивающееся научное направление, воз¬ никшее из практики общения человека е ЭВ.Л. В основаниях она совпадает с математикой, цели и приложения те же, что и у ки¬ бернетики. Это наука об информационных процессах, которая изу¬ чает методы и средства управления информацией. Информационный процесс - это сложноорганизованный, автоматически протекающий очень дина.чичный процесс, связанный с х^нением, переработкой и передачей информации. С точки зрения информатики знания представляют собой осо¬ бый тип данных. Специфичность этого типа данных определяется че¬ тырьмя основными свойствами. Первое свойство - активность, т.е. способность знания самостоятельно обрабатывать информацию. Вто¬ рое свойство - уникальность, т.е. каждое знание требует уникаль¬ ной процедуры обработки, или само является уникальной процеду - рой. Два других свойства характеризуют совокупность знаний в целом. Одно из них - динамичность знаний - указывает на то, что совокупность знаний в процессе вычислений постоянно самоизменя-
4 ется, порождая новые знания и уничтожая старые. Другое - взаи¬ мозависимость знаний - предполагает наличие тесных связей меж¬ ду отдельными знаниями. Таким образом, знания в отличие от обычных данных облада¬ ют некоторой "двуликостыо": они сами могут обрабатывать информа¬ цию, одновременно подвергаясь постоянному изменению, вызванному как информационным взаимодействием с другими знаниями, так и внешним воздействием со стороны других знаний. Такая "двули - кость" знаний предъявляет особые требования к форме их представ¬ ления в вычислительной машине. Они должны иметь свернутую форму, пригодную для внешней обработки, и развернутую форму, готовую для выполнения. В языках программирования первая форма - пассив¬ ная - может быть представлена в виде строки, вторая - активная - в виде процедуры. Результатом работы каждой процедуры являет¬ ся другая процедура в пассивной или активной форме. Операцию преобразования пассивной формы знания в активную назовем акти¬ визацией знания, обратную операцию - сверткой знания. Специфичность знаний определяет основные черты языка их представления в S3M. Во-первых, программа на этом языке должна представлять собой достаточно большой набор, вообще говоря,мел¬ ких информационных процессов. В ходе ее выполнения постоянно возникают новые и исчезают старые процессы, многие процессы вы¬ полняются одновременно, каждый из них имеет возможность обмени¬ ваться информацией с другими процессами, приостанавливать одни и запускать другие - ранее приостановленные процессы. Во-вторых, язык должен содержать средства активизации информации, т.е. сре¬ дства ее преобразования в информационный процесс. Здесь перво¬ степенное значение приобретает форма представления информаци¬ онного процесса. Небольшая по времени, но бурная история развития языков программирования продемонстрировала многообразие форм представ¬ ления информации, в частности,информационных процессов. Но мно¬ гообразие форм лишь обнажило единую сущность любого информаци¬ онного процесса: каждый процесс является множеством взаимодей¬ ствующих суперпозиций функций. Если основу живой материи состав¬ ляет живая клетка, то основу информационного процесса - супер¬ позиция функций.
5 2. Яэл. Язык есть средство описания информационных про¬ цессов. Предложение языка, совокупность предложений или текст - это застывшие формы процессов, превращающиеся в активный про¬ цесс во время выполнения человеком или вычислительной машиной. В общем случае информационный процесс разбивается :4а со¬ вокупность одновременно протекающих (параллельных) элементар¬ ных процессов. Каждый элементарный процесс представляет собой суперпозицию функций. Класс всех используемых в языке функций разбивается на два подкласса. К первому относятся функции, за¬ ранее предопределенные в языке (базисные функции языка), ко второму - функции, определяемые го зреьх выполнения текста. Любой объект как в языке программирования, так и в естест¬ венном языке можно рассматривать как функцию, а обращение к не¬ му - как обращение к функции. Любая переменная есть функция без аргументов. Отличие переменной от тех функций, которые обыч¬ но используются в языках программирования, заключается в том, что тело функции не меняется в процессе выполнения программы, а переменная мэняет свое значение. Однако этим свойством обладают лишь функции в компилируемых языках. Но даже и в этом классе языков требование неизменяемости описаний функций соблюдается не всегда. Структура (запись) с п. полями представляет собой одноар- гументную функцию, определенную на конечном множества из /а элементов, п-мерный массив являвтс/i n-арной функцией, аргу¬ менты которой - целые числа из ограниченного диапазона, дере¬ во есть суперпозиция функций, граф - связка рекурсивных функций и т.д. функциональная интерпретация объектов упрощает концепту¬ альную основу теории и, главное, адекватна практике. Если го¬ ворить о простых объектах, таких, глк структуры или массивы, то не столь важно, как их интерпретировать - как пассивные или активные, т. е. как функции. При переходе к более сложным объектам ситуация существенно меняется. Чем сложнее объект, тем больше в его структуре содержится информации о том, как он должен функционировать. Предложение языка является записью суперпозиции функций. Существует огромное разнообразие форм представления суперпоси-
6 ций, однако наиболее удобной для выполнения является бесскобоч¬ ная инверсная запись, в которой аргументы и имена функций раз¬ делены пробелами. Вызов n-арной функции f с аргументами xv х2, имеет вид а произвольная суперпозиция записывается так: где - аргумент", имя функции или символ базисной операции. Например, выражение (а + b) * с - d в бесскобочной записи: а Ъ <■ о ♦ d - Произвольной суперпозиции можно дать имя, что позволит в дальнейшем использовать ее при построении новых суперпозиций. Именование суперпозиций дает возможность определять рекурсивные функции. При вычислении значения суперпозиции существенную роль мо¬ жет играть способ ее выполнения, который определяется типом вы¬ зова фактического параметра.-Например, выполнение суперпозиции f(*.g(y)) может начинаться с вычисления функции f (функцио¬ нальный вызов второго аргумента функции f ) или с вычисления функции g (вызов по значению). Результаты вычисления могут быть различными, если функция g не определена в точке у. Осо¬ бое значение способ выполнения приобретает при определении ре¬ курсивных функций. Продемонстрируем это на примере фразы " х говорит, что У всегда лжет". Этой фразе соответствует функция: *(х»у ) = говорит (*» (говорит (у»«)-*• -»cor(z))). Здесь сог - базисная функция семантического языка: оог(е) - z соответствует действительности. При х/у правая часть определяющего равенства не зави¬ сит от левой. При х = у (х говорит, что он всегда лжет) по¬ лучим: f(x,x) = говорит (х, Vg (говорит (х, a)-* -icor(z))). Проблема заключается в том, что функция г(х,х) является частным случаем второго аргумента суперпозиции, которая ее оп- ределязт. Подставив вместо и выражение В ■ V»(говорит (*»в)-*- ~ сог(к)), получим уравнение, которому должна удовлетворять функция f(x,x): 1(х,х) « говорит (x,f(x,x)-* В).
7 Если определена, то это уравнение эквивалентно ра¬ венству: f(x,x) = говорит (х, -тВ). Объединив его с исходным определением функции f(x,x), получим f(x,x) » говорит (х,в Л -I в), что соответствует (в зависимости от способа выполнения) следую¬ щим предложениям русского языка: "х говорит нечто противоречи¬ вое, т.е.Bi “’В", "х говорит нечто неопределеннее", "х гово¬ рит" (а что - неизвестно). Эти следствия получены при предложе¬ нии, что функция f(x,x) опоеделене. Но f(x.x) = «;(<<> - всюду неопределенная функция) также является решением исходного уравнения - минимальным по количеству информации. Если f(x,x) « - ей , то фраза "х говорит, что он всегда лжет" на прагматичес¬ ком уровне эквивалентна пустому тексту. Однако из множества всех решений, как правило, выбирается максимальное. В данном случае максимальному решению соответствует фраза:"х говорит нечто про¬ тиворечивое, а именно, что он всегда лжет, и что он иногда не лжет". Грамматика языка, определяет формы обращения к базисным функ¬ циям и способы организации этих обращений в линейную последова¬ тельность. Иначе говоря, грамматика является средством построения суперпозиций. Это - узкое толкование понятия грамматики (для неге иногда используется термин "синтаксическая грамматика). Полная грамматика включает в себя синтаксическую и содержит описания ба¬ зисных функций. Между синтаксической и полной грамматиками лежит целый спектр частичных грамматик, различающихся степенью полноты описания функций. Знать язык - значит знать полную грамматику его. Таким образом, каждая грамматика состоит из двух разнородных, но тесно связанных межцу собой частей - синтаксической грамматики и совокупности описаний функций. Первая определяет синтаксическую структуру (синтаксис) языка, вторая - его семантическую структуру (семантику). Синтаксис языка определяет способ представления текс¬ та, семантика - способ выполнения текста. Языки с одинаковой се¬ мантикой могут отличаться друг от друга лишь именами функций и формой обращения к ним, откуда следует, что все свойства синтак¬ сиса в значительной степени предопределены семантикой языка.
8 Креме синтаксической и семантической структур в языке вы¬ деляют прагматическую структуру (прагматику). Это наиболее сло¬ жная и наименее изученная структура языка. Прагматика связыва¬ ет язык с той или иной предметной областью: язык прох’паммирова- ния - с кругом тех реальны:: задач, на решение которых он ориен¬ тирован, естественный язык - с той частью реальной действитель¬ ности, которую с его помощью можно описать. Прагматика языка предопределяет синтаксис и семантику языка. Если семантика определяет способы вычисления значения (как результата выполнения текста), то прагматика - способы его интерпретации б окружающем i.rzpe. Вне этой интерпретации значе¬ ние, будучи оторванным от действительности, не имеет реального смысла. Семантика языка и семантика (смысл) конкретного текста- существенно различные понятия. Семантическая структура языка хотя и является отражением окружающего мира, тем не менее пол¬ ностью от него абстрагирована и может функционировать в созна¬ нии человека или в вычислительной машине вне зависимости от ре¬ альной действительности. Смысл текста есть результат взаимодей¬ ствия семантики языка, информации об окружающем мире, которой обладает носитель языка, и текущего состояния внешней среды - области интерпретации значений. Не существует точных границ, разделяющих синтаксис, семан¬ тику и прагматику языка. При описании даже простейших языков могут возникнуть вопросы, считать ли то или иное свойство язы¬ ка синтаксическим или семантическим. Например, при описании арифметических выражений приоритетность операций (операции ти¬ па умножения имеют больший приоритет, чем операции типа сложе¬ ния) можно считать синтаксическим свойством, и тогда синтакси¬ ческая грамматика будет иметь вид Е :: Е + Т | Т; Т :: Т * F I F; F :: (В) I I (Здесь е - выражение, т - терм, у - множитель, т - идентифика¬ тор.) в противном случае различие между выражением, термом и множителем стирается, и грамматика становится проще: t ;: 2 + Ь I Е * Е | (Е) I I , но при этом усложняется описание семантических функций.
9 Еще более размыта, граница между семантикой и прагматикой. Какое-либо новое явление действительности может не иметь даже собственного имени и поэтому с позиции языка является строго прагматическим. Но со временем оно может занять свое место в языке, пополнив его семантическую структуру. Аналогично при соз¬ дании пакетов прикладных программ используется прагматическая информация, и каждая программа имеет прагматический смысл, одна¬ ко пользователь пакета может рассматривать его как часть семан¬ тической структуры расширенного языка. Размытость границ между структурами ставит под сомнение де¬ ление языка на структуры. Но отсутствие четких границ между' час¬ тями целого - типичное явление реальной действительности, и ес¬ ли его принимать во внимание, то любое понятие окажется под сом¬ нением. 3. Понятие вычислимости. Каждая функция является частично определенной. Понятие определенности-неопределенности функции - фундаментальное понятие, лежащее в основе формирования принципов вычислимости. Неопределенность значения при вычислении конкрет¬ ного текста означает бессмысленность этого текста с точки зрения семантики языка. На прагматическом уровне она означает отсутст¬ вие информации: такой текст эквивалентен пустому тексту. Пустой текст не может быть ни истинным, ни ложным. С другой стороны, противоречивый аекст не может быть выполнен и его смысл ни опре¬ делен, следовательно, он также эквивалентен пустому тексту. Информационный процесс поставляет новые знания лишь тогда, когда он определен. При аварийном прерывании процесса (если оно не было специально запрограммировано) возникает неопределенная ситуация, которая может служить причиной альтернативного выбора, но которая,как правило, не несет нового знания. Таким образом, понятие знание-незнание тесно связано с понятием определенности- неопределенности. Доопределение функции является источником по¬ лучения нового знания. Одним из основных утверждений классической теории алгорит¬ мов является утверждение о принципиальной невозможности доопреде¬ ления функций: существует частично-рекурсивные функции, которые невозможно доопределить до всюду определенных вычислимых функ-
10 дий. В основе подобных утверждений лежит признание потенциаль¬ ной неограниченности вычислительных ресурсов - времени вычисле¬ ний и объема памяти. Принцип потенциальной неограниченности при¬ водит к такой идеализации понятия вычислимости, которое не толь¬ ко неадекватно реальной действительности, но не имеет с ней ни- - чего общего. 3 то же время прямое отрицание этого принг-ипа,состо¬ ящее в том, чтобы ранее фиксировать конечную границу объема памя¬ ти или числа шагов вычислений, равносильно утверждению о невоз¬ можности построения теории вычислений.Однако существует компромис¬ сное решение.С одной стороны,однажды начатое вычисление функции f в точке х представляет собой реальный процесс , и как всякий реальный процесс он ограничен и в пространстве, и во времени не¬ которым числом I . С другой стороны, запись функции г в языке в для каждого х определяет множество рояльных процессов, которое неограничено ни в пространстве, ни во времени. Значением функ¬ ции f в точке х следует считать lim fm(x). Каковы бы ни были вычислительные ресурсы, почти для любой частично-рекурсивной функции £ существует такое *г , что для всех функция ?(п) невычислима при заданных ресурсах. По¬ этому функция определена лишь на конечном множестве значе¬ ний п. Предельная функция litn f?(x) практически не вычислима, но,являясь идеализацией множества практически вычислимых функ¬ ций , она может служить основным объектом теории вычис¬ лений и с точки зрения теории является вычислимой функцией. Бу¬ дем называть такие функции реально вычислимыми функциями. Ясно, что любая частично-рекурсивная функция может быть доопределена до всюду определенной реально вычислимой функции. Теория реально вычислимых функций существенно отличается от классической теории алгоритмов. В рамках этой теории невозможно доказать существование алгоритмически неразрешимых проблем.Как правило, два алгоритмических языка не эквивалентны по мощности друг другу. По любому языку L можно построить реально вычисли¬ мую функцию f , которую невозможно записать в языке 1> . Тем са- мпл,по любому языку L можно построить более мощный язык!»' .Мно¬ жество всех реально вычислимых функций не счетно. Классическая теория степеней неразрешимости во многом адекватна начальной ие-
IT рархии языков реально вычислимых функций (если термин "степень неразрешимости" заменить на термин "степень сложности вычисле¬ ний" ). Кванторы общности и существования эквивалентны предельно¬ му переходу и поэтому повышают и степень сложности, и мощность языка. Если заменить понятие истинности-ложности на понятие опре¬ деленности-неопределенности, то предикат Vx^(x) ( 5 х г(х))эк¬ вивалентен утверждению, что функция f - всюду определенная функция (функция f определена хотя бы в одной точке). Предикат ¥х-?У Р(х,у) эквивалентен утверждению, что существует функция f(x) , такал, что суперпозиция Р(х, f(x)) определена тогда и только тогда, когда определена функция f(x) . Это одна из уточ¬ ненных формулировок аксиомы выбора Цермело. Эта аксиома утра¬ чивает абсолютный и приобретает относительный характер: если функция Р(х,у) вычислима относительно языка L (т.е. имеет за¬ пись в языке L ), то функция f(x), вообще говоря,принадлежит более мощному языку !■', который можно построить по языку ь .Та¬ кое уточнение позволяет избежать многих парадоксов теории жо- жеств. 4. Принцип активизации. Обладая определенной спецификой, языки представления знаний навязывают особый - функциональный стиль программшювания. Ь основе функциональных методов програм¬ мирования лежит принцип активизации, сущность которого заключа¬ ется в том, что исходные данные решаемой задачи отображаются не на пассивные типы данных (строки, списки, деревья и т.п.), а на активные - функции, суперпозиции функций, наборы функций и т.п. Эти методы наиболее эффективны при построении алгоритмов, пред¬ назначенных для обработки слижнсорганизованной информации. 1!х эффективность тем вше, чем сложнее структура исходных данных. Если исходные данные не разложимы на составные части (например являются числами, символами, логическими или байтовыми значени¬ ями), то функциональные методы вырождаются в обычные методы про¬ граммирования. Чтобы избежать терминологической путаницы, будем различать термины "функциональное программирование" - стиль программирова¬ ния, который навязывают лиспоподобяые языки, и "функциональные методы программирования". Их различие сравнимо с различием меж¬
12 ду языками Лисп и Форт. В языке Лисп каждая функция представи¬ ма в виде списка, но не каждый список является функцией. В язы¬ ке Форт ситуация обратная: любой список может быть представлен в виде Функции, но не любая Функция является списком. При Функ¬ циональном методе программирования существует один тип данных - функция. Не разложимые на составные части данные являются прос¬ тейшими нульарными функдаями.Таким образом, понятие функции здесь используется в самом общем (математическом) смысле этого слова. В самом общем, нс не в самом абстрактном: Функция - это запись процесса, готового к выполнению. Обращение к функции ак¬ тивизирует процесс. Списки, деревья, графы, тексты - это объекты достаточно сложные, поэтому в вычислительной машине их следует представ¬ лять в виде Функций, готовых к выполнению. Формальными парамет¬ рами этих Функций являются .другие, более простые функции. Тем самым класс всех функций разбивается на иерархически упорядо¬ ченные подклассы. Нижние уровни этой иерархии занимают элемен¬ тарные Функции, которые будем называть операциями. Операции ис¬ пользуют в качестве аргументов данные простейших типов. Иерар¬ хия являзтся основой структурирования исходной задачи, которая автоматически распадается на ряд более простых подзадач. Набор операций обладает эффектом комбинаторного взрыва: их небольшое число позволяет строить огромное количество необходи¬ мых Функций. Такая возможность существенно упрсщазт задачу мо¬ дификации построенных Функций. Общая схема применения функциональных методов заключается в следующем. Во-первых, класс X исходных объектов отображается на класс 2. параметризованных функций: . ...yn), где - формальные параметры данного класса объектов. Во-вто¬ рых, каждой функции Pf^ ,*2,.. .,хп) («X) ставится в соотве¬ тствие набор операций А1 ,А2,.. .,д‘т , которые являются фактиче¬ скими параметрами, определяющими п процессов: х (ai,a2, ...,an) • ...,хп(А1,А2, ...,а>т). Параллельное выполнение этих пооцессов вычисляет значение функции Р . Их запуск и завершение осуществ¬ ляется главным процессом, описание которого и является описани¬ ем функции Р :
13 :Р (: Л1 л2,..д?г :) < инициализация =* < запуск^ ■< завершение > ; Здесь (: и :) синтаксически ограничивают параметры, а фактичес¬ ки являются функциями, которые осуществляют передачу параметров А1,д2,...,АЛ, связывая их с формальными параметрами y.j,y2,...,Y Процесс построения функции V3 будем называть процессом ?к- тивизации исходного класса объектов. Функция преобразует ис¬ ходный объект из пассивной <Ьор:лы в активную. Передача фактичес¬ ких параметров А1 конкретизирует объект, настраивая его на вы- числехже функции у . Для точного определения процессов активи¬ зации и конкретизации необходим язык, обеспечивающий их адеква¬ тное описание. Трудно представить себе список, произвольный текст или граф как функции на языке ПЛ/I (или любом другом, по¬ добном ему языке). Мало подходят для этой цели и такие языки как Лисп, Плэнер, Пролог. Длл исследования функциональных мето¬ дов программирования вполне подходящим оказался язык Форт. По¬ этому этот язык был выбран в качестве языка представления объ¬ ектов достаточке сложной природы - списков, гра-'ов, деревьев, автоматов, текстов и грамматик. Функциональное представление этих объектов занимает в памяти ЭВМ примерно вдвое, а иногда и втрое, больше места, чем их свернутая форма. Это недостаток функциональных методов, но он окупается двумя преимуществами: функциональные методы обеспечивают, во-первых, существенное сни некие трудоемкости процесса программирования, во-вторых, эффек¬ тивность по быстродействию получаемых программ. Продемонстрируем функциональный стиль программирования на примере перевода целых двоичных чисел в десятичные. Двоичное число отображается на суперпозицию функций, содержащую две (по¬ ка неопределенные) функции: 0 и •£. Например, двоичное число х = 11001 будет записано в видэ:х 1 1 о о 1 ; , т.е. в виде су¬ перпозиции в бесскобочной записи. Функции 1 и 0 можно опреде¬ лить следующи»л образом: : О 2 * : : 1 г * 1 t : где + и * - операции десятичного сложения и умножения. Обраще¬ ние 0 х оставит в стеке десятичную запись числа х . Б этом примере как отдельные циф.ры - 0 и 1 , так и число х представлены в активной форме. Функционирование активизирован¬ ной информации существенно зависит от тою, в каком окружении
14 она выполняется. Напрми/ер, изменив функции + и * , мо;кио по¬ строить перевод в любую другую систему счисления. 5. Смешанные вычисления. Процесс активизации имеет ряд сходных черт со смешанными вычислениями. Действительно, пусть Р(х,у) - произвольная функция и мы хотим запрограммировать ее, активизируя аргумент х . Тогда функция fx , в которую должен быть преобразован аргумент х., должна удовлетворять равенству: fx(y) *= 3?(х,у) , т.е. fx есть остаточная программа, которая может быть получена из Р(х,у) в результате смешанных вычислений. Смешанные вычисления представляют собой функциональную опе¬ рацию 3(?'\хо) : используя запись тела функции Р и конкре¬ тное значение хэ аргумента- х , операция 3 строит тело новой функции рхо . Поэтому развитый функциональный язык должен со¬ держать средства, пэддер:\иваюдие процесс смешанных вычислений. Но если активизация аргументов позволяет из меньшего получить нечто большее, то смешанные вычисления из большего получают не¬ что меньшее. Кроме того, реализация смешанных вычислений не. сравнима по сложности с реализацией обычных операций, таких, как CAR или сPR- в языке Лисп, или о реализацией, например, меха¬ низма возвратов в Прологе или Плэнере. Поэтому прежде чем прис¬ тупать к реализации смешанных вычислений, необходимо ответить на вопрос, на каком классе задач применение смешанных вычисле¬ ний позволит окупить издержки на их реализацию. Процесс смешанных вычислений в классе арифметических за- . дач очень ело .лен сам по себе и, как правило, не упрощает исход¬ ную программу. Практическая бесконечность множества арифметиче¬ ских значений и слабая структурированность входных данных - ос¬ новные причины, из-за которых смешанные вычисления практически не применимы к этому классу задач. Смешанные вычисления в классе булевских функций очень прос¬ ты и, как правило, существенно упрощают исходную программу. То же самсе можно сказать о всем классе функций, определенных на конечных множествах. Если представить такую функцию (с п аргу¬ ментами) п-мерной таблицей, то смешанные вычисления по любому аргументу понижают размерность этой таблицы на единицу, т.е. в среднем уменьшают объем описания функции вдвое. Применив про-
15 цесс смешанных вычислений к таблице решений, можно построить соответствующую ей блок-схему. Ка.тдая блок-схема определяется порядком аргументов, пс которым ведутся смешанные вычисления. Другим классом задач, при решении которых смешанные вычис¬ ления не бесполезны, является класс так называемых текстовых задач, т.е. задач, связанных с обработкой текстов произвольной длины. Все задачи этого класса можно разбить на две группы: задачи, для решения которых необходимо учитывать синтаксичес¬ кую и семантическую структуры текста (например, перевод, интер¬ претация текста), так как именно они определяют процесс обра¬ ботки, и задачи чисто механической обработки текстов (например разбиение текста на строки, абзацы, страницы). Смешанные вычи¬ сления могут быть З'ффективно использованы по крайней мере при программировании задач первой группы. Наконец, третий класс зацач содержит задачи, связанные с обработкой сложниорганизованной информации, т.е. информации, представленной в виде списков, деревьев, графов, сетей и т.п. С точки зрения смешанных вычислений этот класс очень близок к классу конечных функций. Отличие лишь в том, что в этохм классе приходится иметь дело с циклическими или рекурсивными алгорит¬ мами, что технически усложняет процесс смешанных вычислений,ко¬ торый, как правило, порождает связку рекурсивных функций. В классе конечных функций рекурсия или циклы исключены. 6. Недетерминированные и параллельные процесс!.. Частичная определенность функций является средством управления множеством информационных процессов. При выполнении единичного процесса не¬ определенность какой-либо функции вызывает аварийное прерывание. При выполнении множества процессов прерывание одного из них мо¬ жет инициировать запуск или приостановку других процессор. В этом заключается сущность управления при помощи частичной опре¬ деленности функций. Запуск множества процессов предполагает либо выполнение всех процессов, либо выполнение хотя бы одного процесса. В пер¬ вом случае говорят о параллельных процессах, во втором - о не¬ детерминированном процессе. Хотя между этими двумя классам! процессов имеется' много общего, а с теоретической точки зрения недетерминированные процессы являются частным случаем парал-
16 лельных процессов, однако на практике частный случай часто оказывается особым случаем, для исследования которого требуется особый подход. Эти два класса процессов объединяет и противопо¬ ставляет классу детерминированных процессов множественность вы¬ полняемых процессов, но между собой они находятся в такой же зависимости как кванторы общности и существования. Операция от¬ рицания, которая обеспечивает эквивалентность кванторов, связа¬ на с доопределением частичной функции - с точки зрения класси¬ ческой теории алгоритмов проблемой неразрешимой, а с точки зре¬ ния практики программирования - проблемой достаточно сложной. В этом заключается первооснова различий между этими двумя класса¬ ми процессов. Если недетерминированный процесс, имеет имя, то в языке программирования ок представляется в виде недетерминированной функции, в противном случае - в виде альтернативного оператора, частными случаями которого являются условный оператор и опера¬ тор выбора. Недетерминированная ^'ункция это функция, которая имеет несколько экземпляров своего описания. При обращении к ней управление передастся первому экземпляру, при возврате - второму и т.д. Часто требуется не просто выполнить функцию, но и построить суперпозицию из успешно выполненных экземпляров не¬ детерминированных функций: однажды найденный маршрут может слу¬ жить основой для решения множества конкретных задач. Функция >’,чх1 ,х2,.. , значениями аргументов которой являются объекты сложноорганизованной структуры, порождает К взаимодействующих между собой параллельных процессов. В органи¬ зации параллельных процессов главную рель играют механизмы си¬ нхронизации. В языках ПЛ/1, Алгол-53 для целей синхронизации используются семафопы, в языке Ада - механизм рандеву, некото¬ рые языки используют сети Петри и т.д. Каждый из этих механиз¬ мов описывает некоторый класс взаимодействий одновременно вы¬ полняющихся процессов. Функциональные методы программирования однозначно определяют свой специфический способ синхронизации. Оператор вызова Функции может оказаться разорванным и различ¬ ные его части могут находиться ь разных процессах. Процесс ос¬ танавливается тогда и только тогда, когда происхо/. :т обращение к отдельной части оператора вызова. В простейшем, но важном
17 случае, когда оператор вызова содержит лишь имя функции, раз¬ личные части этого имени разбросаны по разным процессам. Каждая такая часть является обращением к неописанной функции. Останав¬ ливая процзсс, она попадает з управляющую память. В момент, ко¬ гда управляющая память будет содержать все части полного имени, происходит их конкатенация и обращение к функции с этим именем. После ее выполнения (или после ее приостановки) все процессы, остановленные частями ее имени, запускаются на выполнение. Та¬ кова общая схема синхронизации параллельных процессов, порож¬ денных в результате активизации аргументов функции F . 7. Принципы формализации ЕЯ. Естественный язык (ЕЯ) обла¬ дает многими свойствами, пеоб?<одимши для представления знаний. Но для того чтобы использовать его как средство представления знаний в ВВП, необходимо решить сложнейшую проблему содержатель¬ ного (семантического) анализа текстов на ЕЯ. Вопросам формали¬ зации отдельных сторон Ел посвяшено немало работ как у нас в стране, так и зарубежом. Однако никем еще не предпринималась по¬ пытка формализовать ЕЯ в целом. Более того, претензия на научно обоснованное использование ЕЯ в общении с машиной многими во¬ спринимается как дурной тон. Этот вывод - следствие многочислен¬ ных неудач в области машинного перевода, автоматического рефе¬ рирования, аннотирования и т.п. Но неудача - не повод для песси¬ мизма, а стимул для дальнейших исследований. Формализовать язык значит задать машине информацию о языке так, чтобы машина могла выполнять любые тексты на этом языке.По¬ верхностное понимание процесса формализации ЕЯ часто приводит к искаженному представлению, что формализованный язык - абстракт¬ ная, полностью оторванная от содержания схема о простой логиче¬ ской структурой. Адекватная формализация не отрывает исследуе¬ мый объект от содержания. Наоборот, главное ее предназначение - служить средством точного и эксплицитного представления содер¬ жания. т.е. такого представления, которое позволяло бы выделять различные его части и исследовать динамику их взаимодействия. Применительно к языку это означает, что адекватное описание язы¬ ка есть,главным образом,списание его семантической структуры. Семантика определяет синтаксис. Синтаксическая структура является отражением (внешним проявлением) семантической струк-
18 туры. Но даже признавая эти утверждения вер'&зли, не следует пре¬ небрежительно относиться к синтаксическим аспектам язьпса. Семан¬ тика оставляет отчетливый стпечатск на синтаксисе, и этот факт дает возможность исследовать многие языковые явления на синтак¬ сическом уровне. Тем не менее, степень формализации языка определяется сте¬ пенью Формализации его семантики. По отношению к естественна!.! языкам это утверждение приводит к глубоким последствиям. Так как в основе семантической структуры ЕЯ лежит модель окружающе¬ го нас мира, то возможность точного описания ЕЯ прямо зависит от возможности построения точных моделей реальной действитель¬ ности. Ясно, что реальная действительность неформализуема, сле¬ довательно, казалось бы абсурдна даже постановка вопроса о воз¬ можности формализации ЕЯ. Но зто неправильный вывод. Дело в том, что для Формализации семантики ЕЯ достаточно языковой модели ми¬ ра, а эта модель содержится в словарном составе ЕЯ. Тем самым, можно говорить о формальной модели естественного языка, не вы¬ ходя за его рамки. Прагматика языка (что машина должна делать, когда Фраза понята) остается за этими рамками. Таким образом, одной из важнейших проблем Нормализации ЕЯ является проблема извлечения модели реального мира из словарно¬ го состава ЕЯ. Извлечение - не совсем точное слово: словарь лишь поставляет материал для построения модели. Модель сама яв¬ ляется языком, причем языком формальным. (Поэтому в дальнейшем вместо термина "модель" будем использовать термин "семантичес¬ кий язык".) Этот язык может быть построен по правилам, анало¬ гичным правилам построения, например, языков программирования, и его основные понятия можно пояснить, сопоставляя им наиболее близкие программистские понятия. В основе семантической структуры любого языка, в том числе и ЕЯ, лежат две подструктуры: структура данных и структура уп¬ равления. Структура данных ЕЯ представляет собой пару (И,Р), где К - семейство множеств значений, Р - набор базисных опера¬ ций, каждая из которых определена на декартовом произведении некоторых множеств из М со значениями в одном из множеств се¬ мейства М. Структура управления ЕЯ определяет способы хранения информации в памяти и дос гула к ней, в частности, способ иден- ти]я ка цыи даиных.
19 Предложение на семантическом языке представляет собой су¬ перпозицию функций, которая строится из базисных операций. На этом уровне базисные операции остаются неопределяемыми. При за¬ дании конкретной предметной области сии могут быть определены как функции на множествах объектов этой предметной области, ре¬ ализуя связь семантики языка с его прагматикой. Предложение на ЕЯ также является сзтерпоэицией (внешних) Функций в резу¬ льтате выполнения которой вычисляется соответствующее ей пред¬ ложение на семантическом языке. Каждая функция связывается с конкретным словом языка. На поверхностном уровне функциональность слова проявляется в его многозначности. В общем случае каждое свое конкретное зна¬ чение сл^во приобретает только в предложении. Нельзя говорить о значении, например, функции oin , можно говорить лишь об области ее значений. Значение любой функции определяется лишь после задания кошгоетных значений ее аргументов. Рассматривая слово как символ функции, мы получаем возможность вычислять его значение (но только после задания значений его аргументов). 3 частном случае слово может быть нульарной функцией, т. е. константой. Признание функционально? природы слова приводит к необхо¬ димости признать индивидуальность, неповторимость каждого слова А это означает, что каждое слово должно иметь свое собственное семантическое описание. Теи самым возможны по крайней мере два принципиально различных подхода к реализации ЕЯ: либо создавать единую процедуру обработки текстов, либо рассматривать каждое предложение как единичную процедуру, выполнение которой обеспе¬ чивает его обработку. Любой языковый факт связан со словом или словосочетанием (а во фразеологизмах - с предложением), поэтому каждое слово следует рассматривать как активную процедуру. Это является про¬ граммистским отражением простой истины, что несмотря на жесткие рамки языка, которому принадлежит слово, оно обладает ему лик.ь одному присущей индивидуальностью, имеет свое собственное лицо. Говоря иначе, семантика языка выражается через лексическое зна¬ чение слова, а лексика слова определяет граммытику языка. Отсю¬
20 да следует, что не существует главных и второстепенных членов предложения. Такие понятия как подлежащее, сказуемое, дополнение и т.п. в какой-то степени отражают грамматическую структуру ЕЯ, но с их помощью можно излагать лишь некоторые элементарчяе факты, ни в малейшей степени не затрагивая сущности языка,. (Неадекват¬ ность традиционной грамматики, основанной на этих понятиях, ана¬ логична неадекватности римской системы счисления, которая не по¬ зволяет Формализовать даже операцию сложения целых чисел.) Для того чтобы представить хотя бн в общих чертах, чем яв¬ ляется процедура, св/тзанная с конкретным словом, рассмотрим про¬ блему построения программного обеспечения с точки зрения теоре¬ тической вычислимости. Теоретически любой процедурный механизм может быть представлен одним алгоритмом (напримео нормальным алгоритмом Маркова). Допустим, что такой алгоритм Р построен. Бу¬ дем подавать ему на вход синтаксически правильные предложения,со¬ держащие какое-то конкретное слово. Например: А разбивает В ломом ( С ). На выходе будем получать некоторые семантические структу¬ ра ^разбивает * Проиегура является частичной программой, которая получается из алгоритма Р в результате сме¬ шанных вычислений при неполностью заданном входе, ста процедура Р^азбипает я связывается со словом ’разбивает’. Индивидуальность, неповторимость каждого слова обеспечивает простое и естественое разложение алгоритма р на множество Pw процедур-функций, каж¬ дая из которых соответствует некоторому слову w . Сложным предло¬ жениям будет соответствовать суперпозиция нескольких процедур. Вынося из алгоритма р все процедуры Pw, получим алгоритм Р , который уже не зависит от словарного состава языка. Алгоритм Ро обеспечивает только программную поддержку процесса выполнения суперпозиций функций. Механизм смешанных вычислений пронизывает всю структуру ЕЯ. Он позволяет получать из более общих пункций частичные Функции, которые могут использоваться тогда, когда значения некотопых ар¬ гументов неизвестны или нерелзвантны сообщению. Например, для глагола ’покупает’ (кто-что х, кого-что у, у кого г , за чтс-v ) первый и второй аргументы обязательны. Если значение второго ар¬ гумента отсутствует, то используется более конкретная функция -
21 ’тратит’= ’покупает’(х,у,#,v) , которая не имеет аргумента z во¬ все, а аргумент у для нее не обязателен. Из общей функции ’пере¬ мещается’ (кто-чтох, куда .у, откуда я, по чемут, как™) путем подстановки конкретных значений некоторых аргументов можно полу¬ чить 82 частичных Функции, связанных с глаголами движения. Хотя эти общие рассуждения, конечно, не дают ясного предс¬ тавления о том, как описывать функции, связанные со словами ЕЯ, однако они уже сейчас позволяют сформулировать ряд преимуществ, которыми обладает функциональный подход (с точки зрения построе¬ ния программного обеспечения обработки текстов) по сравнению со всеми ранее предлагавшимися методами описания ЕЯ. Во-первых, об¬ щая процедура обработки текстов - очень сложная и даже необозри¬ мая для достаточно большого фрагмента языка - распадается на сот¬ ни и даже на тысячи (для словаря порядка 100 тыс. слов) мелких процедур, которые строятся независимо друг от друга. Во-вторых, программное обеспечение оказывается независимым от словарного со¬ става языка и, обеспечивая лишь поддержку процесса выполнения су¬ перпозиций, может быть использовано на всех уровнях обработки текста - морфологическом, синтаксическом л семантическом. В-тре¬ тьих, иерархическое описание функций, многие из которых получают¬ ся из более общих функций за счет сужения областей определения, в частности, путем подстановки конкретных значений аргументов, адекватно отражает практику построения толковых словарей и, по- существу, является формальным толковым словарем. В-четвертых, списание каждого слова в виде функции есть основная часть описа¬ ния перевода (другой частью является синтаксический анализатор) с внешнего языка на семантический язык. Любой естественный язык - столь сложный объект, что разра¬ ботка методов или подходов его формального описания всего лишь первый шаг на длинном пути построения формальной модели конкрет¬ ного ЕН. (В дальнейшем в качестве конкретного ЕЯ будем рассмат¬ ривать только русский язык.) Основными этапами этого пути являют¬ ся: - разработка семантического языкакоторый не зависит от националытых особенностей ЕЯ; - функциональное описание слов русского языка; - построение синтаксического и морфологического анализаторов.
22 Подавляющая часть этой работы носит чисто лингвистический харак¬ тер и аналогична работе по созданию толкового словаря, но словаря математически точного, без "дурной" рекурсии, со строгим разгра¬ ничением определяемых и неопределяемых понятий. В результате этой работы должен быть создан машинный фонд русского языка. Морфология, синтаксис и семантика русского языка неразрывно связаны между собой, поэтому анализ (морфологический, синтакси¬ ческий и сеиантичес1:ий'> различных аспектов языка, необходимо вы¬ полнять одновременно. Этим обеспечивается детерминированность процесса анализа, исключается перебор возможных вариантов разбо¬ ра. предложения, чтс существенно повышает эффективность работы анализатора. Однако описания трех уровней языка не только могут, но и должны быть независимы. В заключение следует отметить, что название работы не соот¬ ветствует реальному состоянию теории или практики программи¬ рования: языков предстаЕлен?:я знаний нет. Системы искусственного интеллекта и в особенности появившиеся в последнее время эксперт¬ ные системы используют определенные средства представления зна¬ ний - семантические сети, порождающие правила типа "ЕСЛИ, ТО", фреймы и т.п., однако зто еще лишь предыстория. История языков представления знаний еще не началась, но будущее за ними. Их ростки - в современных языках программирования. Непросто по рост¬ кам определить их дальнейшую судьбу. Каким может и должен быть язык представления знаний? Дать пусть пока не точный и не полный ответ на этот вопрос - основная цель этой работы. Эта цель в ка¬ кой-то степени оправдывает ее название. В рамках общей теории два класса языков - языки программи¬ рования и естественные языки - образуют единый класс языков, ко¬ торый можно и нужно исследовать с единых позиций. Расхождение между языками этих классов велико, но это расхождение только в их ’'возрасте'’. Однако языки программирования столь быстро "взрос¬ леют", что это различие начинает стираться (по крайней мере в теории^. Развитый язык представления знаний должен обладать ал¬ горитмическими возможностям мощного языка программирования, а также гибкостью и выразительностью естественного языка.
23 Глава I. КОНЦЕПТУАЛЬНАЯ ОСНОВА ЯЗЫКА ПРЕДСТАВЛЕНИЯ ЗНАНИЙ В концептуальной основе языка представления знаний лежит принцип активизации, общая схема применения которого описана во введения. 3 данной работе этот принцип применяется для решения ряда задач обработки сложноорганизованной информации. Данные делятся на пассивные и активные. Пассивные данные предназначены для обработки некоторыми внешними по отношению к ним процедурами. Активные определяют некоторый информационный процесс (или множество информационны7: процессов) и сами способ¬ ны обрабатывать информацию. За первым типом данных сохраним тер¬ мин "данные", второй тип данных будем называть"знаниями". Классический подход к программированию определяется соотно¬ шением: Данные + Алгоритм = Программа. В рамках искусственного интеллекта был выработан новый подход, сущность которого выра¬ жает соотношение: Знания + Вывод = Система. Подход, который предлагается в данной работе, также может быть охарактеризован в столь же лаконичной форме соотношением: Данные + Активизации Программа. Основная цель работы состоит в том, чтобы показать, что первые два подхода являются вырожденными частными случаями третьего. Достижение этой цели позволит ответить на главный во¬ прос: каким должен быть язык представления знаний. В японском и английском проектах машин пятого поколения предлагается взять за основу будущих языков программирования язы¬ ки Лисп и Пролог, а для их аппаратной поддержки создать соответ¬ ственно функциональную машину и машину логического вывода. Кроме того, предлагается создать еще четыре класса машин: машину реля¬ ционной алгебры, машину абстрактных типов данных, машину потока данных и обновленную машину фон Неймана. Б этой коллекции есть все, кроме здравого смысла. Конечно, лучше шесть разнородных машин, чем одна машина фон Неймана. Но еще лучше - один класс машин, построенных на единой концептуальной основе с единым язы¬ ком програ полирования (или группой однородных языков). Однако вы¬ бор единственксго пути из десятка возможных оправдан лишь тогда, когда он правилен. Можно гарантировать правильность такого выбора, если показать,как построить единый язык, который, во-первых, пе¬ рекрывает возможности всех названных выше языков и машин,вс-зто-
24 рых, является достаточно простым в реализации, в-третьих, обес¬ печивает необходимое быстродействие написанных на нем программ, и, наконец, в-чегвертых, содержит средства программной поддерж¬ ки систем обработки информации на естественном языке. Ни один из современных языков программирования не удовлетво¬ ряет первому и четвертому условиям. Среди всех языков, которые в какой-то степени удовлетворяют этим условиям, прежде всего следо¬ вало бы назвать язык Форт. Этот язык выделяет из группы других широко распространенных языков программирования то, что он под¬ держивает процесс активизации исходных данных, обеспечивая тем самым возможность применения принципиально новых методов прог¬ раммирования, Для того чтобы точно сказать,о какой принципиаль¬ ной новизне идет речь, необходимо хстя бы кратко охарактеризо¬ вать существующие методы програзлмировакия. § I. Классификация методов программирования Алгоритм решения задачи разрабатывается человеком. Этот ал¬ горитм может быть сформулирован на любом в общем случае сколь угодно абстрактном языке (АД1. На этот язык не накладывается ни¬ каких ограничений кроме одного: он должен быть понятен самому разработчику алгоритма. Сущность программирования заключается в построении отображения алгоритма на абстрактном языке в алго- рит.м (или программу) на конкретном языке программирования (ЯП). Общие принципы и методы построения отображения лежат в основе той или иной методологии программирования. Три составные части языка определяют его сущность: струк¬ тура данных (S эд), структура управления ( и эд) и логистика ( Ьдд). Каков бы ни был абстрактный язык, на котором первона¬ чально записывается алгоритм решения задачи, он также содержит эти три составные части: S дд , и д^, ъ да. В основе процесса программирования лежит построение отображения структур абстракт¬ ного языка на структуры языка программирования. В принципе каж¬ дая из трех структур абстрактного языка может быть отображена на любую из структур языка программирования. Таким образом, получаем девять типов отображений;
25 I'1 : Здд sHTt Т-5 : БДЯ здт Т2 : ЦАЯ иЯП Тб : Пдя 3ЯП ТЗ : 1дЯ ^ЯП 'х’7 : Идя *ЯП Т4 : 3АЯ иЯП Т8 : Тдя 5ЯП T9 : ТдЯ ияп Каждое из этих отображений определяет свой собственный стиль про- граммирования, или, , как иногда говорят, технологию программирова- ния. Если основное внимание при программировании обращено на ото¬ бражение TI структур данных. то основу технологии составляют аб¬ страктные типы данных и принздгп модульности. Действительно, для того чтспостроить отображение TI, как правило, необходимо ук¬ рупнить типы данных или операции над ними, т.е. повысить уровень структуры данных ЯП до уровня структуры данных АЯ, а процесс ук¬ рупнения данных и операций над ними прямо приводит к понятиям мо¬ дульности и абстрактных типов данных. Отображение Т2 структур управления всегда связано либо с пони¬ жением ;фовня структуры управления АЯ, либо с повышением уровня структуры управления ЯЛ. В первом случае мы имеем дело с техноло¬ гией структурного программирования сверху-вниз, во втором случае- с разработкой процедурного механизма ЯП. При структурном програм¬ мирования задача разбивается на подзадачи до тех пор, вока струк¬ тура управления АЯ не совпадет со структурой управления ЯП. Раз¬ работка процедурного механизма с целью повышения уровня управля¬ ющей структуры ЯП закономерно подводит к таким понятиям^как со¬ программа, планируемый вызов процедуры, взаимодействующие проце¬ дуры и т.п. Отображение ТЗ лежит в основе логических методов программи¬ рования. Подавляющее большинство современных языков программиро¬ вания либо новое не содержит логистической структуры, либо она яв¬ ляется несущественной вспомогательной частью структуры данных (например, система приведений в языке Алгол-68). Однако некоторые языки программирования, например Плэнер и Пролог, имеют развитую логистическую структуру и ориентированы на поддержку логических методов программирования. Развитой логистической структурой обла¬ дают языки искусственного интеллекта. Почти все задачи, решаемые
26 в рамках искусственного интеллекта, описываются так называемой лабиринтной схемой, которая определяет логику (или логистику •- в общем случае) задачи. Отображение этой схемы на логистическую структуру ЯП есть отображение типа 73. По существу все эти технологии являются технологиями ручного программирования. И здесь единственный путь автоматизации процес¬ са программирования - повышение уровня ЯЛ. Таким образом появи¬ лись языки высокого уровня, затем языки сверхвысокого, сверх¬ сверхвысокого уровня и т.д. Но структура языка сверхвысокого уро¬ вня слишком "высока" но сравнению со структурой языка вычислитель¬ ной машины, что вынуждает заменить процесс компиляции программ на их интерпретацию, а это,в свою очередь,приводит к существенной по¬ тере эффективности (по быстродействию) языка. Сейчас становится совершенно очевиден тот фант, что дальнейшее повышение уровня ЯП по крайнзй мере нецелесообразно. Поэтому практика программирова¬ ния спонтанно порождает принципиально новые методологии более эф¬ фективного построения программ. В основе этих методологий лежат стобра.жения Т4 - T9. Как часто бывает, новое - это хорошо забытое старое. Многие принципы, определяющие сущность новых технологий, испол!зовались и ранее, но на новом витке развития вычислительной техники и языков программирования они приобретают качественно но¬ вую окраску. Отображение 74 активизирует пассивные данные, преобразуя их в активные процессы. Ото отображение есть другая форма принципа активизации. Принцип активизации был детально исследован при соз¬ дании систем построения трансляторов (ОПТ) и системы обработки сложноорганизованной информации, достаточно подробное описание которой приводится в следующей главе. Опыт построения этих систем дает право сказать, что принцип активизации позволяет резко сокра¬ тить объем ручною программирования по крайней мере при решении задач перевода и подавляющего большинства задач обработки символь¬ ной и сложноорганизованной информации. Отображение Т4 лежит в ос¬ нове функциональных методов программирования. Хроме того, сно в значительной степени определяет методы объективяо-ориент»гровэнно- го программировании, а также ряд других методов, близких к функ¬ циональный, например таких, как метод Джексона и метод Верные. Если отображение 74 позволяет по структуре объекта построить
27 операции, необходимые для его обработки, то отображение типа Т5 дает возможность по совокупности операций построить логистическую структуру, т.е. структуру переходов, которая является необходимой и, как правило, достаточной для автоматического построения алго¬ ритма, решающего исходную задачу. Иначе говоря, отображение Т5 задает спецификацию задачи, достаточную для автоматического син¬ теза программ. Этот вид синтеза (так называемый структурный син¬ тез программ) нашел применение в системе Приз 183 . Отображение типа Тб летит в основе построения всех интер¬ претаторов и частично в системах, потщерживающхх процесс сме¬ шанных вычислений. Традиционный процесс трансляции, макрогенера¬ ция и компиляция-выполнение (например, при работе текстового ин- терпретаторг языка Форт) являются классическими примерами методов программирования, основанных на отображениях двух типов - Т4 и Тб. Отображение Тб резко повышает универсальность средств программно¬ го обеспечения, существенно поникая, как правило, его эффектив¬ ность. Однако это в полной мере относится .тиль к интерпретаторам и смешанным вычислениям, если их рассматр.авагь с самой общей точки зрения. Что касается макоогенерации, то поскольку она носит двойственный характер, ее эффективность и универсальность зависят от соотношения отображений 14 и Тб. Процессы трансляции и компиля¬ ции в силу’ своей жесткой ориентации на кон-сретный язык достаточно эффективны, но не универсальны. Отображение типа Т7 пока не нашло широкого применения в мето¬ дах и системах программирования, но в будущем следует ожидать по¬ явления очень интересных - с теоретической точки зрения - и очень полезных для практики программирования систем, основанных на ото¬ бражениях этого типа. Характеризуя целевую нащзавленность этих систем, уже сейчас можно сказать, что в основном они будут ориен¬ тированы на расшифровку смысла программ, на более доступное для понимания описание смысла алгоритма, а в конечном счете - и смы¬ сла задачи. Кроме того, системы этого типа могут быть полезны как средство автоматического структурирования программ или в общем случае как средство автоматического преобразования управляющей структуры программы к более простому виду. Я, наконец, эти систе¬ мы могут использоваться для доказательства свойств программ, в частности, их правильности.
28 Отображение типа Т8 на интуитивном уровне всегда связывается либо с типизацией данных и многоуровнэвостью языка, в случае если необходимо реализовать логистическую структуру алгоритма более эф¬ фективно, либо с интерпретаторами, которые реализуют языки с развитой логистической структурой. В первом случае создаются языки типа Алгол-68 с достаточно развитей системой видов значений (быть может, пока недостаточно развитой) и системой приведений . Во втором случае - такие языки как Плэнер (механизм возвратов, вызов процедуры по шаблону) или Пролог, для которого необходим интерпре¬ татор логики предикатов. Отображение типа Т8 служит основой логи¬ ческого синтеза программ. Отображение типа T9 используется либо ь системах структурного синтеза вместе с отображением типа Тб, либо как средство снятия кванторов существования и общности. При помощи кванторов можно существенно повысить уровень языка, и поэтому они могут входить как составная часть абстрактного языка, но кванторпые операторы абсолютно недопустимы в любом языке программирования (разве лишь в узкоспециализированных, ориентированных на конкретный класс за¬ дач, языках). Переход от кванторного выражения к эквивалентному алгоритму на языке программирования может быть более просто осу¬ ществлен через логистику языка. Каждое из девяти типов отображений определяет некоторую раз¬ новидность технологии программирования. Эти технологии можно на¬ звать "чистыми технологиями". Из сказанного выше видно, что неко¬ торые отображения тесно связаны друг с другом, поэтому на практи¬ ке иногда трудно отделить один подход к программированию ст друго¬ го. Более того, некоторые подходы целесообразно применять в комп¬ лексе, что может обеспечить гораздо больший эффект. Так, абстрак¬ ция типов данных, укрупняя обрабатываемые данные и операции над ними, позволяет существенно упростить управляющую структуру алго¬ ритма, тем самым облегчая процесс построения отображения Т2. Тех¬ нологии программирования, основанные на отображениях Т4, Т5 и T9, взаимно дополняют друг друга. Если структура обрабатываемых объек¬ тов достаточно сложная, то используется отображение Т4, в против¬ ном случае - комплекс отображений типа Т5 и T9. Отображение Тб, явл.яясь обратным к отображению Т4, может эффективно использовать¬ ся там, где Т1 не применимо, и наоборот. В идеале можно предста¬
29 вить язык программирования, который поддерживает все девять тех¬ нологических разновидностей, и этот язык является тем единым язы¬ ком, о котором говорилось в связи с машинами пятого поколения. Приведенная классификация методов программирования носит весьма приблизительный характер, так как многие существенно раз¬ личные методы попадают в один класс. Это объясняется тем, что каждая из трех структур языка состоит из разнородных подструктур и при построении более точной классификации за основу следует взять отображения этих подструктур. Однако приведенная классифи¬ кация вполне достаточна, чтобы пояснить, почему особое внимание уделяется отображению Т4. Это отображение ставит во главу угла управляющую структуру языка программирования. Для его эффективно¬ го использования необходимо, чтобы язык имел развитую управляющую структуру, в частности, он должен содержать недетерминированные и параллельные процессы. Параллельные процессы потому, что отоб¬ ражение Т4 ставит в соответствие л-арной функции л. параллель¬ ных процессов, а недетерминированные процессы, с одной стороны, являются естественным обобщением детерминированных, а с другой - адекватным, а во многих случаях и более мощным средством описа¬ ния логистической структуры решаемой задачи. Развитая управляющая структура языка содержит необходимые средства программной поддер¬ жки всех девяти типов отображений. При построении отображения TI сложность программирования оп¬ ределяется сложностью построения высокоуровневых операций, адек¬ ватных операциям предметной области. Если исходные данные имеют элементарную структуру, то методы, основанные на абстракции ти¬ пов данных и модульности, приобретают первостепенное значение. Отображение Т4 в этом случае практически не применимо. Но если исходные данные не элементарны, то отображение Т4 позволяет рез¬ ко сократить объем ручного программирования. Ясно, что развитая управляющая структура языка, содержащая недетерминированные процессы, обеспечивает программную подцержку отображений Т2, ТЗ, Т5 и T9. Отображение Тб является обратны?л к отображению Т4. Это отоб¬ ражение позволяет перейти от описания множества функций к описа¬ нию одной функции, что составляет сущность процесса параметриза¬ ции функций - процесса, обратного процессу активизации.Если про-
30 вести полную параметризацию всех функций, описывающих решение за¬ дачи, то можно получить единую программу, интерпретируюгую исход¬ ные данные. Однако эффективность '.по быстродействию) полученных в процессе параметризации алгоритмов, как правило, существенно ниже непараметризованных алгоритмов. Тем не менее два процесса - активизации и параметризации - взаимно дополняя друг друга, час¬ то позволяют найти разумный компромисс между объемом описания функций и эффективностью их выполнения. (Активизация данных, как правило, требует большего объема памяти.) . Отображение Т7 не используется в практике программирования, поэтому оставим его без комментариев. Сложность построения отображения Т8 связана со слоисностью построения интерпретатора логистической структуры. Отображение Т4 способно существенно повысить быстродействие такого интерпре¬ татора. Кроме того, в этом случае оно служит средством типизации данных и обеспечивает естественный переход от одноуровневого язы¬ ка к многоуровневому. §2. От задачи - к алгоритму На прагматическом уровне понятие задачи распадается на две составные части: что дано и что требуется получить. Математикой накоплен огромный опыт,во многих случаях дающий ответ, как по то¬ му, что дано, получить то, что требуется. В наиболее концентриро¬ ванной форме этот опыт заключен в аксиоме выбора Цс-рмело, которая утверждает, что предикат VX-3Y P(x,Y) эквивалентен существова¬ нию функции f(x), превращающей этот предикат в тождество. Преди¬ кат p(X,Y) является математической формулировкой задачи, функция f(X) “ ее решением. В чистой математике часто игнорируется воп¬ рос, как по предикату Р построить функцию f. Прикладная матема¬ тика не может игнорировать этот вопрос. Информатика должна идти дальше: в сферу ее исследований входит не только проблема взаимо¬ зависимости предикат-функция, но, главным образом, методы построе¬ ния информационных процессов, вычисляющих функцию f . Рассмотрим вначале два элементарных примера, демонстрирующих переход от математической формулировки задачи и решающему ее ал¬ горитму. Алгоритм деления. Даны целые неотрицательные числа л: и у.
31 ( О ^х,О у).Получить частное и остаток от деления х на у , т.е. пару чисел (ч,г), удовлетворяющих предикату: Xsq*y+r&OjqftO«r<y, (I) Пара (0,х) является решением равенства х = q * у *• г, (2) но она может не удовлетворять неравенству г -«у . Если пара (q, г) удовлетворяет равенству (2), то napa(q + 1,г- у ) также является его решением, если 0 < q + 1 & 0 aj г - у . Отсюда получаем пра¬ вило перехода от пары (q, г) к паре (q +• 1, г - у); f1(q,r) = если У -5 г ТО (q + 1, г - у). Это правило оказывается достаточным для построения информационно¬ го процесса, который имеет общую форму: <начя тьные присваивания > < итерационный цикл > <завершение *, а на конкретном языке, например, Паскаль может быть записан в ви¬ де: begin q: =0; г: = X; wnile г do be₽in q: _ q + 1 ; *: = г - у end end Наибольший общий делитель. Даны целые неотрицательные числа х и у . Получить наибольшее 7 , удовлетворяющее системе равенств: z * Z1 = х z * z? = у Если х = у , то х является искомым решением. Иначе, если х* у , то можно полу’тить эквивалентную систему: 2 * 51 = X “ У 2 * п2 = у Отсюда, учитывая симметрию чисел х и у , получаем два правила пе¬ рехода : (х,у) ~ если х < у то (х,у - х), f2(x»y) = если У * х т0 (* “ У> У)» которые приводят к программе: begin а :=х ; Ъ := у; while а Ъ do if а < Ъ then Ъ 1= Ъ — а
32 else a ;= a - Ъ end Эти два примера будут служить иллюстрацией общей схемы пе¬ рехода от исходного предиката -ЗУР(Х.У) к решающему его алгорит¬ му f(X). Четыре шага отделяют предикат от алгоритма. Первый шаг: построить предикат q(x.Z), эквивалентный пре¬ дикату 3 УР(Х, У) : -3ZQ(X,Z) = ЭУР(Х,У). Предикат Ч(Х,г)дак правило, является более простым, чем пре¬ дикат Р(Х,у), часто - его составной частью. Он служит для зада¬ ния либо начального состояния программы, либо области определения функции f(X).B первом примере: q(x.y,г) = О?хло<у*Огг, во втором примере: q(x.y) = О х ft О у. Второй шаг: построить систему . f2,..преобразований, сохраняющих инвариантным предикат Р(Х,У): Р(1±(Х,у)) = Р(Х,У). (Иначе говоря, ни одно из преобразований не меняет исходную задачу.) В первом примере fi(y,q,r) = (y,q ♦ 1,г -у)» во вто¬ ром ^(х,у) = (х.у —х), Г2(х,у) = (х -у,у). Третий шаг (который необходим лишь тогда, когда преобразова¬ ния fjfX.Y) не зависят от второго аргумента): построить преди¬ кат Р0(х,у), такой, что если (Х,у) удовлетворяет ему, то легко вычислить функцию у = f0(X) Более формально это означает, что предикат Рс(Х,у) имеет вид P0(X,Y) =Й(Х,У) ft (R1(X,Y) ft У =g1(X)V...vRB(X,Y)ftY= ge(X)) и по нему легко строится функция *0(Х) (в виде абстрактного ус¬ ловного оператора), превращающая Р0(Х,у) в тождество: fo(x) = ЕСЛИ Rfx.g^x) ft R^(X, (х))-*. glV'x) о R(X.g2(X) ft r2(x, g2(x))-»■ яс2(Х) a R(X,g_(X)) ft R0(X,(x))-—g (x) KE e В первом примере - это предикат (х = q * у > r)ft О * г * у, во втором - система двух равенств, когда х = у. Четвертый шаг: доказать, что система преобразований fv полна, т.е. с П ’
33 в(х.го)=Э111г...1к(г(х,с<т1_1г__ .11с(х.г<,>7г>гго<6,11г...11<1-!!1>’” где fx1,x2J А = xi»<^i1i2...tk(x,zo) - суперпозиция функций (в польской инверсной записи): X z*. f, ...f. , (x.Z ) - начальное 0 х2 Тс 0 состояние. Связо между исходным поедикатом iJYPfX.Y) и решающим его алгоритмом f(X) выражает теорема. Если система f1tf2,• эквивалентных преобразований пол¬ на, то функция f(X),вычислимая абстрактным оператором цикла (в общем случае недетерминированным): f(x) = (x,zo)fwi -ip0(x,y) -* ЕСЛИ Z (X,Y))J1,Z)-> f1(X,Y)o ... ...Cfjz Q(£(fn(X,Y))JvZ)-^ fn(X,Y) :<]2 является решением предиката -Jy p(x,y). В первом примере G(f.| (у, q. г)) - О * х О * у & 0 * г - у. во втором Q(f.|(x,y)) = О ? х ъ х * у, Q(f2(x»y)) = У** * 0*у. Доказательство. Пусть Jyp(x.y) . Тогда, в силу полноты сис¬ темы | ] 31^2».. (X, zQ)) . Существует минималь¬ ное kQ, такое, что Ро(сГ1 * о 1 ж2 начает, что V j(- * kQ э -г р0(б\ i Покажем, что ^3(3 5 к0 тз 9 Zq([q*. ЕСЛИ 7jZQ(f<Ti < i (X,Y) J.,Z) i к ), T0->3YP«r< 1 4 (X,Y)). о 1112...л^ ■?’ГР«Г- < 4 (x,y)).Следовательно, суперпозиция <o . . ± 1112-*.*k о (X.y) вычисляется программой f(x). С другой стороны, в силу полноты системы преобразований программ®. заканчивает работу и, следовательно, для некоторых 1.выполнен предикат ■о (тг . (хт))« f. " эквивалентное преобразование, значи1" (X,ZO)) . Это 03- i (X?Y))). J для некоторого JO(1 Jo z). Это противоречит тому, что является решением предиката
34 1(X,Y)J2 является решением предиката, что и требова¬ лось доказать. Частными случаям обш.ей схемы перехода являются схема экви¬ валентных преобразований, схема последовательных приближений ib частности, схема неподвижной точки) и схема полного перебора. Пер¬ вый пример - деление чисел - является типичным примером метода последовательных приближений, если в качестве предиката Р взять предикат х а о * у + г) ft О5 г < у) . Второй пример - нахождение НОД - иллюстрирует метод эквивалентных преобразований. Задача поиска заданного числа в массиве чисел может служить при¬ мером задачи, для решения которой используется схема полного пе¬ ребора. Поскольку многие задачи принадлежат классу задач, каждая из которых описывается одной из частных схем перехода, имеет смысл рассмотреть эти частные случаи более подробно. В схеме эквивалентных преобразований предикат Q(X,z) не за¬ висит от 2 и поэтому не содержит квантора существования. Первый шаг схемы перехода может быть сформулирован в следующем виде: по¬ строить предикат Q(X) , такой, что Q(X) = 2Y?(X , Y) . Преди¬ кат Q(X) задает в явном виде область определения функции f(x). Преобразования *А(Х,Т) не изменяют второго аргумента. Поэтому на втором шаге получаем тождество: Р(£ДХ).,У? =■ Р (X ,Y) . Поскольку аргумент Y в процессе преобразования предиката не получает кон¬ кретного значения, требование, чтобы Функция *0(Х) была легко вычислимой, становится обязательным. Тождество на четвертом шаге, функция f(X) и вычисляющая ее программа могут быть записаны в. виде q(x)s ?(Х, 1 ;х)) е 31,1г.. .5Л(s ^...^(Х), да ■>ро(х.1о(х)) — ЕСЛИ Q(f^(X)) *f,f(X)cr ...а Q(fn(X))-> fn(X) НЕ ПК хо(х) В схеме последовательных приближений предикат q(x,Z) зада¬ ет область начальных приближений. Тождество 7ZQ(X,z)= 3YP(X,Y) гарантирует, что для каждого X найдется начальное приближение. 2С , обеспечивающее сходимость процесса приближений к искомому решению; если система { } полна. Преобразования
35 *£ (X,Y) не меняют первого аргумента. Предикат pq(z,Y) совпа¬ дает с предикатом P(X,Y) . 11о&то?лу f&(X) - £(х) . Тождество на четвертом шаге, функция f(x) и вычисляющая ее лрох’рамма име¬ ют вид: Q(XrZ0) -5i1i2...lkT(X, G'i1i2...ik(X,z0)) f(x) ^^ili2...i4(x,z0) (X,7,o) 5ZQ(X,Z)-*• ГЦИКЛ tP(X.Y)-^ «ЕЛИ f, (X, Y) - f 1 (X,Y) a . . . JUJL -'“VWt-yM! № Схема полного перебора использует минимум сведений о том, как решать задачу. Преобразования неизвестны, и вместо них используется один перечисляющий значения второго аргумента алго¬ ритм h(i) (0^ . Предикат q (за неимением лучшего) совпа¬ дает с ? . Поэтому тождество на четвертом шаге, функция f(x) и вьптис ля-лцая ее программа имеют ьид P(X,Y0) = P(X,h(h...h(O)...)) f(X) = h(h..,h(0)...) (X.O) ЦИКЛл(Р(Х,Ъ(1)) ft 1 / + 1)-* (x,i + 1) KU В данном случае полнота системы преобразований означает, что при заданном X существует Yo , удовлетворяющее предикату Р . Схему полного перебора можно интерпрет:1ровать как частный случай схемы последовательных приближений. ^енее очевидно, но однако к схему эквивалентных преоорезований можно рассматривать как частный случай схемы последовательных приближений. С другой стороны, схема последовательных приближений является частным слу¬ чаем как схемы эквивалентных преобразований, так и схемы полного перебора. Таким образом, все три типа схем оказываются равносиль¬ ными и, более того., каждая из них равносильна обшей схеме перехо¬ да. Однако эта равносильность сугубо формальна: сведение схемы одного типа к другому связано с изменением математической поста¬ новки задачи. Семантика задачи (предикаты P(x,Y) и т0(х,у) ) од¬ нозначно определяет тип схемы. Схема перехода от математической формулировки задачи к ре¬ шающему ее алгоритму полностью покрывает "интеллектуальнее отк- ровениэ" Дейкстры17_1и "апостольское деяние" Приса 15 J , но она ни в коем случае не исчерпывает содержание науки програмчи-
36 рования. Что касается работ Дейкстры и Гриса, то они могут слу¬ жить введением в программирование задач численного анализа. Но в этом классе задач программистские проблемы столь ничтожны по сра¬ внению с общематематическими проблемами, что только использование математической логики в качестве средства формализации семантики языков программирования может сделать их значительными, да и то лишь в глазах начинающего программиста. Теория Дейкстры излагается вне какой-либо связи с основания¬ ми математики, поэтому такие понятия как слабейшее предусловие, сильнейшее постусловие, преобразователь предикатов производят на неискушенного читателя впечатление некоего "откровения". Однако аксиома выбора Цермело, конкретизированная в виде общей схемы пе¬ рехода, не только содержит аналогичные понятия, но и способна объяснить место каждого из них в рамках математической постанов¬ ки задачи. Предикат Q(x,Z> является слабейшим предусловием, и слабейшим его делает естественное требование эквивалентности: JZQ(X,z)г 3YP(x,Y) . Этот предикат выражает необходимое и до¬ статочное условие существования решения задачи. Предикат у(Х,у) является инвариантом алгоритма, так как преобразования f^X,?) - преобразователи предикатов - являются эквивалентными преобразо¬ ваниями. Эквивалентнымиtтак как г процессе решения может прои¬ зойти подмена одной задачи другой , Предикат Pq(X,y) являет¬ ся сильнейшим постусловием. Сильнейшим, потому что только импли¬ кация >— р(х»у) гарантирует, что i(х) яв¬ ляется искомык pemei-tfteM. Общее решение предиката p(x,Y) в виде абстрактных операторов (условного и цикла) подчеркивает фунда¬ ментальное значение этих операторов для любого языка программи¬ рования. Работы Дейкстры C7J и Гриса Г53, и более ранние работы Хоора определяют так называемый аксиоматический подход к описа¬ нию семантики языков программирования и на его основе - специфи¬ ческие методы программирования сверху-вниз [U. Принципиальная сшибка всех этих работ связана прежде всего с тем, что в рамках этого подхода происходит подмена понятия "семантика языка" поня¬ тием "семантика алгоритма". Описать семантику языка значит описать процесс выполнения каждой конструкции этого языка. Описа¬ ние семантики алгоритма складывается из описания семантики зада¬
37 чи (что дано и что получить) и описания тсго, как решается эта задача, т.е. из описания метода решения, сущность которого опре¬ деляется выбором системы преобразований . Ясно, что семан¬ тика алгоритма тесно связана с семантикой языка. Еолее того,язык часто навязывает метод решения задачи. Именно эта тесная связь и является причиной путаницы, причиной того, что развиваемая в эфих работах теория "стоит на голове": исследование ведется не от по¬ нятия задачи через язык к программе, а от конструкций языка, на которые по непонятным причинам следует навешивать неизвестно от¬ куда взятые предикаты. Другая принципиальная ошибка этого подхода связана со сле¬ пой верой в то, что каждому вычислительному процессу, записанному в виде программы на реальном языке программирования,можно адек¬ ватным образом сопоставить вывод на. языке логики предикатов пер¬ вого порядка. Язык логики предикатов по мощности эквивалентен язы¬ ку машин Тьюринга, и писать реальные программы на любом из этих языков не более практично, чем обрабатывать крестьянское поле бу¬ лавкой. Еурбаки Г4 .1 проводят доказательство первых теорем теории множеств на языке математической логики, но >понимая всю бесперс¬ пективность такого начинания, очень быстро переходит на естествен¬ ный язык. А ведь реальная программа гораздо сложнее многих теорем теории множеств. Отсюда следует, что язык описания задачи должен превосходить по мощности язык программирования, а доказательство правильности программ следует проводить на естественном языке. 3 задачах численного анализа исходный предикат р(х,¥) задается ь виде уравнения или системы уравнений с теми или иными ограничениям; на исходные данные или на искомую функцию f(x) . Предикат Q(x) (если он не зависит от z ) задает область опреде¬ ления функции f(x). Преобразования являются либо экви¬ валентными преобразованиями исходной системы уравнений к некото¬ рому каноническому виду, решение которой очевидно, либо определя¬ ют очередной шаг в последовательности приближений к искомому ре¬ зультату. Предикат P0(X,Y) задает либо каноническую форму урав¬ нений, достижение которой является конечной целью преобразований, либо точность вычисления. Таким образом, н? классе задач числен¬ ного анализа общая схема перехода по крайней мере з принципе ока¬ зывается достаточно простой и универсальной. В классе задач обработки символьной информации предикат P(Z,Y)
38 задается при помощи системы словарных уравнений, частным случаем которой является операция отождествления. Примеры задач символь¬ ной обработки можно найти в работе Г.117. Постановка некоторых за¬ дач (так называемые лабиринтные задачи) не содержит пре,диката P(X,Y) . 3 этом классе задач задаются преобразования началь¬ ное состояние и предикат P0(X,Y) . Требуется найти последователь¬ ность , которая преобразует начальное-состояние в состояние, удовлетворяющее предикату P0(X,Y) .Примеры задач и этого класса можно найти' в работе fllj., Перейдем к рассмотрению конкретных примеров. Первые четыре взяты из работы Гриса ( 1. Даны произвольные числа х, у. Найти тчх(х.у). Предикат Р(х,у) = Jz(z а & ( z = х V и = у)). Преди¬ кат Р0(х,у) совпадает с Р(х,у) , поэтому f0(x) -= ЕСЛИ у -= х •* х и х < у у Кй Доказательство правильности полученного решения проведем ме¬ тодом разбора различных случаев. Пусть у *• х» Тогда f0(x) = х . (Здесь используется знание семантики условного оператора.) Подставляем fQ(x) в предикат р( х,у ) вместо в : х & х у & (х - х v х = у) = true . Пусть х * у . Тогда f(x) = у. у^хлу?ул (у-х>/у -у)= true . 2. Пусть .1 и к (к * О ) удовлетворяют равенству j=k mod 10. Требуется увеличить к , сохранив равенство. Формальное описание предиката -имеет вид R(k,j) = 5 z (к =1o*z + j)ak>040«j«9, P(k,j) = R(k,J) <i7x,y(R (x,y) & x = к + 1 ) . После элементарных преобразований предикат р(к, j) принимает форму предиката pQ ; Р(к,j) = 3 х,у(х ~ к + 1 &( J * 9 & у = j + 1vj=9&y=0)), поэтому получаем f(k, j) = (к + 1, ЕСЛИ J < 9 -* j * 1 <=з j =9~* О КЕ ) Доказательство правильности подстановкой f(k,j) в P(k, J) аналогично доказательству в первом примере.
39 3. Суммирование элементов массива b fl : ml . Это типич¬ ный пример, когда используется схема полного перебора по i (1 -* 1 п) : У(Ь) = bfl J ; Q(i,s)= 1 -< 1 * в ; ^(1,е) = (1+1, e+b£i+l]); <п . Начальное состояние в задачах перебора содержит нижнюю границу индекса перебора и значение искомой функции на пустом множестве. Так как сумма элементов пустого массива по определению равна ну¬ лю, то начальное состояние в данной задаче - (0,0). Поэтому по¬ лучаем программу (°»°) .да i * n ~ (1 + 1, в + b £ 1 + 1])КЦ или на конкретном языке программирования (например, на языке Алгол-63): 1 := 0 : в 0; while i<n do i: = 1+1; в := s+b[i’J od 4. Поиск элемента в двумерном массиве ьй : ш, 1 : nJ , P(b,i,j,x) x=b(i,j] fn(l, j) = ECJiM j * n(i, j+1) i 1 ■* m • (1+1,0) KE Функция задает порядок перебора по двум индексам. Иско¬ мая программа имеет зид ЙЙ) 1₽-»P ^(1,3) КЦ 5. Дане произвольное слово х в алфавите [ а,э,о} • Требу¬ ется построить слово у , которое получается из слова х после выбрасывания из него всех символов а . Это типичная лабиринтная задача при ч =х описывается так: Q(x, а) =(а х х) ^(^а/2) = У1у2 Ро (х) = (г1аг2 = х) Преобразование 11ф в общем случае недетерминированно. Искомая программа (X) да-1У0(а) -> кц Эта же задача, запрограммированная в функциональном стиле (на языке Форт):
40 : а ; IMMEDIATE : Ъ С«Ъ С, ; IMMEDIATE :с с"с С, ; IMMEDIATE Символы входной строки должны быть разделены пробелами. 6. Дана КС-грамматика: Е ■» Е + Т I Т Т -* Т * У i У F -» (Е) I I I — а I Ъ i с описывающая фрагмент арифметических выражений. Требуется постро¬ ить перевод арифметических выражений в польскую инверсную запись; q(x) =у1 "к +Т’’у? = х v у.)1’? * у"у2 =х- v у2 = х у2 = х ♦ f/x) = У1"Е + Т” У2 = Х-* У1 "Еи "Т" + у2 ; 19(х) = .^"т * у" у2 = х — у1 "Trt "Р,! * у2 : fj(x) =У1 "(Е)" У2 = х“* У-1 "Е* У2 ; f4(x) = у1"1» у2 = х* у1 I у2 . Программа, решающая задачу перевода: ЦИКЛ ^(хЭсз f2(x) г.з Г3(х) и *4 (х) КЦ На вход этой программы подается строка "х", где * - исходное ари¬ фметическое выражение. Эта же задача, запрограммированная в функциональном стиле (на языке Форт1: VARIABLE a VARIABLE Ъ VARIABLE о : + С” + OVER = О ER С” * OR IF е, £ LATEST NAME» , 7 FTJROP ТНЕТГ С” + ; DISDIATE : * I" * OVER = IP C, TREK C" * ; IHIIEPIATE : ( C" ( ; MEDIATE : ) DDF С" ( = -ИГОТ C, [ L.1TEST NAIIE> , J RDROP THEN DROP ; IMMEDIATE : X DROP DROP ; IMMEDIATE Следует внимательно проанализировать примеры 5 и 6 и пра¬ вильно понять различие между программами, записанными в виде аб¬ страктных цикчов, и соответствующими программами на языке Форт. Если исходные данные имеют элементарную структуру (как в примерах I - 41, то абстрактный цикл легко преобразуется в программу на
41 реальном языке программирования. Если исходные данные не элемен¬ тарны, то переход от абстрактного цикла к реальной программе не менее сложен, чем переход к ней от исходной формулировки задачи. Преобразование исходного текста в активный процесс позволяет най¬ ти кратчайший путь от постановки задачи к реальной программе. Последние два примера являются первыми аргументами в обосно¬ вании общего вывода, .что язык представления знаний должен поддер¬ живать функциональные методы программирования, потому что они по¬ зволяют найти кратчайший путь от постановки задачи к решающей ее программе на реальном языке программирования. §3. Алмаз - абстрактный язык представления знаний Язык Алмаз (Алгоритмический Метаязык Активных Знаний) явля¬ ется функциональным языком общего назначения. Основным типом дан¬ ных этого языка является функция. Этот тип данных в языке Алмаз играет такую же роль, подчиняя себе все остальные типы данных, как список в языке Лисп, строка в языке Скобол или реляционная таблица в реляционной базе данных. Метаязыковые возможности язы¬ ка Алмаз обеспечиваются набором средств, достаточных для описания современных языков программирования. По своей сущности этот язык является конкретизацией математической модели языка (III. Несмот¬ ря на определенную конкретизацию он остается абстрактным языком (некоторые его конструкции не допускают эффективной реализации), предназначенным для того, чтобы служить ориентиром при построении конкретных языков представления знаний. В том виде, как он здесь описан, язык Алмаз может использо¬ ваться как язык проектирования сложных программ. Однако процесс перехода от абстрактного языка к реальному языку программирования (например, к таким языкам, как ПЛ/I, Алгол-38, Паскаль, Ада) в общем случае остается очень сложном. Система обработки информации, описанная в следующей главе, предназначена в частности для того, чтобы обеспечить реальную возможность, перехода от программы на языке Алмаз к программе на'языке Форт. Программа на языке Алмаз представляет собой набор описаний функций, макрофункций, модулей, интерпретаторов, грамматик и уп¬ равляющих систем. Обращение к одной из описанных функций иницииру¬ ет выполнение программы. Описания одних функций (модулей и т.д.) содержат список формаль'ых параметров, описания других - не со¬
42 держат. Функции, не содержащие формальных параметров, аналогичны функциям языка Форт: входные данные такие функции берут из стека. В отличие от Форта количество стексв здесь не ограничено. Переход на 1”й . стек осуществляется оператором , возврат на предыдущий стек - оператором 1] . Тело функции представляет собой суперпози¬ цию функций в польской инверсной записи. При работе программа на языке Алмаз может находиться либо в режиме выполнения, либо в режиме компиляции. (В языке Форт эти ре¬ жимы существуют лишь при работе текстового интерпретатора.) Фун¬ кция переводит работу программы в режим выполнения, а функция «ООГТ - в режим компиляции. Управляющие операторы. Основу структуры управления языка Ал¬ маз составляют обращения к функциям и модулям. Обращение к функ¬ ции в общем случае формируется динамически. Это позволяет исклю¬ чить использование не толь;,-о операторов перехода, но и условных операторов и циклов. Однако замена управляющих операторов требует введения новы?: имен функций и часто делает описание функции слиш¬ ком мелким. Поэтому в языке Алмаэ оставлены и условные операторы и циклы. Детерминированный условный оператор имеет вид ЕСЛИ f 1 •* gi i f 2 - g2 ).., ( ГТ & KE где fl, gi - суперпозиции функций. Если суперпозиция *1 опреде¬ лена, то выполняется суперпозиция £1 , и ее результат есть ре¬ зультат условного оператора, иначе ( если f2 ) определена, то выполняется g2 и т.д. Если ни одна из функций fi не определена, то значение условного оператора не определено. Недетерминированный условный оператор имеет вид ЕСЛИ* 1 — g1 El £2 g2 ст, . . a Если суперпозиция Л определена, то выполняется суперпозиция gl. Если gl определена, то ее результат является результатом услов¬ ного оператора. Иначе, т.е. если П не определена или опре¬ делена, a gi не определена, то выполняется вторая альтернатива 12 -* ?2 и т.д. Параллельный условный оператор имеет вид ВСЛЛ £1 —- g1, 12 g2,..., in -* KE В этом операторе все альтернативы запускаются на .выполнение од¬ новременно.
43 Операторы цикла имеют вид Ц’КЛ f1 gi I f2 g2| ..pij- кц ЦИКЛ f 1 ■* g1 о f2 g2a .. .□ cy р^г эд ЦИКЛ f 1 -* g1, f2 -* g2 Д7 -? & КЦ Цикл рассматривается как итерация условного оператора. Итерация выполняется пока соответствующий условный оператор определен. Определение функций. Выполнение описания функции вводит ее новое определение. Заголовок описания содержит различные префик¬ сы, которые определяют различные классы функций. 1) Пустой префикс. Описание функции имеет вид : F L* Х1 X?- ... ХМ *3 pi ?2 ... рк ; (при М=0 скобки С* и *1 могут быть опущены.) Описание функции аналогично оператору присваивания: тело функции присваивается в качестве значения имени функции. В процессе опре¬ деления функции ее тело может быть выполнено. Таким образом, опи¬ сание является действующим оператором. 2) Префикс coi'ip.Описание функции р имеет вид COMP : У L* Х1 7.2 ... XX *J У1 Г2 ... Ж ; Префикс аом? означает, что при обращении к функции у ее тело будет компилироваться целиком независимо от режима выполнения.Од¬ нако при обработке описания функции у оператор *ухес перево¬ дит режим компиляции в режим выполнения. Описание функции с префиксом соку не эквивалентно вызову функции с эти?/ же префиксом. 3) Префикс ijXBO. 5XSC : У £* Х1 Х2 ... XN *3 М У2 ... Ж ; Наличие этого префикса в описании функции у означает, что функ¬ ция У будет выполняться и в режиме компиляции. Вызов СОНУ..? в любом режиме будет компилировать тело функции F. 4) Префикс ALLOT. ALLOT : У С* Х1 X? ... ХМ »3 У1 У2 ... Ж ; Префикс alt от вводит новое определение функции ОТ’ не уничтожая ранее выполненных определений этой функции, а лишь временно зак¬ рывая к ним доступ. Выполнение оператора FUES У вновь открывает доступ к предыдущему определению. Таким образом, описание этого типа аналогично оператору allocate языка ПЛ/1. 5) Префикс JTDET.
44 * числе* 1TDE5 : F £* X1Z2 ... ХМ *] Р1 ?2 ... FN ; Этот префикс вводит списание недетерь-иниро ванной функции. Перед описанием находится целое неотрицательное число. Все описания не¬ детерминированной функции располагаются в порядке возрастания по¬ ложительных чисел. Описания, содержащие одинаковые числа, распо¬ лагаются в порядке их выполнения. Описание, которому предшествует число 0 , располагается последним (динамически). При обращении к функции вначале выполняется первое описание, при возврате - второе и т.д. Если вызов функции имеет вид .nd мр, то выполне¬ ние функции F начинается с первого описания, которому предшест¬ вовало пиело Н . Пример : СМЕРТЕН ЧЕЛОВЕК ; О ndet : ЧЕЛОВЕК "ТЬЮРИНГ" ; 0 ndet : ЧЕЛОВЕК "СОКРАТ" ; : ГРЕК "СОКРАТ" ; : ? ЕСЛИ РАВНО - I НЕУСПЕХ НЕ ; Последовательность действий: СМЕРТЕН ГРЕК ? вычисляет, какой грек был смертен. 6) Префикс PAR : * число* PAR : Р £* Х1 У2 . . . XN *] F1 F2 ... JW ; С помощью этого префикса списывается набор параллельных функций, имеющих одно имя. При обращении к функции р одновременно запу¬ скаются на выполнение все описания с именем р . Каждое описание функции F инициирует параллельный процесс. Число в префиксе по¬ зволяет идентифицировать некоторые описания в наборе с одним име¬ нем. Обращение ! * i р запускает на выполнение лишь те описания функции F , префикс которых содержит число 1 . Синхронизация параллельных процессов осуществляется следую¬ щим образом. Если в опном из параллельных процессов произошло об¬ ращение к неописанной функции F , то имя этой функции засылает¬ ся в управляющую память, а выполнение процесса приостанавливается. Если к этому момонту в управляющей памяти находятся имена HI,... ... ,НК , то имя Р конкатенируется с этими именами и если ка¬ кая-либо комбинация имен HJ и F образует имя х описанной фун¬ кции, то функция X выполняется, и после ее выполнения. (или при¬ остановки) возобновляют работу все те процессы,.которые были при¬ остановлены обращением к функциям, имена которых участвовали в
45 образование имени х , в противном случае - имя р остается в уп¬ равляющей памяти и ни один из приостановленных: процессов не возоб¬ новляет работу. Запустить некоторые из них на выполнение может лишь какой-то работающий процесс, обратившись к неописанной функции. Ес¬ ли все процессы приостановлены, то происходит обращение к функции ПЕОПР. Эта функция может быть описана, и тогда она определит даль¬ нейший процесс вычислений. Если функция НЕСПР не описана, то про¬ исходит прерывание с признаком "heonp". Имя неописанной функции автоматически попадает в управляющую память и приостанавливает процесс выполнения. Однако в управлящую память можно занести любое слово, не останавливая процесс. Это можно сделать при помощи операции ЖДАТЬ. Она заносит в управляю¬ щую память слово или набор слов, представленных в виде списка. Кроме операции ЖДАТЬ с управляющей памятью связаны операции: ЖДАТЬ? у - кладет на стек число экземпляров имени j> , находя¬ щихся в управляющей памяти; ЖДАТЬ F - убирает из управляющей памяти один экземпляр имени F и запускает на выполнение тот процесс, который был останов¬ лен обращением к функции р . Если с р связано несколько остано¬ вленных процессов, то запускается на выполнение процесс, останов¬ ленный раньше других; !ВДА7.'Ь - кладет на стек список имен функций, находящихся в уп¬ равляющей памяти; ”*!ЖДАТЬ - очищает управляющую память. ?) Префикс CONTROL . CONTROL : ? L* Х1 Х2 ... ХМ */ Р1 Р2 ... PN ; Этот префикс вводит особый тип функций - управляющие функции. Ка¬ ждая управляющая функция должна быть описана в одном из модулей. Отличие управляющей функции от других функций заключается в том, что после каждого ее изменения или переопределения управление пе¬ редается модулю, в котором сна определена: каждый модуль содержит кроме описаний функций последовательность действий, которая вы¬ полняется при передаче ецу управления. Бызов функций. Описание функции может содержать формальные параметры Х1,х2, ...,хм. Если функция описана как функмл с г.а-
46 раметрами, то при обращении к ней можно использовать любую из двух форм вызова: либо «префикс * F , либо «префикс * »G2,„, ..., GM), где G1 - фактические параметры. Их число должно совпа¬ дать с числом формальных параметров. При первой форме обращения фактические параметры берутся из стзка. Оператор вызова функции обязательно содержит имя функции и кроме него может содержать префикс и параметры. Этот оператор вы¬ полняет ряд действий, связанных с передачей фактических парамет¬ ров, и в зависимости от префикса определяет режим выполнения тела функции. Простейший вызов ? , не содержащий ни префикса, ни па¬ раметров, аналогичен оператору перехода с возвратом. Тело функции ? не дублируется. Если функция Р описана как параллельная, то выход из нее осуществляется после выполнения всех параллельных процессов. Приостановленный процесс считается выполненным, пока работает хотя бы один параллельный процесс - иначе произойдет прерывание с передачей управления на функцию НЕОПР. Если функция F описана как недетерминированная, то выход из нее осуществля¬ ется лишь в случае ее успешного выполнения. При неуспешном выпол¬ нении управление передается функции НЕУСПЕХ. Если функция НЕУСПЕХ не описана, то она либо осуществляет возврат, либо прерывает про¬ цесс выполнения. Однако если это прерывание произошло при вычис¬ лении условного выражения в условном операторе или цикле, то уп¬ равление передается на выполнение следующей альтернативы. Вызов COMP. Р в начало тела функции р как бы добавляет оператор .СОМТ, переводящий любой режим в режим компиляции, и пе¬ редает модифицированной функции р управление. При определении новых функций этот вызов позволяет заменить обращение к какой-ли¬ бо функции на ее тело. Например, выполнение описаний :g а в с ; : Р *E?<EG comp.g .СОМР и ; определит функцию р так же, как и описание : Р А в С М : . Вызов EXSC* Р независимо от любого стандартного режима всегда инициирует выполнение функции р . Лишь нестандартная ин¬ терпретация может перевести вызов этого типа в режим компиляции. Этот вызов можно сравнить с операторами периода макрогенерапии или препроцессирования: все такие операторы как бы следуют за сло¬ во:.: Е£ЕС*
г? Вызов ALLCF* F копирует тело функции р в активный стек (стек выполнения рекурсивных функций) и после передачи фактических параметров передает ему управление. Таким образом, этот вызов ана¬ логичен вызову нереентрабельной функции. Вызов нрзт* Р копирует всю оперативную память и инициирует выполнение функции F . При ее успешном выполнении этот вызов эк¬ вивалентен вызову без префикса. При неуспешном выполнении происхо¬ дит восстановление памяти: память переходит в то состояние, которое было до обращения к функции Р . Однако управляющая память не вос¬ станавливается: неуспешное выполнение функции р можно использовать для изменения управляющей памяти. Вызов недетерминированной функции не копирует память, и на программиста возлагается забота о восста¬ новлении значений глобальных переменных при возвратах. При вызове WHET* у ситуация противоположная. Память восстанавливается авто¬ матически, но издержки памяти и времени могут быть значительными. Следовательно, вызовы функции с префиксом NDET* и недетерминиро¬ ванные функции являются взаимодополняющими средствами языка. Если процесс почти детерминированный, число ветвлений невелико, но каж¬ дая ветвь требует значительного объема вычислений, то все функции следует описывать как детерминированные, а для ветвлений использо¬ вать вызов с префиксом КВЕТ*.При большом количестве возвратов сле¬ дует использовать недетерминированные функции. Аналогичную роль играет оператор ветвления ( NDST 71 F2...FT). Вначале память копируется и управление передается функции Р1 .При ее успешном выполнении работа оператора заканчивается, память не восстанавливается. При неуспешном выполнении функции Р1 память восстанавливается и инициируется выполнение функции Р2 и т.д. Ес¬ ли ни одна из функций Р1 (1 $ 1SH) не завершает своего выполне¬ ния успешно, то выполнение оператора ветвления эквивалентно пусто¬ му оператору. Вызов РАР* Р запускает на .параллельное с вызвавшей програм¬ мой выполнение функцию Р . В.отличие от параллельных функций вы¬ зов РАД* Р создает более независимый процесс Р: все порождаете в Р описания функций и модулей локализовав: в нем и не доступны параллельно работающим процессам. Аналогично, оператор (рад F1 *2... ... иг) создает к независимых (в смысле локализации) параллельных
48 процессов. Вызов CONTROL* F вводит контроль за изменением уже определенных функций: в процессе выполнения функции р на экран дисплея или на печать будет выдаваться информация об изменении или переопределении любой уже определенной функции. Макро^ункции. Понятие макрофункции аналогично понятию макроса которое, как известно, является столь те старым, как и понятие ас¬ семблера. Вызов макроса отличается от вызова подпрограммы. Такое же различие между вызовами макрофункпии и функции. Однако в функ¬ циональных языках механизм макросов играет менее важную роль, чем в компилируемых языках. Например, введение макрофункций в язык Форт вряд ли существенно расширило бы егс возможности. Тем не ме¬ нее, механизм макросов, являясь средством объединения принципов параметризации и активизации, дает возможность строить простые и лаконичные параметризованные описания функций без потери эффектив¬ ности вычислений. Процесс активизации разбивает программируемый алгоритм на сколь угодно мелкие составные части. При этом возникает множество однотипных функций. Прямая параметризация таких множеств с по¬ мощью обычных функций как правило приводит к их интерпретации во время выполнения и, тем самым, - к потери эффективности. Макрофунк¬ ция выполняется один раз , именно в этом и состоит ее преикопцес- тзо перед обычной, функцией. Механизм макрофункций является наибо¬ лее простым и эффективным частным случаем преобразования пассив¬ ной строки в активную суперпозицию функций. Все макрофункции в языке Алмаз делятся на две группы. Опи¬ сания макрофунхции первой группы содержат списки формальных пара¬ метров: MACRO: Р [♦ Х1 Х2 ... xn*J «строка символов » ; В описаниях макрофункций второй группы список формальных парамет¬ ров отсутствует. Отсутствие явно указанных формальных параметров не означает, что они но входят в тело макрофункции. Каждое вхож¬ дение параметра в тело макрофункции должно иметь вид % 1. , где i - целое неотрицательное ”исло, явл,1Ющееся номером формального параметра. Параметр с нулевым номером обозначает имя макрофунк- пи".. Формрльн.’ми параметрами макрофункций первой группы являются произвольные слова, не содержащие пробелов. Их вхождения в тело
4^ макрофункпии также слева и справа ограничены символами; % и точ¬ ка . Например: MACRO! X [* S О " : 0S. s 0S. 15 ; ""0S."*;" ; является описанием макрофункции X , выполнение которой порожда¬ ет описания новых функций. При обращении мнн х будет порождена функция Н , имеющая описание : Н t и 15 :*ч":. При первом обра¬ щении к функции я она будет переопределена: : н 15;» а в стек будет заслан адрес идентификатора 3 . При последующих обращени¬ ях к функции К в стек будет засылаться число 15. Макрофункции с явно описанными параметрами являются менее гибким средством обработки текстовой информации, чем макрофунк¬ ции без параметров. Поэтому макрофункции с параметрами следует использовать как средство параметризации описаний функций и режи¬ мов выполнения, макрофункции без параметров - как средство обра¬ ботки текстов. Макрофункции с параметрами более эффективны по быстродействию и более чувствительны к ошибкам, т.е. обладают большей надежностью. Макрофункпия с параметрами может быть перекомпилирована в макрофункцию без параметров: MACRO: J #ЗХЕС Р(01. , 02., 0Х. ) ; Если необходим контроль за соответствием фактических и формальных параметров, то макрофункцию без параметров можно перекомпилиро¬ вать в макрофункпию с параметрами: MACRO.- р [* 1 2 ... к *3 «EXEC F(01., 02., ...,0К.) ; Тело макрофункции является строкой, поэтому к телам макро¬ функций применимы зсе операции над строками. Кроме этого, в языке определена еще одна операция MACRO, предназначенная для преоб¬ разования произвольной строки в тело макродункции: "S" MACRO N F Если F - имя строки или макрофункции, то операция macro после¬ довательно заменяет каждое вхождение строки з з F на параметр % я. . Вызов этой операции эквивалентен нормальному алгоритму с одной подстановкой: S-»0W. , на вход которому подается строка или тело макрофункции Р . Модули. Понятие модуля аналогично понятию открытой подпро¬ граммы. Его описание имеет вид <префикс> М01>:К...ХЕ*инабор описаний» ^суперпозиция функций»;
50 В набор описаний входят описания функций и модулей. Хотя тело мо¬ дуля может содержать произвольную последовательность действий, а совокупность описаний может быть л пустой, тем не менее главное предназначение моду’ля - быть хранилищем множества описаний. Вызов модуля открывает доступ к хранимым в нем описаниям функций и дру¬ гих мо.пулей, освобождение ( FREE И ) или закрытие модуля ( CLOSE М ) закрывает доступ. Закрытие модуля создает новый эк¬ земпляр описания модуля с тем же именем, если при обращении к но¬ му его тело копировалось. Старое описание сохраняется. Функции, к которым.был открыт доступ, могут меняться в процессе вычисления и при закрытии модуля его новый экземпляр будет содержать модифици¬ рованные описания функций. Вместо закрытия можно освободить мо¬ дуль. В этом случае новый экземпляр модуля не создается. Освобож¬ дение модуля выбрасывает последнее описание и открывает доступ к предыдущему. В отличие от функции имя модуля может быть пустым словом. Если описание модуля не содержит имени, то после его выполнения его адрес остается в стеке. Такие ?лодули можно использовать ана¬ логично блокам компилируемых языков, локализующим имена описанных в них объектов. Но модуль без имени является понятием более широ¬ ким, чем блок, п,ак как он позволяет какие-то объекты сделать ло¬ кальными, а какие-то - глобгльными. Те описания функций в теле модуля, которые были обработаны в режиме компиляции, остаются в сгенерированном описании модуля, и последовательность действий DUP .free EXEC сделает только их глобальными. Операция ЕХЕО сделает все описания, содержащиеся в модуле, глобальными. Опера- тдеч .FREE закроет доступ ко всем описаниям - и лишь в этом слу¬ чае модуль без имени идентичен блоку. Описание модуля, также как и описание функции, может содержать префикс. I) Пустой префикс. Понятие модуля, описание которого не со¬ держит префикса, аналогично понятию словаря языка Форт. Такие мо¬ дули в основном предназначены для хранения совокупности описаний функций и других модулей, которые могут быть одновременно вызваны и одновременно освобождены. Единственное отличие от словаря - при высове модуля выполняется последовательность действий (которая
51 может быть и пустой), записанная в нем в виде суперпозиции функций. 2) Префикс СОМР.Этот префикс в заголовке описания модуля м указывает на то, что при обращении к модулю М его тело всегда бу¬ дет компилироваться. Модули с таким префиксом, как правило, служат средством задания шаблонов памяти и действий. Другими словами: мо¬ дули с префиксом СОМР - это определяющие конструкции, частными слу¬ чаями которых являются абстрактные типы данных, записи (структуры) с вариантами, конструкция CREATE - DOES * языка.Форт, понятие класса в языке Симула-67, понятие объекта в языке Смолток и т.п. 3) Префикс EXEG . Наличие этого префикса в описании модуля означает, что модуль и все описанные р нем функции и модули всег¬ да выполняются независимо от режима выполнения. Тольке управляемая интерпретация может остановить их выполнение. Модули с этим префи¬ ксом незаменимы торда, когда выполняемая часть программы описыва¬ ется гораздо легче., чем ее компилируемая часть. Нередко при акти¬ визации исходной информации ее компилируемую часть либо невозмож¬ но описать, либо описание получается слишком громоздким. 4) Префикс ALLOT . Наличие этого префикса в списании модуля означает, что старое описание (если оно было) сохраняется, но ста¬ новится недоступным для использования. Освобождение модуля вновь открывает доступ к старому описанию. Таким образом, этот префикс по отношению к модулю действует так же, как и по отношению к функ¬ ции. Вызов функции, описанной с этим префиксом копирует ее тело в активный стек, при вызове модуля его тело копируется в область доступных для использования функций и модулей, открывая доступ ко всем описанным в нем функциям и модулям. В этом случае при за¬ крытии модуля создается экземпляр его нового описания. Старое опи¬ сание сохраняется, но до освобождения нового экземпляра остается недоступным для использования. Новый экземпляр может отличаться от старого как набором функций и модулей (так как до создания но¬ вого экземпляра некоторые из них кохут быть освобождены, могут быть порождены новые описания функций с префиксе?! allot ), так и тем, что описания функций и модулей могут изменяться в процес¬ се вычисления. Основное назначение модулей с префиксом allot - это создание достаточно эффективных недетерминированных процессов
52 о) Префикс itdet . Этот префикс вводит описание недетермини¬ рованного модуля. Способ выполнения такого модуля аналогичен спо¬ собу выполнения недетерминированной функции. Вызов определяет точ¬ ку возврата. При возврате вызывается следующий экземпляр описа¬ ния модуля с тем же именем. 6) Префикс PAR . Этот префикс ь заголовке модуля определя¬ ет его как параллельный. Вызов такого модуля, как и вызов функции, инициирует множество параллельных процессов. Все модули этого типа глобальны, т.е. все функции, содержащиеся в них, до¬ ступны во всех параллельных процессах. Оператор free м освобож¬ дает лишь один экземпляр модуля М - динамически последний. Ос¬ вободить все экземпляры модуля можно при помощи цикла: ЦИКЛ FREE М КЦ. В общем случае параллельные процессы нельзя промо¬ делировать на однопроцессорной машине - разве лиш-> мельчайшим квантованием времени. Это объясняется тем, что любой параллель¬ ный процесс может вмешаться в работу открытого (незащищенного) процесса в непредсказуемые моменты времени и существенно изменить его работу. Обычным приемом такого вмешательства является вызов глобальных параллельных модулей, которые могут прикрыть (сделать недоступными) все работающие функции, или освободить какие-то модули, чем можно немедленно остановить любой незащищенный про¬ цесс или, наконец, просто изменить некоторые глобальные функции. 7) Префикс CONTROL . Изменение или переопределение любой функции или модуля, содержащихся в теле модуля к , описанного с префиксом control , вызывает передачу управления модулю и . Управляемая интерпретация. Выполнение программы осуществля¬ ется стандартным интерпретатором, который организует обращение к функции или модулю и возврат после их выполнения. Можно счи¬ тать, что стандартный интерпретатор выполняет одну операцию 3VAL - выполнить. Имя функции (ее адрес компиляции) поступает в стек, после чего выполняется операция eval. Поэтому если стандартному интерпретатору дать имя si , то он может быть опи¬ сан в виде INTERPRET: SI EVAL ; Язык Алмаз содержит средства динамического управления про¬ цессом интерпретации: стандартный интерпретатор может быть заме-
53 нен другим интерпретатором, который должен быть описан в програм¬ ме либо как интерпретатор с параметрами: * префикс* INTERPRET; • I Г* ?1 ?2,..гм *3 «суперпозиция функций» ; либо без параметров: •«префикс-’ INTERPRET; I «суперпозиция функций >; Параметрами интерпретатора могут быть имена функций, модулей или интерпретаторов. Если интерпретатор имеет параметры, то обращение к нему про¬ исходит в момент обращения к одному из его параметров: имя Pi ос¬ тается на стеке, а действия интерпретатора, описанные в нем в ви¬ де суперпозиции функций, выполняются в режиме стандартного интер¬ претатора. Если имя не входит в список работающего в данный мо¬ мент интерпретатора, то оно не выполняется, а компилируется. Ес¬ ли интерпретатор не имеет параметров, то обращение к нему проис¬ ходит при каждом обращении к любой функции (или модулю). Стандар¬ тный интерпретатор является интерпретатором без параметров. Вызов интерпретатора 11 закрывает доступ к работающему в данный момент интерпретатору 12 . Оператор free II вновь отк¬ рывает доступ к интерпретатору 12 . В качестве примера рассмот¬ рим интерпретатор F : interpret: f l« р *1 .FREE ; После вызова интерпретатора Р все функции будут компилировать¬ ся. Второе обращение к Р передаст управление ранее работавшему интерпретатору. Если это был стандартный интерпретатор, то бу¬ дет возобновлено стандартное выполнение программы. Списание интерпретатора может содержать префикс. Этот пре¬ фикс переносится на каждое обращение без префикса к описанной функции или модулю. На числа, строки, списки и другие данные префикс не переносится. Не переносится он и на стандартные опе¬ рации и на те обращения, которые уже имеют префикс. Управляемая интерпретация является мошным средством прог¬ раммирования. Она позволяет менять режим выполнения программы в широком диапазоне - от полней интерпретации (в режиме отладки, трассировки, частичного выполнения и т.п.) до полной компиляции. Механизм управляемой интерпретации перекрывает возможности пре¬ процессоров, макрогенераторов и языков, в которых реализованы
54 режимы компиляции-выполнения. В то же время реализация управляе¬ мой интерпретации не сложнее реализации обычных функций. Грамматики. Грамматики служат средством перевода с одного языка на другой, средством интерпретации, активизации и внешней обработки произвольных текстов. При интерпретации исходный текст рассматривается как программа на языке Алмаз и выполняется. Акти¬ визация исходного текста совпадает с его переводом на язык Алмаз. Внешняя обработка выполняется с помощью операции отождествления, для определения которой необходимо задать грамматику. Перевод с языка Ы на язык L2 является специфическим частным случаем ин¬ терпретации текста на языке Ы при помощи конструкций языка ъ2. С этой точки зрения грамматика является посредником между языком Алмаз и другими языками. Описать грамматику языка l значит за¬ дать информацию необходимую и достаточную для толкования текста на языке L. Теоретической основой класса грамматик, используемых в язы¬ ке Алмаз, является класс функциональных грамматик. Представление функциональной грамматики в языке Алмаз в виде набора специфичес¬ ких модулей определяет новую конструкцию языка. Она является не¬ которым обобщением понятия модуля, более точным названием которо¬ го могло бы служить выражение "грамматический модуль" - модуль, предназначенный для представления функциональной грамматики. По¬ этому термин "грамматика" является сокращением выражения "грам¬ матический модуль". Выполнение описания грамматики отображает ее в обычный модуль. Описание грамматики имеет вид GRAMMAR: g i* F1 у2...и! *]-«описание функций* •< правила» ; Каждое правило имеет вид :Р Р1 Р2 ... ис ; . Все символы грам¬ матики представлены в виде слов и делятся на четыре класса:тер- минальные, нетерминальные, функциональные и прочие (или иденти¬ фикаторы). Последнее название объясняется тем, что при описании реальных языков программирования "прочими" оказываются идентифи¬ каторы. Список терминальных символов грамматики представлен в виде функции T2RM , список нетерминальных символов - в виде фу¬ нкций NTER2-I . Символ является функциональным, если он является именем функции, описанной в разделе "описания функций". Начальным
55 символом грамматики является первый символ функции ntbrm . Все прочие символы имеют одинаковое описание, которое задается функ¬ цией other : символ поступает в стек, после чего выполняется функция OTHER . Функции TERM , NTSRM И OTHER ДОЛЖНЫ быть описа- ны в разделе < описания функций *. Выполнение описания грамматики заключается в пъстрсении мо¬ дуля М , содержащего функции, необходимые для синтаксического анализа. Вначале- для каждого правила: а ♦ 'f Определяются мно¬ жества FIRST(A) терминалов, каждый из которых удовлетворяет ус¬ ловию: если ха'г' - сентенциальная форма и из ха'И выводима цепочка хау ( х, у - терминальные цепочки), то a «first (А) . Затем если Ф « а| , то строится функция: Аа £ ; если ч’’ » где В - ‘етерминал, то строится функция: Аа ве $ ; , если ч’ пусто, то . функция: Аа ЖДАТЬ а; . Если в результате построения функций появилось несколько описаний с одним именем аа , то к таким описаниям добавляется префикс ndet . Модуль и содержит все функции, описанные в грамматике, и вновь построенные функции. Грамматика после выполнения ее описания превращается в мо¬ дуль, поэтому префиксы comp, ехео, allot и controls заголов¬ ке ее описания имеют тот же смысл, что и для модуля. Префикс PAR в описании грамматики о означает, что после ее вызова раз¬ бор исходного предложения проводится сразу во всех грамматиках, имеющих имя с . Построенные после разбора суперпозиции выполня¬ ются параллельно. Префикс NDET в описании грамматики имеет су¬ щественно другой смысл, чем в описании модуля. Этот префикс оз¬ начает, что исходная грамматика недетерминированная, т.е. по исходному предложению может быть построено несколько соответст¬ вующих ему суперпозиций. После разбора все эти суперпозиции вы¬ полняются параллельно. Операция отождествления. Эта операция реализует один из ча¬ стных видов систем словарных уравнений. Пусть у1,у2,...,уп - произвольные множества слов в некотором алфавите % . Система уравнений имеет вид Ъ = % > ,
56 где 47i, (i -* i * ю) - слова в алфавите >. v [zk j (1 * j < J, 1 p 5 n, 1 « к < к), x. - параметры системы, zk - j p неизвестные. При заданном наборе слов (х°,х2 х°) требуется .и. V V найти решение системы, т.е. множество слов таких, что вр6Ур* Если и = J, слова Т* не содержат параметров х^ f мно¬ жества ур описываются КС-грамматикой, то такая система уравнений определяет операцию отождествления, аргументами которой являются к1 ^2 переменные Xj, результатом - решение (и1 ,z2 ,т.е. набор слов, превращающих уравнение в тождество. В общем случае эта опе- ция является недетерминированной. Реализация операции отождествления в общем виде приводит к громоздкой и неэффективной интерпретации с экспоненциальными вре¬ менными оценками. Однако как средство описания алгоритмов, ориен¬ тированных на человека, эта операция в классе текстовых задач не¬ заменима . Управляющая система. Управляющая система - это интерпретатор, который может содержать описания модулей, интерпретаторов и грам¬ матик, и, главное, расположенный в управляющей памяти. До сих пор управляющая память рассматривалась как черный ящик, в котором хра¬ нятся в виде упорядоченного списка имена функций. Такую память можно представить в виде одной функции : А А1 А2 ... AN ; где А1 - имена, как правило, неописанных функций. Все операции, работающие с управляющей памятью, легко описать как операции со списком А. Таким образом, управляющая память представляет собой стандартную управляющую систему с фиксированным набором операций, Описание управляющей системы дает возможность влиять на вы¬ полнение до сих пор неуправляемых процессов. Прежде всего это от¬ косится к параллельным процессам. Управляющая система с парамет¬ рами реагирует только на обращение к функциям или модулям, являю¬ щимся ее параметрами. Освобождение системы может навсегда остано¬ вить приостановленные процессы: вызов новой управляющей системы закрывает доступ е управляющей памяти, а тем самым закрывает воз¬
57 можность запустить приостановленные процессы до освобождения вновь вызванной системы. Управляющая система в общем случае полностью идентична прог¬ рамме, использующей все описанные средства языка, но находящейся как бы во втором слое памяти, недоступном для первого слоя, и вы¬ полняющаяся в привилегированном режиме. Описание управляющей сис¬ темы может содержать описания других управляющих систем, которые образуют третий слой памяти, недоступный для второго. В принципе нет причин ограничивать количество таких слоев: система, описан¬ ная в системе i-го слоя,образует (f + 1)-й слой. Системы, опи¬ санные независимо одна от другой, образуют слои, недоступные друг для друга. Управляющая система - это операционная система языка высоко¬ го уровня, причем операцио!шая система, меняющаяся динамически в зависимости от требований решаемой задачи. Итак, мы привели здесь теоретические предпосылки, определяю¬ щие направление поиска основ языка представления знаний, и пред¬ ложили вариант абстрактного языка этого класса. Заметим, что в основания математики положена теория множеств. Парадоксы теории множеств делают эти основания хрупкими. Их можно сделать более прочными, если заменить теорию множеств теорией языков. С точки зрения теории языков, одни семантические парадок¬ сы (типа: "Я всегда лгу") представляют собой разновидность "дур¬ ной" рекурсии и легко разрешимы, другие (когда по множеству стро¬ ится не принадлежащий этому множеству элемент) по существу не яв¬ ляются парадоксами: по любому языку можно построить семантически правильное предложение, смысл которого невыразим на данном языке. К сожалению, мы очень коротко обсудили эти вопросы. Безус¬ ловно они заслуживают более подробного изложения.
58 Глава 2. СИСТЕМА ОБРАБОТКИ СЛОЖНООРГАНИЗОВАННОЙ ИНФОРМАЦИИ В первой главе содержится обитая постановка проблемы, решение которой позволило бы ответить на вопрос, каким должен быть язык представления знаний. Этот язык должен поддерживать функциональ¬ ные методы программирования. Следовательно, он должен иметь раз¬ витую структуру управления, в частности, содержать средства опи¬ сания недетерминированных и параллельных процессов. Кроме того, он должен поддерживать принцип активизации, т.е. должен содержать средства преобразования пассивных данных в активные. Наконец, он должен обеспечивать возможность перехода от математической форму¬ лировки задачи к решающему ее алгоритму. Таким образом, если со¬ держание предыдущей главы сводилось к ответу на основной вопрос, "что должен делать язык", то содержание данной главы сводится к описанию того, "что язык может". Точнее что может система обработ¬ ки информации, цель построения которой заключалось в реализации возможностей языка представления знаний. Но главное не в том, что она может, а в том, как ей удается делать то, что она может. Основная цель данной главы - на примере конкретной системы обработки информации раскрыть сущность функционального подхода к программированию. Поэтому описание системы и ее возможностей име¬ ет второстепенное значение по сравнению с описанием методов ее реализации. Точное описание методов реализации невозможно без яв¬ ного предъявления текстов программ: именно в текстах программ за¬ ключается сущность подхода. Сказанное в какой-то степени должно служить оправданием (на первый взгляд кажущейся> перегруженности описания системы текстами программ. Система реализована в виде набора функций на языке Форт-83. Поэтому для полного понимания ее описания необходимо знать язык Форт. Книга С.Н.Баранова и Н.Р.Ноздрунова С Заявляется неплохим учебником по этому языку. Инициатива реализации системы принадле¬ жит А.А.Титову. Без его участия язык представления знаний остался бы абстрактным языком программирования. § I. Обработка списков Список - это последовательность элементов, взятая, в круглые скобки. Поскольку в языке Форт круглые скобки являются ограничи-
59 телями комментариев, то для изображения круглых скобок использу¬ ются слова ($ и $). Элементами списка могут быть числа, иденти¬ фикаторы, списки, ссылки, массивы чисел, массивы ссылок и функ¬ ции. Представление списков. Список после компиляции представляет собой суперпозицию функций, содержащую обращения к векторным пе¬ ременным NUM , ip , LS , rep, arrnum, arref и FUNC . Каждая такая переменная связывается с соответствующим элементом списка. Спи¬ сок преобразуется в активную форму в процессе компиляции. Левая скобка заменяется на последовательность ("w) 1 call , правая - на EXIT IS , Это преобразование осуществляется функциями (0 и 0). : (М R3) 2+ R» DUP +■ >ft ; : LENGTH! HERE OVER - ЗУАР ! ; :((0) COMPILE e*w) HERE 0 , CALL , ; ; (0)) COMPILE EXIT LENGrnH! COMPILE LS ; : (0 ((0) 12 ; IMMEDIATE : 0) 12 * * IP. " ? 0) - НЕПАРНЫЕ СКОБКИ OR QUIT THEN (0)) ; IMMEDIATE Число представляется в виде LITA* число» NUM , идентифи¬ катор - (")* строка со счетчиком* ID , ссылка - LITAREP* ад¬ рес* RBP , массив чисел - (-'wJanum 1 * последовательность чи¬ сел * ARRNUM , массив ссылок •• ("w)AREF 1* последовательность адресов * ARREF , функция - ("w)func 1 CALL * тело функции »PUNC« 1 - длина последовательности в байтах, CALL - метка входа в адресный интерпретатор. Функции LITA и LITAREP имеют идентичные описания: ; LITA R* DUP 2+ »R ; Функции ("*/)» ("w)ANUM , ("w)arep и ("w)eunc также имеют одинаковые описания. Дублирование функций необходимо для того, чтобы по их кодам компиляции можно было идентифицировать тип элемента. Пример. Список (0 АВО 4 (0 EPfRET] 0)|F 2 15 18 N/ [R SWAP DROP Rl [F Ri 2+ DROP P] (0 fARRNUM] 4 fARREP] 20) 0) в процессе компиляции преобразуется в последовательность: (*w) 116 CALL (") 3 ABC ID LTTA 4 NUM (”w) 20 CALL (*) 2 EP 0 ID LITAREP 0 REP EXIT LS ("w)ANUM 8 2 15 18 ARRNUM(*w)AREP 6 SWAP DROP ARRE
60 ("w)FUNC 10 CALL Ru) 2+ DROP FUNC (Hw) 30 CALL ('W )ANUM 10 0 0 0 0 ARRNUM (hw)AREF 6 0 0 ARREF EXIT LS EXIT LS . Ввод списка и преобразование его в суперпозицию функций осу¬ ществляет функция INLIST. Скобки [N, N] , [R, Н} , |? И F] ЯВЛЯЮТ¬ СЯ функциями немедленного действия, описание которых аналогично описанию функций (0 и 00. Адрес метки call, которую компилирует функция (0 является адресом компиляции списка. Передача управ¬ ления по этому адресу инициирует выполнение списка. Эти адреса могут быть значениями списковых переменных или находиться в ад¬ ресном стеке. Необходимость в адресном стеке возникла в связи со сборкой мусора: адрес в арифметическом стеке невозможно отличить от числа. Списковые переменные описываются при помощи конструкции LISTVAR: LISTVAR N F1 ?2 ... FN Все они оформляются в виде активизированного .списка и с каждым описанием переменной связывается векторная переменная мд . Такое представление переменных дает возможность производить любые дей¬ ствия с их описаниями. Для работы с адресным стеком построен набор операций, анало¬ гичных операциям с арифметическим стеком: ?А - заслать элемент в адресный стек; А> - положить на стек верхний элемент адресного стека; Ад) - скопировать в стек верхний элемент адресного стека; N AREVER - переставить в обратном порядке к элементов ад¬ ресного стека; :ЕХЕС А> EXECUTE ; Операции ADUP, ADROP, AOVER, ASWAP, AROT.APICK, AROLL ПОЛНОСТЬЮ аналогичны операциям вир, drop и т.д. Операции ?КЦМ, ?П), ?LS, ?ref, ?arrnum,?arref,?runc пРе~ дназначены для распознавания типа элемента списка. Операция MODE вырабатывает значение 1 (1?1«8) , соответствующее типу эле¬ мента. Если 1 « 1 , то элемент является числом, если 1=2, то идентификатором и т.д. Если 1 = 8 , то тип элемента не распознан, что соответствует чаще всего ошибочной ситуации. Функ 1ИЯ ARRKFP : XARREPP DUP DUP 2- а) 4- 2~ SWAP
61 ?D0 I REF 2 +LOOP | позволяет обрабатывать массив ссылок, как бы-превращая его в по¬ следовательность элементов типа "ссылка". Аналогичное описание (вместо переменной REF - переменная NUM} имеет функция ARRNUMP Функции (:, (*,*) предназначены для присваивания зна¬ чений векторным переменным NUM, id и т.д. 3 результате выполне¬ ния суперпозиции (: Р1 Р2 рЗ Р4 Р5 Рб р7 j) переменная NUM примет значение Р1 , переменная id - значение F2 и т.д. После выполнения последовательности (* р *) вс пе¬ ременные будут иметь одно и то же значение?. Операции над списками. Функция LEN подсчитывает число эле¬ ментов списка. Она использует один фактический параметр: ; LENP DROP 1+ ; ; LEN (♦ LENP *) О EXEC j Функция - первая функция, запрограммированная в функциональ¬ ном стиле, поэтому рассмотрим подробнее процесс ее выполнения. Адрес списка, который является аргументом этой функции, находит¬ ся на вершине адресного стека. Функция len вначале присваивает всем векторным переменным NUM, п> и т.д. адрес компиляции функ¬ ции bENp е Далее она кладет на стек ноль и передает управле¬ ние списку. При выполнении списка функции ("), (”w ) и т.д. ос¬ тавляют на стеке адрес соответствующего элемента и передает уп¬ равление на векторные переменные. Каждая из этих переменных вы¬ полняет функцию ЬЕ№ , т.е. выбрасывает из стека адрес и прибав¬ ляет к верхнему элементу стека единицу. (Вначале на стеке нахо¬ дится число 0.) После выхода из списка на стеке останется число элементов этого списка. Функция ADD2 находит сумму всех чисел списка: : ADD2P Q +• ; : ADD2 ( : ADD2P DROP tSXECUTE REPP ARRNUJJP ARREPP DROP :) 0 EXEO ; Вначале функция ADD2 присваивает значения векторным перзменнш- параметрам списка. Параметр NUM получает значении add2p , па¬ раметр ID- значение DROP и т.д. Функция repp -- достаточно уни¬ версальный фактический параметр для переменной rep. Эта функция разыменовывает ссылку и в зависимости от типа элемента работа-, г
62 либо как тгим , либо кек ID , либо как ls , либо как rep (в дан¬ ном случае снова обращается сама к себе), либо xkkarrnum > ли¬ бо как ARRJSF , либо как Уикс . При этом циклические ссылки обра¬ батываются один раз. Если на вход функции add2 подать список, рассмотренный выпе в примере, то после ее выполнения на стеке останется число 39. Функция ELEM вычисляет адрес i-го элемента списка; : ELEMP >А 2DUP = IP 2DR0P 0 RDROP ELSE 1 + ADROP THEN ; ; ELEM ( * ELEMP *) 1 EXEC IP • •и —? ELEM — НжХОД ЗА ДИАПАЗОН ' OR QUIT THEN’ При обращении к функции ELEM индекс 1 должен находиться на оте¬ ке, адрес списка - на адресном стеке. Функция ELEMP кладет адрес элемента на адресный стек и сравнивает текущий индекс с индексом 1 . При их совпадении на стеке остается ноль , в адресном сте¬ ке - искомый адрес, операция RDROP осуществит выход из списка. При несовпадении к текущему индексу добавится единица, а адрес, положенн|Д в .адресный стек, будет выброшен операцией ADROP , Функ-.’ия RELEM находит Ь-й с правого конца элемент списка; : RKT EM ADUP LEN SWAP “ 1+ ELEM ; Функция COPY копирует на воршину словаря не только списки, но и элементы других типов." : KJOPYP (HAPAiASTP ДЛЯ ©ПИРОВАНИЯ ИДЕНТИФИКАТОРА) DUP 2- HERE ROT 02) 5 + » CELLS DUP ALLOT CMOVE ? STACK ; : NRCOFYP (ПАРАМЕТР ДЛЯ ©ПИРОВАШЯ ЧИСЛА ИЛИ ССЫЛКИ) 2“ HERE 6 ALLOT б CHOPS ?STACK ; : ADCOPYP (ПАРАМЕТР ДЛЯ КОПИРОВАНИЯ СПИСКА, МАССИВА ИЛИ ФУНКЦИИ) 4 “ DUP 2+3 4 + HERE SWAP DUP ALLOT CMOVE ?STACK ; : ICOPY (КОПИРОВАНИЕ даПИФИКАТЭРА) A* HERE 2-»- >A ICOPYP ; : nrcopy (КОПИРОВАНИЕ ЧИСЛА ИЛИ ССЫЛКИ) A* HERE 2+ NRCOPYP ; ; ALCOPY (КОДИРОВАНИЕ СПИСКА, МАССИВА ИЛИ ФУНКЦИИ) А=* KERB 4 + ’A ALCOPYP ;
63 : COPY (КОПИРОВАНИЕ ЭЛЕМЕНТА СПИСКА) ? ID IP KOPY ELSE ?NUF ’REP (Ж ТУ NRCOPT ELSE ?LS 7ARRNUM 7ARREF 7FUNC OR OR OR IP ALCOPY ELSE . ” ?COPY - НЕПРАВИЛЬНЫЙ ЭЛВМСГГ * OR QUIT TEEN THEN THEN ; Функция SEO строит по исходному списку новый список, кото¬ рый не содержит внутренних скобок и ссылок. В построенном списке могут остаться лишь висячие ссылки: ; SEQ (: NRCOPYP ICOPYP EXECUTE REEP ALOOPYE ARREFP A IO OPYE :) HERB 4 + *A ASWAP ((0) EXEC (0)) ; Функция CAR копирует первый элемент списка на вершину сло¬ варя.’ : CARP *А COPY RDROP s : CAR (* CARP *) EXEC : Функция CON’S вставляет значение первого аргумента в качест¬ ве первого элемента в список, который является эн?пением второго аргумента С : 00N3P *А COPY ADROP ; : CONS (* OC8TSP *) HERE 4 * *A 3 aREVER ((0) COPY ADROP EXEC (0)) ; Функция ODR по ис,одному списку строит новый список, выбра¬ сывая первый элемент исходного списка: : CDRP (* CONSP *) DROP • : CDR (* CDRP *) HERE 4 + A SWAP ((0) EXEC CJ9)) ; Функция ADMAX оставляет на стеке ат,рес максимального числа списка: : ADFAXP DUE ’R OVER * IF 2DROP R=> DUP a) ELSE RDROP THEN ; : ADMAX (: ADMAXP DROP EXECUTE REPP ARRNUKP ARREFP DROP :) О -32768 EXEC DROP *A j
64 Функция null определяет, пуст ли список. Эта функция не ис- пользует функциональное представление списка: : NULL А» 2- 3) б = Функция listdepth вычисляет максимальную глубину вложен¬ ности подсписков в список: : LISTDEPTHP ’R 1+ 2DUP * IF PRESS DUP THEN R* EXECUTE 1- : : LISTDEPTH (: DROP DROP LISTDEPTHP REPP DROP ARREFP DROP t) О О EXEC DROP j Функция LLI3T формирует один список из к элементов, адре¬ са которых находятся в адресном стеке. Число к должно находить¬ ся но стеке: :LLIST DUP AREVER ((И) ’ll О DO COPY ADROP LOOP R© (»)) R* 2+ >A ; Функция NCTNLIST конкатенирует n списков. Число к должно быть на стеке.' :»CWLIST (♦ CONSP *) DUP AREVER ( (Й) О DO EXEO LOOP Rd (»)) R> 2+ *A » Функция CTNLIST строит конкатенацию двух списков: : CTNLIST (» DONSP *) ((®) ASWAP EXEO EXEO DUP 2+ ’А (Ю) ; Функция reverse переставляет в обратном порядке элементы списка. Порядок расположения элементов в подсписках остается пр* кним: : I.REV о EXEO HERE 4 ♦ ((») ROT О DO COPY ADROP LOOP (»)) ’A S : REVERSED ’ft 1* t : REVERSE (* REVERSE? *) LREV • Функция revl реверсирует порядок элементов списка и всех Подсписков списка: : REVLP *ft LREV 1+ j : REVL (* REVERSED *) LS< REVTP LREV : Функция EQUAL проверяет на равенство элементы списка. : ТЕО UAL DI ГР Сй 1+ « CELLS EQU J : NEQUAL 'd SWAP a> »; : LEQUAL DUP 2* <5 EQU :
65 : EQU OVER ч- SWAP ?DO I '<0 OVER * * IF DROP FALSE LEAVE ELSE 2+ THEN 2 H-OOP • : EQUAL А* ?ю J? A* EQUAL ELSE ?NU14 ?RSF OH IF A* IF.EQUAL ELSE A* LEOUAL THEN THEN : Функция MEMBER определяет, является ли первый аргумент членом списка, который является вторым аргументом; : IEQUP DUP Ae> EQUAL Е OUTL ELSE DROP THEN ; : LEQUP DUP A Tv LEQUAL E OUTL ELSE DUP 2— 'Si An) 2” * IF EXECUTE ELSE DROP THEN THEN ; : AKEQUP DUP A» LSQUAL IF OUTL ELSE DROP THEN ; : AREQUP DUP *R ANEQUP R* ARREFP J : MEMSERP fp NUM* NEOU? ABRHUIX AHRNUMP FJ £P ID* EQuP Fj fP LS* LEQUP i'J [F REF< NEQUP FJ ГР ARRNUM* AIIEQUP FJ £F ARRET* AREQUP FJ C? FUNC* ANEQUP FJ £F .*?MEHBER~ HE ЭЛсМНГГ СПИСКА" QUPT FJ ; : MEMBER (* DROP *) LS* EXECUTE REP* REFP ARREF* ARREFP MODE FELEiFiX MSI4B2RP 0 >R EXECUTE Ra> IF ADROP >A TRUE ELSE RDROP FALSE THEN ; §2. Операции над множествами Множество представляется в виде массива ссылок. Функция ORDER упорядочивает массив чисел пс возрастании. : ORDEi<P DUP *R 5) 2DUP * IP Rn) 2- I R2) ! ADROP FALSE *t- ELSE 2DR0P THEN R* j : ORDER REF1* ORDERS
66 BEGIN -32768 fta> TRUE *i. ARREFP1 DROP A* UNTIL ADROP ; Здесь функция ARREFP1 аналогична описанной выше функции arrefp. Переменная rep в ней заменена на переменную refi • Фу¬ нкция REF1* присваивает векторной переменной refi значение ORDERP. Функция UNION по двум множествам строит их объединение. Функции SETP1.SETP2 и SETP3 - вспомогательные функции, которые являются фактическими параметрами переменных: :SETP1 ъ over = IF OUT? THEN : :SET22 rt) Afll 0 >R APJtEFP RJC DUP IFNOT PJDROP THEN NUM IF DROP ELSE , THEN ; :SET?3 DUP IFNOT 2 АЭ 2~ +! THEN ; : UNION HERE 2+ Д* COPY ”2 ALLOT REF* SETP1 R.EF1* SETP2 NUM* 0* AI-REFP1 LENGTH! COMPILE ARREF ; Используемая здесь функция OUTL обеспечивает выход из вложенных списков и циклов: :OUTL BEGIN Л* RS> WHILE DROP REPEAT ADROP =*R ; Функция UNict. вначале копирует на вершину словаря первое множе¬ ство, затем, присваивает переменным ref,refi и ни?< соответст¬ венно значения SETP1, SETP2 и О* ». После этого функция ARWP1 добавляет к скопированному первому множеству те элемен¬ ты из второго множества, которые не содержатся в первом. Функции INTERSECT и Dipp по двум множествам строят со¬ ответственно их пересечение и разность. Функция CREASE! явля¬ ется общей частью для этих функций: : CREASE! COMPILE (”w)AREF HERE 2 , HERE *А 3 REFER REF* SETP1 REF1* S3TP2 A* ARREFP1 ADROP LENGTH! COMPILE ARRE? ; : INTERSECT NUM* 0~ , CREASET ; : DIFF NUM* 0* >• CREASET ; Функция ARR set преобразует массив ссылок в множество. Массив может содержать одинаковые ссылки. Множество не содержит одинаковых, ссылок.
6? :ARR SET HERE 4 + ’A NUM-< SETP3 CREA SET : Функция CUTSET конкатенирует два множества. Результатом в общем случае является не множество, а массив: ;OTNSETP ; ;CTNSET A* COPY “2 ALLOT R£?1< CUTSET? ARREPP1 A'£> 2— LENGTH! COMPILE ARREF : §3. Операции реляционной алгебры Отношения (или реляционное таблицы) е данной системе пред¬ ставлены в форме специфицированного списка с именем: RELATION У IATR А1, ...,AN AIR] (0 <1-й кортеж 0) ... ...(#*к-й кортеж >J0) ENDBEL где RELATION , [ATR.ATR] и етпжеь - функции (три последние - немедленного действия), преобразующие внешнюю форму отношения во внутреннее представление, У - имя отношения, А1 ,а2 an - имена атрибутов, которые должны быть описаны как переменные типа QUA1T, в отличие от обычной реляционной таблицы кортеш может со¬ держать элементы любого из семи типов. Единственное ограничение на кортеж - все кортежи должны содержать одинаковое число элемен¬ тов. Функция RELATION строит заголовок отношения и проверяет на¬ личие левой скобки списка атрибутов - функции ГАТк. Функции fATR и ATR] строят массив ссылок аналогично функциям fR и ад : :ATRJ 1ь ** IF . " ?атн - непарные скобки” CR QUIT THEN LENGTH! COMPILE ARREF fCOMPILE] INLIST j IMMEDIATE JATR COPTILE ("w)aRREP HERE 0,16 BEGIN XDHP AIR] = IP EXECUTE EXIT ELSE , THEN AGAIN • IMMEDIATE • RELATION ?EXEC ("COMPILE] : r DUP I'J fATR ~ IP EXECUTE ELSE , " ?RELATICN - '’LATEST ID. »"H2 ОТНОШЕНИЕ" CR QUIT THEN ; Функция ENDREL производит преобразование введенных корте¬ жей : все векторные переменные - num , И , LS , деу , arrnum,arref
68 и TUNC она заменяет на адреса компиляции функций, ТО А1 , Т0А2>#< ...» То an . Векторные переменные остаются лишь при массиве атри¬ бутов (переменная ARR3F) и при каждом списке, который представ¬ ляет кортеж (переменная LS), Функция ATR! заменяет векторную пе¬ ременную на адрес компиляции функции ТО Ai : : ATR! DROP 4 + RD 2- ! ; : LSATP. AT LS SWAP (* ATR! *) AD ARREFa) AS 2~ 2/ REVER EXECUTE TO LS ; Функция LSATR является параметром для векторной переменной LS. Эта функция вначале сохраняет на стеке значение параметра LS - адрес компиляции функции LSATR, затем присваивает всем векторным переменным значение ATR! . После этого считывает в стек из адрес¬ ного стека адреса компиляции переменных А1 , А2дн , пере¬ ставляет в обратном порядке ( N+ I) элементов стека, так что на стеке оказывается адрес списка (кортежа), и передает ему управле¬ ние, Восстановив значение переменной LS , функция LSATR заканчи¬ вает свою работу,’ : ENLREL COMPILE ; LS* LSATR ARREF* >A LATEST NAME* EXECUTE ADROP RDROP L; ; Вначале функция undrel завершает определение отношения у . Затем она начинает его модифицировать: присваивает переменным LS и ARRE? соответственно значения LSATR и ’А и передает вновь постро¬ енному отношению управление. В результате выполнения отношения г все векторные переменные в каждом кортеже будут заменены на коды компиляции функций то А1. Функция UNICNREL вычисляет объединение двух отношений: » RELFND EXEC ADROP *А COMPILE EXIT : : UNION? DUP *A AOVER MEMBER IF DROP EISE CONSP THEN ADROP; : UNTOURED (* CONSP *) HERE CALL , AOVER EXEC ARREF* DROP LS* UNIONP RFLEND : Функция aNTLRREL вычисляет пересечение двух отношений: ; INTERP *А A OVER MEP3ER IF С CPI THEN ADROP ; : INTERRED HERE CALL , ARREF* CONS? LS* INTER? RELEND ; ФункцияDIFREL вычисляет разность двух отношений.
69 .’DIFREL HEPE CALL , A SWAP ARREF* CONSP LS* UNION? RELEND ; Функция SELECT выбирает из отношения столбцы с именами ат¬ рибутов Ai1tAi2 ,...,Aik . Обращение к этой функции имеет вид [R AijAig ... Aik R1 SELECT Адрес компиляции отношения, из которого идет выборка, должен на¬ ходиться на адресном стеке: ;SELECT -2 ALLOT COMPILE (SELECT) ; IMMEDIATE ; (SELECT) *A HERE CALL , COPY SWAP “2 ALLOT COMPILE ZRREP ARREF* DROP CF 3> EXECUTE CONSP FJ C -2 ALLOT J TO REF fF EXECUTE ((Я) .О ARREFP (®)) Fj f “2 ALLOT 7 TO LS RELEND ; Функция DEC* вычисляет декартово произведение двух отноше¬ ний.* :DEC*P HERE 24- 2 PICK CONSF -4 ALLOT SWAP 2+- HERE OVER 4 - o' 2- DUP ALLOT CMOVE ?STACK LENGTH! ; •DEC* ARREF* RDROP ASVAP AOVSR EXEC ADUP EXEO HERE CALL , *A CTNSET ADROP [F AT LS SWAP LS* DEC*P Aft) EXECUTE DROP TO LS F7 [ -i. ALLOT J TO LS ARREF* DROP RELEND : Функция selects выбирает из отношения все кортежи с задан¬ ным значением атрибута А1. Обращение к этой функции имеет вид SELECT2 Ai * значение * L: Значением может быть элемент любого из семи типов. Адрес компиля¬ ции отношения, из которого идет выборка, должен находиться на адресном стеке.’ ; SELECT2 fCOMPILEj i'l fCOMPUF.J INLIST -2 ALLO1? COMPILE (SELECT2) • IMMEDIATE : SELSCT2P DUP >A EXECUTE OVER EXECUTE *A DUP ’A EQUAL IF COPY THEN ADROP ; : (SELECT2) HERE CALL , »A ASWAP LS* SEWCTP2 ARREF* DROP EXEC 2DR0P СОМРГИ EXH ; Функция RELEQUAL сравнивает два кортежа на равенство значе¬ ний тех атрибутов, которые заданы в виде множества. Адреса кор¬ тежей должны находиться на стеке, адрес множества - на адресном стеке.
70 s RELEQUATP «5 EXECUTE OCNSP ; f R3LEQUAL REP1* RELEQUALP EXECUTE HERE 4 + ((# Aa) ARREFP1 («)) SWAP EXECUTE HERE 4 + ((ST) A* ARREFP 1 (£)) I UP ’A EQUAL SWAP 4 “ HERE - ALLOT ; Функция join соединяет (конкатенирует) те кортежи двух отно¬ шений, у которых совпадают значения общих для обоих отношений ат¬ рибутов. Адреса отношений должны находиться на адресной стеке: : JOIUP ADUP 2l)UP RELEQUAL И? EXECUTE HERE 2+ OVE?. COTS? -4 ALLOT A OVER A* ARREPP1 (Ю) ELSE PROP THEN ; : JOIN HERE CALL , RE?1* RELEQUALP ARREF* RDROP AOVER EXEC ADUP EXEC ARPEF* DROP 2DUP =-A >A DIPP *A INTERPET [P AT LS SWAP LS* JOINT 2 APICK 3XIXJ DROP TO LS PJ L -2 ALLOT J TO LS 3 ROLL EXEC ADROP ADROP ADROP *A COMPILE EXIT ; §4. Моделирование автоматов Конечные автоматы. Конечный автомат задается функцией пере¬ ходов вида 1(а,ор= Qj , где а - символ входного алфавита, Qi и Qj - состояния автомата. Множество состояний конечно и од¬ нозначно идентифицируется набором целых чисел. Поэтому каждое со¬ стояние на языке Форт может быть описано как целочисленная кон¬ станта:! CONSTANT q^. Для каждого символа а построим все пары состояний CQi5»Qjs), такие, что )sq^ (1ss<u) и опре¬ делим функцию а следующим образом: : e^Q. * ... * Q. Q 1 ; 1 Si 3m где функции ♦ и А имеют вид : * *R OVER s- IP DROP R* THEN RDROP ; : 1 » ADORT “ ОШИБКА " ; После этого входная цепочка а, а. ...а, , каждый символ кото- а* х к рой отделен пробелом, представляет собой суперпозицию функций
71 на языке Форт, выполнение которой идентично работе конечного ав¬ томата. Магазинные автоматы. Если конечный автомат представляет со¬ бой частичную функцию *(&£ a. ...a, ,q) , второй аргумент которой 1 х2 Jk имеет элементарную структуру и поэтому его активизация не имеет смысла, то магазинный автомат являемся частичной функцией f^aiai^,,ai^zj’ zj • • •zj»£)»два первых аргумента которой могут быть активизированы. В результате порождаются д’за параллельных про¬ цесса. Рассмотрим вначале случай, когда число состояний автомата равно единице. Детерминированный магазинный автомат с одним со¬ стоянием адекватен тл(1)-ррамматике. Поскольку синтаксический анализ в этом классе грамматик сам по себе имеет важное практи¬ ческое значение, рассмотрим проблему построения конструкторов синтаксических анализаторов в классе LL(1)-грамматик. Конструк¬ тором здесь является отображение У , активизирующее класс ъъ(1)“ грамматик. Это отображение каждой грамматике ставит в соответст¬ вие набор описаний функций. По каждому правилу грамматики стро¬ ится одно описание функции: -если правило имеет вид А а где а - терминал,^ - семантическая функция, связанная с данным правилом, то по нему строится функция: : Аа 'У fj. . где ¥ - слово V , все символы которого разделены пробелами; -по правилу А :: НУ {fj,} . где Н - нетерминал и ас first(h) , строится функция: А : ла На "У f* ; -по правилу А :: если а следует за а хотя бы в одной выводимой цепочке, строится функция: : Аа EMPTY : EMPTY 1 1EKPTY • ; Если ограничиться только синтаксическим анализом, то каждая функция может быть определена при помощи конструкции ссмр : ; COMP CREATE DOES* 2“ , • Символы грамматики как терминальные а^,а2,•••»%, тек и нетерми¬
72 нальные А1,А2, ...,Акописываются при помощи конструкции SYMBOLS : : SYMBOL CREATE DOES* 2r ’ТГАМЕ PAUSE EXECUTE ; ’ SYMBOLS 0 DO SYMBOL LOOP j К SYMBOLS А1 A2 ... AM a1 a2 ... < (Ks M + N) VARIABLE 1EMPTY Пример. Грамматика gq: S :: (S зУ {fj i a {f2} , отображается в набор описаний: 4 SYMBOLS S ) а ( ; S( S S ) Л ; : Sa ; Если грамматика не содержит правил с пустыми правыми частя¬ ми, то синтаксический анализатор представляет собой оператор за¬ пуска двух параллельных процессов: START( S У ), где s - начальный символ грамматики, у - функция, имеющая опи¬ сание: ; Р BEGIN BL WORD KIN p£TD 0* 0 ?ERROR PAUSE AGAIN ; * В общем случае синтаксический анализатор запускает на параллель¬ ное выполнение функции и и F: : G 0 1ЕМРТГ ! S ; ; F BEGIN 1EMPTY U 0 1EMFTY t PAD* ELSE BL WORD ’PAD THEN KTN FIND ?ERROR PAUSE AGAIN ; Здесь KTN /PAD и PAD* - функции катенации строк, копирования стро¬ ки с вернины словаря в область PAD и обратно. Анализируемая стро¬ ка должна находиться во входном потоке. По описанию магазинного автомата с многими состояниями на¬ бор необходимых для его моделирования функций строится следующим образом: если команда перехода имеет вид (я.а,с^)-* <'т> »Qj) , где Z- - символ рабочего алфавита, то по нему строится функция: : ZaQf Qj у . если команда перехода имеет вид (Z,-» (V',Qj ) » то стро¬ ится функция: ; ZQj. ВКРТ/ Qj У ;
73 Второй процесс уже при помощи катенации трех символов обра¬ зует имя функции Zaq±t поэтому его описание несколько усложняет¬ ся: : fBEGIN 1 EMPTY я) IF 0 1EMPTY ! ELSE BL WORD THEN 2DUP KTN 2 PICK SWAP KTN BIND IP 2DRCP ELSE KTN PETD 0^ 0 TERROR THEN PAUSE AGAIN ; Магазинные автоматы о N магазинами индуцируют к <- I параллель¬ ный процесс. Структура порождаемых функций остается такой же как и при N - I. Все функции делятся на К классов. Каждый процесс обращается к функциям лишь своего класса. Анализируемая строка порождает ( ^ + 1)-й процесс. Б общем случае имя функции имеет вид: 21Z2...ZN&Q* . Проблема моделирования других классов авто¬ матов легко сводится к моделированию я -магазинных автоматов. §5. Недетерминированные функции Обращение к недетерминированной функции порождает недетерми¬ нированный процесс. Главной проблемой в организации недетермини¬ рованных процессов является проблема восстановления памяти при возвратах. Эта проблема решается достаточно просто, если на неде¬ терминированные функции наложить ряд ограничений. Для функций это вполне естественные ограничения. Во-первых, число аргументов фун¬ кции должно быть фиксированным и одинаковым для всех ее экземпля¬ ров. Зо-вторых, функция не должна стирать информацию з словаре, она может лишь записывать новую, начиная с вершины словаря (ко¬ торую имеет право стирать). В-третьих, при неуспешном выполнении она должна восстанавливать стек данных. При функциональном методе программирования, когда стек данных используется лишь для хране¬ ния аргументов функций, а вся новая информация, не стирая старой, записывается на вершину словаря, эти ограничения можно считать приемлимыми. Возможности описания недетерминированных процессов при этих ограничениях по крайней мере не ниже возможностей языка Пролог. Возможны различные варианты реализации недетерминированных процессов на языке Форт. По-разному можно сводить описания неде¬ терминированных функций, разной может быть и форма обращения к ним, наконец, по-разному можно хранить информацию о точках воз¬ врата. В предлагаемом ниже варианте информация о точках ьозпрата
74 представлена в виде суперпозиции функций, готовой к выполнению. Неуспешное выполнение какой-либо функции передает ей управление, и сна сама восстанавливает память и организует возврат. Эта су¬ перпозиция строится операторами обращений к недетерминированным функциям, которые сами являются действующими суперпозициями функций. Описание недетерминированных функций имеет вид N ND: Р к AR3: Х1 Х2..<.хк # <тэло функции» ... д «тело функции * ND; где N - максимальное число экземпляров функции, К - число аргументов, Х1 , Х2 , ...,хк~ формальные параметры. Не¬ которые экземпляры функции могут быть описаны отдельно в виде # £ * тело функции * ND; или порождаться динамически и присваиваться ? функцией NTO . Функции ND:, ARG: , t? ,ND и NTO имеют описания: : ND: CREATE HERE SWAP DUP 0, 0 С, 1+2* ALLOT DOBS* DUP 1+ CD 2 PICK *1? 1 NPA IL ! EXIT THEN DUP DUP CD 2* 2+ +73 EXECUTE SWAP 2* + Ъ> EXECUTE ; : ARG: HERE 2- >R RS) 0 DO CREATE HERE 2- 0 , LOOP R* HERB R* ! CALL , P DO , COMPILE I LOOP J ; : £ STATE "cu I? COMPILE EXIT ELSE ’’ 2+ THEN HERE OVER ND! CALL , J ; D1MEDIATS : ND! DUP CCD OVER 14- CD 1+ DUP XI < r? 2- ’•NATS ID. ”. ? ~ ПЕРЕЛОЖЕНИЕ” CP. QUIT ELSE DU? 1+ Ra> SWAP C! R* 2* + ! THEN ; ; ND; DROP [COMPILE] ; *, IMMEDIATE : NTO R* DUP 2+ *R ra) 2+ HERE SWA? ND! ; : sh! 2 sii sh 'Л i : С функцией У связывается вектор состояний из и + 2, двух¬ байтовых слов. Первое слоьо содержит числа N и N1 , где N1 фактическое число экземпляров функции р . Это число может менять¬ ся в процессе вычислений. Следующие N слов содержат адреса ком¬ пиляции экземпляров функции ? . Если N1 меньше N , то последние (N_ ni ) слова содержат нуль, (и + 2)-е слово содержит адрес компиляции функции, которая присваивает формальным параметрам значения фактических параметров. Ее создает функция ARG:. Запол¬ нение полей вектора осуществляет функция . Функция ND; выбра¬ сывает адрес компиляции функции Р и завершает ее определение.
75 Обращение к недетерминированной функции & имеет вид SUPER <( h’1 Е2 ... EK)* G . где Е1, е2,...,ек _ выражения, вычисляющие значения фактических параметров, а функция SUPER,<( , )* имеют описания: : SUPER £'7 SUPER1 SH! • s *( Г* : immediate : )» yj -2 ALLOT £C ОГР ILL] f'j COl-iPILE NDCOPY ; IMMEDIATE Функции ■*( и )* компилируют запись вида ("WjFUNC 1 CALL Е1 E2 ... EK EXIT LIT F NDCOPY При выполнении этой записи на стек будут положены адрес начала вычисления фактических параметров и код компиляции функции р , после чего управление будет передано функции NDCOPY . Функция SUPER может отсутзтвэвать в обращении функции р . Ее наличие означает, что при успешном выполнении функции у необходимо пост¬ роить суперпозицию из успешно выполненных экземпляров недетерми¬ нированных функций. Адрес компиляции этой функции остается на стеке. Функция NDCOPY в области, адрес начала которой содержит пе¬ ременная SH , формирует справа налево запись вида CALL ("W)FUNC 1 CALL Е1 E2 ... EK EXIT LS ("W) 11 "стек B03BpaT0B"ARPEP LITA $ RUN LITAREP P REP SUPER1 SUU Адрес компиляции функции SUPER1 в область SH заносит функция SUPER; I NDCOPY ['] SUC- SH ci) DUP a> CALL « IFNOT 2+ THEN ! Cl REF SH! Srf! C'J LITAREP SH! £'J NUM SH! 0 SH! ['J LTVA SH! ['J ARREF SH! RPO R0 5) - DUP BEGIN ?DUD WHILE R* SH! 1“ REPEAT 2+ SH! t'J ("W) SH! f'JLS SH! DUP 4 - SWAP 2~ 2+ SH Ъ OVER - SWAP CMOVE CALL SH! PUSK ; : NREP Э SWAP ; ; SUC NFALL o) IF CALL R* DUP SUPER 1 - IFNOT 2- THEN DUP SH ! ! PUoK ELS:3 RDROP THEN ; ; SUPER1 NFALL О IFNOT (* DROP *) NUM* 3) REF* NREF HERE P SH EXECUTE CALL , DEGIN ?DUP WHILE, REPEAT COMPILE EXIT THEN ; t NDR3 R* RP? S7/AP 2- DUP BEGIN 2“ ?DUP WHILE SWAP 2+ B’ilAT OVER a) >R REPEAT DROP*R ; : NUMS> DUP 1+ OVER ! ;
76 : REF£ "?> EXECUTE ; : PUSK (: NUM<D DROP EXECUTE REFa> DROP NDRci) DROP :) Ъ NFAIT. ! SH 'Si EXECUTE ; В начальный момент SH = sup- 2 . Значением переменнойshP является адоес самого правого конца области хранения информации для возвратов. По этому адресу хранится код компиляции функции FALL : : FAIL ABORT "ПОЛНАЯ НЕУДАЧА" Вся информация, хранимая в области SK , доступна для прог¬ раммиста и он имеет более широкие, чем в языке Пролог.,возможности для управления механизмом возвратов. Допустим, что необходимо ве¬ рнуться к точке вызова функции А , после которой были вызваны недетерминированные функции д),а2 an , все имена которых отличны от А . Этот возврат может осуществить функция return1 : :С OVER = I? DROP R* 4 + *R SUU THEN ; ;RETURN 1 (* DROP *)RI^F* 0 1 NTAILI RS> R'fc 2-t- =*R SHSEXECUTE; Если функция R3TURN1 осуществляет возврат к ближайшей точке вы¬ зова функции А , то функция N RETURN А - к N-й точке ее вы¬ зова (среди функций А1,А2,..,,АМ(и - 1) имен совпадает с д ): : D 1+ DUP *R OVER 2 OVER s ГР 2DROP RDROP R^ 4 + SUC ELSE R> TEEN ; ;RETUR!T (* DROP *)REF< D 1 NFAIL ’Rev ёи R> 2+ >R 0 SHDEXECUTE Параметр NUM позволяет управлять порядком вызова экземпля¬ ров функции при возврате. Допустим, нужно зизвать i-й . экзем¬ пляр последней вызванной функции. Для этого достаточно в качестве вызова фактического параметра для num взять функцию ! : jELEKI (: ! DROP EXECUTE REP A) DROP NDRS> DROP :) DUP SH a) EXECUTE ; Обращение 1 ELEMI осуществит возврат к последней точке вызова недетерминированной функции. Перебор экземпляров этой функции начнется с ее 1-го экземпляра. §6. Сборка мусора "Сборка мусора" - термин, который до сих пор не нашел себе достойной замены, несмотря на неодно:сратные попытки заменить его более подходящим термином. По смыслу более подходят термины "уборка муссра", "выбрасывание м^ссра", "утилизация памяти" и
77 т.п. Но традиция имеет силу закона, поэтому "сборка мусора" - законный термин, который используется всегда, когда речь идет о том, чтобы освободить память от мусора, т.е. от тех значений, к которым нет доступа. Система обработки информации, описанию которой посвящена данная глав?, не может обойтись без сборщика мусора, также кек к любая аналогичная ей система, ь которой значения - списки, отно¬ шения, тексты и т.п. - занимают, как правило, большой объем па¬ мяти, а сами значения и ссылки на них порождаются и уничтожаются динамически в процессе вычислений. Сборщик мусора в данной сис¬ теме запрограммирован в функциональном стиле, что позволяет и да¬ же обязываэт подробно рассмотреть как структуру, так и процесс его выполнения. Сборщик мусора - обычная функция, доступная для использования наравне с другими функциями системы. Он оформлен в виде функции shfl : : SIfFL COMPILE EXIT MARK SMOTE : Вначале функция S1LFL компилирует на вершину словаря функцию EXIT. Затем она отмечает доступные значения, после чего отмеченные зна¬ чения перемещаются на новое место. Первую част» работы выполняет функция MARK, вторую - функция LMOVS, Для того чтобы понять процесс выполнения этих функций, необходимо рассмотреть внутрен¬ нее представление множества переменных и множества значений в памяти ЭВМ. Описание переменных находится внутри программы, представля¬ ющей собой обычный текст на языке Форт, который начинается с фун- кцииЬЗЕСШГ и кончается функцией LENDi :LBEGIK HERE ТО LV0 CALL , (BR : :LEND BR) COMPILE EXIT IN IS TA ; После компиляции программа - это единая функция, адрес компиля¬ ции которой содержится в переменной LV0. Эта функция имеет сле¬ дующую структуру: CALI(BR ... BR)* описания* (BR...BR) * описания* ... ...(BR...BR) ЕХТТ , где * описания* - последовательность списковых переменных, ко¬ торые определяются конструкцией LISTVAR : : LISTVAR *R BR) ((У) R* О ПО ((60 -2 ALLOT QUAN
78 LENGTH! COMPILE AR LOOP (Й)) (BR ; Функции (br и br) компилирует условные переходы, позволяю¬ щие обойти текст (произвольный текст на языке Форт), находящийся между ними: :(BR COMPILE BRANCH КЕЮ? О , 14 ; :BR) 14 ip . « ?BR ) -НаПАРНЫлЛ СКОБКИ" CR QUIT THEN LENGTH! j Функция л; 1STA , к которой обращается функция LEND , иници¬ ализирует адресный сток, под который отводится 200 байтов, и об¬ ласть значений, адрес начала которой присваивается векторной пе¬ ременной LVAL: : IKISTA K3PJS ТО LV 2?<£ ALLOT HERE 2- DTTP DUP 1 ТО А.0 HER3 ТО LVAL CALL , ; Таким образом, область значений также оформляется з виде функции, адрес компиляции которой содержится в переменной lval . Тело этой функции не содержит лишь вхождения функции EXIT - ее компилирует в самом начале своей работы сборщик мусора. В принци¬ пе- вся область значений доступна для использования. Такая возмож¬ ность может быть полезна, особенно в процессе составления и от¬ ладки программы. Функция HARK присваивает значения семи стандартным вектор¬ ным переменным и переменной ER и передает управление на функцию, которая является внутренним представлением программы: : НАЙК (: DROP DROP EXECUTE MARKP DROP AuREFP DROP :) IF NAME» *В0БХ REF F] I “2 ALLOT J TO MR LVJ3 ASIACZP ; Функция ASTACKP просматривает адресный стек и отмечает все доступные из него значения: : ASTACKP APQ А0 ?БО I REF 2 +LOO1 ; Основную работу выполняет функция iiarkp • адрес компиляции которой присваивается переменной RDF. Эта функция отмечает до¬ ступные значения, заменяя векторные переменные ним, (с каждым значением связано одно вхождение переменной) па пере¬ менные этим t SID ,. . ., SFUNC .
79 i МА1Ж.Р1 £F ['j SUUM A> 2> ! p] £? ['J SID PUP 8® 1+ sCELLS * ! У] [? f 'J SI-S Ал! 2” DUP ** э ТУ 2DR0P ADROP ELSE I RDROP A* 2+ »R 1Ш FJ [p L 'J SREF A» 2+ 2DU1 * IF 2DR0F ADROP ELSE 1 A^ RDROP AT REP 2+ *R THSR FJ fp C'J SARRXUM A* 2- DU? S> + ! fp f'7 SARR’iP Ал> 2- DUP + 2T)Tjr 75 = IP 2DROP ADROP ELSE ! A* RDROP Г7 ARREFP 2+ >л TITET p7 fp 7 7 SPUUO A* 2— DUP a> +• ! FJ j : MARK? al ?DU? IF »A MODE FELEM3X KARKJP1 THEM Функция MARKP1 представляет по-суцеству массив функций. Функ¬ ция pelemdx выбирает в зависимости от типа отмечаемого значения одну из функций этого массива и выполняет ее. : VSLEMEX fCOMPILDJ Г' J ip »А SIEM EXEO Р> С “2 ALLOT J STATE И- , ELSE EXECUTE TSE1T ; IMMEDIATE Функция IKOVE инициирует передвижение всех отмеченных значе¬ ний на новое место; : LM07E AT LVAL 2+ HERE - ALLOT £'J MOVEMUM TO S1TJH Г J MOVE ID TO SID 1*2 HOVELS TO SLS 1'7 MOVEREP TO SREF f*J M0VE.4W TO PARRUUM C'J MGVEAREF TO SARREP r'j MOVEEUVC TO S’TF.TC (* DROP *) LS<= EXECUTE LVAL : Вначале эта функция устанавливает адрес вершины словаря на начало области значений. Загем каждой переменной S2MD1 , SID »••• ..., SFWO присваивается код компиляции функций MOVENrUM » MOVEID ,..., MOVRPULC , каждая из которых передвигает на новое место либо число, либо идентификатор, либо ....функцию. Затем
80 семи стандартным векторным перемзнным, кроме LS » присваивается значение DROP и управление передается области значений. После этого каждое отмеченное значение передвигается на новое место самостоятельно : МО^ЕР DUP D'JP Л* - HERE « IF DROP RS> HERE ~ ALLOT ELSE SETREF >A COPY A* ; ГШ4 Ra> 2- » 2 ’А tfCVEP DROP : ID RS, 2— f 2 >A MOVEP DROP ; LS R*v 2- ! Д *A KOVEP 2+ ; REP НЭ 2- ! 2 -4 KOVEP DROP : ARPJJUM %a> 2- ’ 4 >A KOVEP DROP ; C''J ARREF R.V 2— ! 4 *A MOVED DROP ; Г/ РШС Rft 2-14^ KOVEP DROP ; является общей частью для всех сем* функций. Вна- этих семи функций заменяет переменную вида gp на р : r.cvsrnji'’ ; MOVED) : MOVEIS : NOVEREF : FOVEARH ; WOVEARDP : KOVEFUNO Функция MOVE? чале каждая из после чего обращается к функции ИОТК?. Эта функция проверяет, hjikho ли передвигать данный элемент: если текущий адрес вершины словаря отличается от адреса данного элемента (в зависимости от его типа) на два или на четыре, то элемент остается на месте* Меняется лишь адрес вершины словаря. В противном случае происхо¬ дит его перемещение на новое место. Так как при этом меняется его адрес, то необходимо установить новые ссылки. Зту работу выполня¬ ет функция SETREF • • SETKEF REF* SETADDR AT SREF >?. C’J SETADDR TO SREF LV0 ASTACKP REF* DROP R* TO SREF ; Вначале эта функция присваивает переменным REF и S;LSF новое зна¬ чение - код компиляции функции SETaddr.Прежде чем закончить рабо¬ ту функция SETREF восстанавливает значения переменных rep и SREF . Функция SETADDR устанавливает нозые адреса'. : SETADDR DUP *R "S> ?DUP IF *A DUP АЭ = IF 2 ?LS ? ARRNDM OR VARREF OR IF 2+ THEIT HERE + R* ! EXIT ELSE DUP >A ?LS ?ARRWri OR ?ARREF OR IP A> 45) 2DUF U* SWAI' DUP 2- 5>
81 •> om SWAP R* AND IP от - HERE + 4 + R* ! EXIT THEN DROP ELSE ALL<0? THUN- THEN RDROP ?LS IP A* 24- *R ELSE ?REP IF A* [ LATEST NAME* *bODY J >R ELSE 7ARPEF IF A* ['1 ARREFF 2+ >R ELSE 4DROP THEN THEN THEN ELSE RDP.OP THEN ; §7, Альтернативные варианты реализации системы Система реализована на языке ©орт. Б основу реализации поло¬ жен принцип активизации исходной информации. Два эти факта могут служить основанием альтернативного выбора: система может быть ре¬ ализована на другом языке другими методами. Первая альтернатива: другой язык с сохранением принципа ак¬ тивизации. Как было сказано во введении, вряд ли возможно предс¬ тавить список, отношение, произвольны:'? текст ил:: граф в виде фун¬ кции на таких языках,как ПЛ/Т, Алгол-ЗВ, Паскаль, Ада. 'Го же са¬ мое можно сказать про интерпретируемые языки Лисп, Планер, Пролог Группа языков объектно-ориентированного программирования - Симу- ла-67, Модула-2, Смслток - в большей степени, чем другие языки, обеспечивают программную поддержку принципа активизации, но тем не менее существенно уступают в этом языку Форт. При сохранении принципа активизации альтернативы языку Форт (по крайней мере среди широкораспространенных языков программирования) нет. Вторая альтернатива: язык Форт без ограничения на форму пре¬ дставления информации. Это значит, что обрабатываемые объект:: представлены ь обычной пассивной форме. Адекватной заменой класса
82 активизированных объектов может служить только операция eval (выполнить), которая ’’выполняэт" объекты данного класса: просмат¬ ривая объект и анализируя его составные части, она в зависимости от структуры объекта выполняет те или иные действия. Представим, например, элементы списка в пассивной форме. Первые два байта пе¬ ред каждым эле*ментом выделим для информации о типе значения (на¬ пример, три старших бита) и о длине значения. Тогда выполнение активного списка будет идентично выполнению функции EVAL (адрес списка должен находиться на стеке): : EVAL BEGET 2+ DUP DUP ’ll 05) 34X1 AND 64 / DUP 1 “ IP DROP NUM ELSE DUP 2 - IP DROP ID ELSE DUP 3 - IP DROP LS ELSE DUP 4 IE DROP RE? ELSE DUP 5 = IP DROP ARRNUM ELSE DUP 6 - IF DROP ARREF ELSE DUP 7 = IF DROP FUNO ELSE EXIT THEN 1-НЖ THEN THE? THEN THEN THEN R=* DUP '«) 17777 AND + AGA PT Такая реализация снижает возможности системы. Во-первых, список или любой друой элемент списка могут находиться внутри тела любой функции, во-вторнх, обработка должна быть управляемой.
83 Оба эти условия невыполнимы, если список представлен в пассивной форме. Выполнение этих условий немедленно приводит к активной форме представления списка. Третья альтернатива: другой язык без сохранения принципа активизации. Для адекватной замены принципа активизации необходи¬ ма реализация приведенной выше операции EVAL . Ни на каком компи¬ лируемом или объектно-ориентированном языке эта операция без пе¬ реходя в режим интерпретации не реализуема. На языка;: Лисп или Плэнер ее можно описать, но сна будет крайне неэффективна по быстродействию. Из сказанного следует, что альтернативы для языка. Форт и ме¬ тода реализации системы нет, а поскольку знание - это информация в активной форме, то в основу языка представления знаний должен быть положен язык в чем-то аналогичный языку Форт. Более того, поиски внутреннего представления активизированных объектов и опыт реализации системы привели к твердому убеждению, что внутренним представлением этих объектов должен быть косвенный шитый код, и именно он должен служить средством реализации языка представления знаний. Косвенный шитый код является необходимым, но далеко не доста¬ точным средством представления знаний. Недостаточна для этого и та программная поддержка, которую обеспечивает язык Форт. Здесь прежде всего следует сказать об отсутствии в этом язике средств описания параллельных процессов. Многозадачный режим, который легко реализуем в рамках этого языка, не пригоден для реализации множества мелких, но тесно взаимодействующих информационных про¬ цессов, в частности, для реализации механизма их синхронизации. Это существенно ограничивает область применения принципа активи¬ зации, тал как активизация аргументов n-арной функции порожда¬ ет п параллельных процессов. Язык Форт недостаточен также для адекватного представления 2-го, 3-го. 4-го и 7-го типов функций (и в особенности модулей) языка Алмаз. Для их реализации необходима программная поддержка режима компиляции-ЕЫполнения и особого режима прерываний. Не¬ которые частные (но важные) случаи реализуемы в рамках языка Форт, некоторые лишо ценой модификаций глубинных механизмов языка, но в целом реализация этих режимов без аппаратной псддерж-
84 ки, по-видимо:<у, невозможно. То же самое следует сказать и о ре¬ жиме управляемой интерпретации. Управляются память, а тем более управляющая система, могут быть реализованы лишь в виде специализироьанных управляющих бло¬ ков центрального процессора ЭВМ. И, наконец, последнее - составной частью языка представле¬ ния знаний должен быть язык, близкий к естественному, который, с одной стороны, был бы посредником между человеком и ЭВМ, с дру¬ гой - средством представления тех знаний с-б окружающем мире, ко¬ торые могут быть адекватно представлены только на естественном языке. В этой главе мы дали описание системы обработки сложниорга- низоьанной информации. Эта система может рассматриваться з кон¬ тексте предыдущей и следующей глав как практическая реализация некоторых абстрактных идей. Кроме этого ео можно использовать в качестве шаблона дкя создания аналогичных систем или просто как систему программирования для решения конкретных задач или, нако¬ нец, как средство обучения методам программирования на языке Форт Списанная система ориентирована на поддержку различных мето¬ дов программирования. Она содержит средства обработки списков (объектов более сложных, чем списки языка Лисп\ параллельные и недетерминированные процессы, что позволяет использовать логичес¬ кие методы программирования, средс?.'за обработки текстовой инфор¬ мации, в частности, конструкторы лексических и синтаксических анализаторов и генераторов кода, средства построения баз данных, средства, поддерживающие объектно-ориентирован! не методы прог¬ раммирования. Все это говорит о том, что возможности системы по¬ зволяют обрабатывать иН'Ьорационные потоки большой сложности.
35 Главе 3. OCHORu СЕМАНТИЧЕСКОГО ЯЗЫКА. В предыдущих главах основное внимание било уделено внутрен¬ нему представлению знаний. От правильного выбора представления зависит очень многое, даже сама возможность хранения и обработки знаний в ЭВМ. Но внутреннее подставление возникает из внешнего в процессе компиляции. Одно представление является почти зер¬ кальным отображением другого. Однако между ними есть принципи¬ альное различие: внешнее представление должно обеспечивать взаи¬ мопонимание между человеком и лажной. Естественный язык (ЕЯ) об¬ ладает в этом отношении многими привлекательными чертами. Но лишь для человека. Для машины он слишком сложен. Нужен язык-посредник. Нет другого способа построить такой язык, кроме одного - формали¬ зовать естественный язык и тем самым упростить для машины процесс его понимания. Результатом такой формализации является семанти¬ ческий язык (СЯ). Этот язык, близкий и естественному языку, может слу?кить посредником между человеком и ЭВМ. Описанию некоторых на¬ иболее важных понятий, связанных с формализацией русского языка, посвящена данная глава. Ео содержание частично пересекается с со¬ держанием работы [II J , но в основном является его продолжением. Поэтому для полного понимания этой главы необходимо предваритель¬ ное знакомство с работами [9, II3 . § I. Синтаксическая классификация предложений русского /тзыка Синтаксис отражает большинство языковых фактов и даст пер¬ вую непосредственную информацию о лзыкз. Форма слога, связи слов в предложении лежат на поверхности и легко наблюдаемы. Б каждом простом предложении русского языка есть слово, как правило един¬ ственное, на котором дэржится все предложение. Если его убрать, то предложение разваливается. Иногда превращается в другое пред¬ ложение. Таким словом (центром) предложения часто оказывается глагол. Но далеко не только глагол. Предложение "Ему некогда ра¬ ботать" держится на слове "некогда", предложение "Ему время ид¬ ти" - на слове "время", "Здесь не прейти" - на слове "не", "Нет возможности" - на слове "нет", "Ему весело шагать" - на слове "весело" и т.д. Центром может быть и пустое слово (глагол "быть" в настоящем времени,как правиле,опускается).Например, "Он в Моск¬ ве ".
86 ’Саждое предложение является суперпозицией функций. Центр предложения - ото самая внешняя функция суперпозиции. Лели су¬ перпозиция имеет еид ) ) » то выбрасывание цен¬ трального слова .преобразует исходное предложение в другое - »*п> * Описание синтаксиса, языка прежде всего должно содержать описание оераиений к каждой функции. В русском языке форма обраще¬ ния к функции определяется совокупностью грамматических типов ее аргументов. Информация о типах аргументов является основной ин¬ формацией, необходимой для синтаксического анализа. Любая часть речи в любой грамматической форме, а также целые предложения, мо¬ гут служить аргументами для определенного множества слов. Синтаксис неразрывно связан с семантикой, и поэтому иногда целесообразно в его описание включать часть семантической инфор¬ мации. Например, слово "радость" может иметь следующее синтакси¬ ческое описание: радость = (кого i чьях , что*' предл» у ) | (кому (для кого, делать у ) caus (sQy(x) , радость (х,»)) Такое описание позволяет два различных способа использования сле¬ ва "радость" свести к одному из них: "Для нее радость помогать людям" = "То, что она помогает людям, доставляет ей радость". Некоторые функции могут иметь два (или более) предложения в качестве аргументов. Такими функциями являются составные союзы. Спыт постпоения синтаксических аяализатсроЕ русского языка выявил необходимость классификации простых предложений русского языка с целью повышения эффективности анализатора. Наиболее слож¬ ная часть анализа - нахождение центрального слова предложения.Лю¬ бая часть речи может быть центром предложения. Именно она и опре¬ деляет тип предложения. Построенная ниже классификация содержит семь основных синтаисических типов предложений, определяемые гла¬ голами, существительными, прилагательными, наречиями, предлогами, союзами и символом . Причастия относятся к группе прилагатель¬ ного, деепричастия образуют вложенные суперг.озлпии с общим первым аргументом, следовательно, нового типа предложений не образуют. Каждом;/ типу соответствует своя грунта предложений, которая делит¬ ся на подгруппы, которая, в свою очередь, может делиться тоже.
87 Первая группа - глагольная. Она состоит иг трех подгрупп. Каждая подгруппа определяемся формой глагола. Глагол может быть в активной, пассивной форме или в форме инфинитива. Каждая груп¬ па представлена набором типичных для этой группы предложений. I I. а) Ему следует подождать. Есть кому работать. б^ Его знобит. Ее лихорадит. Лодку перевернуло. в1 Светает. Вечереет. Морозит. 1.2. а) Считают, что он умен. У них говорят, что ... б' Молнией зажгло .сарай. 1.3. а) Лес шумит. Собака лает. 61 Он читает книгу. Иван повесил картину. в) Петр сидит смотрит телевизор. Она лежит читает. 2.1. а) Ему хочется петь. б) Ему работается. 2.2. Дом строится рабочими. 2.3. а) Говорилось, что он массой. 61 Курить запрещается. Предлагаются путевки. е1 Воды убывает. 3.1. Быть ему космонавтом. 3.2. Идти ему. 3.3. Он бежать! Центром предложения второй группы является существительное. Общий смысл предложений этого типа - fane (х) - "имеет место быть то, что названа, данным существительным". 1.1. а) Дождь. Ветер. Час дня. Пора ехать. б) Дом с мезанином. Часы с боем. Человек с ружьем. в) Цветов! Народу! 1.2. а) Ему благодарность от командования. 61 Для нее радость помогать людям. 1.3. Платье в горошек. Усы колесом. 2.J. У него машина. Он с книгой. 2.2. С ним обморок. 7 нее истерика. 2.3. У него желание ехать. 3.1. al Он в Москве. б) Он в бригадирах. в) Он в шинели. Пальто в грязи. Она в слезах.
88 3.2. Он в обмороке, в дружбе, в полете, под арестом,... 3.3. Его счастье в труде. В публике смех. В семье гсре. Прилагательные образуют предложения вида: а(3) , где s - существительное, а. - прилагательное. Причастие рассматривается как отглагольное прилагательное. 1.1. а) Цветок красный. Платье голубое с желтым з крапинку отливом. б) Женщина в белом. 1.2. а) Ягоды зелены. б) Он благодарен. в) Он слаб здоровьем. 1.3. а) Дом построен. б) Им довольны. В школе удовлетворены. 2.1. Иван склонен преувеличивать. Он способен быть космо¬ навтом. 2.2. Его рады видеть. Четвертую группу предложений образуют наречия. В роли наре¬ чия может находиться существительное с предлогом. 1.1. Он запанибрата с Иваном Васильевичем. Он сродни ей. 1вое одиночество веку под стать. 1.2. Ему весело кататься. 1.3. а) Он быстро бежит. б) Возможно, что он придет. 2.1. Он говорит с уважением (без уважения). 2.2. В разъяснение тезиса он пригел ряд интересных фактов. 2.3. Он был весь белый от снега. Он пропустил занятия по болезни. За отсутствием простой пишем на гербовой. 3.1. а) Видно следы. Набрано грибов. б) У ребят налоьленс рыбы. У еих договорено о поездке. в) В бригаде решено пахать. 3.2. Морозно. Ветрено. Дождливо. Пятую группу предложений образуют предлоги. Но лишь некото¬ рые из них. Многие предлоги служат средством присоединения аргу¬ ментов и не образуют целых предложений. Однако сложные предлоги, имеющие два аргумента, образуют целые предложения. Семантически они не отличаются от предложений, порождаемых существительными в голи наречия.
89’ 1) Сложные предлоги, содержащие в своем составе первообраз¬ ный предлог и существительное, такие, как: вследствие, с помощью, в условиях, по причине, в отношении и т.п. имеют единую схему списания: сложный предлог = (кого-чего х, предл у) предл (Вследствие засухи наступил голод. Иван повесил картину с помощью лестницы.) Небольшое число предлогов этого типа (в противовес, в противоположность, в контраст, не в пример'1 имеют синтаксичес¬ кую структуру вида сложный предлог = (кому-чему х,предл у)предл. 2) Сложные предлоги, содержащие существительное и два перво¬ образных предлога ( *предлог* <существительное »* предлог ») пер¬ вым аргументом имеют существительное в той грамматической форме, которая требуется для второго первообразного предлога. Вторым ар¬ гументом является целое предложение. В отличие от = (кого-чего х,предлу)прэдл; в связи с = (чем*, предлу)предл; в направлении к = (кому-чемух,предлу )предл. 3) Отглагольные предлоги воспроизводят связи тех глаголов, от которых они образованы. Несмотря на = (кого-чегох,предлу )предл; судя по = (кому-чему х,предлу)предл. Шестую группу предложений образуют союзы. Все предложения этой группы являются сложными в смысле грамматики русского языка. Синтаксический анализ таких предложений в принципе мало чем отли¬ чается от анализа обычных конструкций языков программирования (условных операторов, циклов). Но если в языках программирования таких конструкций единицы, то здесь их десятки, и каждый союз требует отдельного описания, иногда очень громоздкого (например, союз "чем"). Наибольшая сложность синтаксического анализа предло¬ жений этого типа связана с тем, что одинаковые части различных аргументов в предложении не дублируются и синтаксический анализа¬ тор обязан их пополнять. Седьмая группа содержит предложения, центром которых является символ . Предложение этого типа состоит из двух частей и имеет вид: f - g . Эта группа предложений естественно делится на дяе
90 большие группы. К первой группе относятся предложения, в которых символ "-" заменяет некоторую конкретную функцию, однозначно вос¬ станавливаемую по синтаксическому типу своих аргументов f и g. Эти предложения могут быть преобразованы в предложения первых шести групп. Ко второй подгруппе относятся предложения, в которых одна из частей (f или я) является аргументом другой части, но как бы оторвана от основной части предложения. Происходит резкое разделение предложения на рему и тему, противопоставление главно¬ го (с информационной точки зрения' второстепенному. При этом ар¬ гумент может бы’Ь преобразован в синтаксическую форму, отличную от той, которая необходима для построения синтаксически правиль¬ ных предложений. 1.1, a' f = (кто-что х,делать v)предл. Символ заменя¬ ет слова ” в том", "в том. чтобы", "заключается в тем, чтобы". Например: Главное лечение - лежать. Здесь работать - большая честь. б' f~ = (кому-чему х, делать у) прецл. Заменены слова: "надо", "необходимо", "должен". Например: Ему - ехать. в) f~ = (какой х, делать у) предл. Заменены слова: "для того, чтобы”. Например: Молод - гулять. 1.2. a) f = (кто-что х, кем-чем у) предл. Смысл символа "-": х имеет вид утх сделался у, х подобен у. Например: Волосы - бобриком. Усы - колессм. Слезы - ручьем. б) f •- (кому х, кто-что у) предл. Символ заменяет слова: "необходимо дать (отдать)". Например: Пятилетке - ударный труд. в' £~ - (кто-что у, с кем у)предл. Эквивалент: у х есть у. Например: Друзья - с ним. С ним - обморок. 1.3. Обе части выражения f - и имеют одинаковый граммати¬ ческий тип. Символ "-" заменяет слова: "значит", "есть", "явля¬ ется”. Например: Иван - плотник. Курить - здоровью вредить. Красное - это черное. Идут дожди - будет урожай. Обе части выражения f - g имеют различный грамматический тип. 2.Х. Аргумент сохраняет свою синтаксическую форму. Примеры: а' Убить двух зайцев - вот чего он хочет. Они не прой¬ дут - теперь он это знает.
91 б) Мужчина - высокого роста. Ему - благодарность. Памятник - Маяковскому,. в) Цветок - красный. Письмо - написано. г) Он лжет - э^о непростительно. Лекции начались - это хорошо. Сидеть молча - плохо. Деньги - кстати. Гулять - позд¬ но. 2.2. а' Глагол в личной форме преобразуется в отглагольное существительное: f -*• S .С . Например: Непростительно, что он лжет -* ьго ложь - это непростительно. б) Инфинитив преобразуется в отглагольное существи¬ тельное. Например: Только успевай работать Работы - только успевай. в) — . Например: .Понятно, что человек в одиночестве скучает. Человек, скуча¬ ющий в одиночестве - это понятно. § 2. Базисные функции Выполнение суперпозиции функций, представленных словами рус¬ ского языка, порождает суперпозицию базисных функций семантичес¬ кого языка (СЯ). Базисная функция это такая функция, которая оп¬ ределена на любых объектах и дальнейшего толкованию в рамках СЯ не подлежит. Основной набор э^их функций был описан в работе [II]. Здесх? приведены лишь некоторые из них. Они обозначаются латин¬ скими буквами, потому что соответствующие слова русского языка из-за неоднозначности (вне контекста) могут внести путаницу. Бо¬ лее конкретные функции названы близкими по смыслу русскими сло¬ вами. 1. funoo(x) - имеет место быть х; funco (дождь) - идет дождь; ftmoo (ветер) - дует ветер; 2. incep(x) _х начинается, fin(x) -*х заканчиваемся; cont(x)L * продолжа ет оя; 3. aua(x,f) - х делает так, чтобы f ; саив(х, iucep спит (у)) - х усыпляет у ( х делает так, что¬ бы У начал спать); caus(x,fin спит (у)) - х будит у ; 4. copul(x,y) _ х является (есть ) у ; 5. result(f) _ результат f; result (ложится (х)) _ х лежит;
92 6. oper.,(x,f) _ x совершает f ; oper^(x,полет) - x совершает полет; oper^ (x , уважение) - x испытывает уважение; oper(x,sof) - х совершает деяние f; 7» sing(x) - элемент множесава х t 8, nult(x) - множество элементов х; 9. 1ос(х,у> - х находится е у ; Ю. bab(x,y) _ х имеет у? 11. орс1ос(х,у) - х воспринимается у; 12. lab(x,y) - х подвергается действию у ; lab (дерево,мслния) - молния ударила в дерево. Другие базисные функции, смысл которых будет поясняться по ходу изложения: var(x,f), fact(f), prepar(x,f), degrad ( x ), mloc(x,y), uzor(x,y), cor(f),deb(f), ver(f), aspect(f), poss(f), repet(f), norn(x), magn(x) . К базисным операциям относятся так-- же операции сравнения чисел: <, , =,?,*. Особую роль в СЯ играет функция caus. С самой общей точки зрения любое событие каузируется кем-то или чем-то. Поэтому любое действие в СЯ можно было бы описывать в виде caus(g,f) , где Я - либо суперпозиция функций, либо, когда не известен субъект каузировяния, символ * . Но ЕЯ, в частности русский язык, спосо¬ бен различать ситуации каузирования-некаузирования. Поэтому пре¬ дложение "У него есть деньги” на СЯ следует переводить как bab (он,деньги), а предложение ’Ему есть деньги* (например, на почте) как caus( a, hab (он, деньги)). Каждая базисная функция выражает некоторый абстрактный смысл вне временных и пространственных рамок. Для того чтобы использо¬ ваться в языке, функция и/или ее аргументы должны быть конкретизи¬ рованы. функции конкретизируются заданием времени (прошедшее, на¬ стоящее, будущее) и признака завершенности-незавершенности. Дня этой цели используются обозначения: perf, ioperf, fat . Например, выражение caus(x, incep funcQ(y)) имеет смысл: х создает(вообще, всегда)У или х есть то, что создает(вообще,всегда) у . Следую- щиевьражения конкретны: imperf оацв(х, incep funco(y)) - х со¬ здавал У , perf ce.us(x,incop func (у)) - x создал у . fat perf caus(x,incep func0(y)) -x создаст у , fut caus(x,incep fun^(y)) - x будет создавать у . Для конкретизации настоящего времени не¬ обходимо хотя бы у одного аргумента указать артикль - определен-
S3 ный или неопределенный: def х, in def х . Инфинитив функции f(*<!,...,хп ) записывается в виде f(^,x2, ...»хп ) • Многократ¬ ность-единичность действия выражается при помощи функций mult(f), □ing(f) . Например, sinj (стрелять) - стрельнуть, mult (стре¬ лять) - многократно стрелять. Эти функции используются и для дру¬ гих целей. Запись является названием 1-го аргумента функции f ; записи ...,мп) соответствует причастной оборот или выра¬ жение: *£ » который fC1^, ...,хп) или тот(та, то, те), который f(х1,...,хв) (если 1~й аргумент отсутствует). Например, S1 продаватъ=прсдавец, 8г продает (Иван,книга) - книга, которую продает Иван (книга, продаваемая Иваном), S2 продает (Иван, *) - то. что продает Иван. Выражение (12^х»•••»Jria) всегда может быть переведено на русский язык деепричастным оборотом. Суперпозиция съела(бегалэ(собака,внуп,ри(дзор)) ,мясо) соответствует русскому предложению ’Собака, бегая во дворе, съела мясо’; суперпозиция съела( si бегала(собака,внутри(двор)),мясо) - предложению ’Соба¬ ка, которая бегала во дворе, съела мясо’. Каждая функция f кроме обозначения может иметь имя, кото¬ рое в СЯ совпадает с записью sof . В русском языке именам соот¬ ветствуют отглагольные существительные. Например, so уважат^- уважение. Полного соответствия между СЯ и русским языком нет. В русском языке есть имена 3Qf , для которых нет соответствующих им глаголов *. Например: буря, гроза, склероз. Имена функций по¬ зволяют различать вызов по значению и вызов по наименованию. Это различие ведет к разным способам выполнения предложения и тем са¬ мым к различным его смыслам. Приведем примеры использования базисных функций и их прибли¬ зительные переводы на русский язык. I) so* “ имя произвольного действия: деяние, дела(людей, че¬ ловека); явление (природы); sing sc> - дело, поступок(человека); oper(x,so.t) - хсовершает деяние (дела,цело,поступок), х дей¬ ствует; Sooper(*,so*) - деятельность; oper(x,so»(y)) -х совершает деяние, связанное с у ;
94 оро.:(х, лов(рыба)) -x вздет лги рыбы =z ловит рыбу; oper(x,so* (математика)- х занимается математикой; oper(x, so* (игрушки)) -х занимается игрушками; 51 oper(#>so** (лошади)) - лошадник; S. орег(*,яо*‘ (голуби)) - голубя?ник; S,| oper(*,so Лпланер)) - планерист: SQ oper(«,sQ* (планер)) - планеризм; 52 орег(хиэург, s1Sq»(#)) - типичное название того, с чем свя¬ заны деяния хирурга - хирургия; S1 орег(Ъ , термлческяя(обработка)) - термист; 51 орог(* , марафонский бег)) - марафонец; Sg oner (террорист, л ) - террор; 52 open (шпион, «) - шпионаж. Описание слова ’шпионаж’ (а значит и его смысл) по отношению к слову ’шпион’ отличается от описания слова ’хир^фгия* по отно¬ шению к слову ’хирург’. В одном ряду 20 слогом ’шпионаж* находят¬ ся слова ’террор , бег, копирование’ и т.п. Слово ’хирургия* образует второй ряд, к которому относятся слова ’планеризм, го¬ лубеводство, педагогика, магия’ и т.п. 2) Функция гори1(х,у) своим первым аргументом имеет иля объекта вторил - имя объекта или прилагательное, copulfx , скаредный) - * скаредный; S1 copul(* , скаредный) - скаред; S1 copul(^, чужой) - чужак: Б., copul(#, крепкий) - крепыш; сорс1(х, подсобный(рабочий)) - х- подсобный рабочий; ,$1 сори!(л , подсобный(рабочий)) - подссбник; s, copulC# , хпонический(больной)) - хроник; S. copal(# , строгий(выговор)) - строгач; So copul(* , скаредный) - скаредность; SQ copul(* , равный) - равенство; So copul(# t лирика) - лиризм; So ccpul<> , добрый) - добрела; incep copul(x,y ) - х становится .у; perf incep copul (x,v) “ x стал у; incep copul (x, белый) - x белеет (становится белым); incep copul (x, рабочий) - x становится рабочим;
95 oper(x, SQ copvl(*,>’)) ~ * совершает действие, связанное се свойством у ; oper(x, sQ copulf^ , белый)?- х болеет (вдали); oper(x, sq copul(* , бесвиус’ный)) - х проявляет бесвкусицу; орэг(х, SQ copul(# , злой)) •- х злится; oper(x, so copul(«, жених)) - х жежссается. 3) temp(x,y) - х происходит вс время у ; SQ temp - время; S2 temp(x,«) - момент или интервал времени; SQ temp(,», ночь) - ночевка; SQ temp(«, зима) - зимовка; oper(x,So temp(*,y)) -х проводит время у ; oper(x, SQ temp(«, зима)) - х совершает зимовку = х прово¬ дит зиму = х зимует; орет (делает(х ,игрушки), so tamp(»}лето)) - х проводит лето, дела?! игрушки. 4) Функция mult(x) (иля mult х ) определена как на объектах, так и на действиях и называет либо множество однотип¬ ных объектов, либо многократность действия. mult (человек) - человечество; mult (горошине) - горок; mult (террор) - терроризм; mult (купец) - купечество; mult (хлестнуть) - хлестать; регГ варит (x»mult (каша)) - х наварил много каши; S1 copul (mult(^)j’poMapHb®) - типичное название множества объ¬ ектов, обладающих признаком ’громадный’ = громедъэ; S1 copul(malt(#), периодический) - периодика (газеты,журналы); S1 copul(mult(^), растение) - растительность; S1 copul(mult(*), голый) - голытьба; Функция siug(x) является обратной к функции mult(x) ; SiDg(trult(f)) = f . sing (popox) - горошина; sing (студенчество) - студент; 5) Функция usox(x,y) определена на объектах и действиях и имеет смысл: у используется для х . сааь(х, ивог(у,2.)) -х использует а для у ;
96 caue(e,ивог(*,револьверный(станок))) - типичное название то¬ го, кто использует револьверный с,,,анок= револьверщик; S1caus(#,u3or(«, термическая(установка))) - термист; S.,oper(*, термическая(обработка)) - термист (тем самым слово ’термист’ чмеэт два смысла). 6) Sr loc(f,*) - типичное название места, где происходит f. S2loc(copul (течение,быстрое), » ) - быстрина; S2l'’c(copul(», окрестный), # ) •• окрестность. 7) Функция ®agn(x) определена на именах объектов и дей¬ ствий и достаточно близко соответствует русскому слову ’очень’; функция antitaa^n - антоним функции тадп . Зосорц1(м, желтый) - желтизна; entlc’4.<^j(so copul(#,желтый)) - желтинка; “ада(дсм) - домина, домище; ’uitimagE(myM) - шумок; entlmagn(cTor) - стожишкс; antimagn(nerb) - напеть; perf ша<рз(критиковать) - раскритиковать. 8) caus(x,furco(s1 copul ( * , подсбзк(базар)))) - х дела¬ ет так, что имеет место нечто, подобное базару = х базарит; <saus(x, incep oopux(y,калека)) - х калечит у; 9) Первым аргументом функции bon(f,x) может быть как объект, так и действие, вторым - объект типа ’человек’. Смысл этой функции: f является хорошим для х . bon(result(f),x) - хороший для х результат в £ ; antibon(result(f),х) - плохой для х результат в £ ; perf саиэ(дечит(х,у),ax;tibon(re8uit (лечит(х,у)),у)) - х , леча У , сделал так, что результат лечения для у - плохой = = л долечил (!) У ; 10) Функция fact определена на тех объектах, которые, су¬ ществуя, могут не проявляться, не исполняться, не соблюдаться: чувство, надежда, мечта, тишина, граница, обычай, традиция, сим¬ фония, свойство и т.п. oner(х,уважение) -х испытывает уважение-х уважает; oper(x,sofact (уважение)) - х проявляет уважение; oner(x,soccpul(*, хитоый)) - х совершает хитрость- х хитрит;
97 oper(x,so fact(so copul(* ,хитрый))) -x проявляет хитрость; oaus(x, Zin fact(y)) - x нарушает у (границу, ’ишину, обычай,..) opar(x,SQ fact (симфония)) - х исполняет симфонию. 11) Функция x’ebiilt(f) определена на множестве действий и определяет типичный результат действия f . Для нее всегда выпол¬ няется тождество: result(oaus(x, incep f))= f . 12) У функции hab(.xfj,) первых аргументом является имя объ¬ екте, вторым - одна из характеристик объекта или объект. Функция hab(x,y) выражает смысл: х имеет у . S1 hab (дем,мезонин) - дом с; мезонином; hab (Иван,.деньги) - у Ивана есть деньги. §3. Объекты Объект - это абстрактное понятие, в естественных языках ко¬ торому соответствует понятие существительного, называющего неко¬ торый физический объект (в отличие от действия). 3 семантическом языке объект А представляет собой неупорядоченную совокупность Мд характеристических Функций: «л - <4- 4 4> Интуитивно каждый объект а является ства тех конкретных объектов, на каждом из функции f'i . Представление объекта з виде ет определить частичною упорядоченность на тов:А1 ?а21 тогда и только тогда, когда М. представителем множе- которых определен:-; все множества кд лоззоля- множестге всех г.бъек- I - • 1 М Л2 тоА-| соответствует родовому понятию по отношению к а2 » более конкретен чем A-j . Ери этом функции множествев наборе Кд2 могут иметь суженную область значений. Еслиа1 * а2 чествует А^ , такого, чтэА1 * Aj < А2 » то А1 представляет видовое понятие по отношению к А2 • Один из таких объектов в се¬ мантическом языке обозначазтся через ?епег(л2) . При описании объекта А задается имя каждой функции , область ее значении и (единственное) имя объекта А . Это описа¬ 1" а2 ’ и не су ние аналогично описанию вица в языках программирования и служи? в СЯ той же цели - для задания информации об используемых з речи объектах. Имя объекта есть идентификатор (последовательность сл-
98 мволов), однозначно указывающий на данный объект. В этом прояв¬ ляется существенное различие между СЯ и ЕЯ. Если - имя объек¬ та, представляющего вищовое понятие по отношению к объекту , то объект а2 описывается в виде / 1 1 А о Л2 = ( Л, ;Г .3, Г ’ я вк: 1,‘ ) 1 к л2 ( 1 Щ. ; О < к ' 2 где - описание суженной области функции I*1 . В качестве примера приведем описания нескольких объектов СЯ, приближенно соответствующих понятиям: "физический объект", "живой" "животное", "человек" и др. Именами характеризующих функций явля¬ ются идентификаторы, составленные из русских слов, но никакого отношения к русскому языку они, конечно, не имеют. Если областью значений некоторой функции является множество целых чисел 1 (-10 •sIO), то имя функции помечается символом i , если множе¬ ство любых чисел - символом а. Эти символы определяют относитель¬ ные и абсолютные значения. Например, температура -5 определяет понятие "холодный", температура а. =27 соответствует выражению: температура равна 27°. Функция, содержащая альтернативы fitf2,... *“,fn , обозначается через (х^ f2 |...j f ). Физобъект = (физсостояние 1 , температура ( i | а ), цвет=((алый i...|белый i...|черный (...).интенсивность i), размер=(линвэличияа=(высота( На ) ,ширинг.( 1| а),длина( iia)), объсм( i I а ),вес( 11а ), положение-^верт < гориз I висит), состав=(состсяние=(газ I жидкость i густой .^твердый 1), вещество=(металл=(железо,с'"адь,...) | вода ( земля (гранит... ...)), знешвяд=(форма=(правильяая=(и’ар.куб,пирамида,...) .непра¬ вильная)?, свойства=(гибкость 1 .хрупкость 1 .твердость i ,...), повер;.ность=(фкзо6ьект;сксльэкость 1 .гладкость 1 .углубле¬ ние 1), покрытие=(ф)изсбьект) .подобен < --(фгэобъект), части=(рерх=г')изоб7>ек7,низ=физобеект-, пере, д=физобъект, сере ии-
99 на=фисобъект,центр=физобъект,зад=физобъект,бок=физобъект), возраст( i I а),красота 1 ,реальность^действ i воображ)) живой = (физобъект;пища-(физэбъект),здоровье( 11болезнь),акт явность 1 ,местообитание=(местоJ) животное= (живой;пол-(м» ж),психосостояяие=(бешеный t норм),восприятие =(зрение !,слух 1,обоняние i,осязание х.тактилчувстЕитель- ность i),память 1.умспособностм 1, домапний=(да » нет), язык=(блеяние | ... | речь| - * > | шипение...), физссстояние=(бодрость 1.удовлетворение i,голод х), характер=(агрессивность 1,настроение 1), половвлечение i, способпередвижения=(ползание< плавание I полет i ходьба ...), отношение 1 =(жпвотное), родстгенники=( mult(животное)), храбрость i,гордость 1,грубость 1,доброта 1,страх 1,инте¬ рес 1,сила 1,общительность х,свобода! ,сон i.худоба i), человек = (животное; верх=( голоье=( верх-( макуш -са, волосы), середина=( че- реп=(середина=мозг)),перед=(лицо=(верх=лоб,середина-(нос, глаза .щеки) ,низ=(рот=(губы, зубы) ,подбородок,бсрсда=( да,нет)))) зедезатылск, бок-( уши, бакенбарда=( да i нет))...)), середина=( туловище-(верхняя бок=(руки-(левая,правая),плечи ,...), ..., язык=речь,способпеоедгльжения=ходьба,умспособности=1С; фио=(фамилия=идент,имя=идент.отчество=идент), национальность^ абхазец |[ грузин j... i русский I... I як^сг), местожительство^ страна=идент, город=идент, адрес=иден,1), профессия=(агроном!...iслесарь I...iямщик).местоработы, специальность=идент, образование^высшее 1,специальность=идент), характер=(темперамент i.аккуратность 1,благородство «.воль!, склонность 1= mult (действие).искренность 1.упрямство !, хладнокровие 1,черствость 1,честность 1.рассеянность 1, гордыня i.жадность 1,эгоизм !.самолюбие 1.хвастовство 1),
100 чувство=(симпатия 1.реакция i), оптимизм i.юмор 1 .работоспособность 1,счастье 1, ум 1,легко¬ мыслие! .трезвость 1, вероисповедование=(католик i . неверующий), характеристикадействий=(намеренность л,усилие л.риск л,доб¬ рожелательность Л.ожидание Л.трудность л.виноеность л» одобрение 1.добросовестность 1.целесообразность л,тща¬ тельность 1 .тайность л,причина-(действие).предваритель¬ ность 1) ОТРЦ= (человек ;пол=м,д.ети= mult (человек ).отношение л=(дети)) взрослый человек= (человек;возраст^ =”1Ь лег) мужчина^ (взрослый человек;пол=м,...) этист= (человек;пол=м,эгоизм= * 5) эгоистка^ (человек;пол=ж,эгоизм= *5) альтруист- (человек;пол=м,згоизм=< -о) Для того чтобы был понятен смысл идентификаторов, использу¬ емых в описаниях объектов, приведем ряды слов русского языка, ха¬ рактеризующие некоторые из этих идентификаторов в порядке убыва¬ ния индекса 1 . отношение 1 =(...ласка,забота,доброта,милосердие,деликатность.лю¬ безность .вежливость .учтивость.равнодушие.нелюбезность.гру¬ бость .жестокость,...); настроение =(.. .радость .веселость .мажорное настроение .равноду¬ шие .минорное настроение.грусть.печаль.горесть.тоска,мрач¬ ное настроение,...); удовлетворение! =(эйфория,..,.блаженстве,наслаждение,удовольст¬ вие ,удовлетворение,равнодушие,кручина,скорбь.горе.страда¬ ние, мучение, . ..); искренность !=(... искренность .простодушие...... скрытность .лукав¬ ство .хитрость.притворство.фальшивость.лживость.лицемерие, ... ):
ICI реакция! =(...,ярость,бешенстве,гнев,негодование,возмущение, злость,сердитость,досада,волнение,...,восхищение,восторг, упоение,экзальтация,...); гордыня !=(..., гордыня, сгесь, чванство, надменность, высокомерие, зазнайство,самодовольство,себялюбие,...,скромность,...); гордость 1 =(...,гордость,достэинство,самолюбие,...,стеснитель¬ ность , застенчивость , конфузливость ,униженность предварительность 1 =(....заранее.предварительно,....перед,..., вслед,...,после Аналогично каждой из характеристик описаннгх вь.че объек¬ тов сопоставлен соответствующий ряд русски?: слов. Зри.построении этих оядов были использованы словари антонимов 112 • и синонимов ПЭ/. Примеры перевода с семантического языка на русский язык: opinion (х, зрение(у)) - у видит х ; opmloofx , (слух';у)) - у слылит х ; саив'х , видит(х,у)) - х смотрит у ; caus(x,opmloc (у, память(х))) - х запоминает у ; настроение(х ) = 4 - х веселый; настроение(х ) = -3 - х печальный; удовлетворение (х) = 3 - х доволен; бодрость (х) = -= -2 - х усталый; caus(x, opmloc (fact (хвастовство(х) = *5),у)) -■ - делает так, что у воспринимает проявление хвастовства х -а = х хвастается перед у ; caus(x, opmloc(faot (гоидыня(х) - 4),у)) - х высокомерен с у. § 4. Операции над объектами Таи как каждый объект представляет собой множество характе¬ ристических функций, то нетрудно определить набор бинарных опе¬ раций, которые по двулм объектам строят новый объект. Здесь мы рассмотрим одну простую операцию, которая имеет прямое отношение к русскому языку и определяет признаковые прилагательные. Уели функция f входит в набор функций объекта в , то бу¬ дем называть ее признаком объекта в . Запись У(в) = у определя¬ ет бинарную операцию A(z,b) на объектах z и в , где г - сиъ-
102 ечт, содержащий одну функцию Г , 'г.е. z = (f = у). Эта операция по иг:ени объекта в строит имя нового, более конкретного объек¬ та, отличающегося от в лишь тем, что функций f на нем принима¬ ет значение у , которое является либо идентификатором, либо чи¬ слом, либо диапазоном чисел (например, *2). Такая запись вполне удовлетворительно выражает смысл операции а , но для того чтобы приблизить СЯ и по форме к ЕЯ (с целью белее тонкого анализа процесса словообразования) построим имя Afy функции, которая получается из операции л(г,’В) как результат смешанного вычис¬ ления при заданных f и у : Afy(B) '= f (В) = у . Имя Лху - пол¬ ный аналог прилагательного в ЕЯ, поэтому запись АХу будем на¬ зывать прилагательным семантического языка. Например, прилага¬ тельное * А настроение 4’ можно перевести на русский язык сло¬ вом ’веселый*: А настроение 4(чзловек)~веселый человек. Это прилагательное в СЯ определено только на объектах, являющихся конкретизациями объекта ’животное*. Из чисто формальных соображений имеет смысл ввести всюду определенную (на объектах, действиях и т.п.) тождественную фун- кг,ию:А(х) =х . Функции sqA , ASv (см.ниже), образованные от функции а , будем считать также всюду определенными, тожде¬ ственными функциями. Прилагательные принципиально отличаются от существительных гораздо большей функциональностью (грубо говоря, разбросанностью значений). Если описанные выше объекты, даже такие сложные как ’человек’, поддаются компонентному анализу £5J - разложению на характеризующие компоненты, то прилагательные &тяг свойство?/!, как правило, не обладают. Дело в том, что одно и то же имя при¬ знака - прилагательное - может называть различные признаки. На¬ пример, при описании объектов ’животное’ к ’отец’ был выбран один и тот же идентификатор ’отношение i *. ‘Гем самым в 0-Я по¬ является возможность создания прилагательного ’А отношение 1’ с двумя значениями: отношение к кому-то или отношение к своим детям. Для ьЯ эта ситуация типична. Однако это не приводит к ка¬ ким-либо неудобствам, Так как пре.цлоьение снимает эту неодноз¬ начность: поилагательмое является взаимно однозначной функцией существительного. Семантика существительного в ЕЯ (его описание в ЕЯ) гарантирует однозначности хЧ-ллагательного. Однако вне кон-
103 текста прилагательное в’ногозначно (см. примеры в работе Со] Пусть признак! входит в объекты А1 и А- . Возможны два ти¬ па аюгозначности прилагательного: 1)а1 иа2 несравнимы; 2) А2 (тем самым в объект А2 признак f входит дважды). £ первом случае вычисление функций Afy(A,), Afy(A2 ) , т.е. выбор по.^ со¬ ответ ст вещего признака не представляет труда. Во втором случае вычисление функции Afy (а2) может быть осложнено проблемой выбо¬ ра: неизвестно, на какой признак указывает имя Afy . Но в ЕЯ действует неписанное правило: прилагательное указывает на тот признак, который принадлежит более конкретному понятию, и нз при¬ надлежит более общему, хотя признак более общего понятия полно¬ стью из поля зрения не исчезает, а остается на втором плане. На¬ пример, словосочетание ’добрый отец* указывает в nepBju очередь на отношение отца к детям, хотя остается и смысл ’отец - доб¬ рый человек’ . Если прилагательное х указывает на какой-либо признак ? и объект А этого признака не содержит, то прилагательное х как функция существительного -легко может быть доопределено на объект А без какой-либо потери однозначности. Поэтому с легкостью воз¬ никают такие понятия как ’легкая радость*, ’тяжелая тоска’, ’чер¬ ная душа’, ’серые мысли’, ’свежая идея’ и т.п. Шля Afy образуется как результат смешанного вьмисленля би¬ нарной операции a(z,b' , где г» (i = у) - простейший объект, содержащий всего одну функцию f с конкретным значением у . Но тем не менее этот объект может иметь свое собственное имя, и что¬ бы использоваться з языке, он обязан иметь шн. В СЯ это имя сов¬ падает с обозначением S^fy . Б русском языке такие имена об¬ разуются, как правило, при помощи суффиксов: -ость, -стзо, -и, реже (устаревшее словообразование) -изн, -от: цветкрас- ный - краснота; Sqa реакцияб - бешенство; Sqa цветбелый - бе¬ лизна; S0A гордыня4 - высокомерие; sqa реакцияб - ярость. В СЯ имена Afy и S^Afy связаны тождеством: ScAfy(x) = Socopul(x,AXy(x)) . Теперь можно расширить области определения функций Afy ра¬ спространив их на множество всех имен 30А1у . А гэрдыня4( реакцияб) - высокомерная ярость; А гордость-2( зоА искренность-4) - застенчивое притворство.
104 Тот факт, что имя s^fy указывает на признак Гу объекта х будем записывать в виде soAfy(x) . Определим прилагательное Ах , образованное от имени объекта х , кат: функцию на именах s^fy : Ax(S</fy) = SjjAfyfx) , Аналогичные равенства в оусском языке: отцовская дсброта-добрста отца; эгоистическое самолюбие--самолю~ бие эгоиста; человеческая гсрдость=гордость человека. На множестве имен Afy определим функции Advgz (где f, % >• признаки объектов, - их значения) как решение уравнения: (I) ^ur,cc(Agz(ScAfy(x))) = copul(x,Advgz(Afy)(х)) . Функциям Adv^a ь русском языке соответствуют наречия, опреде¬ ленные на множество прилагательных. Например, funcQ (а гордость -2(упрямство4(Иван)))= copul (Иван, Adv гордость~2(упрямство4) (’’ван)). Левой части равенства на русском языке соответствует фраза: имеет место быть застенчивое упрямство Ивана; правой - предложение: Иван застенчиво упрям. Из уравнения (1 ) непосредственно следует, что S0Advgz(Afy) = Agi'/s^fy) . So (высокомерно яростный)=высокомерная ярость. Если в уравнение (1 ) вместо функции Agz подставить тож¬ дественную функцию А , получим тождество: funco(so.^fy(x)) - copul(x,Afy(x'') . Следует подчерк;1уть особую важность механизма словообразо¬ вания. 'Без него не может обойтись ни один естественный язык. Что¬ бы быть адекватным, семантический язык обязан содержать средства словообоазования, хотя и более скромнее, чем естественный язык. Словообразование в СЯ служит средством уточнения процесса выпол¬ нения суперпозиции функций. Выражения Afy(x). SQAfy( к) не являются законченными пре¬ дложениями семантического языка. Нерзое из них вычисляет лишь ссыл!:у на все объекты х , имеющие признак f со значением у . Второе - порождает ссылку на признак f со значением у объекта х . Эти выражения мохут быть составными частями базисных фун¬ кций, например, таких, как funoo(x), ccpal(x,y) и т.д., кото¬ рые образует законченные предложения СЯ. 1Тэи выполнении предло¬ жения fimco(Afy(x)) порождается осьект х с признаком f ,ра-
105 вным у , при выполнении - f'^rcj(soAfy(’7.)) (или copnl(x,Afy (х)) ) объекту х присваивае’ся значение у признака г . Таким образом, первому предложению ъ язкнал программирования соответ¬ ствует оператор описания, второму - оператор присваивания. Предложениям вида: copui(.;,Afy ) на русском языке, как правило, соответствуют предложения с кратким прилагательным: copul (ягода, а зеленый!) = ягоды зелены. Поэтому залисьд*у назовем кратким прилагательным семантического языка. Сравнительная степень прилагательного в СЯ выражается после¬ довательностью предложений: f^%(SoAfb(x)).funco(SoArJ(y)) .! © j , где символ ® является одним из символов. . Например, fli!Oo(SoA зеленый 1(х)),fonco(soA зеленыйДу)) .t*j =х более зелен, чем у > зеленее у ). Сдна:-:э вместо трех предложе¬ ний можно использовать более короткую запись :funco(soAfi © (х,у)). Запись S0-s!y является именем объекта с одним признаком £ , который имеет область значений у . Эта область либо содержат единственное значение, либо совпадает с областью значений индек¬ са 1 . Ео втором случае на объекте s^fi можно определить фун¬ кцию oagn : aagnfS^.fi)» SQAfi + ьДгп(1) . Функция magn по имени SQAfi строит либо имя 1 , если 1*0, либо имя SoAfi- 1 , если 1*0. Е русском языке этой фу¬ нкции соответствуют слова: огромный, большой, полный, сильный и т.п. Например, S0A реакция-? - восторг; magnfsyi реакция-7) - большой восторг; SqA реакцияб - ярость; nagn(aagn(scA реакцияб)) - огромная ярость; S0A удовлетворениеб - блаженство; inagn(s0A удовлетворениеб) - полное блаженство. Функция та;кп легко доопределяется на множество прилагатель¬ ных вида А!!: ciagn(Afi)= Afi + sign(i) . На русский язык выражение oagn(Afi) переводится наречиям.:: очень, слишком, полностью: Ареакция? - яростный; иакп(А реакция" ) = А речкцияд - очень яростны”;
106 magn(A реакция-7) - очень восторженный. В дальнейшем область определения функции cagn будет существенно расширена. Через cagn(i)(x) будем обозначать функцию raagn (rnagn ••• ... (magn(x)) •-.) . . Аналогичным образом определяется функция anti: antitS^fi) =30А£-1; anti(Afi) = Af ~ i . В СЯ выполняются синонимические тождества: So raagnAfi = magnS^Afi SoentiAfi = antiS0Afi . Пример. S (очень красный )=боль:иая краснота. 55. Действия и операции над ними Действие - понятие семантического языкааналогичное понятию глагола естественного языка. Формальное с:тределение этого поня¬ тия имеет вид fh-x2 М- (s ; fvf2,...„tn) , где f - символ (идентификатор) действия, х1?х2,...,хт - аргу¬ менты, являющиеся именами объектов, ст - последовательность су¬ перпозиций базисных функций, описывающая сущность действия; fi -• признаки этого действия. Опишем несколько действий Сл. Вместе абстрактных идентифика¬ торов действий будем использовать фразы русского языка, семанти¬ чески близкие к описываемым действия:.:. х совершает £ = (орег^х, *); интенсивно i , скорость 1 ,продолжительно i , совместность i =(мичохсдом,....совместно,...,наравянх,гл2в- нымобразом), завершенность- (imperf<perf, perffut, fat), многократности (mult, sing), постоянство^...,пс стоянно,...,регулярно,... /часто,...,редко,... ... ,здинс:кды), суиъективнаяоценка=((вульгарно,...,грубо,...,нейтрально,...,неж¬ но, ласково) I торжественно), направленностьдейст£ия=(зокруг.над,...,дэд,...,скьозь5через, мимо), полкотаобъсн'1 а=( весь. полностью,...,частично ....), дополнительно,повторность»;снова | нет),
107 расположениеобъектов=(...,вперемешку,вплотную,рядом,вместе,... ...,врозь)). Все характеристики действий можно разделить на две группы: одни из них характеризуют собственно действие (интенсивность, продолжительность и т.п.), другие - характеризуют объект, на ко¬ торый направлено действие: направленность действия описывает его пространственное распространение относительно объекта, полнота объекта указывает, на какую часть объекта направлено действие: на весь объект или на его (большую - меньшую) часть. Если дейст¬ вие направлено на множество объектов, то характеристика ’распо¬ ложение объектов’ определяет, как элементы множества расположены между собой; субъективная оценка определяет стилистическую ок¬ раску действия: куит.ть - есть •- жрать; характеристика ’дополни¬ тельно’ означает, что данное действие является продолжением ана¬ логичного действия и направлено на некоторые дополнительные объ¬ екты. Примеры perf ir.oep скорость5(волноваться)«взволноваться; ‘ perf интэнсивнобСкрикнуть)«вскрикнуть; perf торжественное благодарить)«возблагодарить; perf тщательно(белить?«выбелить; (тщательность - характеристи¬ ка субъекта действия (Adv^y) ); perf дополнительное купить)«докупить; perf мимоходомС прибежать)«забежать; perf полностьюе плескать)«заплескать; perf предварительное планировать)«запланировать; perf вохруг(бежит (х, дом)) - х обежал вокруг дома; perf снова(воспитывать)«перевоспитывать; perf частичное мыть)«замыть. Если ПР - предлог: в, над, под и т.д., то х находится ПР у = (1сс(х,у); ПР=(внутри / на I над / под / сбоку I ... I расстояние 1)); х находится в комнате= ;1ос(х, комната); ПР=внутрч); х на кухне= (1ос(х. кухня); ПР«внутри); х на крыше= (ioc(x, крыша); ПР=на); х рядом с домом= (1ос(х, дом); расстояние=1); х у дома» с 1зе,дом); расстояние^';
108 х был в доме» (perf 1оо(х, г.ом); ПР=виутри); х перемещается из у в z , используя w , по v со скоростью 1 = (fin loc(x,y). incep loo (х , z)) , транспорт=((физобъект wlpart (х ))) , по=(суша ( вода ( воздух | космос),скорость (1(a)) . Если х - человек, то: х едет=(перемещается,транспорт=(физобъект),по=суша); х едет на телеге»(перемещается;транспорт=телега,по»суша); х идет-(перемещается; транспорт=нэги,по=суша); х плывет-(перемещается; по-вода); х плывет на корабле=(перемещается;транспорт=корабль,по=вода); х летит=(перемешается; по=(воздух t космос)); корабль плывет=(перемешается; по=вода); х плывет под зодой='.оаиа((1ос( х, вода), ПР=знутри),fin loo (х, у), in сер 1о<з(х, и))) . Для того чтобы сократить длину описания, в тех случаях,ког¬ да одно действие обличается от другого лишь суперпозицией & , будем использовать записи вида переместился» perf перемещается; перемещался» ieperf перемещается; переместится» fat переместился; будет перемещаться» fat перемещается. Множество действий, такк;е как и множество объектов, легко поддается иерархическому упорядочению. От белее общих действий, сужая область значений характеризующих функций, а в случае необ¬ ходимости, добавляя новые, что для действий не типично, • мож¬ но переходить к более конкретным действиям. Операции над действиями. Как было сказано выше, от символов действий можно образовывать имена SQf, 3*1, slf(x1,x2,...,ха ). Без какого-либо изменения могут быть определены (признаковые) функции Afy если f - признак некоторого действия. Например, А скорость 1*5 (перемещается(х)) - х быстро перемещается. Та¬ кие функции на русский язык переводятся наре»?иями. Если аргумен¬ том функций М” являются имена действия , то в русском языке им соответствуют прилагательные: а скорость ^(перемеще¬ ние) - быстрое перемещение. В семантическом языке жесткая скобоч¬ ная запись позволяет не различать имена признаковых функций, оп¬ ределенных на действиях и на их именах. Однако по аналогии и
109 именами Adv* (i* 1) , вводимыми ниже, будем обозначать их словом AdvQfy. Пусть f - признак первого аргумента действия ^(x^Xg, ... ..., хп). Суперпозиция g(XpScAfy(х^ )) = oaue(x1,/act(S(JAfy (x-j)))(заделает так, что проявляется свойство f(x.) , т.е. х1 проявляет f) характеризует объект х1 . Определим функцию Artv1Гу- равенством: Adv1fy(f1(xrx2,...,xn)) хп). Имена Adv.|fy семантического языка соответствуют наречиям рус¬ ского языка (или существительным с предлогом *с’), которые опреде¬ ляют состояние субъекта действия. Аналогичным образом можно опре¬ делить функции Adv*fy , характеризующие 1-й аргумент функ¬ ции . Примеры наречий семантического языка и их эквивалентов в русском языке: Adv* настрсениеб - радостно; Adv* настроениеЬ - весело; Adv* настроение-3- печально; Adv* искренностьЗ - простодушно; Adv^ Adv1 Adv4 Adv2 Adv* искренность-7 - лживо; Advj горданя4 - высокомерно; Adv* гордыня-5 - скромно. настроение-3(смстрит(!'1'ван,Петр)) - Иван печально смотрит на Петра; отношениеКгсворитСИвня.Пе^р)) - Иван учтиво(с учтивостью) говорит с Петром; стоимость-5(купил(Иван,книга, #,«)) - Ивэн дешево купил книгу; тшательнссть5(строится(дом,рабочие)) - дом тщательно (с тщательностью) строится ребочими. В СЯ выполняется синонимическое тождество: SoAdv*fy(g) = Afy(Sog) . Примеры аналогичных равенств русского языка: so(сильно любит)«сильная любоьь; So(разгульно живет)«разгульная жизнь; So(быстро едет)«быстрая езда; SQ (усердно работает)«усердная работа. Каждое действие ЬЯ по-своему определяет доступ к признакам своих аргументов. Некоторые действия не разрехают ц?стул даже к признакам первого аргумента. Глагол ’видеть* русского языка -
но один из примеров такого действия: * Иван высокомерно видит Петра. В СЯ какие-либо ограничения на доступ к признакам вряд ли умест¬ ны, но при переводе с ЕЯ на СЯ их, безусловно, необходимо учиты¬ вать. Поэтому при описании действий, соответствующих русскому языку, одной из важнейшее характеристик действия является харак¬ теристика его аргументов. Пусть х - и;4я i-го аргумента функции f . Определим при¬ лагательное Aj* как функцию: AiX(Sof) = . птичий перелет= а1птица(перелет)=перелет птиц; марафонский за- бег=сабег марафонцев; лесные заготовки=Л2 лес(ъаготовки)=заго- товки леса; карандашная зарисовка=А^ каранда'а(заиисовка)=зари- совка карандашом- Эти равенства следует читать справа-налево, так как правая часть определяет левую. События. Это понятие соответствует понятию предложения сЯ. Событие - это действие во времени и пространстве. Формально оно представляет собой запись tenp(loo{о , где <S - конкре¬ тизированная суперпозиция функций, или имя объекта, действия или признака, 1 - место. * - время. Каждая функция в суперпозиции есть имя действия или базисная функция. Иерархии понятий времени и места отроятся так же,как и иерархия физических объек¬ тов. Любой физический объект может быт© указателем места. Но по¬ нятие места в языке принципиально отличается от понятия физичес¬ кого обьекта, поэтому в СЯ оно выделено как особая характеристи¬ ка событий. Аргументы 1 и t могут принимать значение # . В этом случае выполняются‘тождества: temp(loc(6“ ,1),*) = loo(<5М); 1ос( S ,«) •* <Г . Если 6' является именем, то 1ос(<5’,^) « fnno (6‘) . §б. Система синонимического перифразирования В паботе fl'f 1 была построена система поркфразиюовекия. Здесь приводится более полная и точная системе, в которой учиты¬ вается тождества, подерг vune прилкцатепьные и наречия. Числе на¬
ш рений и соответственно прилагательных в каждом равенстве может быть более одного или равно нулю. При переводе с русского языка на СЯ следует различать тип наречия: как, как долго, когда, где, куда и т.п. Наречия типа как определены ‘на глаголах*; наречия типа кэк долго - на некото¬ рых глаголах несовершенного вида; остальные наречия являются ар¬ гументами глаголов или базисных функций, поэтому при перифрази¬ ровании не могут быть преобразованы в соответствующие им прила¬ гательные. Некоторые наречия могут играть двойную роль в предложении. Например, наречие ’своевременно’ (как ( когда) может быть опре- и •< . делено на глаголах и может оыть аргументом базисной функции temp. Поэтому ’Он своевременно помог ей’=своевременно(помог(он,она))« =он оказал ей своевременную помощь (см. п. 3) на с.1'12),’0н свое¬ временно помог ей*= (г;омог(он,она),своевременно^ temp (о.ч оказал помощь,своевременно)=’Он оказал ей помощь своевременно’. Наречие ’существенно’ имеет тип как, поэтому *0н существенно помог1 ей’=’0н оказал ей существенную помощь’. Однако ’Он суще¬ ственно оказал ей помощь’ - неправильная фраза и ее невозможно получить как перифразировку предложения.’Он существенно помог ей’, Аналогично, ’давно(когда | как долго): ’Он даьчо помог ей*- = "temp (помсг(он,она)sдавно)—’Он давно оказал ей помощь’. Пред¬ ставление в виде: давно(помог(он,она)) на СЯ невозможно, поэтому невозможна перифразировка: ’Он оказал ей давнюю помощь’. Однако наречия типа как долго определены на некоторых глаголах несовер¬ шенного вида: ’Он давно ненавидит пауков*«’0и испытывает давнюю ненависть к паукам’. Приведенные ниже тождества I) - 15) всегда выполняются в семантическом языке. В русском языке допустима далеко не каждая из этих перифразировок. Во-песвых, не каждый глагол f позволя¬ ет образовывать имена S^f (О s is п). Во-вторых, базисные Функции oper, copul и т.д. при некоторых значениях своих аргументов не имеют прямого перевода на русский язык. I) Advify(c(x1 хп)) » Г fvraoo(Afy(Sl,’rx1 хп))) . где Т = (perf, imparl, perf fut,fut>- характеристика функции g . ’Народ торжественно встретил его *=торжественнэ(встретил( народ.
112 он))= perf func0 (торжественная зстреча(народ,он))-’Торжествен¬ ная встреча его с народом состоялась’; ’Иван пришел своевременно’=своевременно(пришел (Ивен))=’Имел место своеаремешдгй приход Ивана’. AdT0fy(g(xv.>oxn)) = Т X«a>ol(Afy(Sog(x1,...,xn)%xl) . ’Он сильно тоскует’«’Сильная тоска гложет его’; ’Иван жестоко отомстил ему*=*аКестокое отмщение Ивана настигло его ’; ’Он единолично владеет угодьями*= funo2 (единоличноевладение (он),угодия)=’Его единоличное владение распространяется на уго¬ дия ’. 3) A<?vofy(g(Xl xD))= т operl(xi#Afy(sog(x1 хв))). ’Петр блестяще победил врага*=’Г:етр одержал блестящую победу над врагим’; ’Иван глубоко уважает Марию’«’Иван испитьвает глубокое уважение к Марии’; •Он жил весело и разгульно’«’Он вел веселую и разгульную жизнь*; ’Он долго ловит рыбу’=*0н ведет долгий лов оыбы’; ’Иван твердо решил писать’=’Иваи принял твердое решение писать*; ’Партизаны упорно сопротивляются противнику’= орег2 (противник, упорное сопротивление(партизаны))=’Противник встречает упорное сопротивление партизан*. 4) Advofy(g(xv ..^Хд)) = Т c.au6(xvlab(x2fKfy(S g(x ...,xn)))). ’Он нежно заботится о ней’«’Он окружает ее нежной заботой’; •Иван жестоко наказал его*=*Кван подверг его ?<естокому наказа¬ нию’. 5) Advofy(g(x1,,,.,xn'l) «х Г oopul(S0g(xr....,xn),Afr;H Advlfy(g(x1,...,xn))= Т oopul(Sis(zv...,xn),Afy(S1g)) (1 ? Un). *Сн сильно ненавидит Мвана’=’Егс ненависть к Ивглу сильна*; ’Иван весело купил тетрадь’«’Иван,который к^тгил тетрадь,был весе¬ ла ;м пс куп ат ел ем ’; ’Он пришел своевременноЕго приход был своевременным’; ’Петр блестяще победил врага’«’Победа Петра нзд врагом была блестящей’;
из ’Он жил весело и разгульно*=’Егс жизнь была веселой и разгуль¬ ной’. 6) Advlfy(s(x1,«..,xB)) = Т operi'convi1(g(x1,»,.,xn))> Socopal(-*,Aiy)) . Наречие здесь определено на признаках i-го аргумента. Функция оуег^ на русский язык в этом случае переводится словами: прояв” ляет, испытывает. Если признак относится к характеристикам: чув¬ ство, настроение или удовлетворение, то используется слово испы¬ тывает, иначе - проявляет. Временные характеристики функции g переносятся на функцию орог^, . *0н нежно заботится о ней’=’Заботясь о ней. он проявляет неж¬ ность’; ’Иван жестоко наказал его’=’Наказывая его.Иван проявил жестокость’; ’Он работает с усердием’=’Рабстая, сн проявляет усердие’; ’Он ловил рыбу с радостью*=’Лсвя рыбу, он испытывал радость’ = ’Ловя рыбу, он радовался’. 7) .\dvify(g(x1, = temp(T copul(X1,Afr), imperf га» • ’Он нежно заботится о ней’ =’0н - нежный,когда заботится о ней*; ’Иван жестоко наказал его’=’Иван был жестоким, когда наказывал его ’; ’Он ловил рыбу с радостью*=*0н был радостным, когда ловил рыбу*; ’Он работал с усердием’=’Он был усердным, когда работал’; ’Иван спокойно купил книгу’=’Иван был спокойным, когда покупал книгу’. 8) Sof = S0^(SnT) ; Sof(x) ® Sc*(S1 COpul(x,S1i)) . ’Продажа заканчивается’=’Работа продавцов заканчивается’; •Лов рыбы продолжается’=’Работ? рыбаков продолжается’; ’Агрессия усиливается’=’Действия агрессора усиливаются*. gr Perf cau8(x.f(x1,.,.,xn))r> per* f(xv...,x ) ; perf incep f(Xl x j« f(xv ...,xn) perf саиз(Иван, incap зиситlкартина})=Иван повесил картину perf incap висит(картина)=висит(картина)=картина висит. xn) v f(-x1 xn) V
114 -ccn) . Более точно: правая часть равенства должна содержать все подмно¬ жества (отрицаний) множества аргументов. ’Неверно, что Иван купил ботинки*«’Либо Иван не купил (а продал) ботинки, либо не Иван купил остинки, либо Иван купил не ботин¬ ки* ; ’Он не должен туда ходить’» (должен(он,ходить(туда)))=*либс он может туда не ходить, либо не он должен туда ходить, либо он должен туда не ходить’: ( -» должен)( х , f )»может( х . -if). Ц) -nagn Advfy(g) = funoo(bagnAfy(Sog)) Аналогичные тождества с функцией oagn имеют место для всех остальных тождеств. ’Петр очень уверенно победил’«’Имела место оч'ень уверенная побе¬ да Нетра’=*Петр одержал очень уверенную победу’=’Победа Петра была очень уверенной’; ’Побеждая, Петр проявил большую уверенность*=■’Петр был очень уверен, когда побеждал’=’Действия Петра-победителя были очень уверенными*. Первое множество перифразировок в этом примере не синони¬ мично второму: наречие ’уверенно’ в первом сл^ае рассматривает¬ ся как Adv^fy , во втором - как дат^у » а каждому из них соот¬ ветствуют различные способы вычисления значений. 12) f(ff(x1,..-,\n),.rv<,..,ym) = xn).f(xv ‘ Ги) . ’Иван, ловя рыбу, радовался’»’Иван ловил рыбу и радовался’. » ООПТ. . 4 (f)lX, ) н 1 ’ х2» ' •' ’ "п ~1 *0 Здесь co’nvi1,l2, - конзерся! функции f . ’Иван купил тетрадь у Петра’«’Петр предал тетрадь Ивану’. 14) ^wno0(Agz(SaAfy(x))) — сог«1(х,Advgz(Afy)) « Имеет место высокомерная ярость Петра*»’Петр - высокомерно яростен’. Следующие тождества были приведены в § 4 • Их левые и пра¬ вые части не являются целыми предложениями.
15) S^dTgzfAfy) = Ag^S^fy) ; A£y(S0?) : SonagnA.fi ■= magnS0Afl ; Soanti(Afi) = entiS^fl : Ax(S0Afy) ~ S^Afyfx) ; Ax(Sof) - SQf(x) . 57. Семантика словообразования русского языка В семантическом языке любое понятие изображается некоторой суперпозицией функций (множеством функций). Будем говорить, что понятия X и Y находятся в отношении словообразовательной (непосредственной) мотивации ( х - мотивирующее, у - мотивиро¬ ванное), если суперпозиция х является составной частью суперпо¬ зиции Y , и не существует суперпозиции z , содержащей х и содержащейся в Y . Например, пусть X = Afyfx) - прилагательное СЯ, тогда у = incep copul(x,Afy(x)) мотивировано понятием х . Этой мотива¬ ции в русском языке соответствует суффикс -е, образующий глаголы от прилагательных: влажный - влажнеть, седей - седэть, красный - краснеть. В СЯ русский суффикс -е можно представить как функцию, отображающую запись х в запись hicep copnl(y,x):e : х—хпеер oopul(y,x) . Эру функцию назовем словообразовательной семанти¬ кой суффикса -е. Под семантикой словообразования русского языка буде?л пони¬ мать сопоставление каждому словообразовательному аффиксу соответ¬ ствующей ему функции, определенной ла множестве суперпозиций се¬ мантического языка. Кроме основной задачи, которая заключается в описании семан¬ тики словообразовании!, не менее интересна задача: сопоставить оп¬ ределение интуитивного понятия мотивации, которое дается, напри¬ мер, русской грамматикой ПО J, с формальным определением этого понятия. Формальная мотивация - строго семантическое понятие. В СЯ понятие х мотивирует понятие у , если х содержательно беднее, чем Y . Отметим сразу, что сравнение двух определений мотиваций на материале русского языка показывает, что словообразовательный механизм русского языка строго системен.
П6 Следующие примеры демонстрируют полное совладение обоих оп¬ ределений (при толковании: устарелый=старцй и ненужный): старый — стареть-^устареть -* устарелый— устарелость; старый — inoep copul'y, старый) —*■ perf Inoep copul (у, старый). copul(y, ненуж¬ ный)— 4(perf inoep copul (* , старый). conul(.«, ненужный)) So(copul(y,AS1(perf incep copul(« , старый). (» , ненужный)))). Слово ’неравенство* мотивируется словом ’неравный': Socopul(«, неравный) и словом ’равенство’ :-j£q oopnl (*.ц равный). Еще один пример: глупо= Adv ум-5(х), глупый - А ум-5(х), глупить=ох>ег(х,А ум-5 «cult (поступок)) = Adv ум-5(поступать) - совершать глупые поступки, глупо поступать. Таким образом, слово ’глупить’ мотиви¬ руется как словом ’глупый’, так и словом ’глупо*. Множество ппимеров полного совпадения интуитивной и формаль¬ ной мотивации неисчерпаемо, хотя можно привести и примеры рас¬ хождений. Описание словообразования существенно облегчает процесс пе¬ ревода слов русского языка на семантический язык. Приведенную ниже словообразовательную семантику нельзя счи¬ тать полностью адекватной семантике русского языка. При более точном описании следовало бы учитывать семантические признаки мо¬ тивирующих слов. Например, суффикс -ун, обладая основной семан¬ тической характеристикой f—S,f , иногда добавляет к мотивиро¬ ванному им существительному признак, ’склонный к f’. Этим приз¬ наком различаются слоза: лжец - лгун, певец - пэвун. Объем книги не позволяет привести списание всех префиксов и суффиксов русского языка [ТО ?. ho приведенные ниже семантические схемы достаточны для понимания .метода описания семантики словооб¬ разования. Словооораззвание существительных. Мотивация глаголами. Суффиксы, образующие существительные от глаголов, служат средст¬ вом выражения семантики: f~*SQf, 1—(гораздо pe«e:f *S2f ). В некоторых случаях реализуется схема f— x(f) , где g есть либо uzor, л?1бо loo , либо result . 1) f sof (лов, раздувание. стрижка, .убийство, стрельба); 2) f—S^f (мот, житель, клеветник, мойщик, игрок,урожай); 3) (рассказ, подарок, похлебка, послание, пашня,ба-
117 ловень, вышивание, ученик(Петрова)) ; 4) f— S„uzor(f,#) (поднос, проявитель, подойник, седло, носилки); 5) f -* s2loc(f,#) (загон, вытрезвитель, зимовник, изоля¬ тор, бойня); 6) Soresult Г (вырез, обрубок, крыша, записка, ка¬ тыш, варево). Б. Мотивация прилагательными. Некоторые прилагательные мотивируют существительные, являющиеся названиями растений, жи¬ вотных и т.п. Семантика прилагательного играла определенную роль в момент создания таких существительных, но в настоящее время семантическая связь между ищи утеряна. Ясно, что такая мотива¬ ция остается за рамками формализации. 1) f-* S.jcopul(*,f) (скаред, озорник, тупица, хитрюга, бо¬ гач, злюка); 2) f(x) -*■ s1copul(tf,f(x)) (хроник, сушина, копирка, медо¬ вуха); 3) f(x)~* s.|Cau8(#,ииог(у,f(x))) (термист, левша, револь¬ верщик) ; 4) f(x)-> S-jOperf#,f(x)) (ударник, марафонец, грубиян); о) S1copul(mult(«),f) (опричнина, громадье, воинст¬ во , голытьба); 6) f-»s2loo(oopul(*,f),rt) (горельник, быстрина, вер¬ ховье); 7) f-*S0copul(#,f) (удаль, смелость, радушие, доброта, синева); 8) f —*-antimagn Soconul(#,f) (желтина, ехидца); 9) f-* sing sooopui(#,f) (лукавинка). В. Мотивация существительными. Семантика словообразова¬ ния и здесь подчиняется общей схеме: f-> slg(x1, ...,х ),• но разброс значений гораздо более широкий, чем в предыдущих двух случаях. Ниже приведены лишь некоторые наиболее типичные cxc.’.ti сло вообразо вания. 1) х" 5i°Per(»,So«(x)) (лошадник, голубятник, фокусник, табунщик); 2) х-*31орег(*,х) (завистник, сплетник, горюха, дивер¬ сант, бунтарь);
118 3) х ->• S2loc(x«*) (телятник, гнойник, глазница, хлебни¬ ца, псарня); 4) х^caus^, czor(.«,x)) (весовщик, плугарь, очкарь, трубач); o') х-*- S.jhab(*,.x) (помещик, горбач, горбун, плантатор,ди¬ абетик) ; 6) х-* s1hab(^,magn(x)) (ушан, губан, пузан); 7) хS1caue(«,incep Типоо(х;(фортификатор, лектор); 8) х—Sooper(*,x) (терроризм, жеребьевка, дождевание); 9) х-* socopul(«,x) (бандитизм, лизина, героизм, метраж, кокетство); 10) S2opor(x,*) (шпиона;); 11) x-* uultfx; (водь, бабье, солдатня, колоннада, братья, березняк); 12) х— sing(x) (горошина, дождинка, паутинка, крупица, железяка); 13) x — antiuagn(x) (шумск, лобик, леща, сельцо, ручонка, бочонок). Словообразование глаголов. Р. Мотивация именами. Первой (основной) семантической схемой словообразования глаголов явля¬ ется схема: х —-caus(y,gx(z,x)) , где функция gx , выбирае¬ мая по слову х есть одна из функций: incepfuncQ . irtcepcopul, lab usor, incenioc, incenhab,eopul ( x , подобен (у )). Про¬ блема словообразования для этой схемы может быть сформулирована следующим образом: дана функция g(z,x) ; требуется найти функцию f(y,z)t удовлетворяющую уравнению;resuit f(y{ z)« g(z,x) . Мини¬ мальным (в смысле длины записи и количества информации) решением этого уравнения является функция oaus(y,g(z,x)) . Суффиксами, реализующими эту семантическую схе?лу, в основном являются суффик¬ сы: -и, -нича, -оза > -ирова } -изирова. 1) х-* caus(y,iiicep hab(z,x)) (ранить, женить, ссудить, титуловать); 2) х-* caus(y,inccp copul(z,x)) (сиротить, калечить, бод¬ рись) ; 3) х —«• caus(y,incep funoo(x)) (дымить, коптить, мусорить, жертвовать); 4) х—— causfy,lab(ZjX)) (пилить, лопатить, асфальтиро-
119 вать, судить, глянцевать, арканить, спорить); 5) х с8ча(у,incep loc(z,x)) (складировать); 6) х —^c&us(y,uzor(z,x)) (математизировать, перчить, косты¬ лять); 7) х—*сацв(у,copui (у, подобен (х))) (парусить, важничать, молодить); 81 X -* caus(y,incep fuuoo(s1copul( * ,подобен (х)))) (ба¬ зарить) ; Второй семантической схемой словообразования глаголов являет¬ ся схема: х-л f(y,x), где функция f(y,x) - решение уравнения (х - существительное): Б^(у,х) = х. Простейшим решением этого уравне¬ ния является функция oper(y,socopul(«,x)). Эта схема реализуется, в основном, суффиксом -нича. реже суффиксами -и, -стьова. 9) х-*oper(y,socopul(*,x)) (горевать, обедать, нукать). Третьей схемой словообразования глаголов является схема, по¬ рождаемая уравнением: s^f(y,x) =х, где х- прилагательное. Ре¬ шением этого уравнения является функция oper(y,sofact(s copal (*,х))). 10) х-> oper(y,Sofact(Socopal(*,x))) (.хитрить, хромать). Б. Мотивация глаголами. Суффиксальное образование глаголов, мотивированных глаголами, характеризует общая семантическая схема: f-»g(f), где функцияg есть либо perf sing (реализуется суф¬ фиксом -ну), либо perf (интенсивно (sing f)) (реализуется суф¬ фиксом -ану), либо imnerf или mult (суффиксы: -ва, -а, -и), либо caus(x,f) (суффиксы: -и, -а). 1) f-*perf sing f (махнуть, хлебнуть, плюнуть, глянуть''; 2) f->perf (интенсивно (sing f)) (стегануть, сказануть, тряхануть); 3) perf f-^imperf f (вырубать, вооружать, забывать); 4) imperf— mult imperf f (хаживать, знавать, нашивать); 5) f caus(x,f) (гасить, кипятить, лепить, морозить); Аналогичным образом описывается семантика словообразования при помощи префиксов. Приведем лишь несколько типичных схем пре¬ фиксально-суффиксального словообразования глаголов. Суффикс -и: IJx-^-perf caus(y,inoep copul(s,x)) (выпрямить, снизить);
120 2' х-<» porf caue(y,incep copul( z,magn(x) )) (ИСТОНЧИТЬ, ИС- полошить); 3) х — ;■perf caus(y,incep hab(z,x)) (озаглавить, остеклить); 4) xperf oaua(y,fin hab(x,y)) (обескрылить, расчехлить); 5' x-*• perf саце(у, Incep copul( z, antimajpa (x))) (ПОДНОВИТЬ, подкислить); 6' x-'perf caue(y,fin oopul(z,x)) (раскулачить, рассекре¬ тить, рассредоточить). Суффикс -е: 1) х perf incep copul(y, покрыт(х))(замшеть, обомшеть); 2) х —perf incep copul(v,x) (задеревенеть, ополоуметь); 3) X * perf incep hab(y,х)(оморщинеть); 4) х perf fin hab(y,x) (обезрыбеть, обезденежеть). Суффикс -ну: I) х antima^n(x) (всхлипнуть, взгрустнуть, прихворнуть). ЛИТЕРАТУРА 1. АЛАГИЧ С., АРБИЗ М. Программирование кооректных структуриро¬ ванных программ. М., 1984. 2. АЛЕКСАНДРОВА З.Б. Словарь синонимов русского языка. М., 1969. 3. БАРАНОВ С.Н., НОЗДРУНОВ Н.Р. Язык Форт и его реализация. Л., 4. БУРЗАЕИ И. Теория множеств. М., 1965. 5. ГРИС Д. Наука программирование. М., 1984. 6. «Г^АЛ^У., ДИКСТРА Э., ХООР К. Структурное программирование. М., 7. ДЕЛКСТРА 3. Дисциплина программирования. М., 1978. 8. КАХРО КАЛьЯ А.Р., ТЮТУ З.Х. Инструментальная система программирования ЕС ЭВМ (ПИЗ). М., 1981. 9. ЖЛЫ1УК И.А. Опыт теории лингвистически моделей "Смысл - текст": Семантика, синтаксис..М., 1974. 10. РУССКАЯ гпамматика. Т.1,2. М., 1982. 11. ТУЗОВ В.А. Математическая модель языка. Л., 1984. 12. СП0ВАРВ антонимов. И., 1985. 13. СЛОВАРЬ синонимов. Л., 1975.
СОДЕРЖАНИЕ Введете 3 Глава I. Концептуальна основа языка представления энаниз» . . 23 § I. Классификации методов программирования . . 24 § 2. О*’ задачи - j ; алгоритму 30 § 3. Алмаз - абп’Лрактний язык представления знаний .... 41 Гла'в^ <•. Система обработки оложноорганизованной информации 58 § I. Об работка списков § 2. Операции над множествами 65 § 3.. Опяряпип реляционной алгебры 67 4. Моделирование автоматов ”0 § 5. Недетерминированные функции 73 § 6. Сборка мусора ..... 76 § 7. Альтернативные варианты реализации системы 61 Глава 3. Основы семантического языка 85 § I. Синтаксическая классификация предложений русского языка § 2. Базисные функции 91 § 3. Объекты 97 § 4. Операции над объектами 101 § 5. Действия и операции чад ничз 106 § 6. Система синонимического перифразирования. . . . . . . НО Литература 120 Тузов Виталий Алексеевич ЯЗИКИ ПРЕДСТАВЛЕНИЯ ЗНАНИЙ. Учебное пособие. Редактор М. И. Лаптева Техн, редактор Л. Н. Иванова Мл. редактор 3. А. Кальвин Св. темпл. 493. Подписано в печать с оригинала-макета 03.12.90. Ф-т 60х9С/"6. Бум. тип. й 3. Печать обетная. Усл.печ.л. 7,5. Усл. кп.-отт.7,5. Уч.-изд.л. 6,91. Тирах 500 экз. Заказ й 469 • Нена 20 коп. Редакционно-издательский отдел Ленипгоэдсксго университета. 199034, Ленинград, Университетская наб., 7/9. Печатко-мнокктельзая лаборатория Леншг'оадскох'о унизерситеха. 199Со4, Ленинград, наб. Макарова, 6.