En informática , un árbol de rosas es un término para el valor de una estructura de datos de árbol con un número variable e ilimitado de ramas por nodo. [1] El término se utiliza principalmente en la comunidad de programación funcional , por ejemplo, en el contexto del formalismo de Bird-Meertens . [2] Aparte de la propiedad de ramificación múltiple, la característica más esencial de los árboles de rosas es la coincidencia de bisimilaridad con identidad : dos árboles de rosas distintos nunca son bisimilares.
El nombre "rosal" fue acuñado por Lambert Meertens para evocar el rododendro común , de nombre similar y estructura similar . [3]
A estos árboles los llamaremos rosales , traducción literal de rododendro (griego ῥόδον = rosa, δένδρον = árbol), por su parecido con el hábito de este arbusto, salvo que este último no crece al revés en el hemisferio norte.
Los rosales bien fundados pueden definirse mediante una construcción recursiva de entidades de los siguientes tipos:
Cualquiera de (a)(b)(c) puede estar vacío. Nótese que (b) puede verse como un caso especial de (c): una secuencia es simplemente una función de un segmento inicial del conjunto de números naturales.
Por lo general, solo se utilizan algunas combinaciones de tipos de entidad para la construcción. El artículo original [3] solo considera 1+2b (árboles de rosas con bifurcación de secuencias) y 1+2a (árboles de rosas con bifurcación de conjuntos). En la literatura posterior, la variante 1+2b suele introducirse mediante la siguiente definición:
Árbol de datos a = Hoja a | Nodo [Árbol a]
Un rosal [...] es una hoja que contiene un valor o un nodo que puede tener una lista arbitraria de subárboles
. [4]
La definición más común utilizada en programación funcional (particularmente en Haskell ) combina 3+2b:
datos Rosa α = Nodo α [Rose α]
Un elemento de Rose α consiste en un nodo etiquetado junto con una lista de subárboles
. [1]
Es decir, un árbol de rosas es una entidad de emparejamiento (tipo 3) cuya entidad de ramificación es una secuencia (por lo tanto de tipo 2b) de árboles de rosas.
A veces incluso se considera la combinación 1+3b. [5] [6] La siguiente tabla proporciona un resumen de las combinaciones de entidades más establecidas.
Notas:
Los árboles de rosas generales se pueden definir a través de la bisimilitud de multidígrafos apuntados accesibles con el etiquetado apropiado de nodos y flechas. Estas estructuras son una generalización de la noción de grafo apuntado accesible (abreviado como apg ) a partir de una teoría de conjuntos no bien fundada . Usaremos el acrónimo apq para las estructuras multidígrafo descritas a continuación. Esto se entiende como una abreviatura de "accesible pointed quiver" donde quiver es un sinónimo establecido para "multidígrafo".
En correspondencia con los tipos de entidades utilizadas en la definición recursiva, a cada nodo de un apq se le asigna un tipo (1), (2a), (2b), (2c) o (3). Los apq están sujetos a condiciones que imitan las propiedades de las entidades construidas recursivamente.
Una bisimilaridad entre apqs 𝒳 = ( X , ...) y 𝒴 = ( Y , ...) es una relación R ⊆ X × Y entre nodos tales que las raíces de 𝒳 y 𝒴 están R -relacionadas y para cada par ( x , y ) de nodos R -relacionados, se satisface lo siguiente:
Se satisface una condición simétrica con 𝒳 y 𝒴 intercambiados.
Se dice que dos apqs 𝒳 y 𝒴 son bisimilares si existe una relación de bisimilaridad R para ellos. Esto establece una relación de equivalencia en la clase de todos los apqs.
Un árbol de rosas es entonces una representación fija de la clase 𝒞 de apqs que son bisimilares a algún apq 𝒳 dado . Si el nodo raíz de 𝒳 es de tipo (1) entonces 𝒞 = {𝒳 }, por lo tanto 𝒞 puede ser representado por este nodo raíz. De lo contrario, 𝒞 es una clase propia – en este caso la representación puede ser proporcionada por el truco de Scott para ser el conjunto de aquellos elementos de 𝒞 que tienen el rango más bajo.
Como resultado de la construcción de teoría de conjuntos anterior, se define la clase ℛ de todos los árboles de rosas, dependiendo de los conjuntos V (valores de base), Σ (nombres de flechas) y L (etiquetas de nodos) como constituyentes definitorios. Posteriormente, la estructura de apqs se puede trasladar a una estructura multidígrafo etiquetada sobre ℛ . Es decir, los elementos de ℛ pueden considerarse en sí mismos como "nodos" con asignación de tipo inducida, etiquetado de nodos y flechas. La clase 𝒜 de flechas es una subclase de (ℛ × ℛ) ∪ (ℛ × ( ∪ Σ ) × ℛ) , es decir, las flechas son parejas fuente-objetivo o triples fuente-etiqueta-objetivo según el tipo de la fuente.
Para cada elemento r de ℛ existe un apq inducido 𝒳 = ( X , A , r , ...) tal que r es el nodo raíz de 𝒳 y los respectivos conjuntos X y A de nodos y flechas de 𝒳 están formados por aquellos elementos de ℛ y 𝒜 que son accesibles a través de un camino de flechas que comienza en r . El apq inducido 𝒳 es bisimilar a los apq utilizados para la construcción de r .
Los árboles de rosas que no contienen nodos de ramificación de conjuntos (tipo 2a) se pueden representar mediante mapas de nombres de ruta. Un nombre de ruta es simplemente una secuencia finita de etiquetas de flecha. Para una ruta de flecha a → = [ a 1 , ..., a n ] (una secuencia finita de flechas consecutivas), el nombre de ruta de p es la secuencia correspondiente σ ( a → ) = [ σ ( a 1 ), ..., σ ( a n )] de etiquetas de flecha. Aquí se supone que cada flecha está etiquetada ( σ denota la función de etiquetado). En general, cada ruta de flecha debe reducirse primero eliminando todas sus flechas provenientes de nodos de emparejamiento (tipo 3).
Una ruta de acceso p se puede resolver si existe una ruta de flecha con origen en la raíz a → cuyo nombre de ruta es p . Tal a → se proporciona de forma única hasta una posible última flecha sin etiquetar (obtenida en un nodo de emparejamiento). El nodo de destino de una ruta de acceso resoluble no vacía es el nodo de destino de la última flecha de la ruta de flecha con origen en la raíz correspondiente que no termina con una flecha sin etiquetar. El destino de la ruta vacía es el nodo raíz.
Dado un árbol de rosas r que no contiene nodos de ramificación de conjuntos, el mapa de rutas de r es un mapa t que asigna a cada ruta resoluble p su valor t ( p ) de acuerdo con el siguiente esquema general:
( ∪ Σ ) ⁎ ⊇ dom( t )( V ∪ {⊥} ∪ L ) × T
Recordemos que ∪ Σ es el conjunto de etiquetas de flechas ( es el conjunto de números naturales y Σ es el conjunto de nombres de flechas) L es el conjunto de etiquetas de nodos y V es el conjunto de valores de base. Los símbolos adicionales ⊥ y T significan respectivamente un indicador de un nombre de ruta resoluble y el conjunto de etiquetas de tipo, T = {'1', '2b', '2c', '3b', '3c' }. El mapa t se define mediante la siguiente prescripción ( x denota el objetivo de p ):
Se puede demostrar que los distintos rosales tienen diferentes mapas de rutas de acceso. En el caso de los rosales "homogéneos" no es necesario el etiquetado de tipo, y su mapa de rutas de acceso t se puede definir como se resume a continuación:
En cada caso, existe una axiomatización simple en términos de nombres de ruta:
En particular, un árbol de rosas en el sentido más común de "Haskell" es simplemente una función de un conjunto no vacío cerrado por prefijo y cerrado por hermano izquierdo de secuencias finitas de números naturales a un conjunto L . Esta definición se utiliza principalmente fuera de la rama de la programación funcional, véase Árbol (teoría de autómatas) . Por lo general, los documentos que utilizan esta definición no mencionan el término "árbol de rosas" en absoluto.
Notas:
x = 5
no se consideran "valores de árbol".Los diagramas que aparecen a continuación muestran dos ejemplos de árboles de rosas junto con el código Haskell correspondiente. En ambos casos, se utiliza el módulo Data.Tree [11] tal como lo proporciona el paquete de contenedores Haskell. [12] El módulo presenta los árboles de rosas como entidades de emparejamiento mediante la siguiente definición:
datos Árbol a = Nodo { rootLabel :: a , -- ^ etiqueta valor subForest :: [ Árbol a ] -- ^ cero o más árboles secundarios }
Ambos ejemplos están diseñados para demostrar el concepto de "compartir subestructuras" [13] , que es una característica distintiva de los rosales. En ambos casos, la función de etiquetado es inyectiva (de modo que las etiquetas 'a'
, 'b'
, 'c'
o 'd'
identifican de forma única un subárbol/nodo), lo que no necesita satisfacerse en general. Los números naturales (0, 1, 2 o 3) a lo largo de las flechas indican la posición basada en cero en la que aparece un árbol en la subForest
secuencia de un "superárbol" particular. Como consecuencia de posibles repeticiones en subForest
, puede haber múltiples flechas entre nodos. En cada uno de los ejemplos, el rosal en cuestión está etiquetado por 'a'
y es igual al valor de la a
variable en el código. En ambos diagramas, el árbol está señalado por una flecha sin fuente.
importar Data.Tree main :: IO () main = do let d = Nodo { etiqueta_raíz = 'd' , subBosque = [] } let c = Nodo { etiqueta_raíz = 'c' , subBosque = [ d ] } let b = Nodo { etiqueta_raíz = 'b' , subBosque = [ d , c ] } let a = Nodo { etiqueta_raíz = 'a' , subBosque = [ b , c , c , c ] } print a
importar Data.Tree main :: IO () main = do let root x = caso x de 'a' -> ( x ,[ x , 'b' ]) 'b' -> ( x ,[ x , 'c' ]) 'c' -> ( x ,[ x , 'a' ]) let a = unfoldTree root 'a' putStrLn ( take 900 ( show a ) ++ "... (y así sucesivamente)" )
El primer ejemplo presenta un árbol de rosas bien fundado a
obtenido mediante una construcción incremental. Primero d
se construye , luego c
then b
y finalmente a
. El árbol de rosas se puede representar mediante el mapa de nombres de ruta que se muestra a la izquierda.
El segundo ejemplo presenta un árbol de rosas no bien fundado a
construido por un constructor en amplitud unfoldTree
. El árbol de rosas es una máquina de Moore, véanse las notas anteriores. Su mapa de ruta t : {0,1} ⁎ → {'a','b','c' } se define por t ( p ) es respectivamente igual a 'a' o 'b' o 'c' según n módulo 3 donde n es el número de ocurrencias de 1 en p .
La definición general proporciona una conexión a las estructuras de datos de árbol:
Las "estructuras de árbol" son aquellas apqs (multidígrafos etiquetados de la definición general) en las que cada nodo es accesible por un único camino de flecha. Cada árbol de rosas es bisimilar a una estructura de árbol de este tipo (ya que cada apq es bisimilar a su desdoblamiento ) y cada estructura de árbol de este tipo es bisimilar a exactamente un árbol de rosas que, por lo tanto, puede considerarse como el valor de la estructura de árbol.
El diagrama de la derecha muestra un ejemplo de este tipo de mapeo de estructura a valor. En la parte superior del diagrama, se muestra un árbol ordenado T etiquetado con nodos, que contiene 23 nodos. En la parte inferior, se muestra un árbol de rosas R que es el valor de T. (Tanto en T como en R , las flechas hermanas están ordenadas implícitamente de izquierda a derecha). Hay un mapeo inducido de subárbol a subvalor que se muestra parcialmente mediante flechas azules.
Observe que la asignación es de varios a uno: distintas estructuras de datos de árboles pueden tener el mismo valor. Como consecuencia particular, un árbol de rosas en general no es un árbol en términos de la relación de "subvalores" entre sus subvalores, consulte #Controversia_terminológica.
La asignación de valores descrita anteriormente se puede utilizar para aclarar la diferencia entre los términos "estructura de datos de árbol" y "tipo de datos de árbol":
Tenga en cuenta que existen dos grados de discrepancia entre los términos. Esto se hace evidente cuando se compara un tipo de datos de árbol único con una estructura de datos de árbol único . Un tipo de datos de árbol único contiene (infinitamente) muchos valores, cada uno de los cuales está representado por (infinitamente) muchas estructuras de datos de árbol.
Por ejemplo, dado un conjunto L = {'a','b','c','d' } de etiquetas, el conjunto de árboles de rosas en el sentido de Haskell (3b) con etiquetas tomadas de L es un tipo de datos de árbol único. Todos los ejemplos de árboles de rosas anteriores pertenecen a este tipo de datos.
Notas:
Como se puede observar en el texto y los diagramas anteriores, el término "rosal" es controvertido. Hay dos cuestiones interrelacionadas:
Curiosamente, el término "nodo" no aparece en el artículo original [3], salvo en una única ocasión en un párrafo informal de la página 20. En la literatura posterior, la palabra se utiliza con profusión. Esto ya se puede observar en los comentarios citados a las definiciones:
Un rosal [...] es una hoja [...] o un nudo [...]. [4]
Un elemento de Rose α consiste en un nodo etiquetado [...]. [1]
En particular, la definición de rosales en el sentido más común de Haskell sugiere que (dentro del contexto del discurso) "nodo" y "árbol" son sinónimos. ¿Significa esto que cada rosal coincide con su nodo raíz? Si es así, ¿se considera que esta propiedad es específica de los rosales o se aplica también a otros árboles? Estas preguntas quedan sin respuesta.
El problema (B) se hace evidente al observar los diagramas de los ejemplos anteriores. Ambos diagramas son fieles en el sentido de que cada nodo se dibuja exactamente una vez . Se puede ver inmediatamente que los gráficos subyacentes no son árboles. Usando una cita de Árbol (teoría de grafos)
Los diversos tipos de estructuras de datos a los que en informática se hace referencia como árboles tienen gráficos subyacentes que son árboles en la teoría de grafos [...]
Se puede concluir que los rosales en general no son árboles en el sentido habitual que conocemos en la informática.
Existe al menos una adopción del término "árbol de rosas" en informática en la que se excluye la "compartición de subestructuras". El concepto de un árbol de rosas bayesiano se basa en la siguiente definición de árboles de rosas:
T es un rosal si T = {x } para algún punto de datos x o T = { T 1 , ... , T n T } donde T i son rosales sobre conjuntos disjuntos de puntos de datos. [14]
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )