In 1989, two people were writing programs that generated language out of structure rather than meaning. One of them was Tim Berners-Lee, who that year circulated a memo titled Information Management: A Proposal — the document that became the World Wide Web. The other was a professor in a hallway in Medellín, who wrote a hundred lines of Turbo Prolog to make fun of his colleagues.

I knew about the second one. The first I only read about later, the way everyone did. But the two were closer in spirit than the distance between Geneva and the Universidad de Antioquia would suggest. Both were betting that if you got the relationships right — between documents, between words — the content could take care of itself. One bet built the modern internet. The other got pinned to a cork board and read by people who never realized they were the joke.


I. The Hallway and the Bulletin Board

Prof. Fabián Ríos built it on the Systems Engineering Department’s first computer — an NEC PC, the kind of machine that booted from a floppy and measured its memory in kilobytes. Turbo Prolog, Borland’s 1986 product, ran on MS-DOS with no modules, no Unicode, none of the conveniences that a modern programmer assumes the way they assume electricity.

The program did one thing. It proved a single goal by chaining about ten predicates, each of which called a random function to pick from roughly ten options. Ten columns, ten choices each, concatenated into a paragraph of dignified, institutional-sounding prose. The output was signed Nefasto Bocazza — a name derived, with the affection of an insult, from the NEC machine it ran on.

Then came the second act, which is the part I love. Prof. Roberto Flores printed the discourses and posted them on the faculty bulletin board. And the faculty read them. Busy professors stopped in the hallway, scanned a paragraph of Nefasto’s pronouncements, nodded, and walked on. The satire worked not because the text was clever but because the building was already full of language exactly like it — grand, ornate, recursive, and saying almost nothing. A hundred lines of Prolog had revealed that a great deal of academic speech was, structurally, just columns with random picks.

I should be honest about my own role in this story, which is mostly that of a deserter. I abandoned Prolog. I had to survive, so I moved to Turbo Pascal and Turbo C and, eventually, something called SQL. The original Nefasto code is lost. Prof. Ríos remembers it was “very simple” and no longer recalls the exact form of the random function or the concatenation operator. That, too, is part of the lesson: the thing was so light it left almost no trace.


II. What 1989 Could Hold

It is worth remembering the box this ran in, because the box is the argument. The NEC was an 8086 or 80286, clocked somewhere between 4 and 12 MHz. It had 640 KB of conventional memory — and the 640 KB barrier was not a figure of speech but a wall you hit and cursed. Storage was floppies, maybe a 20 MB hard drive. The display was monochrome or four-color CGA. There was no internet, no network, no coprocessor, no notion of a “cloud” to push the hard parts onto.

The software was just as bare. Turbo Prolog had no findall/3, no setof/3, no standard library for strings. Spanish diacritics required either creative ASCII encoding or quiet omission. The debugger was trace and spy. There was no version control, no package manager, nothing to install. You wrote the grammar, you ran the goal, you got the discourse.

Set that against a frontier model in 2026: a training run that consumes megawatt-hours across thousands of GPUs, trillions of tokens of the entire written record plus synthetic supplement, a single forward pass performing more arithmetic than the NEC would have done in its whole working life. The gap in resources is astronomical. The gap in usefulness for the specific task — generate institutionally plausible discourse to mock institutional discourse — is roughly zero. Nefasto did it in milliseconds on 640 KB. It is the right answer to the question it was asked.


III. Logic, Not Likelihood

The revival — I tried to bring it back at github.com/contento/nefasto — uses SWI-Prolog and definite clause grammars to generate three-act narratives: a character moves through setup, complication, and resolution, drawing words from profile-specific dictionaries. A grammar is just a set of rewrite rules describing which sentences are valid. The Prolog engine finds a derivation that satisfies the rules, and that derivation is the text. There are twelve discourse profiles — political, academic, legal, conspiratorial, motivational, passive-aggressive, and so on — each a different vocabulary poured into the same grammar.

Take the karen profile — entitled, demanding, complaint-focused, its whole personality compressed into a word list. You invoke it from the command line:

swipl -l src/main.pl -- --lang en --profile karen --seed 42

and it hands back three-act stories like these:

once Patricia arrived in the restaurant . then Patricia suggested the refund . finally Patricia cautioned .
once Karen arrived in the newspaper . then Karen harmed the investment . finally Karen threatened .
once Brenda arrived in the television . then Brenda escalated the expectation . finally Brenda demanded .

The grammar is rigid and visible — arrived in, then, finally — and the vocabulary does the rest: manager, complaint, unacceptable, refund, lawsuit, demand, threat. Keep --seed 42 and you get exactly these sentences, on any machine, forever; change it and you get a different but equally lawful set. Swap --profile karen for --profile legal and the same three acts come out in the cadence of a contract. Nothing was trained. The personality is a dictionary.

This is a different kind of machine from a language model, and the difference is not size. It is direction. A grammar encodes validity; a model encodes probability. Nefasto never asks what word is most likely to come next. It asks whether there exists a word that satisfies the constraints, and if so, picks one. Same seed, same output — no temperature, no sampling, nothing stochastic. Every choice is a predicate you can read. There is no latent space, no hidden layer, no representation you are forbidden to inspect. And it needs no data at all: not a corpus, not a fine-tune, just a grammar and a dictionary. Swapping the profile swaps the voice without touching the structure — the separation of what is said from how it is built that LLMs only achieve after training, through prompting. Prolog achieves it at design time, on purpose.

I have written elsewhere about why symbolic and statistical AI now need each other, and I won’t relitigate the comparison. The point here is narrower and older: the symbolic approach was never superseded. It was out-scaled. Those are not the same thing. A tool that solves a small problem cleanly does not become wrong when someone builds a larger tool that also happens to solve it.


IV. The Bricoleur and the Engineer

Claude Lévi-Strauss, in The Savage Mind, draws a distinction between the engineer and the bricoleur. The engineer works from first principles, acquiring exactly the materials a design requires. The bricoleur works with whatever is at hand — a closed, finite set of odds and ends — recombining them into whatever the moment needs. Lévi-Strauss meant it as a model of mythical thought, but it describes Nefasto perfectly. Ten columns, ten scraps each, recombined into discourse. The bricoleur does not need the world’s resources; he needs a good inventory and a feel for combination.

Robert Kowalski gave the same idea a precise form in 1979: Algorithm = Logic + Control. The logic — what is true, what is valid, the grammar and the predicates — is separable from the control, the strategy by which a machine searches for an answer. Change one without disturbing the other. Nefasto is that equation made into a joke: the logic is a handful of facts about how a sentence can be assembled, the control is Prolog’s resolution, and you can rewrite the vocabulary all day without rewriting the engine.

A trained model collapses this distinction. Its logic and its control are the same billions of weights, frozen together, inseparable. You cannot add a rule to it in one line. You add behavior by fine-tuning or prompting, each with side effects you discover later. The bricoleur’s inventory is editable. The engineer’s monument is not.


V. The Name of the Rose

William of Baskerville, the Franciscan in Umberto Eco’s The Name of the Rose, solves a series of murders in a medieval abbey using Aristotle, observation, and deduction. No lab, no database, no oracle. The abbey’s library is the largest in Christendom — a labyrinth of rooms, hidden passages, and forbidden books, a vast and opaque system. William’s method is the small one: reason applied to what he can see and read.

And the book’s cruelest turn is that his method works, but the pattern he finds is not the one he sought. He looked for a rational chain of causation and found a web of contingency and obsession. The logic was sound; reality was messier. This is the honest shape of the symbolic approach. You start with a model of how things work, you derive consequences step by step, every step is traceable, and when it fails you know exactly which rule to fix. The statistical approach is the library itself: start with an enormous heap of observations, let the pattern-finder do its work, and accept fluent, often-correct output you cannot fully explain and cannot easily repair.

William wins because the abbey is the right size for a friar with a logic textbook. A single building, a handful of deaths, a closed world. If the problem were “predict the next word in any language given any context,” you would need the library, not the friar. Nefasto is William. A language model is the library. Both are real, both are valid, and the only mistake is to think one makes the other obsolete.

“I have never doubted the truth of signs, Adso; they are the only things man has to orient himself in the world. What I doubted was their relationship to the things they signify.” — William of Baskerville

The professors in that hallway in 1989 read the signs and trusted them. They never doubted the relationship between the discourse and what it signified — which was nothing. A hundred lines of Prolog knew the secret before any of us did.


Further reading