psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2010-11-12 04:41 pm

Про теорию категорий в стиле фэнтези

Тут пошла такая пьянка: [livejournal.com profile] a_shen помянул теорию категорий, [livejournal.com profile] avva помянул теорию категорий... причем, помянули в таком смысле, что это нечто жутко абстрактное, непонятно, как объяснить простым смертным.

Захотелось мне посмотреть, что за страшная такая теория категорий. То есть, попробовать объяснить хотя бы самому себе. :)

Начинать я люблю с определений: раз и два.

Ну что тут скажешь: видим образчики того, как составить определение так, "чтобы никто не догадался". Как нарочно, чтобы было непонятно. Значков много, разложены значки кривовато. Например, определение в вики содержит такое:

"задано множество морфизмов (или стрелок) HomC(A,B)..."

- ну и к чему относится "Hom" - к понятию "морфизм" или к понятию "множество морфизмов"? Я сначала подумал первое, потом стал читать дальше, оказалось - второе. Вот и получается: вроде как математика, формулы, а все-равно - двусмысленности.

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



Объект

Во-первых, представьте себе некий "объект". Тут есть первая психологическая ловушка - для примера может прийти в голову что-то простое типа "число 5" или "точка A". Так вот, не берите простое, берите сразу сложное - и тогда (как ни парадоксально) понять будет проще.

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

Вот что такое объект. А в категории таких объектов много. То есть, клан магов-полиморфов например. Замечу: это вовсе НЕ аналогия и не художественная метафора, это - вполне корректный пример, частный случай, поскольку теория категорий почти не ограничивает, что именно считать объектами.

Морфизм = превращение

Во-вторых, понятие "морфизм" или "стрелка". Маг-полиморф говорит: "лупус-задрупус-мордус-впередус-жопус-в-хвостус" и превращается, скажем, в волка. Вот морфизм - это и есть превращение. Опять же, для понятности лучше представлять себе превращение сложного объекта в другой сложный объект. Дальше я буду часто говорить "превращение" - мне кажется, это "качественный" и интуитивно понятный перевод термина "морфизм" на русский язык.

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

Композиция = последовательное превращение

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

Последний пример называется "композиция". Композиция - это два превращения, идущих друг за другом: маг -> облако протоплазмы -> волк.

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

("конденсус-канис" o "хомо-дисперсус")

- значок "o" - обозначает операцию композиции. Почему пишут наоборот - не знаю, может, изобретатель теории категорий был евреем, и ему так привычнее :)

Тождественный морфизм = превращение в себя

А теперь представим себе студента школы магии. Перепутал он "у" и "о" в астральных формулах. Начал балаболить: "лОпус-задрОпОс..." - и дело не пошло. Хвост начал отрастать, но отвалился и испарился. И вроде бы все на месте - лишних деталей не осталось. То есть, была некая попытка превращения, но объект вернулся в прежнее состояние. Вот вам тождественный морфизм.

Категория

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

Что за условия? Да ничего особенного - пара аксиом: ассоциативность и закон тождества.

- Ассоциативность. Пусть маг-полиморф может принимать 4 формы: человек, волк, собака, кот. И пусть есть 4 заклинания:
1. человек->волк
2. волк->собака->кот
3. человек->волк->собака
4. собака->кот
Так вот, закон ассоциативности утверждает, что в кота можно превратиться обоими возможными путями:
(заклинание 1) человек->волк, (заклинание 2) волк->собака->кот
все равно, что:
(заклинание 3) человек->волк->собака, (заклинание 4) собака->кот

- Закон тождества. Пусть есть заклинание превращения в самого себя (как "лОпус-задрОпОс"). Тогда неважно, когда его применять - до другого превращения или после:
человек->волк
все равно, что:
человек->человек, человек->волк
или:
волк->человек
все равно, что:
волк->человек, человек->человек

Всякие-разные морфизмы

Еще один студент с факультета полиморфизма обнаружил в Книге Заклинаний формулу превращения в дракона. Пробормотал: "драгонаутус-фойер-гросс-райзер!" - и превратился в огромное жЫвотное. Попробовал изрыгнуть пламя - вах! Получается! "Ладно", - подумал он, - "а теперь обратно". Обернулся к подставке, на которой лежала книга, а там - только пепел. Упс! Кажется, перестарался огнеметчик.

Вот когда для заданного превращения все-таки есть возможность превратиться обратно - тогда это превращение называется "изоморфизм".

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

Вот такая ситуёвина, когда для первой части превращения есть только один подходящий метод, называется "мономорфизмом".

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

"Биморфизм" – когда и для первой, и для второй части есть по одному подходящему варианту.

"Эндоморфизм" – когда одно превращение или серия превращений возвращает к исходной точке, например человек->волк->человек.

"Автоморфизм" – изоморфизм И эндоморфизм.

Тонкость, которую я НЕ понял: чем отличаются тождественный морфизм, эндоморфизм и автоморфизм? На первый взгляд – это одно и то же, в смысле определения эквивалентны. Может ли быть эндоморфизм, который НЕ является единичным? Может ли быть эндоморфизм, который НЕ является изоморфизмом?

Re: Мебель Вам привезли?.. ;-)

[identity profile] psilogic.livejournal.com 2010-11-12 05:53 pm (UTC)(link)
это не те категории. по ссылке категория = класс или категория = множество

Re: Мебель Вам привезли?.. ;-)

[identity profile] alisarin.livejournal.com 2010-11-12 06:08 pm (UTC)(link)
:(

Нет более дурацких понятий, чем математические. Например, "объект" в программировании (вообще - http://nounivers.narod.ru/ofir/fraud.htm). Тогда данное рассуждение подразумевает "структуры" или "упорядоченности" состава - типа "колонной" или "шеренгой". Я не прав?

Re: Мебель Вам привезли?.. ;-)

[identity profile] psilogic.livejournal.com 2010-11-12 06:15 pm (UTC)(link)
"Объект" в программировании - это местоимение, имеющее смысл "нечто или некто", то есть имеет совершенно произвольный смысл. В математике, в теории категорий, похоже такой же смысл. В философии - противопоставление "субъекту". В естествознании - то, что изучается (объект исследования). Какой из этих вариантов более дурацкий? :)

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

Re: Мебель Вам привезли?.. ;-)

[identity profile] alisarin.livejournal.com 2010-11-12 06:26 pm (UTC)(link)
В философии (конечно, смотря в какой) - "объект" это консолидированный комплекс, который в смысле такого комплекса обладает свойством некоторой упорядоченной переместительности: "а по небу плывут облака". Вполне рациональное по сути понимание...

А в смысле "объекта" в программировании лучше всего опять подходит солдатский пример: всякий дневальный может стать караульным (или старшим наряда, как хотите, я не ограничиваю ;-) ; следовательно, речь идет именно о ролевой модели, поскольку содержание не переноминализируется (и лед отличается от воды запасом энергии). Следовательно, подразумевается нечто вроде того, что каждому элементу группы открыта возможность выбрать для себя любую из возможных для таких элементов вообще ролей.

типа "как вы яхту назовете, так она и поплывет" ;-)

Re: Мебель Вам привезли?.. ;-)

[identity profile] psilogic.livejournal.com 2010-11-12 06:31 pm (UTC)(link)
В программировании это даже не роль, это все, что угодно. Ну и роль тоже. Может быть объект "солдат" с параметром "роль", в том числе изменяемым, может быть объект "роль", может быть объект "караульный" или "дневальный", имеющий функцию "роль". т.е. вообще никаких ограничений, что угодно, никаких обязательных свойств нет.

Re: Мебель Вам привезли?.. ;-)

[identity profile] alisarin.livejournal.com 2010-11-12 06:40 pm (UTC)(link)
В философском смысле ответ "нет вообще никаких ограничений" неверен. Поскольку "объект" в программировании открывается и закрывается, для него выделяется область в памяти, и эта же память от него освобождается.

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

[identity profile] psilogic.livejournal.com 2010-11-12 07:05 pm (UTC)(link)
[ Поскольку "объект" в программировании открывается и закрывается, для него выделяется область в памяти, и эта же память от него освобождается. ]

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

[ А вот как возможен здесь объект "роль" мне трудно представить, поскольку "роль" я могу понимать не как порцию кода, а как некоторую заданную порции кода структуру. ]

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

[identity profile] alisarin.livejournal.com 2010-11-12 07:15 pm (UTC)(link)
* Объект - нечто произвольное, относящееся к данной категории.*

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

После же "раскрытия условности" - с этим уже можно что-то делать :) Как можно оперировать с тем "пойди туда, не знаю куда, возьми то, не знаю что", ума не приложу. Хотя инструкция "пойди", да, здесь имеет место :))

[identity profile] psilogic.livejournal.com 2010-11-12 07:27 pm (UTC)(link)
[ Но это лишь указание на то, что "что-то введено (выделено)" и более ни на что. ]

Вот это и есть объект. Мы не знаем, зачем нам понадобилась "условность" - поэтому не знаем никаких ее свойств. Вот как только узнаем - так и начинаем уточнять какие-то свойства объекта/условности - определяем данные, структуру, код и т.п. Например, если надо упорядочивать - будет какая-нибудь операция упорядочивания, или номер.

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

[identity profile] alisarin.livejournal.com 2010-11-13 05:09 am (UTC)(link)
Что же тогда, выделение объектов в программировании - это то, что с огромным трудом удается достичь иными средствами, - подлинная случайность? Ведь порождение этих объектов происходит в силу какого-то востребования, а оно, оказывается просто спонтанно.

А если "объект" есть общее имя ряда возможных порождений, и само определение что есть объект просто соответствует этому списку порождений, то, быть может, такой список и следует привести? ;-)

[identity profile] psilogic.livejournal.com 2010-11-13 06:58 am (UTC)(link)
[ Ведь порождение этих объектов происходит в силу какого-то востребования, а оно, оказывается просто спонтанно ]

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

[ А если "объект" есть общее имя ряда возможных порождений, и само определение что есть объект просто соответствует этому списку порождений, то, быть может, такой список и следует привести? ]

Это подход философа - упомянуть все возможные решения задачки, но саму задачку так и не решить :) Программист выбирает один из вариантов и решает. В результате получается объект определенного класса, содержащий определенные данные, код, структуру.

[identity profile] alisarin.livejournal.com 2010-11-13 10:09 am (UTC)(link)
*Программист выбирает один из вариантов и решает. В результате получается объект определенного класса, содержащий определенные данные, код, структуру.*

Напоминает - "окраина города - район стихийной застройки" :) Мне кажется, признание - супер! ...

[identity profile] psilogic.livejournal.com 2010-11-13 10:19 am (UTC)(link)
[ Напоминает - "окраина города - район стихийной застройки" :) ]

В огороде бузина...

[ Мне кажется, признание - супер! ... ]

Да-да-да-д! Страшная тайна раскрыта! :)

[identity profile] alisarin.livejournal.com 2010-11-13 01:40 pm (UTC)(link)
Имеет прямое отношение - единого стандарта и порядка и, главное, осмысленного понимания рациональности программного кода чей-то не наблюдается :(

[identity profile] psilogic.livejournal.com 2010-11-13 01:46 pm (UTC)(link)
а кому оно надо - единство такое? :)

[identity profile] alisarin.livejournal.com 2010-11-13 02:03 pm (UTC)(link)
Может и не нада, как знать :) Но тады оно "как феномен" не до конца познано - нет общей теории :))