Про алгебру путей
Во-первых, под словом "путь" будем понимать путь до директории в привычной файловой системе. Для простоты, пути будем рассматривать на юникс подобных системах, для винды можно построить аналогичные рассуждения. Примеры путей:
Далее, можно ввести отдельную сущность - относительные пути. Относительный путь это указание, как перейти из одной директории в другую, не зная полного пути (в нашем определении просто пути). Например:
.
(текущая директория)..
(родительская директория)../brother
("братская" директория)../../folder/abc
abc/def
Как мы знаем, путь можно "складывать" с относительным путем, чтобы получить другой путь:
/home/rprtr258/ssh + .. = /home/rprtr258
/var/nginx/logs + ../../prometheus/config = /var/prometheus/config
/root + . = /root
/home + rprtr258 = /home/rprtr258
Сразу примерно понятно, что можно делать с этими сущностями:
- складывать и вычитать относительные пути друг с другом, в результате будет относительный путь:
- складывать и вычитать путь и относительный путь, в результате, как мы видели, будет путь
- вычитать пути, в результате будет относительный путь:
Заметим, что хоть мы и с легкостью можем складывать относительные пути, сумма путей это что-то неопределяемое. Похожая история происходит в геометрии: можно попробовать думать о путях как о точках в неком геометрическом пространстве, а об относительных путях как о векторах между этими точками. Получаем аналогии с правилами сложения/вычитания этих сущностей и невозможность сложения точек. Как минимум это может помочь понять, чем точка отличается от вектора.
Как максимум эта аналогия почти полностью бесполезна. Очевидно мы не можем умножать относительные пути на числа, разве что на натуральные:
с отрицательными числами и вычитанием все сложней: не все относительные пути получится вычесть:- a/b + . = ../.. (т.к. . = a/b + ../.. = a/b/../..)
. - a/b = ../.. # (1)!
. - a/b # неопределено иначе
- если
../.. + a/b = ../../a/b = .
то есть, если текущая директория называетсяb
, а родительскаяa
Что прискорбно, полученная алгебра не векторное пространство и даже не модуль. Но, как минимум это моноид: .
- нейтральный элемент, +
ассоциативен и везде определен. Вычитание далеко не везде определено, так что это не группа.
Отдельно стоит оговорить, что формально, конечно, надо рассматривать классы эквивалентных (относительных) путей:
и так далееНу и еще можно пытаться таки строить аналогии с геометрией, например, три абсолютных пути и три относительных между ними это по сути треугольник. Но выглядит (на мой взгляд) бесполезно.