CH NEO-ZÜRICH EDITION
WEATHER · CLEAR 3°C
BLEND OF THE DAY · 07/ROGUE
EST. 2027
THE AEC CYBER MORNING NEWS

PAZ Kaffi

DESIGN · DEMOLITION · CAFFEINE · DISPATCH
EDITION 1113 · 13 November 2026
BROADCAST 04:42 CET
2,400 BROADSHEETS PRINTED
READ TIME · 47 MIN
Five Symbols Grow 4,096 Segments. How Thick Each One Is Stays Your Job
ACTION
FRAME · 06:50
13-11-2026 ▣ 73 READS

Five Symbols Grow 4,096 Segments. How Thick Each One Is Stays Your Job

Lindenmayer's 1968 bracket grammar grows 4,096 segments in four rewrites. Learn why width is a separate rule, and port the loop into Grasshopper Python 3.

Open the ACTION sketch and touch nothing. The readout already says bush·i4 -> 4096 segs · 0xbc9eb1. One production rule, rewritten four times, has grown 4,096 line segments. Push iterations to 5 and there are 32,768. Every rewrite multiplies the bush by eight, because the rule F → FF-[-F+F+F]+[+F-F-F] puts eight Fs where there was one.

The whole alphabet is five symbols. F draws a step, + and - turn, and [ and ] remember a position and return to it. The tree and fern presets add a silent X and a second rule. That short alphabet is the work of a biologist.

A grammar for filaments

In 1968 Aristid Lindenmayer, newly a professor at Utrecht, published “Mathematical models for cellular interaction in development” in two parts in the Journal of Theoretical Biology (vol. 18). His subject was filaments of cells, including algae. Przemyslaw Prusinkiewicz revisited the paper in a 2025 retrospective in the same journal. He describes Lindenmayer’s pivotal insight this way: cellular automata struggle with cell division, but that limit “does not apply to linear or branching filaments.” Lindenmayer wrote growth as the rewriting of strings, and he enclosed each branch in brackets. Prusinkiewicz says that notation “remains a cornerstone of L-systems to this day.” Even the name came from someone else: van Dalen coined “L-systems” in 1971.

Then came the turtle. Prusinkiewicz took a LOGO-style turtle from Abelson and diSessa’s Turtle Geometry (MIT Press, 1982). It reads the string from left to right. It steps on F and turns on + and -. On [ it pushes its state onto a stack, and on ] it pops that state back. The sketch does exactly this, with 9-unit steps, a starting heading of straight up, and x, y, heading and depth on the stack. Its default bush is Figure 1.24c of Prusinkiewicz and Lindenmayer’s The Algorithmic Beauty of Plants (Springer, 1990). The book draws it at n=4 and 22.5°, and the sketch’s integer slider rounds the angle to 22°.

The half the grammar leaves out

That book contains an honest line about the theory: “The emphasis was on plant topology… Their geometric aspects were beyond the scope of the theory.” The grammar tells you which branch grows from which. It never tells you how thick any branch is. Flip the sketch’s taper selector and you can see that gap for yourself.

Width has its own lineage. Leonardo’s notebooks say that all the branches of a tree, at every stage of its height, put together equal the thickness of the trunk. Read as cross-sections, that rule corresponds to an exponent of Δ=2. Christophe Eloy, then at Aix-Marseille University, reported in Physical Review Letters (2011) that measured species fall between 1.8 and 2.3. He argued that wind-induced loads can explain the rule. For flow, Cecil Murray at Bryn Mawr College showed in PNAS in 1926 that vessels which minimise work follow r³ = r₁³ + r₂³.

Here is what the selector actually does. It applies w = max(0.6, 3.2·0.88^(depth·e)). With “×2 exponent (load)” the widths run 3.20 → 2.48 → 1.92 → 1.49. With “×3 exponent (flow)” they thin faster, 3.20 → 2.18 → 1.49 → 1.01. Leonardo and Murray work the other way round. For two equal daughter branches, a Leonardo child keeps 0.71 of its parent’s diameter and a Murray child keeps 0.79. The sketch also ignores how many branches split at each node. So the selector nods to load versus flow, but it computes neither rule. That is the lesson rather than a defect: width is a second rule, and you have to write it down yourself.

From plants to Zürich

The brackets travelled into films and games. At SIGGRAPH 2001, Yoav Parish and Pascal Müller proposed “a system using a procedural approach based on L-systems to model cities.” That line of work became CityEngine and the Zurich company Procedural. Esri’s release announced the purchase on 11 July 2011 and said Procedural’s Zurich offices would be extended into an R&D centre. A biologist’s notation for algae is part of how Swiss-built software models cities.

←TODAY: a 1968 bracket grammar still grows the branching graph in 2026 tools, and width remains a separate rule. →3012: every tree-column ships with its grammar and its width exponent side by side, rebuildable by anyone. Fulcrum: topology is cheap to grow, and only a written width rule makes it a structure.

Stuttgart Airport’s terminal, by gmp with the engineers sbp, stands on 18 filigree tree-columns made of thick-walled steel pipes joined by castings. Read it as an L-system in steel: a branching graph in which engineers sized every member, because the grammar could not. The sketch’s learn panel says it in one line: “The L-system hands you the graph — an equilibrium method still has to size it.”

The grammar is cheap to grow and expensive to draw. At six rewrites the bush is a 711,532-character string and 262,144 segments, which may lag on a phone.

Atelier: A canopy or tree-column study often reaches the engineer as one frozen mesh, with topology and thickness fused together. An office working with generative and AI-assisted tools will produce more of these forms, faster, and each one is harder to defend without the rule behind it. Monday move: in your next branching Grasshopper definition, keep the grammar and the width rule as two separate named inputs, and write the width exponent on the sheet you send to the engineer.

Hack: Count the bush before you draw it, so the scaling law is in your hands rather than your graphics card. McNeel’s Script Editor runs Python 3 in one editor that works the same in Rhino and Grasshopper. Drop this into a Python 3 script component with an integer input n:

rule = {"F": "FF-[-F+F+F]+[+F-F-F]"}
s = "F"
for i in range(n):
    s = "".join(rule.get(c, c) for c in s)
a = (s.count("F"), 8 ** n)  # (4096, 4096) at n=4

To draw the bush, add a turtle that turns each F into an rg.Line (after import Rhino.Geometry as rg) and keeps a plain list as its stack for the brackets.

Keep the limits in mind. The sketch is 2D and deterministic. It has no random seed: the 0x tag is a fingerprint hash of the expanded string. It exports no geometry (the download button saves only the page), so the way into Grasshopper is to port expand() yourself. From where this desk sits, the branching forms worth keeping were the ones whose width rule was written down beside the grammar. Open the sketch, set it to i5, and count the eight before you draw.

FILED FROM
CO-SIGNERS
PAZ Academy
CONFIDENCE
HIGH
REPRINTS
© PAZ - PARAMETRIC ACADEMY ZURICH · ALL RIGHTS RESERVED

PAZ Kaffi · multidisciplinary editorial, led by PAZ Academy

⚑ REPORT AN ERROR · SUBMIT A CORRECTION
◂ BACK TO FRONT PAGE · PAZ KAFFI

© 2026 PAZ Academy.