Как равномерно отобразить индуктивный граф? - PullRequest
0 голосов
/ 30 октября 2019

Это сообщение о fgl, обычной библиотеке графов на Haskell.

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

isLeaf :: Context a b -> Bool
isLeaf (_, _, _, [ ]) = True
isLeaf (_, _, _, _  ) = False

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

mark :: (Context a b -> Bool) -> Context a b -> Context (a, Bool) b
mark p x@(edgesIn, identifier, label       , edgesOut)
       = (edgesIn, identifier, (label, p x), edgesOut)

Что можетпойти не такИ все же.

λ ab
mkGraph [(1,'a'),(2,'b')] [(1,2,()),(2,1,())]
λ gmap (mark isLeaf) ab
mkGraph [(1,('a',False)),(2,('b',True))] [(1,2,()),(2,1,())]

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

Но это не то, что я хочу. Это дает мне стек ;что я хочу, это молния . Я хочу иметь мою симметрию . Я уверен, что смогу обойти эту проблему, но мне интересно, есть ли чистое, очевидное, стандартное решение.

1 Ответ

1 голос
/ 30 октября 2019

Если вы хотите посмотреть на контекст в исходном графике, то вам нужна копия исходного графика:

isLeaf :: Graph gr => gr a b -> Context a b -> Bool
isLeaf g (_, n, _, _) = null (suc g n)

Тогда:

> gmap (mark (isLeaf ab)) ab
mkGraph [(1,('a',False)),(2,('b',False))] [(1,2,()),(2,1,())]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...