Thực sự có một sự tinh tế ở đây, mặc dù mọi thứ hoạt động tốt trong trường hợp kiểm tra kiểu. Tôi sẽ viết ra vấn đề ở đây, vì nó dường như xuất hiện trong nhiều chủ đề liên quan và cố gắng giải thích lý do tại sao mọi thứ đều ổn khi kiểm tra kiểu trong lý thuyết loại phụ thuộc "tiêu chuẩn" (tôi sẽ mơ hồ, vì những vấn đề này có xu hướng tăng lên bất kể):
Sự thật 1: Nếu là một dẫn xuất của , thì có một đạo hàm của cho một số loại và cho mọi subterm , có một số loại , một bối cảnh và một nguồn gốc của .DΓ⊢t:AD′Γ⊢A:ssu≤tBΔD′′Δ⊢u:B
Thực tế tốt đẹp này có phần khó chứng minh và được bù đắp bởi một thực tế khá khó chịu:
Sự thật 2: Nói chung, và không phải là đạo hàm phụ của !D′D′′ D
Điều này phụ thuộc một chút vào công thức chính xác của hệ thống loại của bạn, nhưng hầu hết các hệ thống "vận hành" được triển khai trong thực tế đều đáp ứng Sự thật 2.
Điều này có nghĩa là bạn không thể "chuyển sang các thuật ngữ phụ" khi suy luận bằng cách cảm ứng trên các đạo hàm hoặc kết luận rằng tuyên bố quy nạp là đúng về loại thuật ngữ bạn đang cố gắng chứng minh điều gì đó.
Thực tế này đã cắn bạn khá gay gắt khi cố gắng chứng minh những tuyên bố dường như vô hại, ví dụ: các hệ thống có chuyển đổi được gõ tương đương với các hệ thống có chuyển đổi chưa được gõ.
Tuy nhiên , trong trường hợp suy luận kiểu, bạn có thể đưa ra thuật toán suy luận loại và loại đồng thời (loại của loại) bằng cách cảm ứng trên cấu trúc của thuật ngữ, có thể liên quan đến thuật toán định hướng kiểu như Andrej gợi ý. Đối với một thuật ngữ đã cho (và bối cảnh , bạn sẽ thất bại hoặc tìm sao cho và . Bạn không cần sử dụng giả thuyết quy nạp để tìm ra giả thuyết sau phái sinh, và đặc biệt là bạn tránh được vấn đề được giải thích ở trên.tΓA,sΓ⊢t:AΓ⊢A:s
Trường hợp quan trọng (và trường hợp duy nhất thực sự cần chuyển đổi) là ứng dụng:
infer(t u):
type_t, sort_t <- infer(t)
type_t' <- normalize(type_t)
type_u, sort_u <- infer(u)
type_u' <- normalize(type_u)
if (type_t' = Pi(A, B) and type_u' = A' and alpha_equal(A, A') then
return B, sort_t (or the appropriate sort)
else fail
Mọi lời kêu gọi bình thường hóa đều được thực hiện theo các điều khoản được đánh máy tốt, vì đây là bất biến cho infer
thành công của.
Nhân tiện, khi nó được triển khai, Coq không có kiểm tra loại có thể quyết định, vì nó bình thường hóa phần thân của các fix
câu lệnh trước khi thử gõ chúng.
Ở mức độ nào, các giới hạn về các hình thức bình thường của các thuật ngữ được đánh máy tốt là rất thiên văn, rằng định lý về tính quyết định chủ yếu là học thuật vào thời điểm này. Trong thực tế, bạn chạy thuật toán kiểm tra loại miễn là bạn có kiên nhẫn và thử một tuyến đường khác nếu nó chưa kết thúc trước đó.