In System F à la Church, possiamo automatizzare l'inferenza del tipo per l'eliminazione definitiva?


9

La domanda è la seguente. Generalmente quando uno ha un termine come , possiamo eliminare il forall applicando questo termine a un tipo, come esempio .( Λ X . t ) [ T ] t [ X : = T ]ΛX.t(ΛX.t)[T]t[X:=T]

Supponiamo ora che questa sia una freccia e che vogliamo dargli un argomento, quindi dovremmo applicare questo termine al tipo corretto in modo che possa ricevere tale argomento. Questo è ciò che chiedo se posso automatizzare: è possibile costruire una funzione prendendo due termini e restituendo un tipo tale che ci dia il tipo necessario per essere sostituito da in tale che può accettare l'argomento ?f < Λ X . t > < r > X t t rff<ΛX.t><r>Xttr

Qualche esempio:

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

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


2
La tua domanda sarebbe un po 'più leggibile se non metti l'argomento f come sotto / apice, ciascuno contenente altri sotto / apici.
Dave Clarke,

Per riferimento: questo tipo di problema è uno dei due problemi risolti da "Inferenza del tipo locale" ( dl.acm.org/citation.cfm?id=345100 ). Anche pertinente dovrebbe essere dl.acm.org/citation.cfm?id=1086383 .
Blaisorblade,

Risposte:


8

Non sono davvero sicuro di aver capito la domanda. Innanzitutto, provo a ridurre il problema al seguente problema di unificazione:

Dato un sistema F di tipo τ (X) con una variabile libera (di tipo) X e un tipo σ.
È possibile trovare un tipo γ tale che τ (γ) = σ?

Ecco uno pseudo-codice (con un'eccezione sollevata quando non unificabile) per risolvere questo problema.

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

Puoi provare (per induzione) che γ = τ (unify (τ (X), σ) funziona se e non viene sollevata solo un'eccezione.

Ora per il tuo problema puoi prendere

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

(ovviamente la tua funzione f dovrebbe prendere come argomento un contesto se i tuoi termini sono aperti).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.