Наброски теории абстрактного формализма

Наброски теории абстрактного формализма

Теория абстрактного формализма – это теория о том, как правильно строить формализм, то есть систему формальных (строгих) обозначений. (так, естественный язык – это тоже система обозначений, но недостаточно строгая) Критерий правильности формализма – это точность смысла (то есть однозначная воспроизводимость) всех его элементов. То есть теория о том, как располагать различные символы элементов формализма, то есть где ставить скобки, запятые, другие знаки препинания и иные символы.
Короче говоря, это теория об изморфизме формализмов, а точнее – теория изиморфных формализмов, ибо любой однозначно интерпретируемый формализм (и элемент формализма) изоморфен элементу другого формализма, имеющему тот же смысл (интепретацию)
И по сути проблема здесь заключается в том, чтобы линейно отобразить некую древовидную структуру. (ибо не только любой алгоритм, в общем случае,  это древовидная (а то и циклическая) структура, но также и любое рассуждение или описание)

Так, примером изоморфных элементов разных формализмов (равно как и одного формализма, как варианты обозначений с одинаковым смыслом. И, в естественных языках тоже есть такое явление, называмое синонимией. Которое, однако, отличается от синонимии в формальных языках тем, что сам факт синономии разных обозначений не может быть установлен путём анализа самих этих обозначений, тогда как в формальных языках
(примером которых являются языки программирования и язык математики, конечно.(а точнее, математических формул) Который, в сущности, и является прообразом всех, в том числе современных, языков программирования)
являются:
1)a:=a+1
2)a++
На чём сыграл автор 2-го элемента? (а именно, это был изобретатель языка С Деннис Алистер Ритчи)
На том, что в 1) один и тот же символ (а) встречается встречается 2-жды, след-но, нельзя ли как-то сократить (-упростить) классическое обозначение (вар.1)? (и это разумно, ведь в итоге мы выигрываем на времени записи описания алгоритма)
(и это имеет смысл, и особенно для наиболее актуальных элементов формализма (далее ЭФ))
Конечно, можно, а именно так: прибавить1(а).
(Как же такое получилось? А просто мы оформили a:=a+1 как процедуру, тело которой состоит всего из одного оператора. В результате чего, т.к. переменная а является как входным, так и  выходным параметром процедуры, мы выигрываем в краткости обозначения)
После этого остаётся только придумать более краткое обозначение для прибавить1, например add1.  Но если к этому добавить еще и требование оригинальности обозначения (и желательно максимальной его очевидности), то в итоге и получится ++(а)

После этого остаётся только избавиться от скобок. И в самом деле, а зачем они, если процедура унарная? Ведь скобки нужны, чтобы отделить обозначение наименования процедуры от наименований её многочисленных аргументов (и тогда они, через скобку). Но это так, если есть какие-то требования, которые позволяют отличить обозначения процедур от обозначения переменных-аргументов процедур (например, соглашение о том, что 1-ое не может состоять как из  букв, так и из допзнаков) Хотя это распространяется на обозначения всех процедур,  а только на некоторые их частные случаи. При условии, что транслятор языка однозначно воспринимает эти (разные) частные случаи.
(Но каковы условия этого?)
Итак, получается такое: ++а.

Осталось теперь только сделать перестановку наименования процедуры и наименования (её единственного) аргумента, вот так а++.
Но что делает это возможным?
Например, то, есть разные нотации для одной и той же операции.
Например:
1)3+2
2)+(3,2)
3)(3,2)+
Структура (а значит, и смысл их), которую отображают все эти записи, одинакова:
3--
    |+
2--
Другой пример элементов формализма:
1)(2+3)*5
2)2,3+5*
Структура их такова:
2--
    |+--
3--      |*
      5--

Но не нужны ли в 2-й (из последних) записи скобки?
Для ответа на этот вопроса возьмём следующие записи:
1)(2+3)*(1+7)
2)2,3+1,7+*
Их структура тоже одинакова:
2--
    |+--
3--      |
           |*
1--      |
    |+--
7--      

Во всех этих случаях разные формализмы изоморфны. Отсутствие же необходимости скобок (во 2-ой записи 2-го и 3-го примера достигается засчёт соглашения, что перечисляемые через запятую (целые) числа (или переменные) интерпретируются как операнды операции, обозначение которой следует за данной цепочкой.
Также (в этом формализме, а он здесь один, просто записи разные) являются операндами следующие друг за другом результаты выполнения операций, разделяемые внутри в этой цепочки знаками операций,
(и это как бы конец операнда операции следующего уровня, но для надёжности и здесь следовало бы поставить запятую, а уж теоремы об оптимизации формализма дальше применить. Но кто их знает, эти теоремы? Ибо о них ведь данная статья.)
так что запятые уже не нужны.
А операция, которая совершается над этой цепочкой, указывается сразу после неё. (а это значит, указание операции и есть символ окончания цепочки)
Таким образом удаётся построить полностью бесскобочную запись
(просто скобочная запись полиарых операций, со знаками между операндами, наиболее очевидно воспринимается (и понимается) большнинством пользователей. Ибо так учат в школе.)
А также тот же принцип применим при постановке знаков операций и при постановке знаков операций перед знаками (обозначениями) операндов.

***
Отсюда получается следующее: если существуют алгоритмы, согласно которым записи в разных формализмах могут быть приведены к одной и той же структуре (типа дерево с циклами, то есть к сполна ориентированому графу), то данные записи эквивалентны по смыслу.
Но главное тут не это! А то, что данные алгоритмы должны приводить любую запись в данном формализме к единственной структуре! Если же такого алгоритма для данного формализма не существует, то это неправильный (некондиционный) формализм. (допустима тажке синонимия, то есть эквивалентность смыслов разных записей в одно формализме. Но никак не омонимия.)
Каков же ключ к выполнению данного требования для любого формализма?
Описание формализма, причём желательно формальное, то есть в виде формул.
Формализм же описывается как?

Это давно известно. Например, с помощью нотации Бэкуса-Наура (другое русскоязычное произношение: Ноора)
А значит, эту нотацию данного формализма нужно просто проверить на какие-то требования.
На какие же? То есть какие требования к формализму (который с этой точке зрения идентичен его описанию с помощью совокупности формул БН) нужно потребовать к выполнению, чтобы обеспечить однозначность любой записи в данном формализме? Это и является темой данной статьи.
(Кроме того, понятно, что существуют очевидно (с запасом) правильный формализм и оптимизированный формализм. Как из 1-го сделать (соответствующий) 2-ой?
А отсюда еще тема - теоремы об оптимизации формализмов.)

**
Но, поскольку ответ на поставленный вопрос не может быть найден с ходу в математическом русле, попробуем подойти к нему с иного направления. И оно связано с тем, что любой язык, в том числе естественный, является формализмом (в разной степени строгим) А мы знаем, что в любом языке всякое слово является некоторой частью речи, перечень которых таков: имя существительное, глагол, имя прилагательное, числительное, наречие, отглагольные формы, местоимение, предлог, союз и т.п. Однако логика (и математика) утверждают, что в информационном мире «живут» следующие типы сущностей: объекты (операнды), операции (действия), свойства, отношения.
Отсюда вопрос: какие типы сущностей каким частям речи соответствуют? Таблица соответствия, по идее, такая: объект (предмет) - имя существительное, операция – глагол, свойство (предмета) – имя прилагательное, наречие – свойство операции. Но вот как быть с отношением? И не потому ли возникает этот вопрос, что в курсе русского языка средней школы отношений вообще как бы нет? (поскольку не выделено жестко соответствущей им части речи)

Между тем, очевидно, что отношения существуют, ибо за примерами далеко ходить не надо: слева, справа, больше, меньше, равно. Что это за части речи? Казалось бы, это наречия. Но очевидно, что это не так, ибо это не свойства действий (которых, в сущности, не так и много: быстро и медленно, ускоряясь или замедляясь, но последнее уже деепричастия)
Кроме того, отношения – потому и отношения, что они связывают (как минимум) ) 2 предмета. А слева от Б, А короче Б (и в данном случае, кстати, в качестве отношения выступает сравнительная степень прилагательного)
Но вот еще сюрприз от отношений: А – муж Б => Б – жена А, А – сын Б => Б – отец А. Ибо муж, жена, отец, сын – это тоже отношения, а части речи вроде бы существительные.. Вот ещё до кучи: А – свояк Б =>Б – свояк А, А - брат Б => Б - брат А.
Ну что такое учитель? Хотя это можно трактовать как профессию, но это также и отношение, ибо: А - учитель Б => Б - ученик А.
Пожалуй, вы тоже удивитесь, если я вам приведу примеры из геометрии. Что такое медиана, биссектрисса, высота? Это отношения, связывающие соответственно объекты типа отрезок и треугольник, отрезок (или луч) и угол, отрезок и треугольник (в частности, т.к. высота есть у любой более чем 1-мерной геометрической фигуры.

Еще один фокус имеем со свойствами. Ибо в естественном языке можно не заметить, что имена прилагательные указывают не только на значение свойства (и весьма приблизително: легкий-тяжелый), но и (неявно) на тип его.(масса) Но когда мы научаемся измерять значения свойств (ибо характеристики типа лёгкий-тяжелый, длинный-короткий нас не устраивают), вот тогда-то это очень хорошо становится видно. Кроме того, каждый тип свойства определён только для объектов конкретных типов. Так длина есть у отрезка, но нет у прямой, луча, 2-х мерных и 3х-мерных фигур. А вот площадь есть у 2х-мерных фигур, но отсутствует у 1-мерных и 3х-мерных. (но какова мерность такой фигуры, как угол?)

Как видим, при определении как отношений, так и свойств (а точнее, типов свойств и типов отношений) важно указывать также типы связываемых (или характеризуемых) ими объектов. Не исключение и операции, т.к. они определяются для конкретых типов объектов и определения эти (даже при одноимённости определяемых понятий (омонимии), которая, хоть изначально запрещена, но в связи с указанием типов объектов, к которым эти понятия применяются, допустима и называется перегрузкой методов ) зависят от последних. (так, сложение векторов - это совсем не то, что сложение чисел) Поэтому начинать надо с типов объектов. Которых существует огромное множество.

Впрочем, для чего всё это нужно знать? Чтобы понимать, как (и на основе чего) строятся предложения в формализме.
Возмём для этого примеры из формализма программы для решения математических задач Maple, сначала из пакета Geometry:
1)point(P, [Px, Py]) - создание объекта P типа "точка" с координатами Px, Py(и это объекты типа "действительное число")
Здесь point - наименование (типа) операции-процедуры, P, [Px, Py]) - аргументы этой операции (указанных выше типов). Квадратные скобки здесь следует понимать как указание на необязательные аргументы. Если они не указаны, то создаётся пустой объект типа "точка".
coordinates(B) - свойство (со значением типа пара чисел) объекта В типа "точка"
Здесь coordinates - наименование (типа) свойства, с другой стороны его можно трактовать как операцию-функцию, т.к. она возращает результат в себя, а не в свой аргумент.(а значит, её можно использовать как элемент выражения)

2)square(Sq, [A, B, C, F]) - создание объекта Sq типа "квадрат", вершинами которого являются точки A, B, C, F.
Здесь square - наименование типа операции-процедуры, Sq, [A, B, C, F] - аргументы этой операции. Квадратные скобки здесь следует понимать как указание на необязательные аргументы. Если они не указаны, то создаётся пустой объект типа "квадрат".
diagonal(Sq) - свойство объекта Sq типа "квадрат"
Здесь diagonal - наименование типа свойства (длина диагонали) (значение которого имеет тип действительное число. Хотя по-хорошему-то диагональ имеет тип отрезок) для объект типа квадрат.
3)bisector(bA, A, ABC) - создание объекта bA типа линия для объектов А типа точка и ABC типа треугольник (при этом верно, что А - вершина ABC, иначе операция не определена. Но где же в таком случае отношение (точнее, реализация его) вершина(A, ABC)?)
Здесь  bisector - наименование типа операции-процедуры (биссектрисса) (её значением является конкретная её реализация, то есть выполнение)

Но где же здесь отношения?
4)areCollinear(P, Q, R) - ответ на вопрос, лежат ли на одной прямой  точки P, Q, R. (в виде операции-функции логического типа)
Здесь areCollinear - наименование типа отношения (значение которого, как и любого отношения, как выясняется, имеет тип логический (или булевский, что то же самое) ), P, Q, R - аргументы отношения типа точка.
5)IsOnLine(f, l) - ответ на вопрос, лежит ли точка f на прямой l.
Здесь IsOnLine - наименование типа отношения, f, l - наименования его аргументов, соответственно типов точка и прямая.

Итак, какие же отсюда выводы?
0)объекты в тексте фигурируют в основном в виде своих наименований.(но это притом, что их типы (в явном виде) - указаны перед этим. Что в естественном языке - не норма.)
1)свойства, отношения, операции в тексте указываются в виде наименований их типов.
2)значения свойств могут имеют, как правило, тип число.
3)значения отношений имеют тип булевский.
4)значения операций - это конкретные их реализации.
5)объекты могут иметь самый разный тип, и в том числе объектами являются процессы (родственные, получается, операциям)

Но самое главное тут не это.
А то, что свойство - имеется у объекта.
Отношения - имеются между объектами.
Операции делаются над объектами. Но при этом результат операции может возвращаться как в саму операцию, по записи (и тогда это операция-функция), либо в один из её аргументов (и тогда это операция-процедура, отличие тут состоит только в способе записи операции. И соблазн процедуры возникает тогда, когда старое значение базового аргумента функции не жалко стереть.)
А это значит, что нормальный формализм должен быть примерно такой:
<свойство>(<объект>)
<отношение>(<объект1><объект2>)
<операция-процедура>(<объект1>,<объект2>)
А именно потому, что это формализм с наибольшей прозрачностью понимания.
А всё остальное - это попытки оптимизировать формализм. (но при этом сделать его менее прозрачным. Например как а++. Ибо такой формализм уже требует докащательство его эквивалентности с наиболе прозрачным. И обоснован только желанием его оптимизировать. А это - уже следующая тема)


Рецензии