Dalam System F à la Church, dapatkah kita mengotomatiskan inferensi tipe untuk penghapusan untuk semua?


9

Pertanyaannya adalah sebagai berikut. Secara umum ketika seseorang memiliki istilah seperti , kita dapat menghilangkan forall dengan menerapkan istilah ini pada suatu tipe, sebagai contoh .ΛX.t(ΛX.t)[T]t[X:=T]

Sekarang, anggap ini adalah panah dan kami ingin memberikan argumen, maka kita perlu menerapkan istilah ini ke jenis yang tepat sehingga dapat menerima argumen seperti itu. Itulah yang saya tanyakan jika saya dapat mengotomatiskan: Apakah mungkin untuk membangun fungsi mengambil dua istilah dan mengembalikan jenis sehingga memberi kita jenis yang perlu diganti oleh di sehingga dapat menerima argumen ?ff<ΛX.t><r>Xttr

Beberapa contoh:

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

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


2
Pertanyaan Anda akan sedikit lebih mudah dibaca jika Anda tidak menempatkan argumen ke f sebagai sub / superskrip, masing-masing berisi sub / superskrip lainnya.
Dave Clarke

Untuk referensi: Masalah semacam ini adalah salah satu dari dua masalah yang dipecahkan oleh "Local type inference" ( dl.acm.org/citation.cfm?id=345100 ). Yang relevan juga harus dl.acm.org/citation.cfm?id=1086383 .
Blaisorblade

Jawaban:


8

Saya tidak begitu yakin saya mengerti pertanyaan itu. Pertama, saya mencoba mengurangi masalah Anda menjadi masalah penyatuan berikut:

Diberikan sistem tipe F τ (X) dengan variabel (tipe) bebas X, dan tipe σ.
Apakah mungkin untuk menemukan tipe γ sedemikian rupa sehingga τ (γ) = σ?

Berikut adalah pseudo-code (dengan pengecualian yang dimunculkan ketika tidak dapat disatukan) untuk menyelesaikan masalah ini.

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

Anda dapat membuktikan (dengan induksi) bahwa γ = τ (unify (τ (X), σ)) berfungsi jika dan hanya pengecualian yang tidak dimunculkan.

Sekarang untuk masalah Anda, Anda dapat mengambil

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

(tentu saja fungsi Anda f harus mengambil argumen konteks jika istilah Anda terbuka).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.