Genworks GDL is a knowledge-based engineering system. That phrase has carried a lot of marketing weight over the years, so this page sets out plainly what we mean by it: the handful of ideas that make the engine behave differently from a conventional program, a CAD model, or a database. For what the system is built out of, see the Technology page. This page is about how it thinks.
You may have met the term Knowledge Base System — or Knowledge Based System — in a textbook or a vendor brochure, and concluded that the concept was too broad to be of practical use. You may even have heard the joke: knowledge-based engineering, as opposed to ignorance-based engineering? Fair enough. Our own definition is deliberately narrow, and it is the one this page uses throughout.
A Knowledge Base System is a hybrid object-oriented and functional programming environment which implements caching and dependency tracking.
Everything else on this page follows from that sentence. Caching means that once the system has computed something, it will not generally repeat the computation if the same question is asked again. Dependency tracking is the other side of the coin: it ensures that when a cached result has gone stale, it is recomputed the next time it is demanded, so what comes back is always fresh.
The wider engineering literature defines knowledge-based engineering as a technology for capturing and systematically re-using product and process engineering knowledge, with the goal of cutting the time and cost of product development — by automating the repetitive, non-creative parts of design, and by supporting multidisciplinary design optimization throughout the process rather than only at the end. We have no quarrel with that definition. We would add only that it stands or falls on whether the underlying engine gets the next three things right.
The engine memoizes what it computes — both computed slot values and instantiated objects — so that results are reused rather than recalculated. The dependency tracker records what each cached value was derived from. When something upstream changes, every value downstream of it is marked stale and unbound. Nothing is recomputed at that moment; the recomputation happens later, if and when the value is demanded again.
This is what makes associative modeling work. Suppose the shape of a wing rib is defined in terms of the wing's aerodynamic surface. Modify that surface, and the rib instance — together with every attribute and every child object that depended on it — is invalidated automatically. The replacement rib is not built eagerly; it appears at the moment someone asks for it.
Note what is absent. There is no rebuild step to run, no dirty flag to maintain, no observer to wire up, no ordering convention that a future maintainer has to know about. You cannot forget to invalidate something, because you never wrote the invalidation in the first place.
GDL evaluates only those chains of expressions needed to answer the question actually asked. Request the weight of that wing rib, and the rib object is instantiated because the weight needs it; the reference surface is generated because the rib needs it; and so on, backwards through the dependencies, until the request can be satisfied — and no further.
This matters at scale, and scale is the normal case. A production object tree can run to hundreds of branches and thousands of attributes. The ability to evaluate one specific attribute on one specific branch, without evaluating the entire model from its root, is frequently the difference between a problem that is tractable and one that is not. Ask for a bill of materials and you pay for a bill of materials — not for the geometry, the drawings, and the analyses that nobody requested.
When you put together a GDL application you think and write mainly in terms of objects, their properties, and how those properties depend on one another. You do not have to track in your head which object will call which other object, or in what order. There is no main loop and no evaluation sequence to maintain: the engine derives the order it needs from the dependency graph, at the moment of demand.
The practical consequence is that you can add a rule in the middle of a large model without first deciding where in an execution sequence it belongs. The definition reads as a statement about the product rather than as a recipe for computing it, which is why GDL source stays legible years later — to a colleague picking it up, and increasingly to a language model asked to extend it.
None of this costs you the machine. GDL is a superset of ANSI Common Lisp and compiles down to native code; the stack, and the code-expansion that gets you there, are covered on the Technology page.
The combination — declarative form, a dependency graph, demand-driven recomputation — has been independently reinvented several times in other corners of computing. That is usually a sign that a model is right rather than merely old.
Each of these rediscovered one facet of the model for its own domain. GDL has had the whole of it — with a real object hierarchy, real geometry, and a real compiler underneath — since the 1990s. That makes the engine early rather than legacy, and it goes some way toward explaining why it takes so naturally to being driven by an AI agent.
In order to model very complex products and efficiently manage large bodies of knowledge, a KB system taps the object-oriented nature of its underlying language. "Object" here means an instantiated data structure of a particular assigned type. From that you get what you would expect of any object-oriented environment:
But unrestricted modification of object state is the well-known road to systems that are difficult to debug and impossible to maintain. A KB system manages that risk by strictly constraining the ability to change state. What it produces at runtime is a tree of inspectable objects, analogous to the function call tree of a pure functional program — except that it persists, and you can walk it, query it, and display it.
Where mutation is genuinely called for, as when a user changes an input in a web interface, it is confined to slots explicitly declared settable, and the dependency tracker deals with the consequences. GDL supports the message-passing style of object orientation, with some extensions; full ANSI CLOS is always available alongside it, so the generic-function style is there when it suits the problem better.
What the engine is made of: ANSI Common Lisp, Franz Allegro CL, the SMLib NURBS kernel, CAD interoperability, and live MCP access for AI agents.
The technology stack →Self-paced, hands-on tutorials that take you from installation through object definition to web-delivered GDL applications.
Start learning →The open tooling line — skewed-emacs, lisply-mcp and Cyclops — that puts the running engine within reach of your editor and your AI agent.
The open stack →No installation required. A live terminal, running the engine, is the shortest path from these ideas to something you can poke at.
Launch the terminal →If the ideas above sound like a fit for the work in front of you — or if you want a second opinion on whether they are — we are happy to talk it through.