System F à la Church'de, herkesin ortadan kaldırılması için tür çıkarımını otomatikleştirebilir miyiz?


9

Soru şudur. Genellikle kişininΛX.t, bu terimi bir türe örnek olarak uygulayarak forall'i ortadan kaldırabiliriz(ΛX.t)[T]t[X:=T].

Şimdi, bunun bir ok olduğunu ve ona bir argüman vermek istediğimizi varsayalım, o zaman bu terimi, böyle bir argümanı alabilecek şekilde uygun türe uygulamak zorundayız. Otomatikleştirebilir miyim diye soruyorum: Bir işlev oluşturmak mümkün müf iki terim alıp bir tür döndürerek f<ΛX.t><r> bize değiştirilmesi gereken türü verin X içinde t öyle ki t tartışmayı kabul edebilir r?

Bazı örnekler:

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

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


2
F değişkenine sub / superscripts (her biri diğer alt / superscripts) içeren bir argüman koymazsanız sorunuz biraz daha okunabilir olacaktır.
Dave Clarke

Başvuru için: Bu tür bir sorun, "Yerel tür çıkarımı" tarafından çözülen iki sorundan biridir ( dl.acm.org/citation.cfm?id=345100 ). Ayrıca ilgili dl.acm.org/citation.cfm?id=1086383 olmalıdır .
Blaisorblade

Yanıtlar:


8

Soruyu anladığımdan gerçekten emin değilim. İlk olarak, sorununuzu aşağıdaki birleşme sorununa indirgemeye çalışıyorum:

Serbest (tip) değişken X ve σ tipi bir sistem F tipi τ (X) verildi.
Τ (γ) = σ olacak şekilde γ tipi bulmak mümkün müdür?

İşte bu sorunu çözmek için (kullanılamaz olmadığında bir istisna dışında) sahte bir kod.

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

İnduc = τ (birleştirme (τ (X), σ)) sadece bir istisna oluşmazsa (indüksiyonla) çalıştığını kanıtlayabilirsiniz.

Şimdi probleminiz için

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

(tabii ki terimleriniz açıksa f işleviniz argüman olarak bir bağlam almalıdır)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.