Аналитика небольших данных: как совместить Excel, Python и SQL с помощью инструментов с открытым исходным кодом

Введение

Однажды Джоэл Спольски в своей знаменитой презентации «You Suck at Excel» сказал, что существуют сотни коммерческих продуктов, вместо которых можно было бы использовать табличку Excel.

В этой шутке очень высокая доля правды. Excel благородя интуитивному UI, формулам и VBA дает возможность пользователям самим решать широкий спектр задач, избавляя от необходимости каждый раз обращаться за помощью к разработчикам или внедрять в компании новый продукт. Excel используется везде от мелкой розницы до Fortune 500 и CERN.

Пользовательский интерфейс Excel оказался, настолько удачным – ни один из конкурентов так и отошел от привычных таблиц. Для пользователя Excel интерфейс Google Spreadsheet будет привычным и интуитивно понятным. А вот по своим функциональным возможностям Excel до сих пор превосходит большинство конкурентов.

Как с помощью двух мощных инструментов с открытым исходным кодом можно совместить привычный для пользователей интерфейс, надежность и мощь SQL, гибкость Python и командную работу как в Google Spreadsheet? Давайте рассмотрим это на простом примере.

Grist

https://github.com/gristlabs/grist-core

Это аналог Google Spreadsheet который можно хостить на своей инфраструктуре. Интерфейс Grist похож на Excel, но вместо VBA используется Python, а вместо инфраструктуры Google каждый документ Grist представляет из себя базу SQLite.

В каждой ячейке можно вводить формулы на Питоне:

Формулы

Формулы

https://support.getgrist.com/formulas

По сути дела весь документ Grist – это скрипт на Питоне, который сохраняет данные в базу SQLite:

Python

Python

У этого решения есть огромный плюс – ваши данные всегда остаются у вас. Для SQLite очень легко настроить резервное копирование – в отличии от «серьезных» баз данных, SQLite не требует особого ухода, но при этом почти ничем не уступает по функционалу MySQL или Postgres.

Не будем подробно разбирать все возможности Grist, разработки этого продукта ушли гораздо дальше Google Spreadsheet и Excel. По сути дела, Grist можно использовать в качестве мини CRM в небольшой организации. И это решение будет мало чем уступать дорогим (в плане обслуживания) решениям вроде Salesforce.

В плане администрирования Grist очень неприхотлив, сервис можно развернуть в контейнере следующим образом:

mkdir persist docker run -p 8484:8484 -v $$PWD/persist:/persist -it gristlabs/grist 

В директории persist будут сохранятся данные в SQLite – это необходимо для того, чтобы они могли «пережить» перезагрузку сервиса.

Metabase

Girst – это отличный вариант для небольшой команды специалистов, но что делать бизнес-аналитику или дата-инженеру, которому нужно анализировать данные из десятков различных источников и необходимо создавать сложные отчеты и витрины данных?

Для этих целей отлично подходит другой инструмент открытым исходным кодом – Metabase.

https://www.metabase.com/data_sources

Metabase

Metabase

В Metabase есть мониторинг и возможность рассылки по почте. Графики Metabase можно встраивать на сторонних ресурсах. Существует возможность настройки интерактивных витрин данных и эверистика (Query Builder) с помощью, которого пользователь может задавать вопросы, которые автоматически конвертируются в SQL-запросы.

Charts

Charts

Настройка Metabase

Для установки вам понадобится Docker compose. Нужно создать файл docker-compose.yml со следующим содержимым:

version: '3.9' services:   metabase:     image: metabase/metabase:latest     container_name: metabase     hostname: metabase     volumes:     - /dev/urandom:/dev/random:ro     - /srv/grist:/srv/grist/persist:ro     ports:       - 3000:3000     environment:       MB_DB_TYPE: postgres       MB_DB_DBNAME: metabase       MB_DB_PORT: 5432       MB_DB_USER_FILE: /run/secrets/db_user       MB_DB_PASS_FILE: /run/secrets/db_password       MB_DB_HOST: postgres     networks:       - metanet1     secrets:       - db_password       - db_user     healthcheck:       test: curl --fail -I http://localhost:3000/api/health || exit 1       interval: 15s       timeout: 5s       retries: 5   postgres:     image: postgres:latest     container_name: postgres     hostname: postgres     environment:       POSTGRES_USER_FILE: /run/secrets/db_user       POSTGRES_DB: metabase       POSTGRES_PASSWORD_FILE: /run/secrets/db_password     networks:       - metanet1     secrets:       - db_password       - db_user networks:   metanet1:     driver: bridge secrets:    db_password:      file: db_password.txt    db_user:      file: db_user.txt 

Затем создать в текущей директории два файла:

  • db_user.txt

  • db_password.txt

В этих файлах вам нужно записать имя пользователя и пароль к базе данных Metabase.
Пускай это будет postgres и postgrespassword.

Следующая строчка конфига очень важна: мы монтируем директорию в которой Grist сохраняет свои документы в контейнер Metabase. Затем этот путь будет использоваться Metabase для подключения к базе данных:

    volumes:     - /dev/urandom:/dev/random:ro     - /srv/grist/persist:/srv/grist:ro 

В настройках Metabase в разделе «Admin Settings» нужно добавить новую баз данных SQLite указав путь до примонтированной директории Grist /srv/grist/doc/НАЗВАНИЕ_ДОКУМЕНТА_GRIST. В этом же разделе можно задать настройки автоматического сканирования схемы и таблиц.



ссылка на оригинал статьи https://habr.com/ru/articles/751352/

Инерционные автоматы в SimInTech

Создались условия, чтобы подвести некий итог. Дело в том, что автоматы в SimInTech  могут быть инерционными. И это определенно знаменательный факт. Более того, он даже радует своей неожиданностью, опровергая то фактическое неверие, которое к среде было до этого. Но давайте подробнее о том, как это все таки случилось…

В предыдущей статье (см. [1]) была допущена ошибка. С одной стороны, как говорится, это минус, но, как ни странно, это плюс, т.к. ее все же обнаружили. Нет, не те кто, как я полагаю, ставит минусы, а те, кто вникает в прочитанное. И за это хочется сказать последним огромное спасибо. Пусть даже потом они поставят минус. Это их законное право. Но тут хотя бы можно обсудить за что и сделать какие-то выводы. Хотя, как я их называю «минусеры», подобно «санитарам леса» тоже вносят свой посильный вклад в общее дело. Но все же честнее … глаза в глаза.

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

Повторим код из предыдущей статьи, содержащий ошибку. Он приведен на рис. 1. Анализируя его, сосредоточимся на коде текущего состояния автомата.  Просто потому, что код остальных состояний на текущем шаге среды будет нерабочим.

Рис. 1. Код с ошибкой

Рис. 1. Код с ошибкой

Когда сработал переход из текущего исходного состояния 0 в состояние 1, то изменяется «теневая переменная» состояния автомата — tmpState. Заметим, что только на следующем шаге ее значение будет переписано в переменную текущего состояния curState. Именно такая процедура блокирует код для нового текущего состояния на текущем шаге. Но, как оказалось, это справедливо только по отношению к состоянию, имя которого отличается от имени текущего. И вот тут начинается самое интересное…

Предположим, для текущих значений переменных a и b сработал первый переход a>b. В соответствии с алгоритмом НОД значение большей переменной уменьшается, а к значению счетчика циклов добавится 1. Но если это приведет к тому, что значение переменной a станет меньше b, то следом сработает переход, который уменьшит b, а значение счетчика увеличит еще на 1. Но если так уж случится, что после этого a сравняется с b, то это тут же приведет к срабатыванию еще одного перехода, что приведет к завершению алгоритма. Но при этом значение счетчика увеличится еще раз, а новое текущее состояние (переменная tmpState) станет равным 2. Далее уже в состоянии 2 автомат останется до тех пор, пока не изменится значение входов блока…

Таким образом, в текущем состоянии 1 при определенном соотношении входных параметров за один дискретный шаг может сработать до трех переходов автомата, что, конечно, форменное безобразие, т.к. в теории должен быть только один и только один переход. Тем не менее, эта и подобные ей ситуации могут быть разрешены  раз и навсегда очень просто — вставкой оператора exit в конец каждого действия автомата.  Проделав подобное, получим следующий код (рис. 2):

Рис. 2. Исправленный код алгоритма НОД

Рис. 2. Исправленный код алгоритма НОД

Уф! — проблема решена. Причем легко, просто и весьма надежно. Более того, этот же оператор exit позволяет упростить код автомата, исключив теневую переменную состояния tmpState. Если ранее, как это было выше описано, она была необходима, то теперь в ней нет нужды, т.к. код, который может сработать в случае той же ошибки, «отрезается» естественным образом за счет выхода из блока.

Результат работы схемы, состоящей из трех блоков НОД с входными данными из предыдущей статьи показан на рис. 3.

Рис. 3. Тестирование

Рис. 3. Тестирование

И это уже весьма близко к истине. Но осталась все же еще одна проблема — несоответствие числа исполненных шагов блоков времени их работы (см. ось времени). Эта разница составляет один дискретный шаг для отдельного блока, что составило в конечном итоге привело к опережению на два шага при индикации результата (время работы блоков составляет число шагов среды, равное значению выходной переменной nCycles, помноженное на длительность шага). Сдвиг, что наиболее вероятно, результат отражения графическим блоком текущих значений переменных в начале дискретного шага. Так  по замыслу авторов SimInTech, среда «изображает» мгновенность своих вычислений. В реальности такое блокам не под силу. Вычисления по замыслу «создателя» инерционны, а потому в реальной жизни на них всегда тратится то или иное не равное нулю время. Поэтому естественным было бы отображать новые значения переменных по истечении дискретного шага.  Но способна ли на это условно «мгновенная» среда SimInTech?

Оказалось — способна. Инерционную задержку можно организовать с помощью стандартного  блока среды — «Задержка на шаг интегрирования» из закладки «Нелинейные». С учетом этого можно предложить процедуру создания любого автомата в SimInTech, которая состоит из следующих действий:

1)  Представить каждый автомат в форме субмодели;

2) Реализовать отдельно логику автомата (лучше это сделать на внутреннем языке программирования и по описанному шаблону), включив этот блок в субмодель;

3) В рамках субмодели создать порты входа и выхода для соответствующих каналов автомата;

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

Отвечая описанным выше правилам, исходное решение примет уже несколько иной вид. На структурном уровне оно будет таким, как это показано на рис. 4. Здесь каждый блок НОД представлен субмоделью, каждая из которых имеет вид, представленный на рис. 5.

Рис. 4. Схема на субмоделях

Рис. 4. Схема на субмоделях
Рис. 5. Реализация субмодели алгоритма НОД

Рис. 5. Реализация субмодели алгоритма НОД

Тестирование уже новой схемы привело к результату, который приведен на рис. 6. Здесь рис. 6а отражает времена вычисления блоков, а рис. 6б — число их рабочих циклов. И вот теперь наконец-то к графикам претензий нет, т.к. значение циклов совпадает с временами работы блоков (сравните с графиками на рис. 4 в [1]). А это все потому, что в этот раз у нас автоматы правильные, т.е. инерционные (подробнее об инерционной модели автомата см в [2]).

Рис. 6. Результат работы схемы на рис. 4

Рис. 6. Результат работы схемы на рис. 4

Итоги

Выше мы сформулировали правила создания любых автоматов, а на примере алгоритма НОД описали шаблон их кодирования на внутреннем языке SimInTech. Все это в рамках данной среды повышает надежность программирования и увеличивает доверие к результатам работы программ. Если бы раньше им следовать, то столь досадных ошибок допущено бы не было. Как их не было при реализации этого же автомата и этой же схемы в среде ВКПа…

Ну, а я уже чувствую, как, несмотря ни на что, дрожащие от нетерпения ручки моих друзей-минусеров уже тянутся к клавиатуре… Удачи вам, други мои…

Литература

1.     Кулинарные шедевры параллелизма. Или что бывает, когда утеряны вкус и обоняние. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/750244/ свободный. Яз. рус. (дата обращения 30.07.2023).

2.     Автоматное программирование: определение, модель, реализация. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/682422/ свободный. Яз. рус. (дата обращения 30.07.2023).


ссылка на оригинал статьи https://habr.com/ru/articles/751358/

Прикладное adb (Android Debug Bridge) для зумеров

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

В этой инструкции хочу рассказать о командах adb, которые использовать легче, чем делать то же самое через UI Android Studio или настройки Android.

Основная задача — показать возможности adb, которые избавят от рутинных шагов при разработке/отладке. Например, позволят быстро переключать светлую тему на темную.

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

Денис Долгополов

Блог об Android разработке — https://t.me/dolgo_polo_dev

Что такое ADB

adb (Android Debug Bridge) — это программа для управления андроидом через командную строку.

Hidden text

https://developer.android.com/tools/adb — тут есть более правильное определение + объяснение, почему adb называют клиент-серверным приложением.

Сменить тему (светлая/темная)

// перейти на темную тему adb shell cmd uimode night yes  // перейти на светлую тему adb shell cmd uimode night no

Принудительная остановка приложения

  adb shell am force-stop ru.test.app

Удалить кэш и данные приложения

adb shell pm clear

Включить/выключить Wi-Fi

adb shell svc wifi enable adb shell svc wifi disable

Удалить файл

Без root-прав некоторые директории будут недоступны через adb

adb shell rm  "/records/albums/music.mp3"

Отправить Intent

Пригождается, когда нужно сэмулировать Intent от системы:

adb shell am broadcast -a android.media.tv.action.INITIALIZE_PROGRAMS -n ru.app.test/ru.app.test.featureName.TestBroadcastReceiver

Отправить deeplink:

adb shell am start -a android.intent.action.VIEW -d "mydeeplink"

Или запустить Activity:

adb shell am start -n ru.test.app/.feature.main.MyActivity

Установить proxy ip

Если вы пользуетесь Charles/Proxyman или другой программой для работы с трафиком, то можете быстро установить proxy ip командой:

adb shell settings put global http_proxy 192.168.1.12:8888

Сбросить proxy ip:

adb shell settings put global http_proxy :0

Изменить плотность экрана

Удобно для тестирования UI на разных разрешениях:

adb shell wm density 160  например adb shell wm density 160

Узнать, какая изначальная плотность экрана:

adb shell wm density   // Physical density: 440 // Override density: 160

Установить apk

 adb install -d -r -g "C://downloads/.../test.apk"

аргументы (лишние убрать):

  • -r — сохранить данные приложения (например, информацию в shared preferences)

  • -g — выдать все разрешение, запрашиваемые в манифесте

  • -d — отключает проверку версии приложения (по умолчанию версия устанавливаемого приложения должна быть равна или больше версии установленного)

Подключение по Wi-Fi

Необходимо, чтобы компьютер и телефон находились в одной сети. На Android нужно включить «Отладку по Wi-Fi» в настройках разработчика.

adb connect ip:port  например: adb connect 192.168.1.12 или adb connect 192.168.1.12:5555

Список подключенных устройств и их ip

adb devices

Выбор определенного устройства

Если вы работаете с несколькими устройствами, то чтобы отправить любую команду на определенное устройство (а не получать ошибку List of devices attached), можно передать аргумент -s ip

adb -s 192.168.1.12 uninstall ru.test.app

Заключение

Когда определите для себя топ удобных команд, можно сделать для них alias (псевдонимы для длинных команд). Тогда использование adb станет действительно удобнее, чем GUI.


ссылка на оригинал статьи https://habr.com/ru/articles/751092/

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

© Самойлов А. В. 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. Собственный контур

Определение собственных объектов на C# дано в 3.1. Теперь запишем графическую форму (Рис. 9), которую будем называть собственным контуром.

Рис. 9: Собственный контур

Рис. 9: Собственный контур

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

Для отражения структуры времени используем директор, надписанный над полюсом времени. Коннектор директора маркера выполнен жирной линией. Его полюсы представляют коммутаторы, базис преобразование (transform), выбранное направление действия маркера надписано акцентом над базисом.

4.11. Координаты

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

Мы можем рассматривать любой объект как абстрагируясь от его координат, так и совместно с ними. В первом случае будем использовать обычную запись x, во втором формулу \mathscr{B} \rightarrow x. Данная формула уточняет, что мы рассматриваем объект на доске, где он имеет координаты. В отличие от доски, память маркера содержит всего один объект, и координаты к нему не применимы.

Координатами сложного объекта будем считать координаты его базиса.

5. Темпоральная механика

5.1. Терминология

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

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

Традиционная математика не рассматривает напрямую понятие времени, ограничиваясь термином функция [1; с. 712]. Данное понятие оперирует парой множеств, между которыми существует отображение, или закон, который сопоставляет элементы множеств. Таким образом, понятие функции статичное, оно не акцентирует внимание на событии вычисления и его этапах. Но, исходя из начального постулата, игнорировать понятия времени и изменения невозможно, как и временну́ю природу функции.

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

5.2. Потоки и изоляция

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

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

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

5.3. Порядок следования

Средства порождения структуры в ФОРАОН диктуют определённые правила следования. Так, базис контракта предшествует полюсам: в его отсутствие полюсы нельзя записать, т.к. их расположение было бы не определено.

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

Таким образом, структура объектов естественным образом образует граф следования примитивов.

5.4. Синхронность и противоречия

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

Свойство операции ожидать завершения будем называть синхронностью.

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

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

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

5.5. Транзакция

Запишем транзакцию y = f(x) в графической (Рис. 10) и программной нотации.

Рис. 10: Транзакция

Рис. 10: Транзакция

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

На языке C#, эта транзакция сводится к вызову алгоритма f:

    dynamic f = ...;     object x = ...;     //     object y = f(x);

Напомним, что мы, в общем случае, характеризуем алгоритмы направлением, положительным или отрицательным (т.е. f^+(x) или f^-(x)). В некоторых случаях положительный и отрицательный алгоритмы взаимно обратны, в некоторых нет; а для ряда алгоритмов существует только один вариант.

5.6. Пустой алгоритм

В вырожденном случае, алгоритм не вносит никаких изменений. Такой алгоритм будем называть пустым (он необходим в том числе по принципу универсальности). Пустой алгоритм исполняется нуль-системой: x \equiv \underline{\alpha}(x). Действительно, нуль-система не содержит ни элементов, ни информации, которые могли бы описывать изменение.

5.7. Структурные алгоритмы

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

Путём использования ластика, можно проводить обратное к конструированию деконструирование. Конструирование и деконструирование относятся к структурным алгоритмам. Другим примером таких алгоритмов являются алгоритмы над множествами (см. 8.3, 8.4).

6. Движения

6.1. Обобщённое движение

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

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

В мнемонической форме движение будем записывать словом «переместить».

Найдём объект, который служит алгоритмом движения. По структуре и информации движение точно соответствует директору, т.е. его результат вычисляется как y = \mathscr{D}(x). Директоры \mathscr{D}^+ или \mathscr{D}^- выполняют вращение (поворот), директоры \mathscr{D}_p^+,\mathscr{D}_p^-, \mathscr{D}_s^+ или \mathscr{D}_s^- — сдвиг.

Примем это представление движения за основу и продолжим рассуждения.

6.2. Пустое движение

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

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

Пустое движение, таким образом, записывается как x \equiv \underline{\omega}(x); мнемоническая запись — «стоп».

6.3. Завершённое движение

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

В виде формулы такой объект записывается как:

     \mathscr{D}'^+_p \equiv \mathscr{D}^+_p \rightarrow \mathscr{D}^+

Данная запись, при её логичности, содержит проблему, которую необходимо указать и решить. Суть проблемы — ввод паразитного смысла. Обозначим директоры как 1 и 2, а их примитивы как \underline{\alpha}^0_i,\underline{\alpha}^+_i,\underline{\alpha}^-_i. Тогда положительный полюс первого директора имеет формулу \underline{\alpha}^+_1 \dot{\rightarrow} \underline{\alpha}^0_2, в то время как второго записывается как \underline{\alpha}^+_2. Т.к. оба движения абсолютно идентичны, чтобы запись была верной и не содержала непреднамеренно введённого смысла, это различие необходимо устранить.

Для этого надпишем над вторым директором контракт (Рис. 11ii). Получившийся объект в мнемонической форме можно записать как «переместить, переместить, стоп», в формуле — \mathscr{D}^+_p \rightarrow \mathscr{D}^+ \rightarrow \underline{\omega}, что полностью соответствует смыслу указанного движения, которое будем называть завершённым.

Рис. 11: Варианты движения

Рис. 11: Варианты движения

6.4. Неограниченное движение

Рассмотренное выше завершённое движение — не единственный способ устранить ввод паразитного смысла. Другим способом является применить повторение, как показано на Рис. 12. Здесь прерывистая линия стрелочки означает повторение во времени, т.е. оператор goto. Мнемоническая запись: «переместить, повторить (переместить)». В символическом виде повторение будем записывать как \mathscr{R}. Важно: повтор операции не означает, что объект следует сам за собой.

Рис. 12: Неограниченное движение

Рис. 12: Неограниченное движение

6.5. Редуцированное движение

Формула кратного движения (см. 6.3) задаёт новое движение в форме a \equiv b \rightarrow b, при этом определяемый объект находится в левой части формулы. Перепишем формулу, поменяв элементарное движение и определяемый объект местами:

    \mathscr{D}^+ \equiv \mathscr{D}'^+ \rightarrow \mathscr{D}'^+

Движение \mathscr{D}' в данной формуле будем называть редуцированным.

На доске выберем (произвольно) некоторую точку «стоп» (s). Поместим над ней центр движения (Рис. 13i). Ясно, что точка s делит движение пополам.

Рис. 13: Редуцирование

Рис. 13: Редуцирование

Далее повторим это действие, для чего добавим к объекту две стрелочки (Рис. 12ii). Стрелочки выполнены двойной прерывистой линией, что означает «параллельный goto«, т.е. повторы, выполняемые одновременно разными маркерами. Стрелочки предписывают далее разделить движения \mathscr{D}' новыми точками. Поскольку стрелочки являются элементами объекта, при повторе действия они копируются в определение, таким образом, задавая параллельно-рекурсивный алгоритм получения новых движений \mathscr{D}'', \mathscr{D}''', ..., каждое из которых в два раза меньше предыдущего.

С алгоритмом редуцирования связано понятие непрерывности. Действительно, каждый контракт можно разделить на два меньших и так до бесконечности, из-за чего количество компонентов результирующей структуры равна 2^\infty, что является признаком континуума.

Непрерывность, т.е. объект со структурой на Рис. 13ii, будем обозначать символом \mathscr{T}.

6.6. Комбинаторика вращения

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

При повторении сдвига в одном направлении результат никогда не становится равным пустому сдвигу. Это не верно для вращения. Если ориентация вращаемого объекта (например, директора) не рассматривается, то повтор вращения эквивалентен пустому вращению (здесь директор выступает как аргументом, так и алгоритмом транзакции): \mathscr{D}^+(\mathscr{D}^+) \equiv \mathscr{D}^-, \mathscr{D}^+(\mathscr{D}^-) \equiv \mathscr{D}^+.

Если же ориентация рассматривается, то вращение последовательно меняет ориентацию и направления: \mathscr{D}^+(\mathscr{D}^+_p) \equiv \mathscr{D}^+_s, \mathscr{D}^+(\mathscr{D}^+_s) \equiv \mathscr{D}^-_p, \mathscr{D}^+(\mathscr{D}^-_p) \equiv \mathscr{D}^-_s, \mathscr{D}^+(\mathscr{D}^-_s) \equiv \mathscr{D}^+_p, т.е. четыре вращения в одном направлении эквивалентны пустому вращению.

6.7. Свободное движение

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

Ввод свободного вращения говорит о том, что для свободного сдвига, надо заменить фиксированное перечисление orn в качестве ориентации контракта на вещественное число. Тогда значению orn.p будет соответствовать 0 или \pi, а значению orn.s\frac{1}{2}\pi или \frac{3}{2}\pi.

7. Математические понятия

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

7.1. Объект

Само понятие объекта уже обсуждалось в 4.1. Здесь напомним, что в рамках АММ, рассмотрение объекта означает запись его структуры на доске маркером. Наличие описанной структуры или отыскание таковой относит предмет рассуждений к математическим объектам.

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

Присутствие x(\mathscr{B}) есть состояние объекта x после создания, а отсутствие \mathscr{E}(x) есть его состояние после стирания. Понятие единственности будем ассоциировать со структурой объекта. При оценке структуры необходимо принимать во внимание граф следования, а не линейную цепочку parts().

7.2. Равенство

Необходимость понятия равенства следует из способности мышления оценивать изменения. Проиллюстрируем равенство на следующем примере. Запишем на доске число 5 в двух местах. Единственное, что отличает эти объекты друг от друга, это их координаты, т.е. значение дискриминатора.

Под отличием y от x будем понимать алгоритм, который преобразует один объект в другой. Если этот алгоритм пуст, т.е. y = \underline{\alpha}(x), то изменения y относительно x отсутствуют, что и примем за формальное определение равенства. В данном случае, дискриминаторами выступают не координаты, а сами символические обозначения x и y.

Известны аксиомы равенства, например \forall x (x = x) или \forall x \forall y(x = y \Rightarrow y = x) [3; с. 113]. Поскольку алгоритм \underline{\alpha}(x) не вносит в x изменений, не важно, какова структура x, а в случае единственного объекта x отсутствует различие даже в дискриминаторах, что доказывает первую аксиому. Если x = y, то различие между ними лишь в обозначениях, т.е. смысл не изменится, если переназвать x как y и наоборот: так доказываются вторая аксиома.

Помимо равенство, математика использует термин «тождественность», понимая под этим равенство, не зависящее от переменных факторов. Мы будем использовать знак \equiv в смысле сравнения структуры, имея в виду, что отношение = может быть переопределено для конкретного вида объектов, например множеств или чисел; так, 1 + 1 = 2, но 1+1 \not \equiv 2.

Запись y \equiv x будем также прочитывать «y в точности является x«. Если структура x входит в структуру y, но последний имеет дополнительные шаги конструирования, то будем говорить, что y является x, но не в точности. Это отношение будем называть подобием и обозначать как y := x.

Помимо равенства, знак = используется для записи присваивания: y=f(x).

7.3. Существование

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

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

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

7.4. Логические значения

В понятие логических значений входит: истина (T), ложь (F) и функция отрицания. Значения T и F мы полагаем атомарными, они не состоят из частей. Одновременно, они содержат информацию, ровно один бит. То есть, по составу знаний и информации, логические значения эквивалентны полюсам контракта: T \equiv \underline{\alpha}^+, F \equiv \underline{\alpha}^-, отрицание эквивалентно вращению: \neg(x) = \mathscr{D}(x).

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

7.5. Числа

По составу знаний и информации и по поведению, число эквивалентно алгоритму сдвига. Действительно, число (кроме нуля) имеет знак, величину (модуль) и угол (аргумент) к оси x на комплексной плоскости. Эти элементы соответствуют направлению, величине и ориентации сдвига.

В этой связи, можно отметить следующую терминологию и структуру:

  • нуль 0 \equiv \underline{\omega}

  • единица 1 \equiv \mathscr{D}^+_p \dot{\rightarrow} \underline{\omega}

  • мнимая единица i \equiv \mathscr{D}^+_s \;\dot{\rightarrow}\; \underline{\omega}

  • вещественное \mathbb{R}число есть алгоритм сдвига с первичной ориентацией

  • комплексное число r e^{i \varphi} есть алгоритм сдвига на величину r с ориентацией \varphi

  • дискретное число \mathscr{N} есть алгоритм кратного сдвига, см. 6.1

  • натуральное число \mathbb{N} есть \mathscr{N}^+_p

  • целое число \mathbb{Z} есть дискретное число первичной ориентации \mathscr{N}_p или нуль

  • натуральная бесконечность \infty \equiv \mathscr{R}(\mathscr{D}^+_p)

  • несчётная бесконечность есть непрерывность \mathscr{T} \equiv \mathscr{R}^2(\underline{\omega} \;\dot{\rightarrow}\; \mathscr{D}^+)

Знак числа будем записывать в виде верхнего индекса: 1 \equiv 1^+, -2 \equiv 2^-.

Связь определения числа с множествами рассмотрена далее.

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

Рассмотрим транзакцию на Рис. 14.

Рис. 14: f(x) = x+1 | x = 1

Рис. 14: f(x) = x+1 | x = 1

Её алгоритм имеет единственный аргумент, т.е. y = 1^+(1^+) , что эквивалентно y= 1+1; в свою очередь, 1^-(1^+) = 1-1. Отметим, что x^+_1(x^+_2) = x^+_2(x^+_1), а x^-_1(x^+_2) =- x^-_2(x^+_1). Алгоритм, симметричный в положительном направлении и асимметричный в отрицательном направлении, является повторяющимся шаблоном, который назовём симметрической парой.

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

Приведём примеры.

1 есть натуральное число. Это высказывание следует из определения \mathbb{N}.

Число, следующее за натуральным, тоже является натуральным. Аксиомы Пеано рассматривают функцию следования так же, как и сами натуральные числа: как чёрный ящик. Поскольку функция следования S(n) совпадает с 1^+(n), эта аксиома становится доказанным высказыванием.

1 не следует ни за каким натуральным числом. Исходя из природы функции следования, 1 следует за нулём. Т.к. нуль не входит в определение \mathbb{N}, единица не следует за натуральным числом.

Если натуральное число n следует как за числом i, так и за числом k, то i и k равны. Если S(n)= 1^+(n), то обратная функция S^-(n) = 1^-(n); значит, i = S^-(n), k= S^-(n), следовательно, i= k.

8. Множества

8.1. Природа понятия

Математическая энциклопедия [2; с. 758-759] сообщает, что «понятие множества принадлежит к числу первоначальных математических понятий и может быть пояснено только при помощи примеров». По понятным причинам, в случае низшей математики этого недостаточно.

Понятие множества, безусловно, связано с его элементами; но в отношении самих элементов ничего утверждать нельзя: их может не быть вовсе, или быть конечное, бесконечное или даже не счётное количество. Отсюда, природа множества связана не с составом его элементов; но тогда с чем?

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

Поэтому: в точности множество есть директор \mathscr{D}. Объект, стоящий до стрелочки, будем называть телом множества, объект(ы) после стрелочки суть его элемент(ы), а саму стрелочку назовём маршрутом множества. В простейшем случае (изолированный директор) и тело, и единственный элемент множества есть нуль-система \underline{\alpha}.

По методу горшочка, пустое множество суть контракт: \varnothing \equiv \underline{\omega}.

Отсюда видно, как натуральные числа выражаются через множества: 0 \equiv \varnothing, 1^+ \equiv \{\varnothing\}, 2^+ \equiv \{\{\varnothing\}\}, 3^+ \equiv \{\{\{\varnothing\}\}\}. Отметим, что данное выражение не является способом построить множество с n элементами, как например 2 = \{ \varnothing ,\{ \varnothing \}\}, 3=\{ \varnothing ,\{\varnothing\},\{ \varnothing ,\{ \varnothing \}\}\}, и не противоречит этому способу.

8.2. Элементный состав

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

Мы рассмотрели множество с одним элементом. Для построения множества с n элементами нужен более сложный маршрут, и примером такого маршрута является натуральное число n, где базис i-го директора цепочки связан стрелочкой с i-м элементом (Рис. 15).

Рис. 15: Множество с двумя элементами

Рис. 15: Множество с двумя элементами

Иным способом записывается несчётное множество (континуум). Здесь телом множества является начальная точка s: действительно, знание, где нужно записать сдвиг, предшествует собственно записи сдвига. Отношение следования (маршрут), вместо директора, записано акцентом. За телом следует записанный сдвиг (линия), содержащий в себе все 2^\infty точек.

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

Запись \{x_1,x_2\} означает пустое тело, т.е. эквивалентна \underline{\alpha} \rightarrow \{x_1,x_2\} .

Рассмотрим универсум, т.е. множество всех объектов. В обычном понимании, такое множество не должно существовать, т.к. следует само за собой. Низшая математика позволяет разрешить это противоречие. Любой объект, если он рассматривается, расположен в памяти. Следовательно, в качестве коллекции всех объектов естественным образом выступает память \mathscr{B} как таковая. Поскольку память является не абстрактным, а собственным объектом, её существование следует из начального постулата. Поэтому, хотя память и не содержит саму себя, она содержит все абстрактные объекты.

8.3. Алгоритмы

Подобно доске, где объект может быть записан или стёрт под воздействием маркера, элемент может быть добавлен в множество или удалён из него. Добавление элемента x в множество A будем записывать как A \oplus x, удаление как A \ominus x. Если объект присутствует (отсутствует) в множестве, то добавление (удаление) не изменяет это множество, поэтому A \oplus x и A \ominus x не являются взаимно обратными.

Пусть A и B — множества. Рассмотрим алгоритмы B^+(A) и B^-(A). Применение множества B к множеству A в положительном направлении добавляет все элементы B к A, а в обратном направлении удаляет все элементы B из A. Запишем сказанное в виде формул (8.1) и (8.2). Здесь запись (f) \rightarrow a будем читать как «выполнить действие fи положить aкак результат». Запись \forall x \in A (f(x))будем читать как «для каждого элемента x из A выполнить действие f(x)«.

(8.1)

\begin{split} B^+(A) \equiv (&C =  A \\ & \forall x \in B (C \oplus x)) \rightarrow C \end{split}

(8.2)

\begin{split} B^-(A) \equiv (&C =  A \\ & \forall x \in B (C \ominus x)) \rightarrow C \end{split}

Более привычная бинарная форма записи этих алгоритмов выглядит как объединение A\cup B и разность A\setminus B. Видно, что эти алгоритмы образуют симметрическую пару. Отметим, что данные операции не являются взаимно обратными.

Дополнение множества выразим как \overline{A} \equiv A^-(\mathscr{B}).

Перейдём к алгоритмам двух аргументов. Простейшими из них являются пересечение A \cap B (8.3) и симметрическая разность A \bigtriangleup B (8.4). Данные алгоритмы устроены аналогично: на основе \oplus и \ominus, соответственно. Запись a(x) \Rightarrow f(x) в данном контексте будем читать как «если функция a(x) истинна, то выполнить действие f(x)«.

(8.3)

\begin{split} A \cap B &\equiv (C =  B^+(A)\\ &\quad \; \; \; D =  \varnothing\\ &\quad \; \; \; \forall x \in C ((x \in A \land x \in B) \Rightarrow D \oplus x )) \rightarrow D \end{split}

(8.4)

\begin{split} A \bigtriangleup B &\equiv (C =  B^+(A)\\ &\quad \; \; \; \forall x \in C ((x \in A \land x \in B) \Rightarrow C \ominus x )) \rightarrow C \end{split}

Нам понадобится условие равенства множеств (A=B), поэтому зададим его строго формулой (8.5).

(8.5)

\begin{split} (A = B) & \equiv (C= A,D=  B \\  &\quad \; \; \; \forall x \in A (D \ominus x) \\  &\quad \; \; \; \forall x \in B (C \ominus x)) \rightarrow (C \equiv \varnothing \land D \equiv \varnothing) \end{split}

Остальные алгоритмы над множествами распадаются на перечисленные выше более простые.

8.4. Аксиомы теории множеств

Описав структуру и поведение множеств, обнаруживаем, что аксиомы о них могут быть доказаны. Проиллюстрируем это на примерах (формулировка аксиом по [3; с. 126]).

Аксиома объёмности. Любые два множества x и y, содержащие одни и те же элементы, равны: \forall x \forall y(\forall z (z \in x \equiv z \in y) \Rightarrow x=y). В соответствии с формулой (8.5), в этом случае между множествами отсутствуют относительные изменения, что эквивалентно равенству.

Аксиома пустого множества. Существует множество \varnothing, не содержащее элементов: \exists \varnothing \forall y (y \notin \varnothing). Истинно по определению: \varnothing \equiv \underline{\omega}.

Аксиома пары. Для любых множеств x и y существует множество z, содержащее в точности элементы x и y: \forall x \forall y \exists z \forall w(w \in z \equiv (w=x \lor w = y)). Запишем транзакцию:

\begin{split} z = ( & A= \varnothing \\  & A \oplus x \\ & A \oplus y ) \rightarrow A \end{split}

Данная формула непротиворечиво определяет z, следовательно z существует.

Аксиома объединения (суммы). Для любого семейства множеств x существует множество u, элементами которого являются в точности элементы множеств, принадлежащих x: \forall x \exists u \forall y(y \in u \equiv \exists z(z \in x \land y \in z)). Запишем транзакцию:

\begin{split} u = ( & A= \varnothing \\  & \forall B \in x (\forall i \in B(A \oplus i))) \rightarrow A \end{split}

Данная формула непротиворечиво определяет u, следовательно, u существует.

Аксиома множества всех подмножеств. Для любого множества x существует множество y, элементами которого являются все подмножества множества x и только они: \forall x \exists y \forall z(z \in y \equiv z \subseteq x). Найдём способ вычисления y. Зададим некоторое множество A и парный к нему рекурсивный алгоритм \Delta_A:

\begin{split} \Delta_A(a) \equiv ( \forall i \in a (&B = a\\ & B \ominus i \\ & B \not\equiv \varnothing \Rightarrow A \oplus B \\ & \Delta_A(B))) \end{split}

Тогда транзакция вычисления y запишется как:

\begin{split} y = (&A = \varnothing \\ & \Delta_A(x)) \rightarrow A \end{split}

Эта формула непротиворечиво определяет y, следовательно y существует.

Схема аксиом выделения. Для любого множества x существует множество y, содержащее в точности элементы множества x, которые выполняют условие A:
\forall \forall \;\forall x \exists y \forall z(z \in y \equiv(z \in x \land A(z))).
Запишем транзакцию:

\begin{split} y = ( & B= \varnothing \\  & \forall i \in x (A(i) \Rightarrow B \oplus i)) \rightarrow B \end{split}

Данная формула непротиворечиво определяет y, следовательно y существует.

9. Заключение

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

  • нуль-система \underline{\alpha}

  • контракт \underline{\omega} (логические значения, нуль, пустое множество)

  • директор \mathscr{D} (множества)

  • цепочка \mathscr{D} \rightarrow \underline{\omega} (числа)

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

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

Список литературы

[1] Математическая энциклопедия, 5, Советская энциклопедия, Москва, 1982.

[2] Математическая энциклопедия, 3, Советская энциклопедия, Москва, 1982.

[3] А. С. Герасимов, Курс математической логики и теории вычислимости: учебное пособие. 3-е изд., испр. и доп., ЛЕМА, С-Петербург, 2011.

30.07.2023

Самойлов Андрей Владимирович (Andrei Samoylov)
Email: as@mixed.systems

PDF-версия доступна здесь.


ссылка на оригинал статьи https://habr.com/ru/articles/751058/

Черная сторона науки

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

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

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

Индекс Хирша (H-index) – это один из наиболее широко используемых показателей научной продуктивности, который позволяет оценить не только количество научных публикаций, но и их влияние на научное сообщество. Этот индекс был предложен в 2005 году американским физиком Хорасом Хиршем и с тех пор стал популярным инструментом для оценки научной продуктивности ученых.

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

Расчет h-индекса, или индекса Хирша, ведется по простой формуле: ученый имеет индекс h, если h из его Np статей цитируются как минимум h раз каждая, в то время как оставшиеся (Np – h) статьи цитируются не более, чем h раз каждая (подробнее о методах повышения индекса Хирша смотрите в предыдущей статье).

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

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

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

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

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

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

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

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

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

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


Ссылка на статью

Бот для скачивания статей

Лучшие инструменты для написания статей

ВК | ТГ | Блог 


ссылка на оригинал статьи https://habr.com/ru/articles/750582/