ML tipi çıkarımın üstel maliyetinin kısa örneği


11

OCaml gibi fonksiyonel bir dilde tür çıkarım maliyetinin çok yüksek olabileceği dikkatimi çekti. İddia, her bir ifade için, karşılık gelen tipin uzunluğunun, ekspresyonun uzunluğu üzerinde üstel olacağı şekilde bir dizi ifade olmasıdır.

Aşağıdaki diziyi tasarladım. Sorum şu: aynı türlere ulaşan daha özlü ifadelere sahip bir sıra biliyor musunuz?

# fun a -> a;;
- : 'a -> 'a = <fun>
# fun b a -> b a;;
- : ('a -> 'b) -> 'a -> 'b = <fun>
# fun c b a -> c b (b a);;
- : (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c = <fun>
# fun d c b a -> d c b (c b (b a));;
- : ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'd
= <fun>
# fun e d c b a -> e d c b (d c b (c b (b a)));;
- : (((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
   ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'e
= <fun>
# fun f e d c b a -> f e d c b (e d c b (d c b (c b (b a))));;
- : ((((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
     (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
    ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'e -> 'f) ->
   (((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
   ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'f
= <fun>

Yanıtlar:


14

Bu cevapta, Hindley-Milner'denlet sonra sadece lambda-calculus ve polimorfik ile dilin çekirdek bir ML parçasına bağlı kalacağım . Tam OCaml dili, sıra polimorfizmi (doğru hatırlarsam teorik karmaşıklığı değiştirmez, ancak gerçek programların daha büyük türlere sahip olduğu eğilimindedir) ve bir modül sistemi (yeterince sert konuşursanız, olmayan) gibi ek özelliklere sahiptir. - soyut imzaları içeren patolojik durumlarda son).

Bir çekirdek ML programının bir türe sahip olup olmadığına karar vermenin en kötü zaman karmaşıklığı, programın boyutunda basit bir üsteldir. Bu sonuç için klasik referanslar [KTU90] ve [M90] 'dır. [S95] 'te daha temel ancak daha az tam bir tedavi verilmektedir.

Bir çekirdek ML programının türünün maksimum boyutu aslında programın boyutunda iki kat daha fazladır. Tür denetleyicisinin program türünü yazdırması gerekiyorsa, zaman iki kat daha fazla olabilir; ağacın tekrarlanan kısımları için kısaltmalar tanımlayarak basit bir üslü hale getirilebilir. Bu, bir uygulamada tür ağacının bölümlerini paylaşmaya karşılık gelebilir.

Örneğin, türün üstel büyümesini gösterir. Bununla birlikte, türün tekrarlanan bölümleri için kısaltmalar kullanarak türün doğrusal boyutlu bir temsilini vermenin mümkün olduğuna dikkat edin. Bu, bir uygulamada tür ağacının bölümlerini paylaşmaya karşılık gelebilir. Örneğin:

# fun d c b a -> d c b (c b (b a));;
t2 -> t2
where t2 = (t1 -> 'b -> 'c) -> t1 -> 'a -> 'd
where t1 = 'a -> 'b

(x,x)xpairN-Θ(2N-)

# let pair x f = f x x;;
# let pairN x = pair (pair (pair … (pair x)…));;
'a -> tN
where tN = (tN-1 -> tN-1 -> 'bN) -> 'bN
…
where t2 = (t1 -> t1 -> 'b2) -> 'b2
where t1 = ('a -> 'a -> 'b1) -> 'b1

Yuvalanmış polimorfik lettanımlar ekleyerek , türün boyutu tekrar katlanarak artar; bu kez hiçbir paylaşım üstel büyümeyi tıraş edemez.

# let pair x f = f x x;;
# let f1 x = pair x in
  let f2 x = f1 (f1 x) in
  let f3 x = f2 (f2 x) in
  fun z -> f3 (fun x -> x) z;;

Referanslar

[KTU90] Kfoury, J .; Tiuryn; Urzyczyn, P. (1990). Msgstr "ML tiplendirmesi dexptime-tamamlandı". Bilgisayar Biliminde Ders Notları. CAAP '90431: 206-220. [ Springer ] [ Google ]

Mairson, Harry G. (1990). Msgstr "ML tiplendirilebilirliğine karar vermenin deterministik üstel süre için tamamlanması". ACM SIGPLAN-SIGACT programlama dillerinin ilkeleri sempozyumunun bildirileri. POPL '90 (ACM): 382-401. [ ACM ]

[P04] Benjamin C. Pierce. Türler ve Programlama Dillerinde İleri Konular. MIT Press, 2004. [ Amazon ]

[PR04] François Pottier ve Didier Rémy. "ML Tipi Çıkarımın Özü". [P04] Bölüm 10. [ pdf ]

Michael I. Schwartzbach. Polimorfik Tip Çıkarımları. BRICS LS-95-3, Haziran 1995. ps


yani temelde, tür çıkarımları ile birleştirilmiş tip ifadelerinin "bileşimsel" doğası sorunun köküdür?
didierc

1
@didierc Yorumunuzu anlamıyorum. Birçok şey bileşimseldir. Bir bakıma, temel neden, bir nesneyi çoğaltmanın (iki türün aynı olması kısıtlaması) ve eşleştirmenin ( ->operatör) temel işlemlerinden, üstel büyüme (bir Fibonacci ağacı) yapabilmenizdir.
Gilles 'SO- kötü olmayı kes

Evet, bence bu demek istediğim: cebir tipi tanım gereği bileşimseldir (cevabınızda "çift işlevini oluştur" terimlerini kullandınız, muhtemelen kelimeyi aldığım yer), yani thaf tipi ifadeler daha küçük ifadeler ve operatörler ve her yeni ifade bileşimi, ifade boyutunu en azından bir faktör 2 ile ölçeklendirir (daha karmaşık polimorfik tiplerle - triadik veya daha fazla, faktör daha büyüktür).
didierc
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.