Ich weiß, wie einige negative Ereignisse definitiv schlecht sein können:
data False
data Bad a = C (Bad a -> a)
selfApp :: Bad a -> a
selfApp (x@(C x')) = x' x
yc :: (a -> a) -> a
yc f = selfApp $ C (\x -> f (selfApp x))
false :: False
false = yc id
Ich bin mir jedoch nicht sicher, ob:
Alle induktiven Typen mit negativen Vorkommen können falsch werden.
wenn ja, gibt es einen bekannten mechanischen Weg, dies zu tun;
Zum Beispiel habe ich versucht, diesen Typ falsch zu machen:
type Not a = a -> False
data Bad2 a = C2 (Bad2 (Not a) -> a)
Jeder Hinweis auf Literatur zu diesem Thema wäre willkommen.
lo.logic
type-theory
soundness
Ptival
quelle
quelle
Antworten:
Der Grund für das Verbot negativer Vorkommen kann in Analogie zum Knaster-Tarski-Theorem verstanden werden. Dieser Satz sagt das
In der traditionellen Modelltheorie können Gitter als Sätze angesehen werden, und die Ordnungsbeziehung p ≤ q kann als Folge verstanden werden (dh, dass die Wahrheit von q durch die Wahrheit von p verbunden ist ).L. p ≤ q q p
Wenn wir von der Modelltheorie zur Beweistheorie übergehen, verallgemeinern sich Gitter auf Kategorien. Typen können als Objekte einer Kategorie , und eine Karte e : P → Q repräsentiert einen Beweis dafür, dass Q von Q abgeleitet werden kann .C e:P→Q Q Q
Wenn wir versuchen, durch rekursive Gleichungen definierte Typen zu interpretieren, ist ee, ist es naheliegend, nach einer Verallgemeinerung des Knaster-Tarski-Theorems zu suchen. Anstelle einer monotonen Funktion auf einem Gitter möchten wir also einenFunktor F : C → C , der Objekte an Objekte sendet, aber die Monotoniebedingung verallgemeinert, so dass jede Karte e : P → Q eine Karte F ( e ) : F erhält ( P ) → F ( Q ) (mit den Kohärenzbedingungen, dass F Identitäten an Identitäten sendet und Kompositionen beibehält, so dass F.N=μα.1+α F:C→C e:P→Q F(e):F(P)→F(Q) F ).F(g∘f)=F(g)∘F(f)
Wenn Sie also einen induktiven Datentyp μ α möchten . müssen Sie auch eine Funktionsaktion zu Begriffen für den Typoperator F bereitstellen, um sicherzustellen, dass der gewünschte Fixpunkt vorhanden ist. Die strenge Positivitätsbedingung in Agda und Coq ist einesyntaktischeBedingung, die diesesemantischeEinschränkungimpliziert. Wenn Sie einen Typoperator aus Summen und Produkten erstellen, können Sie die Funktionsaktion immer zusammenstellen. Daher sollte jeder auf diese Weise gebildete Typ einen festen Punkt haben.μα.F(α) F
In Sprachen mit abhängiger Eingabe haben Sie auch indizierte und parametrisierte Typen, sodass Ihre eigentliche Aufgabe komplizierter ist. Bob Atkey (der hier und hier darüber gebloggt hat ) sagt mir, dass ein guter Ort, um nach der Geschichte zu suchen, ist:
Wie Andrej bemerkt, hängt es grundsätzlich davon ab, welches Modell der Typentheorie Sie verwenden, ob ein negatives Auftreten in Ordnung ist oder nicht. Wenn Sie eine rekursive Definition haben, suchen Sie grundsätzlich nach einem Fixpunkt, und in der Mathematik gibt es viele Fixpunktsätze.
Eines, von dem ich persönlich viel Gebrauch gemacht habe, ist Banachs Fixpunktsatz, der besagt, dass wenn Sie eine streng kontraktive Funktion auf einem metrischen Raum haben, er einen eindeutigen Fixpunkt hat. Diese Idee wurde von (IIRC) Maurice Nivat in die Semantik eingeführt, von Amerika und Rutten eingehend untersucht und kürzlich von Birkedal und seinen Mitarbeitern mit einer beliebten Operationstechnik namens "Step-Indexing" in Verbindung gebracht.
Dies führt zu Typentheorien, bei denen negative Vorkommen in rekursiven Typen zulässig sind, jedoch nur dann, wenn die negativen Vorkommen unter einem speziellen Konstruktor vom Typ "Schutz" auftreten. Diese Idee wurde von Hiroshi Nakano eingeführt, und die Verbindung zu Banachs Theorem wurde sowohl von mir und Nick Benton als auch von Lars Birkedal und seinen Mitautoren hergestellt.
quelle
Manchmal kann man rekursive Gleichungen "durch Glück" lösen.
Fazit: Es gibt zwei Lösungen, den leeren Typ (den Sie aufgerufen haben
False
) und den Einheitentyp()
.Integer
(Integer -> Bool) -> Bool
quelle
Es ist schwer, Andrejs oder Neels Erklärungen etwas hinzuzufügen, aber ich werde es versuchen. Ich werde versuchen, den syntaktischen Standpunkt anzusprechen, anstatt zu versuchen, die zugrunde liegende Semantik aufzudecken, da die Erklärung elementarer ist und ich eine einfachere Antwort auf Ihre Frage gebe.
Die entscheidende Referenz ist die folgende:
Mendler, N. (1991). Induktive Typen und Typbeschränkungen im Lambda-Kalkül zweiter Ordnung. Ich fürchte, ich habe online keine Referenz gefunden. Die Aussagen und Beweise finden sich jedoch in Nax ' Dissertation (eine sehr empfehlenswerte Lektüre!).
und so
Natürlich arbeiten Sie nicht mit gleichwertig definierten Typen, sondern mit Konstruktoren , dh Sie haben
eher als strenge Gleichheit. Sie können jedoch definieren
was ausreicht, damit dieses Ergebnis weiterhin gilt:
In Ihrem zweiten Beispiel sind die Dinge etwas kniffliger, da Sie etwas in der Art von haben
mit
Es wäre leicht zu lösen, wenn Haskell solche Typdefinitionen zulassen würde:
In diesem Fall können Sie einen Schleifenkombinator genauso erstellen wie zuvor. Ich vermute, Sie können eine ähnliche (aber komplexere) Konstruktion mit tragen
Das Problem hierbei ist, einen Isomorphismus aufzubauen
Sie müssen mit gemischten Varianz umgehen.
quelle