Alcune delle opere di Conor McBride, Diff , Dissect , mettono in relazione la derivata dei tipi di dati con il loro "tipo di contesti a foro singolo". Cioè, se prendi la derivata del tipo ti viene lasciato un tipo di dati che ti mostra come il tipo di dati appare dall'interno in un dato punto.
Quindi, ad esempio, se hai un elenco (in Haskell)
data List a = [] | a : List a
questo corrisponde a
data List a = 1 + a * List a
e attraverso un po 'di magia matematica, la derivata è
data ListDeriv a = List a * List a
che viene interpretato nel senso che in qualsiasi punto dell'elenco ci sarà un elenco a sinistra e un elenco a destra. È possibile scorrere l'elenco originale utilizzando la struttura dei dati derivati.
Ora sono interessato a fare qualcosa di simile con i grafici. Una rappresentazione comune di grafici è un insieme di vertici e spigoli, che potrebbe essere implementato ingenuamente con un tipo di dati come:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
Se lo capisco correttamente, un derivato di questo tipo di dati, rispetto all'indice del grafico i
, dovrebbe essere qualcosa di simile.
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)] }
Ho ottenuto questo attraverso l'uso della regola del prodotto e delle regole della catena per i derivati, e sebbene possibilmente ci siano alcuni errori, sembra seguire lo schema generale. In questa struttura sarai focalizzato su Nodi (costruttore InNodes) o Bordi (Nei bordi) e dato il posto vedrai i dati rilevanti.
Ma non è quello che speravo. Speravo in un costrutto più strettamente correlato all'interfaccia della biblioteca grafica funzionale Martin Erwigs. In particolare, voglio vedere in un nodo un contesto che rappresenta l'etichetta del nodo e due elenchi di adiacenza, uno per l'esterno e uno per l'arrivo.
Node a b = ([(i,b)],a,[(i,b)])
Vedo speranza, tuttavia, poiché la rappresentazione di adiacenza ha alcuni termini in comune con il derivato, l'etichetta solitaria a
, in ogni posizione del foro, la rappresentazione / dissezione di adiacenza di ciascun bordo.
Poiché una derivata non è la stessa funzione dell'originale, ma un'integrazione della derivata è (kindof), esiste una sorta di analogo dell'integrazione che servirà a trasformare la derivata in una raccolta di contesti di nodi? Non un'integrazione diretta per recuperare la struttura originale, intendiamoci, ma una struttura equivalente all'originale ma in una rappresentazione più algoritmica.
In tal caso, spero che le strutture del tipo di relazione possano essere specificate da un linguaggio semplice "insieme di vertici e spigoli" e che possa derivare una libreria efficiente per lavorare con quella struttura. Una simile implementazione potrebbe essere usata per studiare strutture "al di là della teoria dei grafi": ipergrafie, complessi simpliciali ...
Così. Questa idea sembra fattibile? Utile? C'è stato qualche studio su questo tipo di cose di cui potrei leggere di più?
appendice
Come commentato da Curtis F , un insieme di nodi e bordi non è esattamente un grafico. Tuttavia, tutti i grafici possono essere rappresentati da tale, e trovo che sia una presentazione abbastanza comune. Ho visto (la specifica molto approssimativa) utilizzato nella ricerca che applica la teoria dei grafi alle ottimizzazioni delle reti wireless in vari modi. Ecco un esempio ad accesso aperto, DRAND *. Ciò solleva la questione, qual è il legame tra la presentazione e come alcuni software potrebbero essere implementati in base alla ricerca.
Detto questo, non sono del tutto contrario a cambiare le specifiche di input da a qualcos'altro. Ad esempio, dato un indice di tipo , etichette dei nodi, , e le etichette di bordo, . Quindi il grafico è (approssimativamente) una funzione dagli indici a un'etichetta e un elenco di spigoli.
Questo, sono abbastanza sicuro che possa essere espresso (teoria delle categorie?) Come
o
che può essere visto come un insieme di vertici e spigoli - dati abbastanza avvertimenti. Tuttavia, non è chiaro se la derivata di sia significativa:
Io per primo penso che mostri qualche promessa, ma mi manca la raffinatezza per andare oltre. So che ci deve essere qualche lavoro là fuori per esplorare ulteriormente la connessione.
* In caso di interruzione del collegamento, citazione: Rhee, Injong, et al. "DRAND: programmazione TDMA randomizzata distribuita per reti wireless ad hoc." Transazioni IEEE su Mobile Computing 8.10 (2009): 1384-1396.