Können wir in System F à la Church die Typinferenz für die Eliminierung für alle automatisieren?


9

Die Frage ist die folgende. Wenn man einen Begriff wie , kann man das Forall im Allgemeinen eliminieren, indem man diesen Begriff auf einen Typ als Instanz anwendet .( Λ X . t ) [ T ] t [ X : = T ]ΛX..t(ΛX..t)[T.]]t[X.: =T.]]

Angenommen, dies ist ein Pfeil, und wir möchten ihm ein Argument geben, dann müssten wir diesen Begriff auf den richtigen Typ anwenden, damit er ein solches Argument empfangen kann. Das ist, was ich frage, ob ich automatisieren kann: Ist es möglich, eine Funktion zu konstruieren, die zwei Terme verwendet und einen Typ so dass uns den Typ gibt, durch den ersetzt werden muss in so, dass das Argument ?f < Λ X . t > < r > X t t rff<ΛX..t> <r>X.ttr

Einige Beispiele:

  • f<ΛX..λxX.X..t> <λxT..x> =T. .

  • f<ΛX..λxX..r> <(λxR..tT.) s> =T.


2
Ihre Frage wäre etwas lesbarer, wenn Sie das Argument nicht als sub / hochgestellt auf f setzen, die jeweils andere sub / hochgestellt enthalten.
Dave Clarke

Als Referenz: Diese Art von Problem ist eines der beiden Probleme, die durch "Local Type Inference " ( dl.acm.org/citation.cfm?id=345100 ) gelöst wurden . Ebenfalls relevant sollte dl.acm.org/citation.cfm?id=1086383 sein .
Blaisorblade

Antworten:


8

Ich bin mir nicht sicher, ob ich die Frage verstanden habe. Zunächst versuche ich, Ihr Problem auf das folgende Vereinigungsproblem zu reduzieren:

Gegeben ein System F Typ τ (X) mit einer freien (Typ) Variablen X und einem Typ σ.
Ist es möglich, einen Typ γ so zu finden, dass τ (γ) = σ ist?

Hier ist ein Pseudocode (mit einer Ausnahme, die ausgelöst wird, wenn er nicht vereinbar ist) zur Lösung dieses Problems.

unify (X, σ) = σ
unify (Y, Y) = Y
unify (τ₁ → τ₂, σ₁ → σ₂) = unify(τ₁,σ₁) → unify(τ₂,σ₂)
unify (∀Y.τ(Y), ∀Y.σ(Y)) = ∀Y.unify(τ(Y),σ(Y)) (with Y a fresh variable)
unify (_,_) = raise Not_unifiable

Sie können (durch Induktion) beweisen, dass γ = τ (Unify (τ (X), σ)) funktioniert, wenn nur eine Ausnahme nicht ausgelöst wird.

Nun zu Ihrem Problem können Sie nehmen

f (ΛX.t) (r) = match type of t with "τ₁ → τ₂" => unify (τ₁, type of r) | _ => fail end

(Natürlich sollte Ihre Funktion f einen Kontext als Argument nehmen, wenn Ihre Begriffe offen sind).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.