Мне нужно представлять ориентированные графы в Clojure. Я хотел бы представить каждый node в графе как объект (возможно, запись), который включает в себя поле под названием :edges
, которое представляет собой набор узлов, которые непосредственно доступны из текущего node. Надеюсь, это само собой разумеется, но я бы хотел, чтобы эти графики были неизменными.
Я могу построить ориентированные ациклические графы с этим подходом, пока я делаю топологическую сортировку и строю каждый график "из листьев".
Однако этот подход не работает для циклических графов. Единственным обходным решением, которое я могу придумать, является наличие отдельной коллекции (возможно, карты или вектора) всех ребер для целого графика. Поле :edges
в каждом node будет иметь ключ (или индекс) в сборке графов ребер. Добавление этого дополнительного уровня косвенности работает, потому что я могу создавать ключи (или индексы) до того, что они (будут) ссылаться на существующие, но это похоже на kludge. Мало того, что мне нужно делать дополнительный поиск, когда я хочу посетить соседний node, но мне также нужно передать глобальную коллекцию граней, которая кажется очень неуклюжей.
Я слышал, что у некоторых Lisps есть способ создания циклических списков, не прибегая к функциям мутации. Есть ли способ создать неизменяемые циклические структуры данных в Clojure?