Contoh ringkas biaya eksponensial inferensi tipe ML

11

Saya mendapat perhatian bahwa biaya inferensi jenis dalam bahasa fungsional seperti OCaml bisa sangat tinggi. Klaimnya adalah bahwa ada urutan ekspresi sehingga untuk setiap ekspresi, panjang jenis yang sesuai adalah eksponensial pada panjang ekspresi.

Saya menyusun urutan di bawah ini. Pertanyaan saya adalah: apakah Anda tahu urutan dengan ekspresi yang lebih ringkas yang mencapai jenis yang sama?

# 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>
mrrusof
sumber

Jawaban:

14

Dalam jawaban ini, saya akan berpegang pada fragmen ML inti bahasa, hanya dengan lambda-calculus dan polymorphic letmengikuti Hindley-Milner . Bahasa OCaml lengkap memiliki fitur tambahan seperti polimorfisme baris (yang jika saya ingat dengan benar tidak mengubah kompleksitas teoretis, tetapi dengan mana program nyata cenderung memiliki tipe yang lebih besar) dan sistem modul (yang jika Anda colek cukup keras dapat -minminasi dalam kasus patologis yang melibatkan tanda tangan abstrak).

Kompleksitas waktu terburuk untuk memutuskan apakah suatu program inti ML memiliki tipe adalah eksponensial sederhana dalam ukuran program. Referensi klasik untuk hasil ini adalah [KTU90] dan [M90]. Perawatan yang lebih mendasar tetapi kurang lengkap diberikan dalam [S95].

Ukuran maksimum dari jenis jenis program inti ML sebenarnya eksponensial ganda dalam ukuran program. Jika pemeriksa tipe harus mencetak jenis program, maka waktu dapat eksponensial ganda; itu dapat dibawa kembali ke eksponensial sederhana dengan mendefinisikan singkatan untuk bagian-bagian pohon yang berulang. Ini bisa sesuai dengan berbagi bagian dari pohon jenis dalam implementasi.

Contoh Anda menunjukkan pertumbuhan tipe yang eksponensial. Namun, perhatikan bahwa dimungkinkan untuk memberikan representasi ukuran linier dari tipe tersebut dengan menggunakan singkatan untuk bagian berulang dari tipe tersebut. Ini bisa sesuai dengan berbagi bagian dari pohon jenis dalam implementasi. Sebagai contoh:

# 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

Berikut ini adalah contoh yang lebih sederhana secara konseptual: ukuran tipe pasangan (x,x)adalah dua kali ukuran ukuran tipe x, jadi jika Anda menulis pairfungsi kali, Anda mendapatkan jenis ukuran .NΘ(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

Dengan memperkenalkan letdefinisi polimorfik bersarang , ukuran tipe meningkat lagi secara eksponensial; saat ini, tidak ada jumlah pembagian yang dapat mengurangi pertumbuhan eksponensial.

# 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;;

Referensi

[KTU90] Kfoury, J .; Tiuryn; Urzyczyn, P. (1990). "Kemampuan mengetik ML adalah dexptime-complete". Catatan Kuliah di Ilmu Komputer. CAAP '90 431: 206-220. [ Springer ] [ Google ]

[M90] Mairson, Harry G. (1990). "Memutuskan tipabilitas ML selesai untuk waktu eksponensial deterministik". Prosiding simposium ACM SIGPLAN-SIGACT ke-17 tentang Prinsip-prinsip bahasa pemrograman. POPL '90 (ACM): 382-401. [ ACM ]

[P04] Benjamin C. Pierce. Topik Tingkat Lanjut dalam Jenis dan Bahasa Pemrograman. MIT Press, 2004. [ Amazon ]

[PR04] François Pottier dan Didier Rémy. "Esensi Inferensi Tipe ML". Bab 10 dalam [P04]. [ pdf ]

[S95] Michael I. Schwartzbach. Inferensi Tipe Polimorfik. BRICS LS-95-3, Juni 1995. ps

Gilles 'SANGAT berhenti menjadi jahat'
sumber
jadi pada dasarnya, sifat "komposisi" dari ekspresi tipe yang digabungkan dengan inferensi tipe adalah akar masalahnya?
didierc
1
@dierier Saya tidak mengerti komentar Anda. Banyak hal yang komposisional. Di satu sisi, alasan mendasarnya adalah bahwa dari operasi dasar menduplikasi objek (batasan bahwa dua jenis sama) dan pairing ( ->operator), Anda dapat membuat pertumbuhan eksponensial (pohon Fibonacci).
Gilles 'SO- stop being evil'
Ya, saya pikir itulah yang saya maksud: aljabar jenis adalah dengan definisi komposisi (Anda menggunakan istilah "menyusun fungsi pasangan" dalam jawaban Anda, itu mungkin di mana saya mengambil kata), dalam arti ungkapan tipe thaf dibangun dari ekspresi dan operator yang lebih kecil, dan setiap komposisi ekspresi baru mengukur ukuran ekspresi setidaknya oleh faktor 2 (dengan tipe polimorfik yang lebih kompleks - triadik atau lebih, faktornya lebih besar).
didierc