Формальные языки
Анализ рассмотренных нами работ, посвященных уточнению понятия алгоритма, показал, что изложенные в них теории эквивалентны. Каждая из них позволяет построить свой класс алгоритмов. Поэтому уточнение понятия алгоритма распространяется на определенное семейство алгоритмов. Обобщение каждой теории осуществляется с помощью выдвигаемых ими тезисов. Дальнейшее уточнение понятия алгоритма основано на построении формального языка. Спрашивается, чем же не устраивают теорию алгоритмов естественные языки? Чтобы ответить на этот вопрос, рассмотрим особенности данных языков.
Характерной особенностью естественных языков является наличие смысла у его предложений. Предложения представляют собой конструкции слов. Предложения не являются минимальными элементами, наделенными смыслом. Слово также может нести смысловую нагрузку. Совокупность правил построения правильных предложений называют синтаксисом. Под семантикой языка понимают набор правил, с помощью которых мы наделяем смыслом предложения. При этом синтаксис зависит от семантики, что является положительной стороной. Для формального языка это достоинство становится неудобством, Почему? Потому что формальный язык предназначен для машины, а не для разумного существа. Вся теория алгоритмов направлена на автоматизацию их построения
Следующей неудобной особенностью естественного языка при построении алгоритмов является его многозначность. Различают синтаксическую и семантическую неоднозначность. Синтаксическая многозначность выражается в том, что предложения могут иметь один и тот же смысл, хотя и построены по разным правилам, а семантическая – в том, предложение имеет не один смысл.
К особенностям естественных языков следует отнести и наличие не точных выражений, что не допустимо при использовании автоматических средств при построении алгоритмов.
Очень неприятным фактом при формализации процессов является возможность появления пародоксальных предложений. (Парадокс Ришара).
К указанным особенностям естественного языка нужно добавить еще две: зависимость смысла предложений от имеющих место ситуаций в обществе и его изменчивость. Следует признать, что язык живет только потому, что он постоянно изменяется. В противном случае он умирает, как, например, латинский язык. В то же время упомянутые особенности создают определенные
трудности в теории и практике построения алгоритмов. Чтобы устранить их, построим такой язык, которому не были бы присущи перечисленные особенности естественного языка. Такой язык должен удовлетворять следующим требованиям.
Во-первых, его предложения должны конструироваться по строгим и точно сформулированным синтаксическим правилам. При этом множество правил должно быть конечным, а сами правила не должны зависеть от смысла получаемых с их помощью предложений. Потребуем также, чтобы между формой предложений и их смыслом существовало однозначное соответствие. И, конечно, язык не должен допускать в нем парадоксов.
Языки, удовлетворяющие этим требованиям, называют формальными. Формальный язык, полученный путем отбора некоторого подмножества предложений естественного языка, называют формализованным.
Первый формальный язык был построен для обоснования математики. На этом языке были записаны аксиомы, а затем с помощью правил вывода доказаны вытекающие из них теоремы.
При создании формальных языков целесообразно рассматривать два случая. В первом случае - это множество предложений, полученных с помощью синтаксических правил и второй случай – когда предложениям поставлен в соответствие определенный смысл, т.е. когда предложения наделены семантикой.
Формальный язык, как и естественный, обладает своей грамматикой, называемой формальной грамматикой.
Формальная грамматика использует понятие операция. Без этого понятия остается не ясным смысл понятий формальный язык и алгоритм.
Обычно рассматривают два вида операций: натуральные и объявленные.
К натуральным относят так называемые простейшие операции. Исходными данными для них являются слова или наборы слов. Результатами операций также являются слова. Таким образом, натуральная операция – это преобразование слова/набора слов в слово/набор слов. Все простейшие операции должны быть точно описаны.
Класс натуральных операций служит для построения более сложных операций, называемых объявленными операциями. Прежде чем объявить новую операцию, нужно сначала построить определяющий ее алгоритм и только после этого совершать акт ее объявления.
Теперь можно перейти к определению понятия первичный алгоритм.
Пусть задан некоторый формальный язык L и набор операций, среди них есть и такие, которые применимы к предложениям языка L. Помимо этого имеется множество предикатов, представляющих собой утверждения о конструкциях языка.
Назовем данный язык языком операндов.
Язык операндов определим следующим образом. Выберем некоторый алфавит А. Составим с помощью нотации Бекуса формулу:
<буква>::= │список всех однобуквенных слов в А, разделенных знаками │.
В качестве второй формулы возьмем:
<слово>::=<пусто>│<буква>│<слово><буква>.
Эти формулы являются формальной грамматикой языка L.
Предположим, что имеется также формальный язык L*, заданный с помощью нотации Бекуса. Применяемые формулы:
<Запись первичного алгоритма>::= <приказ>│<Запись первичного алгоритма><приказ>;
<приказ>::=<условный приказ>│<безусловный приказ>.
Каждый безусловный приказ состоит из меток, разделителей и знака действия. Он описывается тоже с помощью нотации Бекуса.
Условный приказ вместо знака дейчтвия имеет знак условия и условную отсылку.
Построенные по данным формулам предложения, которые назовем записями первичного алгоритма, пока не имеют смысла.Наделение их смыслом будем осуществлять по следующему правилу.
-
Найти первый приказв записи первичного алгоритма и перейти к п.2.
-
Определить вид приказа. Если приказ безусловный, перейти к п.3, в противном случае – к п.4.
-
Найти в приказе знак действия и выполнить соответствующую операцию над преобразуемым объектом. Перейти к п. 4.
-
Найти в записи алгоритма приказ, метка которого совпадает с выбранной отсылкой. Вернуться к п.2.
-
Найти в приказе знак условия. Определить, удовлетворяет ли ему преобразуемый объект. Если да, ио перейти к п.6, если нет – к п.7.
-
Принять за отсылку первую метку в списке условнных отсылок в данном приказе. Перейти к п.2.
-
Вторую из меток, входящих в состав условной отсылки данного приказа принять за отсылку. Перейти к п.2.
Назовем язык L*, наделенный семантикой первичным алгоритмическим языком, а его предложения первичными алгортимами.
Первичные алгоритмы, в которых используются только натуральные операции, называют натуральными алгоритмами.
С помощью таких алгоритмов можно строить различные операции, а значит, и целые семейства первичных алгоритмов.
Однако мы еще не можем перейти к понятию алгоритма в широком смысле слова. Для этого нужно дать определение понятию алгоритма выполнения.
С той целью создадим новый язык.
Допустим, что имеется некоторая связь между предложениями языка L и L*. Связывая некоторое предложение t языка L* с предложениями s1, s2, , sr языка L. Полученную конструкцию обозначим z (t, s1, s2, , sr ).
Совокупность таких конструкций и будет представлять новый язык.
Предположим теперь, что существует некоторый алгоритм W первого ранга, для которого любая конструкция нового языка является допустимым исходным данным. (Рангом называют число, равное количеству предложений, которые могут быть одновременно обработаны языком). Если это имеет место, то такой алгоритм называют алгоритмом выполнения.
Язык L* называется алгоритмическим языком, а язык L языком исходных данных.
Наконец, можно дать строгую формулировку широкого формального понятия алгоритма.
Всякий натуральный алгоритм, записанный на некотором языке L* и работающий над другим языком L, является алгоритмом.
