Pull to refresh
1
0
Send message

Проблема некоторых формальных систем в том, что они слишком громоздецкие. Приведенные в статье формулы, конечно, объясняют суть различных возможных операций над различными типами чисел, но не исчерпывают. Есть такое понятие, как "разрыв в объяснении". Примерно звучит следующим образом: вот тут у нас происходит нечто известное, заканчивается всё это определенным образом, а между всем этим делом происходит магия. Школьные программы обучения исходят из того, что дети уже владеют некоторыми базовыми навыками оперирования натуральными числами. И им предлагается операции над натуральными числами просто взять и перенести на остальные типы чисел: иррациональные, мнимые и т.д. Это и есть разрыв в объяснении. Как это сделать? Самые упорные ищут методом тыка, т.е. по сути по данному вопросу учатся без учителя. Потому как учитель в в данном вопросе, словно известный просветленный, хранит благородное молчание.

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

Как правильно здесь уже упоминали, что вообще такое число -1 ? Это кратка форма выражения 0 - 1. Как можно записать -2 * -3 ? Здесь важно понимать, где находится исходная точка отсчета. Как уже было упомянуто, проще всего представить себе числовую прямую, например линейку. Вот вы ее сломали на позиции 30 см и потеряли начальный кусок. Как вам вычислить с помощью нее длину отрезка? Принять 30 см за точку отсчета. Т.е. вычесть из каждого значения эти самые 30 см. Таким образом 31 - 30 = 1, 32 - 30 = 2 и т.д. А если я вычту из потерянных 29 см эти 30 см, то получу -1. Из 28 отниму 30, получу -2. Получается, что отрицательное число - это то же положительное, но со смещенной точкой нуля. А значит я могу исчислять отрицательные числа, как положительные, главное не забывать отнимать базу от каждого операнда. Но с умножением, конечно, придется считать дотошнее.

Исходя из описанного примера, запишем выражение -2 * -3 в более полном виде: (28 - 30) * (27 - 30). Перемножим заданные числа как два двучлена, то есть: (28 * 27) - (28 * 30) - (30 * 27) + (30 * 30) = 756 - 840 - 810 + 900 = 6.

Пробовал как-то рассчитать периодическое поле (образованное абстрактной периодической функцией). Занимательная получилась вещь. Идея скорее экспериментальная, что-то показалось интересным, что-то так и не удалось доделать.

        0000 >>>
0001                0010
0011      0101      0100      0110
0111 1011 1001 1101 1000 1100 1010 1110
повторитель >>     |      << накопитель
0000 0001 0010 0011 0100 0101 0110 0111
            ^^ проекция ^^

Не знаю как будет отображаться, но на пк вроде видно четко. Для большего удобства графически лучше расставить как чередующиеся числовые прямые, образованные степенью двойки и обозначающие масштаб. Функция, написанная для расчета нужной точки, просто делает сдвиг бит на один шаг (для масштабирования). Двигаться по такому пространству лучше используя его проекцию на числовую прямую. Само собой у каждого масштаба своя проекция. Функция для расчета делает простые шаги, берет битовую последовательность нужного числа в проекции (например 6), отбрасывает первые нули (их там может быть 64 нуля) и начиная с верхнего бита производит расчет скаляра в периодическом пространстве. Биты - дальние прыжки, нули ближние. Число 6 - это 110 в битовом виде. Начиная с верхнего бита от нулевого скаляра делаем дальний прыжок на следующий масштаб вправо. Попадаем на скаляр 0010. Следующий бит еще вниз и вправо - попадаем на скаляр 0110. Последним идет нуль, поэтому делаем ближний прыжок - просто вниз. Попадаем на скаляр 1010. Функция при прыжках просто прибавляет к скаляру бит в нужном масштабе с одинарным или двойным сдвигом. Таким образом каждая точка на проекции имеет свой уникальный скаляр в периодическом пространстве.

Само по себе ничего интересного, но я делал эту функцию в другом контексте. Мне было интересно разместить в скалярах пространства матрицу искажения. Чтобы при движения до нужной точки проекции, рассчитать то или иное искажение. Для примера можно представить как из плоской растягивающейся карты мира, вытянули фигуру глобуса или другую фигуру. Т.е. если между 6 и 7 точкой проекции я условно вставил еще десять точек, чтобы они рассчитывались правильно. 6я так и останется 6й, а 7я станет 7 + 10 = 17.

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

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

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

PS Если всё еще размышляете почему, зачем и как работает, я бы сказал, что Графы сюда больше подойдут в качестве ближайшей аналогии. Не умные указатели это точно. Но графы это переусложненный, громоздкий и неудобный формализм, поэтому я не стал бы ставить знак равенства. Скорее оба решения призваны решать одни и те же проблемы, но у такой формулировки довольно широкие рамки.

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

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

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

Конечно такой функционал придуман не впервые в истории. Конечно такое уже есть в разных вариациях и это очередная. Но здесь есть свои особенности. Абстрактность, малое количество ограничений, высокая степень усложнения структуры в тех случаях, когда это действительно необходимо. Я в статье описал пример загрузки в такую дифференциальную сеть формальной системы из своей стековой машины. Эта формальная система на первом уровне фильтрует поток символов на отрезки - токены. На втором уровне выдает из токенов инструкции. Поток это скрипт на синтаксисе классического С. Сколько понадобится различных if/else, а также сравнений, чтобы реализовать такой парсинг и сборку инструкций? Я выкинул их все. Просто загружаю в дифференциальную сеть символ из потока, потом след., потом след. Сеть мне выдает токен. Загружаю токен, она мне выдает связанную инструкцию. Итого продвигаюсь пошагово по скрипту, загружаю порционно данные, получаю порционно связанные данные. Вот и вся механика.

Hidden text
struct node {
  ui64 *somePtr;
}

struct point {
  int value;
}

struct altWay {
  ui64 *altPtr;
}

node.somePtr = malloc(sizeof(point));
altWay.altPtr = node.somePtr;

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

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

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

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

Information

Rating
Does not participate
Registered
Activity