Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы вокруг нас.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
13.11 Mб
Скачать

§ 5. Нотация Бекуса. Тезаурусы

В 1958 г. на русский язык было переведено описание алгоритмического языка лгол-58, составленное с помощью особых синтаксических правил, получивших название фор­мул Бекуса. Способ описания формального языка с помощью формул Бекуса называется нормальной формой или нота­цией Бекуса.

Рассмотрим частный случай порождающей индуктивной грамматики, в котором применяемыми конструкциями являются слова, а операциями, имена которых присутст­вуют в синтаксических правилах, являются так называемые операции соединения слов. Обозначим эти операции вре­менно символами S1(P), S2(P1, Р2), S3(P1, P2. P3), …, Si(P1, Р2, ..., Pi), где Р, P1, Р2, ... , Рi — произвольные слова. Сущность этих операций заключается в следующем. Операция S1(P) является тождественной операцией. Для нее справедливо равенство

.

Например S1(мама)=мама.

Для операции S2(P1, P2) справедливо условие

.

т. е. ее результатом является новое слово, получаемое путем приписывания елов Р2 к слову Р1. Например, S2 (экстра, алгоритм) = экстраалгоритм.

Вообще, для Si(P1, P2, …, Рi) справедливо условие

Si(P1, P2, …, Pi)=P1P2…Pi.

В описанном частном случае запись синтаксических правил индуктивной грамматики можно видоизменить (не изменяя их смысла) следующим образом.

1. Во всех синтаксических правилах знак «=», отде­ляющий левую часть от правой, заменим знаком «:: =», который читается как «по определению есть».

2. Во всех правилах имена морфем заменим самими морфемами. Это можно сделать, так как морфемы являются словами (пустыми, однобуквенными или многобуквенными).

3. Если имеется несколько формул, в левых частях ко­торых стоят одинаковые групповые имена, то заменим эти несколько формул одной, имеющей такую же левую часть, а в правой части содержащей записи всех правых частей указанных формул, разделенные знаками «|». Эти знаки читаются как «или». Данное видоизменение синтаксических формул не обязательно. Новая формула рассматривается как сокращенная запись вошедших в нее старых формул.

4. Пользуясь тем, что результат выполнения операции Si соединения можно получить из ее записи путем отбрасывания функциональной буквы Si, скобок и разделяющих аргументы запятых, отбросим в правых частях синтаксических правил знаки Si, знаки «(», «)», «,».

5. Наконец, условимся об особом выборе символов, яв­ляющихся групповыми именами. В качестве таких символов будем брать фразу на естественном языке, заключенную в угловые скобки. Такая фраза в угловых скобках является одним целым и неизменяемым знаком — метасимволом.

Заметим, что в языке-объекте и в используемом естест­венном языке не должны применяться буквы «:: =», «|». «<«, «>» или сочетания букв, одинаковые с символом :: =,

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

Приведем пример описания формального языка с по­мощью нотации Бекуса. Ставить внутри формул знаки переноса или после них знаки препинания нельзя!

Как известно, десятичная система счисления является формальным языком. Ее алфавит содержит десять букв, обычно называемых арабскими цифрами. Будем считать, что базу языка составляют десять морфем, каждая из кото­рых является однобуквенным словом. Для обозначения груп­пового имени «морфема» используем метасимвол «(цифра)». Итак, приводим формулы Бекуса:

<ненуль> ::= 1|2|3|4|5|6|7|8|9

<цифра> ::=0 | <ненуль>

<строка цифр> ::= <цифра> | <строка цифр> <цифра>

<неотрицательное целое число> ::= <цифра> | <ненуль>

<строка цифр>

Эти четыре формулы Бекуса дают полное описание деся­тичной системы счисления. Покажем, как с помощью этих формул можно порождать различные записи чисел. В силу первой и второй формул 1, 2, 7, 0 являются цифра­ми. В силу третьей формулы 001207 является строкой цифр, а в силу второй формулы 5 является ненулем. Наконец, в силу четвертой формулы 5001207 является неотрицатель­ным целым числом.

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

Есть очень простые слова, которые невозможно описать с помощью формул Бекуса. Например, к их числу относятся «спаренные числа»; чтобы написать такое число, нужно сперва написать какое угодно число, а затем к нему припи­сать в точности такое же число. Спаренными числами являют­ся 88, 9191, 235235 и т. п. К сожалению, формула Бекуса

<спаренное число> ::= <неотрицательное целое число> <неотрицательное целое число>

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

Несмотря на ограниченные возможности нотации Бе­куса, она настолько удобна, что ею довольно часто поль­зуются. Мы с вами, читатель, тоже будем ее применять и потому постараемся ее запомнить. Вот еще пример опи­сания с ее помощью несложного языка:

<цифра>::=0|1|2|3|4|5|6|7|8|9

<буква>::=А|В|C|D|E|F|G|Н|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z

<идентификатор> ::= <буква> | <идентификатор> <бук­ва> | <идентификатор> <цифра>

С помощью указанных трех формул определена синтак­сическая структура, называемая идентификатором. В ряде языков программирования такие конструкции применяются в качестве имен переменных величин и некоторых других элементов программ.

В конце предыдущего параграфа мы говорили о том, что конечное множество предложений естественного языка представляет собой, без учета семантики, формальный язык. Такой формальный язык можно описать с помощью формул Бекуса. Еще один вид его описания называют тезаурусом; его мы упоминали в предыдущем параграфе23. В простейшем случае тезаурус — это список упомянутых предложений. В более сложном случае тезаурус представ­ляет собой перечень некоторых текстов, каждому из которых придана дополнительная, так называемая грамматическая информация. Эта структура тезауруса применяется в тех случаях, когда список предложений очень велик. Мы пояс­ним его на небольшом списке, чтобы передать только са­мую суть этого способа описания формального языка.

Представим себе, что множество предложений естествен­ного языка содержит такие фразы, как: текстильное произ­водство, текстильная фабрика, текстильное изделие, тек­стиль, ткань, токарный станок, токарная работа и т. д. В тезаурус можно включить тексты, разбив их на груп­пы и указав между ними связи (см. табл. 7).

Таблица 7

Чтобы получить предложения языка, нужно войти в тезаурус. Если мы остановимся на позиции 1, то про­читаем текст «изделие» и узнаем, что с ним связана пози­ция 10. В позиции 10 прочитаем текст «текстильн» и ин­формацию* 21 —1,2, которая означает, что за «текстильн» следует содержимое позиции 21 и затем текст «изде­лие» (цифра 1 во второй части информации).

В итоге получаем предложение «текстильное изделие».

Знак означает пробел. Знак * означает «данный текст» (в этом примере «текстильн»). Числа означают номера по­зиций. Если два числа разделены запятой, то из них должно быть выбрано то, которое является номером пози­ции, от которой был совершен переход к данной позиции. В графе «смысловые связи» у нас указана лишь подчи­ненность понятий. Запись «2>3» значит, что понятие «производство» старше понятия «работа».

Под номером 5 в тезаурусе стоят 2 термина «текстиль» и «ткань». Эти термины считаются синонимами (что, собст­венно, относится уже к смысловым связям).

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

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

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

Г л а в а 8

ЭЛЕМЕНТЫ АНАЛИТИЧЕСКОЙ ТЕОРИИ

АЛГОРИТМОВ