Композиция математических объектов в рамках абстрактной модели мышления

© Самойлов А. В. 2023

УДК 510.2, 004.8

Посвящается моим родителям

Помощь в работе оказал к.ф.-м.н. Ленюк С. В., доцент каф. выс. мат. МФТИ.

Аннотация

Рассматривается структура основных математических объектов, опирающаяся на абстрактную модель разумного мышления. Каковая, в свою очередь, выводится из основополагающего высказывания «я мыслю, следовательно, существую». Показано, что данные аспекты математики взаимосвязаны и могут быть заданы только в рамках объединяющей теории.

Ключевые слова: абстрактная модель мышления, смешанные системы, математическая реальность, низшая математика, ФОРАОН, формальная семантика, темпоральная механика.

Библиография: 3 наименования.

1. Введение

Потребность в настоящей работе обусловлена комплексом проблем (открытых вопросов) современной науки. Эти проблемы относятся, с одной стороны, к теории искусственного интеллекта, а с другой — к основаниям математики. Опишем их вкратце.

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

В области оснований математики, укажем проблему композиции. Математические конструкции могут быть весьма сложны, но всё сложное состоит из более простого, а в современной математике поиск наиболее простого обнаруживает сразу несколько объектов, среди которых, например, логические значения, мнимая единица, пустое множество, и т.д. Разбиение подобных объектов на более простые не описано.

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

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

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

2. Парадигма

2.1. Принципы

Данная статья описывает и обсуждает абстрактную модель мышления (АММ). Слова «мышление» и «разум» полагаем синонимами.

Источником необходимости для АММ являются наши знания о мышлении: если модель верна, то мы можем безусловно ожидать от неё тех или иных черт. Мы будем неоднократно возвращаться к мышлению как к источнику необходимости; сейчас укажем на два аспекта, важных для всей статьи.

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

Пример: вещественное число, отличное от нуля, либо положительно, либо отрицательно. Тогда пусть число, которое одновременно больше и меньше нуля, называется «чудесным». Существуют такие числа или нет, принцип универсальности требует, чтобы сама возможность их формализации не выходила за рамки АММ, в противном случае эта модель не будет исчерпывающей.

Этот пример иллюстрирует действие принципа универсальности при обосновании необходимости. Если тем или иным образом обоснована необходимость некоторого правила, то принцип универсальности, в свою очередь, обосновывает необходимость нарушения этого правила.

Второй аспект связан с внутренним представлением знаний и независимостью мышления от языка. Очевидно, что базовое мышление ребёнка успешно функционирует даже до того, как он начинает понимать и применять свой первый язык, в противном случае он не мог бы этого сделать.

Чтобы подобное стало возможным для АММ, она должна обладать встроенным способом хранения знаний, который представляет структуру объектов напрямую, т.е. выражает их композицию, а не кодирует их при помощи третьих объектов. Данный тезис будем называть принципом независимости.

2.2. Смешанные системы

В самых разных системах, хранение и изменение каких-либо объектов суть две наиболее низкоуровневые, первичные, основополагающие функции. Для выполнения этих функций в системе должна присутствовать память, хранящая объекты, и время, их изменяющее. Тройку \{m,t,x\} будем называть смешанной системой (англ. mixed system), где память обозначена как m, время как t, а объекты в памяти как x.

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

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

Среди теоретических или искусственных систем, самые очевидными примерами являются машина Тьюринга и компьютер. В машине Тьюринга роли памяти, времени и объектов играют лента, головка и символы, соответственно. В ЭВМ данные в оперативной памяти изменяются процессором.

Альтернативный термин для смешанной системы — вариальность (англ. variality).

2.3. Математическая реальность

Поскольку разум человека является смешанной системой, АММ должна включать в себя представление памяти и времени. Задавшись вопросом о природе подобного представления, мы вынуждены для начала исключить такие абстракции, как нейронная сеть и машина Тьюринга.

Что касается нейронной сети, то данная структура моделирует не разум, а мозг, что не соответствует задачам настоящего исследования: переход от взаимодействия нейронов и импульсов к мышлению есть переход от количества к качеству, который не учитывается нейронной сетью как моделью.

Машину Тьюринга также следует исключить, т.к. лента не даёт возможность представлять структуру объектов напрямую; символы всего лишь кодируют её при помощи некоторого языка. Содержимое ленты нуждается в интерпретации в рамках этого языка, что не соответствует принципу независимости.

Таким образом, необходимо предъявить другую модель памяти/времени, соответствующую принципам универсальности и независимости. Весьма удачно, что такая модель обнаруживается достаточно легко: она прослеживается в истории человеческого интеллекта от доисторических времён до наших дней.

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

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

В центре данной работы лежит идея использовать математическую реальность как представление памяти и времени в АММ и математике в целом. Плюсом этого подхода является то, что математика полагает средства письма самоочевидными.

2.4. Начальный постулат

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

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

Данная статья описывает первую часть теории. Совокупность её определений будем называть формальный аппарат общего назначения (ФОРАОН, англ. formal apparatus of overall notion, FORAON). Определения даются при помощи оригинальной графической нотации и программного кода на языке C#, дополняющих друг друга. Для каждого вводимого объекта, мы указываем цепочку обоснования, т.е. путь вывода его необходимости из НП, а также понятийный и информационный состав объекта.

2.5. Формальная семантика

Традиционно, математика связывает понятие формальности с языками, ассоциируя с ними термины «символ», «алфавит», «слово». При этом, слова кодируют смысл (семантику) объекта, а способ сопоставления слов и смысла и образует, собственно, формальный язык.

Однако, такой способ построения языка не обеспечивает передачу структуры.

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

2.6. Программная нотация

Программные определения, приведённые в статье, доступны на сайте по адресу https://mixed.systems/FORAON. Объектам ФОРАОН даны названия в нотации underscore_case, а библиотечные классы и методы именуются в нотации PascalCase.

Мы используем язык программирования, чтобы выразить структуру излагаемой идеи, поскольку язык программирования на 100% однозначен, а также лаконичнее естественного языка. Код явно указывает композицию объекта, и других «неучтённых» элементов не подразумевается.

Код ФОРАОН не является утилитарным ПО или прикладным интерфейсом (API). Также, он не делает попытку покрыть полностью материал статьи (такая попытка эквивалентна написанию нового языка программирования). Классы ФОРАОН следует рассматривать как фрагменты кода или приёмы, используя которые, можно построить программу для конкретного случая. Эти классы объединены в проект, который можно компилировать и выполнять.

3. Структура АММ

3.1. Предел осознания

Начнём разбирать НП. Мы будем анализировать как смысл, так и запись этой фразы.

Укажем, что НП высказан от первого лица, т.е. он имеет смысл для некоторого разумного субъекта. Чтобы отразить данный факт, в структуре АММ должна быть часть, соответствующая слову «я». Мы будем называть эту часть АММ термином внимание.

Формальное определение внимания: public class attention { }. Для целей статьи достаточно задать его как класс без содержания — важно само наличие внимания в составе АММ; в специальной части теории это определение будет расширено. В формулах будем обозначать внимание символом \underline{\varphi}.

Слово «мыслю» обосновывает необходимость памяти и времени в составе АММ. Одновременно, из записи НП следует, что доска и маркер являются моделями этих понятий. Поскольку использование средств письма не вызывает у математиков затруднений, мы можем включить доску и маркер в АММ и применять их для обоснования необходимости.

Смешанная система (вариальность), входящая в состав мышления, моделируется классом variality. Как видно из определения, членами этого класса являются доска и маркер (board и marker), подробнее описанные далее.

public partial class variality {

    public static board memory;
    public static marker time() => new(); }

В свою очередь, attention и variality комбинируются в классе sentience, отражающем структуру мышления в целом. Данный класс является корневым определением АММ. Таким образом, в состав АММ включены понятия, необходимость которых вытекает из «я мыслю».

public partial class sentience {

    public static attention personality;
    public static variality mixed; }

Обратимся к слову «существую». Для человека, оно означает материальный характер мышления, присутствие разума в физическом мире. В математике, «существую» будем трактовать как указание на то, что входящие в АММ объекты образуют отдельную (в противоположность знаниям) категорию, аналогичную материальным элементам разума. Эти объекты будем называть собственными (англ. own objects).

Исследуя сам себя, разум способен осознать собственные объекты: внимание, память и время, но и только. Обнаружить более детальную структуру (нейроны и импульсы) при таком исследовании нельзя. Мы будем называть границу самоочевидных знаний о мышлении пределом осознания.

3.2. Доска

Математика полагает использование поверхности для письма естественным, что даёт возможность использовать свойства доски при обосновании необходимости.

Для нас представляют интерес следующие аспекты поверхности (её размер не рассматривается):

  • два измерения (оси) — первичной и вторичной ориентации;

  • на каждой оси два направления — положительное и отрицательное;

  • преобразование осей и направлений при помощи поворотов, имеющих направление.

В настоящей работе выбраны ориентации и направления, как показано на Рис. 1. Первичная и вторичная оси обозначены как p и s, положительные и отрицательные направления как + и -. По умолчанию принимаются: положительное направление и первичная ориентация.

Рис. 1: Аспекты доски

Рис. 1: Аспекты доски

Соответствующее программное определение:

public class board {

    public enum drn { p = 0, n = 1, }
    public enum orn { p = 0, s = 1, }
    public delegate void rotate(object x, drn d); }

В классе board направления и ориентации представлены соответственно как drn и orn, а поворот как делегат rotate. Направления и ориентации моделируются как перечисления (enum) со значениями 0,1. Это значит, что мы не видим в них каких-либо свойств, кроме отличия одного значения от другого.

В формулах будем обозначать доску символом \mathscr{B}.

3.3. Маркер

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

Запись НП обосновывает использование маркера как модели времени.

Чтобы описать использование маркера, надо абстрагироваться от человека, стоящего с маркером у доски. В нашем рассмотрении есть только внимание, доска и маркер. Следовательно, в рамках АММ всё взаимодействие с доской должно выполняться маркером. Описание маркера начнём с базового сценария, в котором внимание инициирует запись какого-либо объекта на доске. Поведение маркера выглядит так:

  • получить от внимания объект, подлежащий записи;

  • записать этот объект на доске.

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

Всё вышесказанное записывается на C#:

public class marker {

    public object argument;
    public void function(object previous, object next) {

        argument = read(previous);
        write(next, argument); }}

Рассмотрим код подробнее. Класс marker содержит два члена: поле argument, представляющее собой память маркера, и метод function, описывающий поведение маркера.

Маркер взаимодействует с двумя объектами, которые будем называть коммутаторами: предыдущий (previous) и следующий (next). В базовом сценарии предыдущим коммутатором является внимание, следующим — доска (вместе с тем, принцип универсальности требует, чтобы маркер не ограничивал диапазон возможных в качестве коммутаторов объектов).

Метод function состоит из двух частей. Первая (строка 6) читает информацию из предыдущего коммутатора и копирует её в память маркера. Вторая — записывает её в следующий коммутатор (строка 7).

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

Для этого, необходимо обработать случай, когда один и тот же объект передан маркеру в качестве как предыдущего, так и следующего коммутатора. В этом случае запись нужно отменить (подчеркнём, что от записи защищено не внимание, а именно предыдущий коммутатор) — строка 4. На языке C# это выражается через аппарат исключения.

    public void function(object previous, object next) {

        argument = read(previous);
        if (previous == next) throw new Exception();
        write(next, argument); }

На этом базовый сценарий завершён.

Чтобы произвести чтение, достаточно лишь выполнить маркер, передав доску в качестве предыдущего, а внимание в качестве следующего коммутатора. Таким образом, как запись на доске, так и чтение с неё могут в равной степени выполняться маркером как средством передачи информации.

Базовый сценарий полагает, что маркер записывает информацию (argument) без изменений. Однако, принцип универсальности требует, чтобы нарушение этого правила, т.е. изменение информации между чтением и записью, также поддерживалось. Понятие изменения или преобразования напрямую вытекает из начального постулата: «мыслю» подразумевает, что содержимое памяти может меняться.

Для поддержки изменения добавим в класс marker два члена:

    public dynamic transform;
    public drn direction;

Чтобы маркер мог изменять информацию, нужен объект, описывающий требуемое изменение. Таким объектом является поле transform, добавленное к коду маркера. Второе добавленное поле (direction) указывает на направление изменения. Мы исходим из того, что преобразование может иметь прямое или обратное направление (в некоторых случаях обратное преобразование отменяет прямое, и наоборот). Положительное направление соответствует прямому, отрицательное — обратному преобразованию.

Перепишем функцию function:

public void function(object previous, object next) {

    argument = read(previous);
    argument = transform(argument, direction);

    if (previous == next) throw new Exception();
    write(next, argument); }

Строка 4 выполняет transform в указанном направлении, и записывает результат в память маркера.

Таким образом, мы взяли за основу самоочевидные аспекты маркера в виде базового сценария и рассмотрели расширение и нарушение этого сценария. Результатом этого стала модель, представляющая математические аспекты маркера, вытекающие из начального постулата. Отметим, что данная модель в точности соответствует процессу вычисления функции, хотя математика и не акцентирует внимание на защите аргумента от записи.

В формулах будем обозначать маркер символом \mathscr{M}.

Определение маркера в графической нотации даётся в 4.10.

3.4. Ластик

Менее очевидным, но всё же необходимым определением является ластик \mathscr{E}. Его необходимость следует из того, что сама по себе запись является обращаемой операцией. Т.к. любые операции в АММ выполняются маркером, ластик является просто признаком того, что объект нужно стереть.

Ластик задаётся как пустой класс public class eraser { }, т.к. мы не усматриваем в нём каких-либо свойств. Чтобы выразить на C# способность ластика стирать объект, заменим последнюю строчку в коде маркера следующим кодом:

    if (argument is eraser) erase(next);
    else write(next, argument);

Например, применение ластика к доске как таковой очищает всю память.

4. Абстрактные объекты

4.1. Универсальные термины

Необходимость понятия «объект» как предмета рассуждений следует из «мыслю», и других определений не требуется. По принципу универсальности, объектом может являться всё что угодно.

Ключевым свойством объектов является их способность состоять из частей.

Так, начальный постулат является цельной фразой с законченным смыслом. В то же время, он состоит из элементов (слов). Другими словами, НП является системой; таким образом, необходимость термина «система» также напрямую вытекает из этой фразы.

Суть понятия системы программно выражается классом system:

public abstract partial class system {
    public abstract system[] parts(); }

Данный класс определяет функцию parts(), которая возвращает набор элементов системы. Отметим, что эта функция является иллюстративной: структура объектов, как правило, более сложная, чем это может быть однозначно выражено последовательностью. Система не обязана иметь элементы (см. 4.2), но если они есть, их должно быть более одного: единственный объект не образует новую систему.

В соответствии с принципом универсальности, можно также рассмотреть (несуществующий) объект, который входит в состав своих же частей: например, записать parts() => new[] { this, ... }. Рекурсивные по parts() алгоритмы, обрабатывающие такое определение, будут зацикливаться; однако, это указывает не на некорректность самого понятия системы, а лишь на то, что несуществующие объекты отличаются в поведении от существующих (более подробно о существовании см. 5.4, 7.3).

Термины «объект» и «система» будем называть универсальными.

4.2. Нуль-система

Систему без элементов (пустую) будем называть нуль-системой (класс empty):

public class empty : system {
    public override system[] parts() => new system[]{}; }

Графическая нотация ФОРАОН изображает нуль-систему как кружочек (Рис. 2). Его размер не фиксируется и может меняться для удобства. Этот кружочек называется примитивом.

Рис. 2: Примитив

Рис. 2: Примитив

В формулах будем обозначать нуль-систему символом \underline{\alpha}. Из определения следует, что \underline{\alpha} является простейшим объектом и конечным этапом рекурсивной декомпозиции входной системы.

Мы будем выделять особенный примитив из числа входящих в состав сложного объекта, с которого начинается процесс его конструирования (он же отвечает за представление объекта в целом). Данный примитив будем называть базисом объекта. В программной нотации, базису объекта соответствует поле public empty basis, добавленное в класс system.

4.3. Дискриминаторы

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

Различные виды памяти реализуют различные способы различения объектов. Например, для памяти машины Тьюринга дискриминатором является позиция (номер ячейки) на ленте. Это позволяет в разные ячейки поместить символы и ссылаться на них и изменять их по отдельности. Аналогично, в оперативной памяти ЭВМ дискриминатором является адрес объекта.

Рассмотрим дискриминаторы на доске. Первым и самым очевидным из них является место (координаты) объекта на доске. По сути, это аналог номера ячейки, с поправкой на двухмерность доски.

Характерно, что для одного (изолированного) объекта его размещение не существенно: будь то доска, лента или память ЭВМ, не важно, где он расположен. Координаты объекта играют роль тогда, когда рассматриваются несколько объектов, взаимно расположенные в памяти тем или иным образом.

Кроме координат, доска имеет также два дополнительных дискриминатора: направления и ориентации. Отметим, что это более сложные, независимые способы отличать объекты друг от друга: действительно, одна точка не может задать ни направление, ни ориентацию.

Использование этих дискриминаторов более подробно рассмотрено ниже. Характерно, что ни лента машины Тьюринга, ни RAM не содержат дополнительных дискриминаторов, а именно ими объясняется то «богатство» математической реальности, о котором говорилось в 2.5.

Для учёта дискриминаторов, добавим новый член place (размещение) к классу system:

public abstract partial class system {
    public object place; }

Рассмотрим следующий код. В классе discriminator два (в остальном одинаковых) члена различаются по именам, т.е. система имён в языке программирования представляет собой разновидность дискриминатора. Указанный абстрактный класс является основой для других определений ФОРАОН, при этом совместно с ним используются различные дискриминаторы на доске.

public abstract class discriminator : system {
    public system o1;
    public system o2; }

Значения (place и аналогичные), связанные с дискриминаторами, будем называть информацией.

Завершая описание дискриминаторов, нужно отметить, что они относятся к конкретному устройству памяти. Так, мы ничего не знаем о том, какие дискриминаторы есть в нейронной сети мозга. Можно, однако, предположить, что память человека не менее богата, чем доска.

4.4. Контракт

Первым из объектов, более сложных, чем \underline{\alpha}, является контракт. Для его построения будем использовать один из дискриминаторов, а именно направления на доске. Построение контракта начнём с одиночного примитива (базис), вслед за которым запишем по одному примитиву в положительном и отрицательном направлении от базиса. Эти два примитива будем называть полюсами контракта.

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

Рис. 3: Контракт (неориентированный)

Рис. 3: Контракт (неориентированный)

Мы можем рассматривать или не рассматривать ориентацию оси, по которой размещён контракт. Если ориентация не рассматривается, то изображения по вертикали и горизонтали эквивалентны; также допускается изображение под углом или изогнутое. Если же ориентация рассматривается, то поле place контракта принимает одно из значений orn, изображения по горизонтали и вертикали получают разный смысл, а коннектор изображается двойной линией (Рис 4).

Рис. 4: Контракт (ориентированный)

Рис. 4: Контракт (ориентированный)

Рассмотрим программное определение контракта. Здесь o1 и o2 представляют полюсы, а конструктор contract() отражает последовательность построения объекта. Функция parts() возвращает его элементы: базис, положительный и отрицательный полюсы.

public class contract : discriminator {

    public contract() {
        basis = new empty();
        (o1, o2) = (new empty(), new empty());
        (o1.place, o2.place) = (drn.p, drn.n); }

    public override system[] parts() => new[] { basis, o1, o2 }; }

В формулах будем обозначать контракт символом \underline{\omega}.

4.5. Краски

Мы будем применять дополнительные элементы графической нотации для иллюстрации расположения примитивов в контракте и соответствующих значений place. Эти элементы для «раскрашивания» примитивов будем называть краски. Поскольку применение разных цветов в статье непрактично, будем использовать черно-белые элементы, см. Рис. 5.

Рис. 5: Контракт (раскрашенный)

Рис. 5: Контракт (раскрашенный)

Ещё один вид краски рассмотрен далее в статье (см. 4.10).

4.6. Порядок

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

Отношение порядка традиционно изображается в виде стрелочки (запись в нотации ФОРАОН см. 4.8). Запись объекта перед стрелочкой означает, что объект рассматривается, конструируется, обрабатывается или выполняется перед объектом, стоящим после стрелочки (связь порядка с временем).

Отношение порядка между двумя объектами (т.е. указание на один из них) требует одного бита информации. В программной нотации, отношение порядка будем моделировать классом order, в котором для указания на один из объектов o1, o2 используется направление (drn).

public abstract class order : discriminator {

    public drn direction;
    public system selected() => new[] { o1, o2 }[(int)direction]; }

Стрелочка имеет два смысловых наполнения. Для пары объектов, она задаёт их порядок. Кроме того, если объектов более двух, то стрелочка указывает, какие из этих объектов образуют пару.

4.7. Акцент

Традиционно, символ записывается на доске, и других вариантов не предусмотрено. В ФОРАОН, в силу принципа универсальности, примитив можно надписать как прямо на доске, так и поверх другого примитива, так что функцию памяти играет объект, отличный от доски. Данный вариант расположения примитивов имеет название акцент (accent).

Графическое определение акцента дано на Рис. 6.

Рис. 6: Акцент

Рис. 6: Акцент

Программное определение:

public class accent : discriminator {
    public override system[] parts() => new system[]{}; }

В данном классе нижний примитив соответствует полю o1, верхний полю o2; при этом поля o1 и o2 упорядочены в памяти программы, нижний и верхний примитивы также упорядочены между собой графически. Отметим, что данные поля не входят в функцию parts() акцента. Причина этого в том, что сам факт надписывания одного примитива над другим не состоит из элементов.

В формулах будем обозначать акцент символом \dot{\rightarrow}.

4.8. Директор

Другим вариантом представить порядок является стрелочка. В ФОРАОН она моделируется как указание на один из полюсов контракта. В отличие от акцента, мы рассматриваем стрелочку как изменяемый объект, т.е. она может быть инвертирована.

Построим объект, называемый директором. Для этого возьмём контракт и надпишем (при помощи акцента) над его базисом выбранное направление. В графической нотации это выражается как на Рис. 7i. Мы будем также использовать обобщённую форму директора для выражения следования (Рис. 7ii).

Рис. 7: Директор

Рис. 7: Директор

Программная нотация задаёт определение директора как класс director, компонентами которого являются: контракт c и акцент a. Конструктор director() определяет порядок конструирования директора. Функция selected() возвращает выбранное направление, по аналогии с order.

public class director : system {

    public contract c;
    public accent a;

    public director(drn d = drn.p) {
        c = new();
        a = new() { o1 = c.basis, o2 = new[] { c.o1, c.o2 }[(int)d] };
        basis = c.basis; }
    
    public drn selected() => (drn)a.o2.place;
    
    public override system[] parts() => new system[] { c, a, }; }

В формулах будем обозначать директор символом \mathscr{D} или стрелочкой.

4.9. Цепочка

Рассмотрим, как построить объект из двух (или более) контрактов. Будем объединять контракты путём надписывания (акцент) базиса следующего контракта над полюсом предыдущего. Объединяемые контракты изображаются под разными ориентациями (Рис. 8).

Рис. 8: Цепочка

Рис. 8: Цепочка

Данный объект будем называть цепочкой и обозначать как \mathscr{S}.

Программная нотация задаёт цепочку как класс sequence. В нём объекты o1 и o2 это первый и второй контракты, размещение которых принимает значения ориентации, первичная и вторичная. Базисом цепочки является базис первого контракта. Элементами цепочки являются контракты и акцент (ы) между ними. Если следующие контракты надписаны только над одним из направлений предыдущих контрактов, такую цепочку назовём линейной, если над каждым, то насыщенной.

public class sequence : discriminator {

    public accent a;
    public sequence() {

        (o1, o2) = (new contract(), new contract());
        (o1.place, o2.place) = (orn.p, orn.s);
        a = new() { o1 = ((contract)o1).o1, o2 = o2.basis };
        basis = o1.basis; }

    public override system[] parts() => new[] { o1, o2, a }; }

4.10. Собственны

© Habrahabr.ru