에듀테크 프로젝트 대시보드
L-시스템 — 규칙으로 자라는 프랙탈
1968년 생물학자 아리스티드 린덴마이어(Aristid Lindenmayer)는 조류(藻類)가 자라는 모습을 수학으로 적고 싶었다. 그가 만든 L-시스템은 놀랄 만큼 단순하다. 시작 문자열(공리, axiom) 하나와, "이 글자는 이렇게 바꿔라"라는 치환 규칙 몇 개. 그다음 모든 글자를 동시에 규칙대로 바꾸는 것을 반복한다. 몇 세대만 지나면 문자열이 폭발적으로 길어지고, 이 문자열을 거북이(turtle)에게 "앞으로 가라 / 왼쪽으로 돌아라" 명령으로 읽히면 — 눈송이, 고사리, 해안선이 그려진다.
맨 처음 문자열. 예: F 딱 한 글자.
글자 → 문자열. 예: F → F+F−F−F+F. 규칙 없는 글자는 그대로.
한 세대에 모든 글자를 한꺼번에 치환. 순차 치환이 아니다.
공리 F, 규칙 F → F+F−F−F+F 하나.
+ 와 − 에는 규칙이 없으니 그대로 남는다.
각 세대에서 문자열 속 모든 F가 동시에 다섯 글자짜리 패턴으로 부풀어 오른다.
F의 개수가 세대마다 5배로 늘어난다 (1 → 5 → 25 → 125 …). n세대 문자열 길이는 대략 5ⁿ. 이 지수적 성장이 프랙탈의 "무한한 디테일"을 만든다.
완성된 문자열을 왼쪽부터 한 글자씩 읽으며 펜을 쥔 거북이를 조종한다.
[ ] 대괄호는 거북이의 현재 위치·방향을 저장(push)하고 복원(pop)하는데,
나뭇가지가 갈라졌다가 원래 자리로 돌아오는 것을 표현한다.
| 기호 | 거북이 동작 |
|---|---|
F G | 현재 방향으로 한 칸 전진하며 선을 긋는다 |
f | 선을 긋지 않고 한 칸 전진 (펜 들기) |
+ | 왼쪽으로 각도 δ 만큼 회전 |
− | 오른쪽으로 각도 δ 만큼 회전 |
[ | 현재 (위치, 방향)을 스택에 저장 |
] | 스택에서 꺼내 그 상태로 순간이동 (가지 끝 → 갈림길) |
X Y | 그리지 않음. 규칙을 키우기 위한 "성장 변수" |
도형을 고르고 세대(iterations) 슬라이더를 올려 보자. 각도 δ를 바꾸면 완전히 다른 모양이 된다. 세대를 높이면 문자열이 수십만 글자까지 길어지므로 도형별로 상한을 뒀다.
같은 코흐 곡선을 재귀 함수로도 그릴 수 있다. 차이는 관점이다.
재귀는 "이 선분을 4개의 작은 선분으로 나눠라"라고 도형을 직접 다룬다.
L-시스템은 기호 문자열을 다루고, 그리기는 완전히 분리된 뒤처리 단계다.
덕분에 규칙만 슬쩍 바꿔도(예: F에 가지 규칙 추가) 전혀 다른 식물이 나오고,
생물학자들이 실제 나무의 성장 데이터를 규칙으로 옮겨 적기 쉬웠다.
절차적 생성(procedural generation)의 뿌리다. 게임·영화의 나무 생성 도구 SpeedTree, 식물 모델링 소프트웨어, 도시 도로망·강줄기 자동 생성, 그리고 프랙탈 아트가 모두 L-시스템 아이디어를 쓴다. 규칙에 확률을 넣으면(확률적 L-시스템) 나무마다 조금씩 다르게 자라고, 앞뒤 글자를 보고 규칙이 달라지면(문맥 의존 L-시스템) 형식 문법의 문맥 자유 → 문맥 의존 위계와 그대로 대응된다.