L -система или система Линденмайера — это параллельная система переписывания и тип формальной грамматики . L-система состоит из алфавита символов, которые могут быть использованы для создания строк , набора правил производства , которые расширяют каждый символ в некоторую большую строку символов, начальной строки « аксиомы », с которой начинается построение, и механизма для перевода сгенерированных строк в геометрические структуры. L-системы были введены и разработаны в 1968 году Аристидом Линденмайером , венгерским биологом -теоретиком и ботаником из Утрехтского университета . [1] Линденмайер использовал L-системы для описания поведения растительных клеток и для моделирования процессов роста растений . L-системы также использовались для моделирования морфологии различных организмов [2] и могут быть использованы для создания самоподобных фракталов .
Как биолог, Линденмайер работал с дрожжами и нитчатыми грибами и изучал закономерности роста различных типов бактерий , таких как цианобактерия Anabaena catenula . Первоначально L-системы были разработаны для формального описания развития таких простых многоклеточных организмов и для иллюстрации соседских отношений между растительными клетками. Позднее эта система была расширена для описания высших растений и сложных ветвящихся структур.
Рекурсивная природа правил L-системы приводит к самоподобию , и, таким образом, фракталоподобные формы легко описать с помощью L-системы. Модели растений и естественно выглядящие органические формы легко определить, поскольку с увеличением уровня рекурсии форма медленно «растет» и становится более сложной. Системы Линденмайера также популярны в создании искусственной жизни .
Грамматики L-системы очень похожи на полу-грамматику Туэ (см. Иерархия Хомского ). L-системы теперь широко известны как параметрические L-системы, определяемые как кортеж
где
Правила грамматики L-системы применяются итеративно, начиная с начального состояния. Одновременно применяется как можно больше правил, за одну итерацию. Тот факт, что каждая итерация использует как можно больше правил, отличает L-систему от формального языка, сгенерированного формальной грамматикой , которая применяет только одно правило за одну итерацию. Если бы правила производства применялись только по одному за раз, можно было бы просто сгенерировать строку в языке, и все такие последовательности применений производили бы язык, указанный грамматикой. Однако в некоторых языках есть некоторые строки, которые не могут быть сгенерированы, если грамматика рассматривается как L-система, а не как языковая спецификация. Например, [3] предположим, что в грамматике есть правило S→SS. Если производства выполняются по одному за раз, то, начиная с S, мы можем получить сначала SS, а затем, применяя правило снова, SSS. Однако, если все применимые правила применяются на каждом шаге, как в L-системе, то мы не можем получить эту сентенциальную форму. Вместо этого первый шаг даст нам SS, но второй применит правило дважды, давая нам SSSS. Таким образом, набор строк, произведенных L-системой из заданной грамматики, является подмножеством формального языка, определенного грамматикой, и если мы берем язык, который определяется как набор строк, это означает, что заданная L-система фактически является подмножеством формального языка, определенного грамматикой L-системы.
L-система является контекстно-свободной , если каждое правило производства относится только к отдельному символу, а не к его соседям. Таким образом, контекстно-свободные L-системы определяются контекстно-свободной грамматикой . Если правило зависит не только от одного символа, но и от его соседей, оно называется контекстно-зависимой L-системой.
Если для каждого символа существует ровно одно произведение, то L-система называется детерминированной (детерминированная контекстно-свободная L-система обычно называется системой D0L ). Если их несколько, и каждое выбирается с определенной вероятностью во время каждой итерации, то это стохастическая L-система.
Использование L-систем для создания графических изображений требует, чтобы символы в модели ссылались на элементы рисунка на экране компьютера. Например, программа Fractint использует графику черепахи (похожую на ту, что есть в языке программирования Logo ) для создания изображений на экране. Она интерпретирует каждую константу в модели L-системы как команду черепахи.
Оригинальная L-система Линденмайера для моделирования роста водорослей.
который производит:
n=0: Начало (аксиома/инициатор) / \n=1: AB — начальный одиночный A, порожденный в AB по правилу (A → AB), правило (B → A) не может быть применено /| \n=2: ABA бывшая строка AB со всеми примененными правилами, A снова порождена в AB, бывшая B превратилась в A / | | | \n=3: ABAAB обратите внимание, что все A в первую очередь создают копию самих себя, затем B, который превращается ... / | | | \ | \ \n=4: ABAABABA ... в A одним поколением позже, начиная порождать/повторять/рекурсировать затем
Результатом является последовательность слов Фибоначчи . Если мы посчитаем длину каждой строки, то получим знаменитую последовательность чисел Фибоначчи (пропуская первую 1 из-за нашего выбора аксиомы):
Если мы не хотим пропускать первую 1, мы можем использовать аксиому B. Это поместит узел B перед самым верхним узлом ( A ) графика выше.
Для каждой строки, если мы отсчитываем k -ю позицию от левого конца строки, значение определяется тем, попадает ли кратное золотого сечения в интервал . Отношение A к B также сходится к золотому сечению.
Этот пример дает тот же результат (с точки зрения длины каждой строки, а не последовательности A и B ), если правило ( A → AB ) заменить на ( A → BA ), за исключением того, что строки зеркально отражаются.
Эта последовательность является локально катенативной последовательностью , поскольку , где — n -е поколение.
Форма строится путем рекурсивной подачи аксиомы через правила производства. Каждый символ входной строки проверяется по списку правил, чтобы определить, каким символом или строкой его заменить в выходной строке. В этом примере «1» во входной строке становится «11» в выходной строке, а «[» остается прежним. Применяя это к аксиоме «0», получаем:
Мы видим, что эта строка быстро растет в размере и сложности. Эту строку можно нарисовать как изображение, используя графику черепахи , где каждому символу назначается графическая операция, которую должна выполнить черепаха. Например, в примере выше черепахе можно дать следующие инструкции:
Push и pop ссылаются на стек LIFO (более техническая грамматика имела бы отдельные символы для «push position» и «turn left»). Когда интерпретация черепахи встречает '[', текущее положение и угол сохраняются, а затем восстанавливаются, когда интерпретация встречает ']'. Если было «задвинуто» несколько значений, то «pop» восстанавливает последние сохраненные значения. Применяя графические правила, перечисленные выше, к более ранней рекурсии, мы получаем:
Пусть A означает «тянуть вперед», а B означает «двигаться вперед».
Это создает знаменитое фрактальное множество Кантора на действительной прямой R.
Вариант кривой Коха , в котором используются только прямые углы.
Здесь F означает «тянуться вперед», + означает «повернуться налево на 90°», а − означает «повернуться направо на 90°» (см. графику черепахи ).
Треугольник Серпинского, нарисованный с использованием L-системы.
Здесь F и G оба означают «тянуться вперед», + означает «повернуть налево на угол», а − означает «повернуть направо на угол».
Также возможно аппроксимировать треугольник Серпинского с помощью L-системы стреловидных кривых Серпинского .
Здесь A и B оба означают «тянуться вперед», + означает «повернуть налево на угол», а − означает «повернуть направо на угол» (см. графику черепахи ).
Кривая дракона , нарисованная с использованием L-системы.
Здесь F и G оба означают «тянуться вперед», + означает «повернуть налево на угол», а − означает «повернуть направо на угол».
Сначала вам нужно инициализировать пустой стек. Это следует методу LIFO (Last in, First Out) для добавления и удаления элементов. Здесь F означает «рисовать вперед», − означает «повернуть направо на 25°», а + означает «повернуть налево на 25°». X не соответствует никакому действию рисования и используется для управления эволюцией кривой. Квадратная скобка «[» соответствует сохранению текущих значений положения и угла, поэтому вы помещаете положение и угол наверх стека, когда встречается токен «]», выталкиваете стек и сбрасываете положение и угол. Каждый токен «[» предшествует каждому токену «]».
Разработан ряд усовершенствований этой базовой техники L-системы, которые могут использоваться совместно друг с другом. Среди них — стохастические грамматики , контекстно-зависимые грамматики и параметрические грамматики.
Модель грамматики, которую мы обсуждали до сих пор, была детерминированной — то есть, для любого символа в алфавите грамматики было ровно одно правило производства, которое всегда выбирается и всегда выполняет одно и то же преобразование. Одна из альтернатив — указать более одного правила производства для символа, задав каждому вероятность появления. Например, в грамматике примера 2 мы могли бы изменить правило для переписывания «0» с:
вероятностному правилу:
При таком производстве, всякий раз, когда во время переписывания строки встречается "0", есть 50% вероятность, что он будет вести себя так, как описано ранее, и 50% вероятность, что он не изменится во время производства. Когда стохастическая грамматика используется в эволюционном контексте, целесообразно включить случайное семя в генотип , чтобы стохастические свойства изображения оставались постоянными между поколениями.
Правило производства, чувствительное к контексту, смотрит не только на изменяемый им символ, но и на символы в строке, которые появляются до и после него. Например, правило производства:
преобразует «a» в «aa», но только если «a» встречается между «b» и «c» во входной строке:
Как и в случае со стохастическими постановками, существует несколько постановок для обработки символов в разных контекстах. Если для заданного контекста не найдено правило постановки, предполагается постановка тождества, и символ не изменяется при преобразовании. Если в одной и той же грамматике существуют как контекстно-зависимые, так и контекстно-свободные постановки, предполагается, что контекстно-зависимые постановки имеют приоритет, когда они применимы.
В параметрической грамматике каждый символ в алфавите имеет связанный с ним список параметров. Символ, связанный со своим списком параметров, называется модулем, а строка в параметрической грамматике — это серия модулей. Пример строки может быть таким:
Параметры могут использоваться функциями рисования, а также правилами производства. Правила производства могут использовать параметры двумя способами: во-первых, в условном операторе, определяющем, будет ли применяться правило, и, во-вторых, правило производства может изменять фактические параметры. Например, посмотрите на:
Модуль a(x,y) подвергается преобразованию по этому правилу производства, если выполняется условие x=0. Например, a(0,2) подвергнется преобразованию, а a(1,2) — нет.
В части преобразования правила производства могут быть затронуты как параметры, так и целые модули. В приведенном выше примере модуль b(x,y) добавляется к строке с начальными параметрами (2,3). Также преобразуются параметры уже существующего модуля. Согласно правилу производства выше,
Становится
поскольку параметр «x» функции a(x,y) явно преобразуется в «1», а параметр «y» функции a увеличивается на единицу.
Параметрические грамматики позволяют определять длины линий и углы ветвления с помощью грамматики, а не методов интерпретации черепахи. Кроме того, если в качестве параметра для модуля задан возраст, правила могут меняться в зависимости от возраста сегмента растения, что позволяет создавать анимации всего жизненного цикла дерева.
Двунаправленная модель явно разделяет символическую систему переписывания от назначения формы. Например, процесс переписывания строки в примере 2 (фрактальное дерево) не зависит от того, как графические операции назначаются символам. Другими словами, бесконечное число методов рисования применимо к данной системе переписывания.
Двунаправленная модель состоит из 1) прямого процесса, который создает дерево вывода с правилами производства, и 2) обратного процесса, который реализует дерево с формами поэтапно (от листьев к корню). Каждый шаг обратного вывода включает в себя существенные геометрические и топологические рассуждения. С помощью этой двунаправленной структуры ограничения и цели проектирования кодируются в переводе грамматики в форму. В приложениях архитектурного проектирования двунаправленная грамматика характеризуется последовательной внутренней связностью и богатой пространственной иерархией. [4]
Существует много открытых проблем, связанных с изучением L-систем. Например:
L-системы на действительной прямой R :
Известными L-системами на плоскости R2 являются :