Abhängige Typentheorie (Dependent Type Theory, DTT) ist ein mächtiges Formalismus innerhalb der mathematischen Logik und Informatik, der es erlaubt, Typen in Abhängigkeit von Werten zu definieren. Das eröffnet die Möglichkeit, Programme und mathematische Beweise stärker miteinander zu verbinden. Doch die formale Theorie ist hochkomplex und abstrakt, weshalb es hilfreich ist, Modelle zu entwickeln, die sie anschaulich und begreifbar machen. Hier kommt eine überraschende Verbindung ins Spiel: Python und dessen frozenset als endliches Mengenmodell. Python ist weithin bekannt als flexible Programmiersprache.
Doch durch das Einführen von frozenset — unveränderlichen Mengen — kann man eine Interpretation von Typen aus der abhängigen Typentheorie als Mengen darstellen. Das ist grundlegend sinnvoll, da Typen semantisch oft als Mengen von zulässigen Werten verstanden werden. Die Abbildung von Typen auf frozensets schafft so eine fassbare, rechenbare Welt, in der typentheoretische Konzepte exploriert werden können. Im Kern bedeutet die Interpretation, dass grundlegende Typen wie der leere Typ (Void), Einheits-Typ (Unit) und Boolesche Werte (Bool) als kleine konkrete frozensets definiert werden. Void als die leere frozenset, Unit als Singleton mit dem leeren Tupel als Element und Bool als frozenset bestehend aus True und False.
Damit ist eine solide Basis geschaffen. Wichtig ist der Umgang mit endlichen Mengen und die Einschränkung auf „extrem finite“ Betrachtungen. Python erlaubt keine Mengen von allen Ganzzahlen, wohl aber von begrenzten Bereichen, etwa mit range. Hier entsteht ein Meta-Parameter n, mit dem sich Typen wie Fin(n) als Mengen der Zahlen von 0 bis n-1 konkret fassen lassen. Obwohl Fin aus Lean her bekannt ist, handelt es sich hier um eine pragmatische Endlichkeitsbeschränkung aus Python-Perspektive.
Die Kernideen der abhängigen Typentheorie enthalten verschiedene Judgments, etwa dass A ein Typ ist, t ein Element von A, die Gleichheit von Typen oder von Elementen innerhalb eines Typs. Diese lassen sich im Python-Modell mit Funktionen abbilden, die auf Frozensets und deren Elemente prüfen. So kann durch einfache Zugehörigkeitsprüfungen („in“) oder Gleichheitsabfragen dargestellt werden, ob Judgments im Modell gelten. Damit entsteht ein mehr oder weniger soundes Modell, das zwar nicht alle theoretischen Feinheiten abbildet, aber die grundlegende Intuition erhält. Wichtige Operationen der Typentheorie wie abhängige Summen (Sigma-Typen) und abhängige Produkte (Pi-Typen) finden sich hier als Mengen von Tupeln oder Mengen von Abbildungen, dargestellt durch frozensets von frozendicts — unveränderlichen Dictionaries, die relevante Assoziationen zwischen Eingaben und Ausgaben festhalten.
Die − manchmal sperrigen − Konstruktionen von abhängigen Funktionen lassen sich so als total definierte Abbildungen mit endlichem Definitionsbereich darstellen. Durch itertools.product werden alle möglichen Kombinationen von Funktionen erzeugt, die die abhängigen Mengen abbilden. Das ist praktisch eine explizite Realisierung der Funktionstypen in endlicher Form. Auch einfache Summentypen, die Wahlmöglichkeiten zwischen verschiedenen Typen repräsentieren, sind modellierbar, indem Elemente in einem frozenset mit Tags wie "inl" und "inr" versehen werden.
Dieses Vorgehen orientiert sich einerseits an der Typentheorie, andererseits an der pragmatischen Umsetzung von Konstruktoren. Ein zentrales Konzept der abhängigen Typentheorie sind die sogenannten telescoped contexts, also Typkontexte, die schachtelartig abhängige Variablen binden. Diese lassen sich in Python natürlich durch verschachtelte for-Schleifen und Conditionally eingeschränkte Mengen repräsentieren. Die Tatsache, dass Typen in Abhängigkeit früherer Variablen definiert werden, spiegelt sich direkt in der Schleifenstruktur wider, was intuitiv und elegant zugleich erscheint. Ein klassisches Beispiel für abhängige Typen ist der Vektor-Typ (Vec), der Listen fester Länge beschreibt.
In der Frozenset-Interpretation entstehen diese durch Kombinationen von Tupeln, die Abbildungen über Fin(n) zu beliebigen Typen repräsentieren. Dabei wird die Endlichkeit durch Vorgabe einer maximalen Länge elegant eingebaut. Darüber hinaus werden Identitätstypen interpretiert, etwa der Typ Id(A, x, y), der nur dann ein Singleton mit "refl" ist, wenn x und y gleich sind, andernfalls eine leere Menge. Das erlaubt die Modellierung definitionaler Gleichheiten, wenngleich das Modell extensional ist und die Unterscheidung zu propositionaler Gleichheit weniger hervorgehoben wird. Eine größere Herausforderung stellen sogenannte Universen dar, also Typen, die selbst Typen enthalten.
Diese Hierarchie wird in der Frozenset-Interpretation durch Rekursion über zwei Parameter realisiert: eine Nummer für etwa die Größe und eine für die Ebenentiefe. Dabei entstehen so genannte kumulative Universen, die Typen aus Basistypen, Funktions- und Paar-Konstruktionen sowie begrenzte Fin-Typen enthalten. Somit kann man Polymorphie und hochrangige Typen modellieren, allerdings innerhalb endlicher Grenzen. Der Umgang mit komplexeren Konzepten wie Quotienten, Teilmengen oder Erfüllbarkeit wird ebenfalls angegangen. Beispielsweise sind Quotiententypen in der Frozenset-Welt Mengen von Äquivalenzklassen, definiert über eine Relation R, die Partitionen von Typen schafft.
Teilmengen wiederum können als Sigma-Typen mit einem induktiven Prädikat modelliert werden. Das Konzept der Ausführung lässt sich hier subtil durch Generatoren und zeitindizierte Mengen interpretieren. So könnten Erweiterungen das Modell um konvergente Berechnungen oder gesteuerte Auswertungsschritte bereichern. Die Verschmelzung von pyhtonischem Generatormanagement mit typentheoretischen Prinzipien ist ein spannendes Forschungsfeld. Verschiedene weiterführende Ideen sind im Spiel, etwa eine Anbindung an SMT-Solver wie Z3, die Nutzung von Sympy für symbolische Berechnungen, oder sogar komplexere formale Modellierungen mit E-Graph-Methoden.
Damit könnte das Python-Frozenset-Modell Ausgangspunkt für automatisierte Beweissysteme und Modellprüfer werden. Besonders hervorzuheben ist, dass das Modell trotz seiner Endlichkeit nicht unten durch eine naive Vereinfachung leidet. Die Interpretation ist bewusst „sound-ish“, das heißt, alles, was man in der Typentheorie ableiten kann, ist im Modell erfüllt, aber nicht jedes Element des Modells muss in der Theorie beweisbar sein. Als Fazit zeigt die Frozenset-Interpretation von abhängiger Typentheorie in Python eine faszinierende Brücke zwischen formaler Logik, Mengenlehre und Computermodellen. Sie bringt wichtige Typkonzepte auf ein verständliches, berechenbares Niveau und öffnet die Tür zu lehrreichen Experimenten mit Typen, Universen und funktionen ersten Grades.
Damit wird nicht zuletzt die oft mystifizierte abhängige Typentheorie greifbar, indem sie in die vertraute Sprache von Python-Mengen übersetzt wird. Forscher und Entwickler können hierdurch komplexe Typen exakt modellieren, simulieren und inspizieren, ohne direkt in formale Beweissprachen einzutauchen. Das Python-Frozenset-Modell ist dabei nicht nur akademisches Spielzeug, sondern potenziell ein Werkzeug für didaktische Zwecke, Prototyping neuer Typsysteme und für Modellprüfungen in der Informatik zugänglicher machen. Die Verbindung von Python als Metatheorie und Typentheorie als Objekt ist eine innovative Perspektive, die in Zukunft weiter erforscht und automatisiert werden kann.