Algunas de las obras de Conor McBride, Diff , Dissect , relacionan la derivada de los tipos de datos con su "tipo de contextos de un agujero". Es decir, si toma la derivada del tipo, le queda un tipo de datos que le muestra cómo se ve el tipo de datos desde adentro en cualquier punto dado.
Entonces, por ejemplo, si tienes una lista (en Haskell)
data List a = [] | a : List a
esto corresponde a
data List a = 1 + a * List a
y a través de un poco de magia matemática, la derivada es
data ListDeriv a = List a * List a
lo cual se interpreta que significa que en cualquier punto de la lista habrá una lista a la izquierda y una lista a la derecha. Podemos recorrer la lista original utilizando la estructura de datos derivados.
Ahora, estoy interesado en hacer algo similar con los gráficos. Una representación común de gráficos es un conjunto de vértices y aristas, que podrían implementarse ingenuamente con un tipo de datos como:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
Si lo entiendo correctamente, una derivada de este tipo de datos, con respecto al índice del gráfico i
, debería ser algo así.
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)] }
Obtuve esto mediante el uso de la regla del producto y las reglas de la cadena para derivados, y aunque posiblemente haya algunos errores, parece seguir el esquema general. En esta estructura, se centrará en Nodos (constructor InNodes) o Bordes (en bordes) y se le dará el lugar donde verá los datos relevantes.
Pero esto no es lo que esperaba. Esperaba una construcción más estrechamente relacionada con la interfaz de Martin Erwigs Functional Graph Library. Específicamente, quiero ver en un nodo un contexto que represente la etiqueta del nodo y dos listas de adyacencia, una para saliente y otra para entrante.
Node a b = ([(i,b)],a,[(i,b)])
Sin embargo, veo esperanza, ya que la representación de adyacencia tiene algunos términos en común con la derivada, la etiqueta solitaria a
, en cada ubicación de agujero, la representación / disección de adyacencia de cada borde.
Dado que una derivada no es la misma función que la original, pero una integración de la derivada es (kindof), ¿hay algún tipo de análogo de integración que sirva para transformar la derivada en una colección de contextos de nodo? No es una integración directa para recuperar la estructura original, pero una estructura equivalente a la original pero en una representación más amigable con el algoritmo.
Si es así, espero que las estructuras de tipo de relación puedan especificarse mediante un lenguaje sencillo de "conjunto de vértices y aristas" y pueda derivar una biblioteca eficiente para trabajar con esa estructura. Tal implementación podría usarse para estudiar estructuras "más allá de la teoría de grafos": hipergramas, complejos simpliciales ...
Entonces. ¿Esta idea parece factible? ¿Útil? ¿Ha habido algún estudio sobre este tipo de cosas sobre el que podría leer más?
Apéndice
Como comentó Curtis F , un conjunto de nodos y aristas no es exactamente un gráfico. Sin embargo, todos los gráficos pueden ser representados por tales, y me parece bastante común la presentación. He visto (la muy gruesa especificación) utilizado en investigaciones que aplican la teoría de grafos a las optimizaciones de redes inalámbricas de varias maneras. Aquí hay un ejemplo de acceso abierto, DRAND *. Esto plantea la pregunta, ¿cuál es el vínculo entre la presentación y cómo se puede implementar algún software basado en la investigación?
Dicho esto, no me opongo por completo a cambiar la especificación de entrada de a otra cosa. Por ejemplo, dado un tipo de índice , etiquetas de nodo, , y las etiquetas de borde, . Entonces el gráfico es (aproximadamente) una función de índices a una etiqueta y lista de bordes.
Esto, estoy bastante seguro de que se puede expresar (¿teoría de categorías?) Como
o
que puede verse como un conjunto de vértices y bordes, dadas suficientes advertencias. Sin embargo, no está claro si la derivada de es significativa:
Por mi parte, creo que muestra cierta promesa, pero me falta la sofisticación para ir más allá. Sé que debe haber algún trabajo por ahí explorando la conexión aún más.
* En caso de que el enlace se rompa alguna vez, cita: Rhee, Injong, et al. "DRAND: programación distribuida aleatoria de TDMA para redes inalámbricas ad hoc". Transacciones IEEE en informática móvil 8.10 (2009): 1384-1396.