Có một thành ngữ hay, được giải thích nhiều hơn trong chương 22 của các loại và ngôn ngữ lập trình (nó được sử dụng cho đa hình hơn là các loại phụ thuộc, nhưng ý tưởng là như nhau). Thành ngữ như sau:
Một hệ thống kiểm tra loại có thể được biến thành một hệ thống suy luận kiểu bằng cách làm cho các quy tắc tuyến tính và thêm các ràng buộc .
Tôi sẽ sử dụng quy tắc ứng dụng làm ví dụ. Các kiểm tra quy tắc trong các loại phụ thuộc là thế này:
Γ⊢t:Πx:A.BΓ⊢u:AΓ⊢t u:B[u/x]
Tuyến tính hóa quy tắc này yêu cầu đặt tên lại 2 lần xuất hiện của , sao cho chúng ta có được:A
Γ⊢t:Πx:A1.BΓ⊢u:A2Γ⊢t u:B[u/x]
Nhưng điều này không còn đúng nữa! Chúng ta cần thêm ràng buộc :A1≃A2
Γ⊢t:Πx:A1.BΓ⊢u:A2Γ⊢t u:B[u/x]A1≃A2
Lưu ý rằng biểu thị modulo tương đương mối quan hệ chuyển đổi của bạn ( , thông thường), giống như quy tắc chuyển đổi, nhưng giờ đây là một ràng buộc thống nhất , vì bạn có thể có các biến meta trong các điều khoản của mình.≃βη
Trong quá trình kiểm tra loại, bạn sẽ tích lũy các ràng buộc như thế này, để có khả năng giải quyết tất cả chúng cùng một lúc (hoặc sớm hơn vì lý do hiệu quả).
Bây giờ mọi thứ có thể trở nên phức tạp hơn, bởi vì loại chính nó có thể là một biến thái trong bối cảnh! Do đó, một quy tắc áp dụng chung hơn sẽ làt
Γ⊢t:CΓ⊢u:A2Γ⊢t u:B[u/x] C≃Πx:A1.B, A1≃A2
Hoặc cách khác, giữ quy tắc trước đó và thêm quy tắc
Γ1,x:C,Γ2⊢x:AC≃A
tại thời điểm tra cứu thay đổi.
Một nhận xét hữu ích khác là trong hệ thống kiểm tra , quy tắc chuyển đổi chỉ cần được áp dụng ngay trước các ứng dụng và có thể một lần vào cuối phiên bản. Vì quy tắc này tương ứng với một ràng buộc thống nhất trong hệ thống suy luận , điều này cho bạn biết nơi đặt các ràng buộc.