Un sistema L o sistema Lindenmayer es un sistema de reescritura paralela y un tipo de gramática formal . Un sistema L consiste en un alfabeto de símbolos que se pueden usar para hacer cadenas , una colección de reglas de producción que expanden cada símbolo en una cadena más grande de símbolos, una cadena de " axiomas " inicial a partir de la cual comenzar la construcción y un mecanismo para traducir las cadenas generadas en estructuras geométricas. Los sistemas L fueron introducidos y desarrollados en 1968 por Aristid Lindenmayer , un biólogo teórico y botánico húngaro de la Universidad de Utrecht . [1] Lindenmayer usó sistemas L para describir el comportamiento de las células vegetales y para modelar los procesos de crecimiento del desarrollo de las plantas . Los sistemas L también se han utilizado para modelar la morfología de una variedad de organismos [2] y se pueden utilizar para generar fractales autosimilares .
Como biólogo, Lindenmayer trabajó con levaduras y hongos filamentosos y estudió los patrones de crecimiento de varios tipos de bacterias , como la cianobacteria Anabaena catenula . Originalmente, los sistemas L se idearon para proporcionar una descripción formal del desarrollo de estos organismos multicelulares simples y para ilustrar las relaciones de vecindad entre las células vegetales. Más tarde, este sistema se amplió para describir plantas superiores y estructuras ramificadas complejas.
La naturaleza recursiva de las reglas del sistema L conduce a la autosimilitud y, por lo tanto, las formas de tipo fractal son fáciles de describir con un sistema L. Los modelos de plantas y las formas orgánicas de aspecto natural son fáciles de definir, ya que al aumentar el nivel de recursión la forma "crece" lentamente y se vuelve más compleja. Los sistemas Lindenmayer también son populares en la generación de vida artificial .
Las gramáticas de sistemas L son muy similares a la gramática semi-Thue (ver jerarquía de Chomsky ). Los sistemas L ahora se conocen comúnmente como sistemas L paramétricos , definidos como una tupla
dónde
Las reglas de la gramática del sistema L se aplican iterativamente comenzando desde el estado inicial. Se aplican tantas reglas como sea posible simultáneamente, por iteración. El hecho de que cada iteración emplee tantas reglas como sea posible diferencia un sistema L de un lenguaje formal generado por una gramática formal , que aplica solo una regla por iteración. Si las reglas de producción se aplicaran solo una a la vez, uno simplemente generaría una cadena en un lenguaje, y todas esas secuencias de aplicaciones producirían el lenguaje especificado por la gramática. Sin embargo, hay algunas cadenas en algunos lenguajes que no se pueden generar si la gramática se trata como un sistema L en lugar de una especificación de lenguaje. Por ejemplo, [3] supongamos que hay una regla S→SS en una gramática. Si las producciones se realizan una a la vez, comenzando desde S, podemos obtener primero SS y luego, aplicando la regla nuevamente, SSS. Sin embargo, si todas las reglas aplicables se aplican en cada paso, como en un sistema L, entonces no podemos obtener esta forma oracional. En cambio, el primer paso nos daría SS, pero el segundo aplicaría la regla dos veces, lo que nos daría SSSS. Por lo tanto, el conjunto de cadenas producidas por un L-sistema a partir de una gramática dada es un subconjunto del lenguaje formal definido por la gramática, y si tomamos un lenguaje como definido como un conjunto de cadenas, esto significa que un L-sistema dado es efectivamente un subconjunto del lenguaje formal definido por la gramática del L-sistema.
Un sistema L es independiente del contexto si cada regla de producción se refiere únicamente a un símbolo individual y no a sus vecinos. Por lo tanto, los sistemas L independientes del contexto se especifican mediante una gramática independiente del contexto . Si una regla depende no solo de un símbolo individual sino también de sus vecinos, se denomina sistema L sensible al contexto .
Si hay exactamente una producción para cada símbolo, entonces se dice que el sistema L es determinista (un sistema L determinista libre de contexto se denomina popularmente sistema D0L ). Si hay varios, y cada uno se elige con una cierta probabilidad durante cada iteración, entonces es un sistema L estocástico .
El uso de sistemas L para generar imágenes gráficas requiere que los símbolos del modelo hagan referencia a elementos de un dibujo en la pantalla de la computadora. Por ejemplo, el programa Fractint utiliza gráficos de tortuga (similares a los del lenguaje de programación Logo ) para producir imágenes en la pantalla. Interpreta cada constante en un modelo de sistema L como un comando de tortuga.
Sistema L original de Lindenmayer para modelar el crecimiento de algas.
que produce:
n=0: Un inicio (axioma/iniciador) / \n=1: AB el único A inicial generado en AB por la regla (A → AB), la regla (B → A) no se pudo aplicar /| \n=2: ABA antigua cadena AB con todas las reglas aplicadas, A se volvió a generar en AB, antigua B se convirtió en A / | | | \n=3: ABAAB nota: todos los A producen una copia de sí mismos en primer lugar, luego una B, que se convierte... / | | | \ | \ \n=4: ABAABABA... en una A una generación después, comenzando a generar/repetir/recurrir entonces
El resultado es la secuencia de palabras de Fibonacci . Si contamos la longitud de cada cadena, obtenemos la famosa secuencia de números de Fibonacci (omitiendo el primer 1, debido a nuestra elección del axioma):
Si no queremos omitir el primer 1, podemos usar el axioma B. Esto colocaría el nodo B antes del nodo superior ( A ) del gráfico anterior.
Para cada cadena, si contamos la posición k desde el extremo izquierdo de la cadena, el valor se determina en función de si un múltiplo de la proporción áurea cae dentro del intervalo . La relación entre A y B también converge a la media áurea.
Este ejemplo produce el mismo resultado (en términos de la longitud de cada cadena, no de la secuencia de A y B ) si la regla ( A → AB ) se reemplaza por ( A → BA ), excepto que las cadenas se reflejan.
Esta secuencia es una secuencia localmente catenativa porque , donde es la n -ésima generación.
La forma se construye introduciendo de forma recursiva el axioma a través de las reglas de producción. Cada carácter de la cadena de entrada se compara con la lista de reglas para determinar con qué carácter o cadena se debe reemplazar en la cadena de salida. En este ejemplo, un '1' en la cadena de entrada se convierte en '11' en la cadena de salida, mientras que '[' permanece igual. Aplicando esto al axioma de '0', obtenemos:
Podemos ver que esta cadena crece rápidamente en tamaño y complejidad. Esta cadena se puede dibujar como una imagen utilizando gráficos de tortugas , donde a cada símbolo se le asigna una operación gráfica que la tortuga debe realizar. Por ejemplo, en el ejemplo anterior, se le pueden dar a la tortuga las siguientes instrucciones:
El push y el pop hacen referencia a una pila LIFO (una gramática más técnica tendría símbolos separados para "posición de push" y "giro a la izquierda"). Cuando la interpretación de la tortuga encuentra un '[', se guardan la posición y el ángulo actuales, y luego se restauran cuando la interpretación encuentra un ']'. Si se han "empujado" varios valores, entonces un "pop" restaura los valores guardados más recientemente. Aplicando las reglas gráficas enumeradas anteriormente a la recursión anterior, obtenemos:
Sea A "avanzar" y B "moverse hacia adelante".
Esto produce el famoso conjunto fractal de Cantor en una línea recta real R.
Una variante de la curva de Koch que utiliza sólo ángulos rectos.
Aquí, F significa "avanzar", + significa "girar a la izquierda 90°" y − significa "girar a la derecha 90°" (ver gráficos de tortugas ).
El triángulo de Sierpinski dibujado utilizando un sistema L.
Aquí, F y G significan "avanzar", + significa "girar a la izquierda en ángulo" y − significa "girar a la derecha en ángulo".
También es posible aproximar el triángulo de Sierpinski utilizando un sistema L de curva de punta de flecha de Sierpinski .
Aquí, A y B significan "avanzar", + significa "girar a la izquierda en ángulo" y − significa "girar a la derecha en ángulo" (ver gráficos de tortugas ).
La curva del dragón dibujada utilizando un sistema L.
Aquí, F y G significan "avanzar", + significa "girar a la izquierda en ángulo" y − significa "girar a la derecha en ángulo".
Primero, debe inicializar una pila vacía. Esto sigue el método LIFO (último en entrar, primero en salir) para agregar y eliminar elementos. Aquí, F significa "dibujar hacia adelante", − significa "girar a la derecha 25°" y + significa "girar a la izquierda 25°". X no corresponde a ninguna acción de dibujo y se utiliza para controlar la evolución de la curva. El corchete "[" corresponde a guardar los valores actuales de posición y ángulo, por lo que empuja la posición y el ángulo a la parte superior de la pila, cuando se encuentra el token "]", saca la pila y restablece la posición y el ángulo. Cada "[" viene antes de cada token "]".
Se han desarrollado varias elaboraciones de esta técnica básica del sistema L que pueden utilizarse en conjunto. Entre ellas se encuentran las gramáticas estocásticas , las gramáticas sensibles al contexto y las gramáticas paramétricas.
El modelo gramatical que hemos analizado hasta ahora ha sido determinista, es decir, dado cualquier símbolo en el alfabeto de la gramática, ha habido exactamente una regla de producción, que siempre se elige y siempre realiza la misma conversión. Una alternativa es especificar más de una regla de producción para un símbolo, dándole a cada una una probabilidad de ocurrencia. Por ejemplo, en la gramática del Ejemplo 2, podríamos cambiar la regla para reescribir "0" de:
a una regla probabilística:
En el marco de esta producción, siempre que se encuentre un "0" durante la reescritura de una cadena, habría un 50 % de posibilidades de que se comportara como se describió anteriormente y un 50 % de posibilidades de que no cambiara durante la producción. Cuando se utiliza una gramática estocástica en un contexto evolutivo , es recomendable incorporar una semilla aleatoria en el genotipo , de modo que las propiedades estocásticas de la imagen permanezcan constantes entre generaciones.
Una regla de producción sensible al contexto no solo tiene en cuenta el símbolo que modifica, sino también los símbolos de la cadena que aparecen antes y después de él. Por ejemplo, la regla de producción:
transforma "a" en "aa", pero sólo si la "a" aparece entre una "b" y una "c" en la cadena de entrada:
Al igual que con las producciones estocásticas, existen múltiples producciones para manejar símbolos en diferentes contextos. Si no se puede encontrar ninguna regla de producción para un contexto determinado, se supone la producción de identidad y el símbolo no cambia en la transformación. Si existen producciones sensibles al contexto y libres de contexto dentro de la misma gramática, se supone que la producción sensible al contexto tiene prioridad cuando es aplicable.
En una gramática paramétrica, cada símbolo del alfabeto tiene una lista de parámetros asociada. Un símbolo acoplado a su lista de parámetros se denomina módulo, y una cadena en una gramática paramétrica es una serie de módulos. Un ejemplo de cadena podría ser:
Los parámetros pueden ser utilizados por las funciones de dibujo y también por las reglas de producción. Las reglas de producción pueden utilizar los parámetros de dos maneras: primero, en una declaración condicional que determina si se aplicará la regla y, segundo, la regla de producción puede modificar los parámetros reales. Por ejemplo, observe lo siguiente:
El módulo a(x,y) sufre una transformación según esta regla de producción si se cumple la condición x=0. Por ejemplo, a(0,2) sufriría una transformación y a(1,2) no.
En la parte de transformación de la regla de producción, se pueden afectar tanto los parámetros como los módulos completos. En el ejemplo anterior, se agrega el módulo b(x,y) a la cadena, con parámetros iniciales (2,3). Además, se transforman los parámetros del módulo ya existente. Según la regla de producción anterior,
Se convierte en
como el parámetro "x" de a(x,y) se transforma explícitamente en un "1" y el parámetro "y" de a se incrementa en uno.
Las gramáticas paramétricas permiten determinar las longitudes de las líneas y los ángulos de ramificación mediante la gramática, en lugar de los métodos de interpretación de la tortuga. Además, si se proporciona la edad como parámetro para un módulo, las reglas pueden cambiar según la edad de un segmento de la planta, lo que permite crear animaciones de todo el ciclo de vida del árbol.
El modelo bidireccional separa explícitamente el sistema de reescritura simbólica de la asignación de formas. Por ejemplo, el proceso de reescritura de cadenas en el Ejemplo 2 (árbol fractal) es independiente de cómo se asignan las operaciones gráficas a los símbolos. En otras palabras, una cantidad infinita de métodos de dibujo son aplicables a un sistema de reescritura determinado.
El modelo bidireccional consiste en 1) un proceso hacia adelante que construye el árbol de derivación con reglas de producción, y 2) un proceso hacia atrás que realiza el árbol con formas de manera gradual (desde las hojas hasta la raíz). Cada paso de la derivación inversa implica un razonamiento geométrico-topológico esencial. Con este marco bidireccional, las restricciones y los objetivos del diseño se codifican en la traducción de la gramática a la forma. En las aplicaciones de diseño arquitectónico, la gramática bidireccional presenta una conectividad interior consistente y una rica jerarquía espacial. [4]
Existen muchos problemas abiertos relacionados con el estudio de los sistemas L. Por ejemplo:
Sistemas L sobre la recta real R :
Los sistemas L más conocidos en un plano R 2 son: