Einige der Arbeiten von Conor McBride, Diff , Dissect , beziehen die Ableitung von Datentypen auf ihre "Art von Ein-Loch-Kontexten". Das heißt, wenn Sie die Ableitung des Typs nehmen, bleibt ein Datentyp übrig, der Ihnen zeigt, wie der Datentyp an einem bestimmten Punkt von innen aussieht.
So zum Beispiel, wenn Sie eine Liste haben (in Haskell)
data List a = [] | a : List a
das entspricht
data List a = 1 + a * List a
und durch ein wenig mathematische Magie ist die Ableitung
data ListDeriv a = List a * List a
Dies bedeutet, dass sich an jeder Stelle der Liste eine Liste links und eine Liste rechts befindet. Wir können die ursprüngliche Liste mithilfe der abgeleiteten Datenstruktur zippen.
Jetzt bin ich daran interessiert, etwas Ähnliches mit Diagrammen zu machen. Eine gebräuchliche Darstellung von Graphen ist eine Reihe von Eckpunkten und Kanten, die mit einem Datentyp wie dem folgenden naiv implementiert werden können:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
Wenn ich es richtig verstehe, sollte eine Ableitung dieses Datentyps in Bezug auf den Diagrammindex ungefähr i
so aussehen.
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)] }
Ich habe dies durch die Verwendung der Produktregel und der Kettenregeln für Derivate herausgefunden, und obwohl möglicherweise einige Fehler vorliegen, scheint es dem allgemeinen Schema zu folgen. In dieser Struktur konzentrieren Sie sich entweder auf Knoten (InNodes-Konstruktor) oder Kanten (In Kanten), und an der angegebenen Stelle werden die relevanten Daten angezeigt.
Aber darauf habe ich nicht gehofft. Ich hatte auf ein Konstrukt gehofft, das enger mit der Schnittstelle der Martin Erwigs Functional Graph Library verwandt ist. Insbesondere möchte ich an einem Knoten einen Kontext sehen, der die Bezeichnung des Knotens darstellt, und zwei Adjazenzlisten, eine für ausgehende und eine für eingehende.
Node a b = ([(i,b)],a,[(i,b)])
Ich sehe jedoch Hoffnung, da die Adjazenzdarstellung einige Begriffe gemeinsam hat mit der Ableitung, dem Einzellabel, a
und an jeder Lochposition der Adjazenzdarstellung / Dissektion jeder Kante.
Da ein Derivat nicht dieselbe Funktion wie das Original hat, aber eine Integration des Derivats (irgendwie) ist, gibt es eine Art Integrationsanalogon, das dazu dient, das Derivat in eine Sammlung von Knotenkontexten umzuwandeln? Wohlgemerkt keine direkte Integration, um die ursprüngliche Struktur wiederherzustellen, sondern eine Struktur, die der ursprünglichen entspricht, jedoch algorithmisch darstellbar ist.
Wenn dies der Fall ist, hoffe ich, dass Beziehungstypstrukturen durch eine einfache Sprache für "Scheitelpunkte und Kanten" angegeben werden können, und ich kann eine effiziente Bibliothek für die Arbeit mit dieser Struktur ableiten. Eine solche Implementierung könnte verwendet werden, um Strukturen "jenseits der Graphentheorie" zu untersuchen: Hypergraphen, einfache Komplexe ...
So. Scheint diese Idee machbar? Nützlich? Gab es eine Studie zu dieser Art von Dingen, über die ich mehr lesen konnte?
Nachtrag
Wie von Curtis F kommentiert , ist eine Menge von Knoten und Kanten nicht genau ein Graph. Alle Graphen können jedoch durch solche dargestellt werden, und ich finde es allgemein genug Präsentation. Ich habe gesehen, dass (die sehr grobe Spezifikation) in der Forschung verwendet wird, die die Graphentheorie auf verschiedene Arten auf die Optimierung von drahtlosen Netzwerken anwendet. Hier ist ein Open-Access-Beispiel, DRAND *. Dies wirft die Frage auf, in welcher Beziehung die Präsentation zu der Frage steht, wie bestimmte Software basierend auf den Recherchen implementiert werden könnte.
Das heißt, ich bin nicht ganz dagegen, die Eingangsspezifikation von auf etwas anderes zu ändern . Zum Beispiel kann ein Indextyp gegeben I , Knotenetiketten, V und Kanten Etiketten, E . Dann ist das Diagramm (ungefähr) eine Funktion von Indizes zu einer Beschriftungs- und Kantenliste.
Ich bin mir ziemlich sicher, dass sich dies so ausdrücken lässt (Kategorietheorie?)
oder
das kann als eine Reihe von Ecken und Kanten gesehen werden - mit genügend Einschränkungen. Es ist jedoch nicht klar, ob die Ableitung von sinnvoll ist:
Ich denke, es ist vielversprechend, aber mir fehlt die Raffinesse, um noch weiter zu gehen. Ich weiß, dass es da draußen Arbeit geben muss, um die Verbindung weiter zu untersuchen.
* Falls die Verbindung jemals unterbrochen wird, zitieren: Rhee, Injong, et al. "DRAND: Verteilte randomisierte TDMA-Planung für drahtlose Ad-hoc-Netzwerke." IEEE Transactions on Mobile Computing 8.10 (2009): 1384 & ndash; 1396.