Tại sao thuật toán Hindley-Milner sẽ không bao giờ mang lại một loại như t1 -> t2?


14

Tôi đang đọc về thuật toán gõ Hindley-Milner trong khi viết một triển khai và thấy rằng, miễn là mọi biến bị ràng buộc, bạn sẽ luôn nhận được các loại nguyên tử hoặc các loại trong đó các đối số sẽ xác định loại cuối cùng, chẳng hạn như t1 -> t1hoặc (t1 -> t2) -> (t1 -> t2)trong đó t1t2là các biến loại.

Tôi không thể nghĩ ra cách bạn nhận được một cái gì đó giống t1 -> t2hoặc đơn giản t1, mà tôi hiểu có nghĩa là thuật toán bị hỏng vì sẽ không có cách nào để xác định loại biểu thức thực tế. Làm thế nào để bạn biết bạn sẽ không bao giờ có được một loại như những loại "bị hỏng" miễn là mọi biến đều bị ràng buộc?

Tôi biết thuật toán mang lại các loại với các biến, nhưng chúng luôn được giải quyết một khi bạn truyền các đối số cho hàm, điều này sẽ không xảy ra trong một hàm có kiểu t1 -> t2. Đây là lý do tại sao tôi muốn biết làm thế nào chúng ta biết chắc chắn thuật toán sẽ không bao giờ mang lại các loại như vậy.

(Có vẻ như bạn có thể nhận được các loại "bị hỏng" này trong ML , nhưng tôi đang hỏi về phép tính lambda.)

Câu trả lời:


16

α,β.αβα.ααλx.x

α,β.αββββββ

Chỉ vì không có giá trị của một loại nhất định không có nghĩa là không có thuật ngữ của loại đó: có thể có một thuật ngữ không có giá trị, nghĩa là một thuật ngữ không kết thúc (nói chính xác, một thuật ngữ không có hình thức bình thường). Lý do tại sao không có thuật ngữ lambda với các loại như vậy là vì tất cả các thuật ngữ HM được đánh máy tốt đang bình thường hóa mạnh mẽ. Đây là một khái quát về kết quả mà các trạng thái đơn giản được gõ lambda đang bình thường hóa mạnh mẽ. Đó là hậu quả của việc Hệ thống F đang bình thường hóa mạnh mẽ: Hệ thống F giống như HM, nhưng cho phép định lượng kiểu ở mọi nơi trong các loại, không chỉ ở toplevel. Ví dụ, trong hệ thống F, Δ=λx.xx(α.α)(α.α)ΔΔ

A,B,ABα,β.αβ

YY(λx.x)α.αA,B,AB

Tìm ra ranh giới giữa các hệ thống loại đảm bảo hệ thống chuẩn hóa mạnh và loại hệ thống không phải là một vấn đề khó khăn và thú vị. Đây là một vấn đề quan trọng bởi vì nó xác định logic nào là âm thanh, nói cách khác, chương trình nào là hiện thân của các định lý. Bạn có thể đi xa hơn nhiều so với Hệ thống F, nhưng các quy tắc trở nên phức tạp hơn. Ví dụ, tính toán của các cấu trúc quy nạp , là cơ sở của trợ lý chứng minh Coq , đang bình thường hóa mạnh mẽ nhưng vẫn có khả năng mô tả các cấu trúc dữ liệu và thuật toán quy nạp phổ biến trên chúng, v.v.

Ngay khi bạn có được ngôn ngữ lập trình thực sự, sự tương ứng bị phá vỡ. Ngôn ngữ lập trình thực có các tính năng như các hàm đệ quy chung (có thể không chấm dứt), các ngoại lệ (một biểu thức luôn đưa ra một ngoại lệ không bao giờ trả về một giá trị và do đó có thể có bất kỳ loại nào trong hầu hết các hệ thống loại), các loại đệ quy (cho phép không kết thúc lẻn vào), v.v.


"Đó là hậu quả của việc Hệ thống F đang bình thường hóa mạnh mẽ". Làm thế nào có thể chỉ ra rằng HM đang bình thường hóa mạnh mẽ là hậu quả của Hệ thống F đang bình thường hóa mạnh mẽ?
Rafael Castro

1
@RafaelCastro Mọi thuật ngữ được gõ tốt trong HM đều được gõ tốt trong Hệ thống F. Mọi thuật ngữ được nhập tốt trong Hệ thống F là SN. Do đó, mọi thuật ngữ được gõ tốt trong HM là SN.
Gilles 'SO- ngừng trở nên xấu xa'
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.