De genealogie van ELIZA (ELIZAGen)

Gedurende zes decennia is ELIZA honderden keren opnieuw geïmplementeerd: gekopieerd, geporteerd naar verschillende talen, herbouwd op basis van gepubliceerde beschrijvingen, vereenvoudigd voor onderwijsdoeleinden en opnieuw vormgegeven als kunst. Software heeft geen materiële continuïteit zoals die bestaat bij biologische stambomen of manuscripten. Daarom vergelijken we niet de brontekst, maar de architectuur. Elk programma wordt beschreven door een set abstracte kenmerken (bijv.: rangschikt het trefwoorden? beschikt het over een backtracking matcher? houdt het een geheugen bij van eerdere invoer?). De resulterende karaktermatrix wordt geanalyseerd met PAUP*, de standaard software voor parsimonie uit de evolutionaire biologie.

Het huidige corpus bevat 27 specimens uit de periode 1965–2025 in acht talen, beschreven aan de hand van 13 binaire kenmerken. Het werk is nog in uitvoering en is uitgewerkt in een conceptartikel: Reconstructing Program Genealogies from Abstract Program Descriptions: The ELIZA Case Study (A Work in Progress) (Jeff Shrager, december 2025).

De huidige meest parsimonieuze boom uit PAUP* is getekend met Biopython's Bio.Phylo. De horizontale afstand staat voor de taklengte (het aantal kenmerkveranderingen). De namen van de specimens vermelden de auteur, het geschatte jaar (XX = onbekend) en de taal.

Interpretatie van de stamboom

Een basale polytomie van volledige ELIZA's

Aan de wortel bevinden zich programma's die de volledige ELIZA-architectuur behouden en op basis van deze kenmerken niet van elkaar te onderscheiden zijn: Weizenbaums originele MAD-SLIP uit 1965, Bernie Cosells BBN Lisp uit 1966 (geschreven op basis van het CACM-artikel zonder Weizenbaums code te zien), diverse andere Lisp-versies, de SNOBOL- en Burroughs B5500 Algol-versies uit 1970, een Java-versie en Anthony Hays C++ reconstructie uit 2021. Ondanks zes decennia en zeer verschillende talen is het ontwerp identiek.

Een afgeleide clade van vereenvoudigingen

Afbuigend van die kern bevinden zich voornamelijk BASIC-versies uit het tijdperk van de microcomputer (afstammelingen van Jeff Shragers BASIC ELIZA uit 1973, gepubliceerd in Creative Computing in 1977), samen met Python-, JavaScript- en enkele vereenvoudigde Lisp-versies. Deze laten doorgaans backtracking, geheugen en trefwoordprioriteit vallen. Dit is gebeurd vanwege de beperkingen van vroege microcomputers, voor educatieve doeleinden (bijv. Norvigs Lisp uit 1991 in PAIP), of simpelweg door een andere programmeercultuur.

Validatie-specimens

Drie specimens dienen om de methode te testen:

  • Identieke clones: Een paar byte-voor-byte identieke clones (E18, E20) landen samen met een taklengte van nul, zoals verwacht.
  • Een controle-specimen: Een controle (E22, een pattern-matching bestandshulpprogramma dat niets met conversatie te maken heeft) nestelt zich binnen de ELIZA-clade. De huidige kenmerken vangen dus een algemene pattern-matching architectuur op in plaats van iets dat specifiek conversationeel is; betere conversationele kenmerken zijn nodig.
  • LadyMouth: LadyMouth (E21, de feministische kritische-kunst chatbot van Sarah Ciston) scoort nul op elk kenmerk. Het bevindt zich op maximale afstand: het is een ELIZA-achtig programma op basis van rol en kritiek, niet op basis van architectuur, en dient als een bevestigde outlier.

Het artikel stelt dat het resultaat niet gelezen moet worden als een letterlijke afstammingslijn, maar als een kaart van een tekstuele traditie. Het laat zien hoe implementaties zich tot elkaar verhouden via behoud, adaptatie, convergente herimplementatie en kritiek.

Methodologie: Hoe het is gemaakt

  1. Verzamelen en normaliseren: Specimens werden verzameld uit archieven, publicaties en repositories, en vervolgens licht genormaliseerd (witruimte, commentaren, metadata).
  2. Kenmerken extraheren met een LLM, daarna handmatig cureren: Een taalmodel stelde structurele en gedragsmatige kenmerken voor voor een eerste programma. De vocabulaire werd handmatig bewerkt en vervolgens uitgebreid in een ronde over alle specimens totdat er geen nieuwe kenmerken meer verschenen, met handmatige curatie na elke ronde.
  3. Classificeren: Elk specimen werd gescoord op de vastgestelde vocabulaire, wat resulteerde in een matrix van programma's per kenmerk.
  4. Bomen afleiden: De matrix werd geconverteerd naar NEXUS en geanalyseerd in PAUP* onder parsimonie (heuristische zoekopdracht, TBR branch swapping), en de resulterende bomen werden getekend met Biopython.

De kenmerken

  • Rule-based pattern matching: Het gedrag wordt gestuurd door een expliciete set regels, elk met patronen en bijbehorende reacties, in plaats van puur procedurele of statistische logica.
  • Keyword priority: Trefwoorden of regels hebben numerieke prioriteiten die bepalen welke regel wordt toegepast.
  • Synonym translation: Een mapping normaliseert oppervlaktevormen (synoniemen, buigingen) naar canonieke tokens voordat regels worden toegepast.
  • Backtracking matcher: De matcher kan segmenten van invoer met variabele lengte consumeren en daarover terugspoelen (backtrack) om aan complexe patronen te voldoen.
  • Wildcards & classes: De pattaaltaal ondersteunt wildcards (bijv. placeholders voor numerieke segmenten) en token-klassen of matches op basis van eigenschappen.
  • Segment storage: Gematchte invoersegmenten worden opgeslagen voor latere referentie tijdens het genereren van de reactie.
  • Template reassembly: Reacties worden gebouwd door sjablonen in te vullen die verwijzen naar gematchte segmenten op basis van positie.
  • Memory rules: Geselecteerde eerdere invoer wordt opgeslagen en later opgehaald door specifieke geheugenregels.
  • Fallback rule: Een expliciete standaardregel ("laatste redmiddel") wordt toegepast wanneer niets specifiekers matcht.
  • Punctuation-sensitive: Invoer wordt getokeniseerd met een expliciete set scheidings- en breektekens, zodat interpunctie de tokens en frases vormgeeft.
  • Ordered memory: Geheugen wordt opgehaald in chronologische volgorde (in plaats van willekeurig).
  • List/symbol processing: Het programma maakt primair gebruik van lijst- en symboolverwerking in plaats van stringverwerking.
  • Separable script: Het script is in essentie gescheiden van de code voor taalverwerking (ongeacht of het in een apart bestand staat).

De specimens en hun kenmerken

✓ = kenmerk aanwezig, leeg = afwezig, ? = kon niet worden bepaald.

SpecimenRule-based pattern matchingKeyword prioritySynonym translationBacktracking matcherWildcards & classesSegment storageTemplate reassemblyMemory rulesFallback rulePunctuation-sensitiveOrdered memoryList/symbol processingSeparable script
E01 Cosell66Lisp✓✓✓✓✓✓✓✓✓✓✓✓✓
E02 Trembly17Cobol✓✓✓✓✓✓✓
E03 SamsonXXLisp✓✓✓✓✓✓✓✓✓✓✓✓✓
E04 KMPXXLisp✓✓✓✓✓✓✓✓✓
E05 JonLXXLisp✓✓✓✓✓✓✓✓✓✓✓✓✓
E06 Babcock15BASIC✓✓✓✓✓✓✓
E07 Hay21CPP✓✓✓✓✓✓✓✓✓✓✓✓✓
E08 Juul23BASIC✓✓✓✓✓✓✓
E09 DavenportXXBASIC✓✓✓✓✓✓✓✓
E10 Srijak08Python✓✓✓✓✓✓✓✓✓✓
E11 Strout05Python✓✓✓✓✓✓✓
E12 Shrager73BASIC✓✓✓✓✓✓✓
E13 Norvig91Lisp✓✓✓✓✓✓✓✓
E14 Cherry82Lisp✓✓✓✓✓?✓✓
E15 Bell79BASIC✓✓✓✓✓✓
E16 Dunlop97JS✓✓✓✓✓✓
E17 Platt79BASIC✓✓✓✓
E18 JonLXXLisp clone✓✓✓✓✓✓✓✓✓✓✓✓✓
E19 Weizenbaum65MADSLIP✓✓?✓✓✓✓✓✓✓✓✓✓
E20 Shrager73BASIC clone✓✓✓✓✓✓✓
E21 Ciston15LadyMouthPython
E22 Shrager15FilerCPP foil✓✓✓✓✓
E23 Jull99Java✓✓✓✓✓
E24 HaydenXXJava✓✓✓✓✓✓✓✓✓✓✓✓✓
E25 Haxpor15PHP✓✓✓✓✓✓✓✓✓✓✓
E26 Duquet70SNOBOL✓✓✓✓✓✓✓✓✓✓✓✓✓
E27 Fricks70B5500Algol✓✓✓✓✓✓✓✓✓✓✓✓✓

Data, code en paper

Alle bestanden bevinden zich in de genealogy map van de ELIZAGen GitHub repository:

  • Conceptartikel: PDF · LaTeX bron · bibliografie
  • Resultaten: kenmerkmatrix (CSV) · kenmerkvocabulaire (YAML) · NEXUS-bestand · bomen · PAUP* log
  • Pipeline: handleiding en README · elizagenlibrary.py · cvs2nexus.py · drawpaup_trees.py
  • Specimens: broncode voor alle 27 programma's
  • Werknotities: LLM-conversaties uit de analyse

Dit project is voortgekomen uit het blogbericht A Code-Based ELIZA Phylogeny uit 2022. Als u een ELIZA-implementatie kent die in het corpus thuishoort (met name pre-microcomputer, niet-Engelstalig of artistiek), neem dan contact op met Jeff Shrager (jshrager@gmail.com).

ELIZAGen wordt gecureerd door Jeff Shrager (jshrager@gmail.com). Wij danken CommerceNet voor hun steun.