Dans le Système F à la Eglise, peut-on automatiser l'inférence de type pour l'élimination pour tous?


9

La question est la suivante. En général , quand on ont un terme comme , nous pouvons éliminer le forall en appliquant ce terme à un type, comme par exemple ( Λ X . t ) [ T ] t [ X : = T ] .ΛX.t(ΛX.t)[T]t[X:=T]

Supposons maintenant que ce soit une flèche et que nous voulions lui donner un argument, alors nous aurions besoin d'appliquer ce terme au type approprié pour qu'il puisse recevoir un tel argument. Voilà ce que je demande si je peux automatiser: Est - il possible de construire une fonction en prenant deux termes et en retournant un type tel que f < Λ X . t > < r > nous donne le type à remplacer par X dans t tel que t puisse accepter l'argument r ?ff<ΛX.t><r>Xttr

Quelques exemples:

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

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


2
Votre question serait un peu plus lisible si vous ne mettez pas l'argument à f en tant que sous / exposants, chacun contenant d'autres sous / exposants.
Dave Clarke

Pour référence: ce type de problème est l'un des deux problèmes résolus par "l'inférence de type local" ( dl.acm.org/citation.cfm?id=345100 ). Dl.acm.org/citation.cfm?id=1086383 devrait également être pertinent .
Blaisorblade

Réponses:


8

Je ne suis pas vraiment sûr d'avoir compris la question. Tout d'abord, j'essaie de réduire votre problème au problème d'unification suivant:

Soit un système F de type τ (X) avec une variable libre (type) X, et un type σ.
Est-il possible de trouver un type γ tel que τ (γ) = σ?

Voici un pseudo-code (avec une exception levée lorsqu'il n'est pas unifiable) pour résoudre ce problème.

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

Vous pouvez prouver (par induction) que γ = τ (unifier (τ (X), σ) fonctionne si et seulement une exception n'est pas levée.

Maintenant, pour votre problème, vous pouvez prendre

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

(bien sûr, votre fonction f devrait prendre comme argument un contexte si vos termes sont ouverts).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.