Ví dụ ngắn gọn về chi phí theo cấp số nhân của suy luận kiểu ML


11

Tôi đã nhận thấy rằng chi phí suy luận kiểu trong một ngôn ngữ chức năng như OCaml có thể rất cao. Khiếu nại là có một chuỗi các biểu thức sao cho mỗi biểu thức độ dài của loại tương ứng là theo cấp số nhân trên độ dài của biểu thức.

Tôi nghĩ ra trình tự dưới đây. Câu hỏi của tôi là: bạn có biết một chuỗi với các biểu thức ngắn gọn hơn đạt được cùng loại không?

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

Câu trả lời:


14

Trong câu trả lời này, tôi sẽ bám vào một đoạn ML cốt lõi của ngôn ngữ, chỉ với phép tính lambda và đa hình lettheo sau Hindley-Milner . Ngôn ngữ OCaml đầy đủ có các tính năng bổ sung như đa hình hàng (nếu tôi nhớ chính xác sẽ không thay đổi độ phức tạp về mặt lý thuyết, nhưng với các chương trình thực có xu hướng có loại lớn hơn) và hệ thống mô-đun (nếu bạn chọc đủ mạnh có thể không - kết thúc trong các trường hợp bệnh lý liên quan đến chữ ký trừu tượng).

Độ phức tạp thời gian trong trường hợp xấu nhất để quyết định xem chương trình ML lõi có loại hay không là một hàm mũ đơn giản trong kích thước của chương trình. Các tài liệu tham khảo cổ điển cho kết quả này là [KTU90] và [M90]. Một điều trị cơ bản hơn nhưng ít hoàn thiện hơn được đưa ra trong [S95].

Kích thước tối đa của loại chương trình ML lõi thực tế là theo cấp số nhân theo kích thước của chương trình. Nếu trình kiểm tra loại phải in loại chương trình, do đó thời gian có thể gấp đôi theo cấp số nhân; nó có thể được đưa trở lại theo cấp số nhân đơn giản bằng cách xác định các chữ viết tắt cho các phần lặp lại của cây. Điều này có thể tương ứng với việc chia sẻ các phần của cây loại trong một triển khai.

Ví dụ của bạn cho thấy sự tăng trưởng theo cấp số nhân của loại. Tuy nhiên, lưu ý rằng có thể đưa ra biểu diễn kích thước tuyến tính của loại bằng cách sử dụng các chữ viết tắt cho các phần lặp lại của loại. Điều này có thể tương ứng với việc chia sẻ các phần của cây loại trong một triển khai. Ví dụ:

# 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

Bằng cách đưa ra các letđịnh nghĩa đa hình lồng nhau , kích thước của kiểu tăng trở lại theo cấp số nhân; lần này, không có số lượng chia sẻ nào có thể làm mất đi sự tăng trưởng theo cấp số nhân.

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

Người giới thiệu

[KTU90] Kfoury, J.; Tiuryn; Urzyczyn, P. (1990). "Khả năng đánh máy ML là hoàn hảo." Bài giảng trong khoa học máy tính. CAAP '90 431: 206-220. [ Springer ] [ Google ]

[M90] Mairson, Harry G. (1990). "Quyết định khả năng đánh máy ML là hoàn thành cho thời gian theo cấp số nhân xác định". Kỷ yếu của hội thảo chuyên đề ACM SIGPLAN-SIGACT lần thứ 17 về Nguyên tắc ngôn ngữ lập trình. POPL '90 (ACM): 382 Hay401. [ ACM ]

[P04] Benjamin C. Xỏ. Các chủ đề nâng cao về các loại và ngôn ngữ lập trình. Báo chí MIT, 2004. [ Amazon ]

[PR04] François Pottier và Didier Rémy. "Bản chất của suy luận kiểu ML". Chương 10 trong [P04]. [ pdf ]

[S95] Michael I. Schwartzbach. Kiểu suy luận đa hình. BRICS LS-95-3, tháng 6 năm 1995. ps


Vì vậy, về cơ bản, bản chất "thành phần" của các biểu thức kiểu kết hợp với suy luận kiểu là gốc rễ của vấn đề?
didierc

1
@didierc Tôi không hiểu bình luận của bạn. Rất nhiều thứ là thành phần. Theo một cách nào đó, lý do cơ bản là từ các hoạt động cơ bản của việc sao chép một đối tượng (ràng buộc hai loại giống nhau) và ghép nối ( ->toán tử), bạn có thể tạo ra sự tăng trưởng theo cấp số nhân (một cây Fibonacci).
Gilles 'SO- ngừng trở nên xấu xa'

Vâng, tôi nghĩ đó là ý của tôi: đại số loại theo định nghĩa thành phần (bạn đã sử dụng thuật ngữ "soạn hàm hàm" trong câu trả lời của bạn, đó có lẽ là nơi tôi đã chọn từ này), theo nghĩa biểu thức loại thaf được xây dựng từ các biểu thức và toán tử nhỏ hơn và mỗi thành phần biểu thức mới chia tỷ lệ kích thước biểu thức ít nhất bằng một yếu tố 2 (với các loại đa hình phức tạp hơn - triadic trở lên, hệ số này lớn hơn).
didierc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.