Certaines œuvres de Conor McBride, Diff , Dissect , relient la dérivée des types de données à leur "type de contextes à un trou". Autrement dit, si vous prenez la dérivée du type, vous vous retrouvez avec un type de données qui vous montre à quoi ressemble le type de données de l'intérieur à un moment donné.
Donc, par exemple, si vous avez une liste (en Haskell)
data List a = [] | a : List a
cela correspond à
data List a = 1 + a * List a
et à travers un peu de magie mathématique, le dérivé est
data ListDeriv a = List a * List a
ce qui signifie que, à tout moment de la liste, il y aura une liste à gauche et une liste à droite. Nous pouvons parcourir la liste d'origine en utilisant la structure de données dérivée.
Maintenant, je suis intéressé à faire quelque chose de similaire avec des graphiques. Une représentation courante des graphiques est un ensemble de sommets et d'arêtes, qui peut être implémenté naïvement avec un type de données tel que:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
Si je comprends bien, un dérivé de ce type de données, par rapport à l'index du graphique i
, devrait ressembler à quelque chose.
data GrDeriv a b i = d/di (Gr a b i)
= d\di ( [a*i] * [b*i^2] )
= (d\di [a*i]) * [b*i^2] ) + [a*i]*(d/di [b*i^2])
= (a* [a*i] * [a*i]) * [b*i^2] )
+ [a*i] * (2*b*i) *[b*i^2]*[b*i^2])
= InNodes { nodesLeft :: [(a,i)]
, nodeLbl :: a
, nodesRight :: [(a,i)]
, edges :: [(b,i,i)] }
| InEdges { nodes :: [(a,i)]
, adjNode :: Either (b,i) (b,i)
, edgesLeft :: [(b,i,i)]
, edgesRight :: [(b,i,i)] }
Je l'ai obtenu grâce à l'utilisation de la règle de produit et des règles de chaîne pour les produits dérivés, et bien qu'il puisse y avoir des erreurs, il semble suivre le schéma général. Dans cette structure, vous serez concentré sur les nœuds (constructeur InNodes) ou les bords (dans les bords) et compte tenu de la place, vous verrez les données pertinentes.
Mais ce n'est pas ce que j'espérais. J'espérais une construction plus étroitement liée à l'interface de Martin Erwigs Functional Graph Library. Plus précisément, je veux voir à un nœud un contexte représentant l'étiquette du nœud et deux listes d'adjacence, une pour les sorties, une pour les entrées.
Node a b = ([(i,b)],a,[(i,b)])
Je vois cependant de l'espoir, car la représentation de l'adjacence a des termes en commun avec le dérivé, la seule étiquette,, a
à chaque emplacement de trou, la représentation / dissection de l'adjacence de chaque bord.
Puisqu'un dérivé n'est pas la même fonction que l'original, mais une intégration du dérivé est (kindof), existe-t-il une sorte d'analogue d'intégration qui servira à transformer le dérivé en une collection de contextes de nœuds? Pas une intégration directe pour récupérer la structure d'origine, rappelez-vous, mais une structure équivalente à l'original mais dans une représentation plus conviviale pour les algorithmes.
S'il y en a, j'espère que les structures de type relation peuvent être spécifiées par un langage simple "ensemble de sommets et d'arêtes" et je peux dériver une bibliothèque efficace pour travailler avec cette structure. Une telle implémentation pourrait être utilisée pour étudier des structures "au-delà de la théorie des graphes": hyper graphes, complexes simpliciaux ...
Donc. Cette idée semble-t-elle réalisable? Utile? Y a-t-il eu une étude sur ce type de chose sur laquelle je pourrais en savoir plus?
Addenda
Comme l'a commenté Curtis F , un ensemble de nœuds et d'arêtes n'est pas exactement un graphique. Cependant, tous les graphiques peuvent être représentés par un tel, et je le trouve assez courant. J'ai vu (la spécification très grossière) utilisé dans la recherche qui applique la théorie des graphes aux optimisations des réseaux sans fil de diverses manières. Voici un exemple en accès libre, DRAND *. Cela soulève la question de savoir quel est le lien entre la présentation et comment certains logiciels pourraient être mis en œuvre sur la base de la recherche.
Cela dit, je ne suis pas entièrement opposé au changement de la spécification d'entrée de à autre chose. Par exemple, étant donné un type d'index I , les étiquettes de noeud, V , et les étiquettes de bord, E . Ensuite, le graphique est (approximativement) une fonction des index à une liste d'étiquettes et de bords.
Je suis sûr que cela peut être exprimé (théorie des catégories?) Comme
ou
qui peut être vu comme un ensemble de sommets et d'arêtes - avec suffisamment de mises en garde. Cependant, il n'est pas clair si la dérivée de est significative:
Pour ma part, je pense que cela semble prometteur, mais je manque de sophistication pour aller plus loin. Je sais qu'il doit y avoir un peu de travail à explorer la connexion plus loin.
* En cas de rupture du lien, citation: Rhee, Injong, et al. "DRAND: planification TDMA randomisée distribuée pour les réseaux ad hoc sans fil." Transactions IEEE sur l'informatique mobile 8.10 (2009): 1384-1396.
la source
Réponses:
Votre type
Gr
ne correspond pas vraiment aux graphiques, car il comprend de nombreuses instances qui ne sont clairement pas des graphiques, car les indices de bord n'ont pas besoin d'être de véritables indices de sommet.Par exemple,
n'est pas un graphique, mais est autorisé dans votre type en tant que
Au contraire, votre
Gr
correspond littéralement à une liste d'index étiquetés et à une liste distincte, sans rapport, de paires d'index étiquetées. C'est pourquoi vous obtenez un tel dérivé "littéral"Gr
qui ne correspond pas aux "trous" dans les graphiques.Il y a aussi le malheureux problème de se soucier de l'ordre des sommets / arêtes (visible dans les distinctions
nodesLeft/Right
etedgesLeft/Right
), mais cela peut être résolu en utilisant unSet
au lieu d'une liste.Voici un type exprimé en Haskell qui, je pense, correspond plus étroitement aux graphiques (non vides):
Par souci de simplicité, je considérerai plutôt des graphiques complets, simples et non orientés:
(Pour détendre la plénitude, laissez la
e = Bool
présence de bord de marque)Notez que
Graph
c'est récursif (et en fait, récursif paramétriquement). C'est ce qui nous permet de nous limiter le type aux seuls graphes et pas seulement aux listes d'adjacence combinées aux listes de sommets.Écrit plus algébriquement,
En augmentant à plusieurs reprises, nous obtenons le point fixe
Cela a du sens, car un graphique (complet) est soit
qui a un dérivé
Ordre de fixation dans ce graphique
Cette version de la structure de données Graph est fondamentalement une liste chaînée, et donc elle code l'ordre des sommets. Bien que cela puisse être corrigé dans votre version de liste d'adjacence en utilisant un ensemble, ce n'est pas si direct ici.
Je pense que vous pouvez modifier une structure de données arborescente pour effectuer le même type de récursivité paramétrique, la racine jouant le rôle de la "tête"
SimpleGraph
. Par l'interface des ensembles d'arbres résultants, l'ordre / la structure sous-jacente devient invisible (ou même canonique, si vous n'êtes pas intéressé par les mises à jour rapides).Votre dérivé proposé
Vous avez proposé un type dérivé; Je vais le changer pour confondre les étiquettes et les indices comme je l'ai fait:
([(v,e)], [(v,e)])
(v, [(v, e)])
la source