Tạo các ràng buộc để giải quyết các biến thái phụ thuộc gõ?


8

Trong các kiểu phụ thuộc, thống nhất mẫu Miller được sử dụng để giải quyết một đoạn có thể quyết định của thống nhất bậc cao. Điều này cho phép các ngôn ngữ được gõ phụ thuộc để chứa các biến số hoặc đối số ngầm.

Có nhiều bài viết mô tả, đưa ra một vấn đề thống nhất trong đoạn mẫu, làm thế nào để tìm ra giải pháp nếu có. Các ví dụ bao gồm (Gundry-McBride) , (Abel-Pientka)giấy Miller gốc .

Điều tôi băn khoăn là, được đưa ra một chương trình được gõ phụ thuộc có chứa các biến số (hoặc các đối số ngầm), làm thế nào để tạo ra các vấn đề được chuyển đến bộ giải hợp nhất?


Bạn đã xem luận án của Norell chưa? cse.chalmers.se/~ulfn/auge/thesis.pdf
adamse

Ý tưởng cơ bản là bạn thực hiện kiểm tra loại hai chiều, nhưng thống nhất với metas thay vì sử dụng case.
fread2281

@adamse Tôi có, mặc dù tôi sẽ thừa nhận, tôi đã khá khó khăn để hiểu nó và xem nơi mà các ràng buộc thực tế được tạo ra.
jmite

2
eb.host.cs.st-andrews.ac.uk/dcraft/impldtp.pdf mô tả công phu của Idris và có thể có một số điều bạn muốn, đặc biệt là phần 4
Edwin Brady

1
Đối với các ẩn ý, ​​bạn cần có khả năng xử lý các lỗ hổng hay các biến meta trong chứng nhận cho thấy phán quyết G | - t: A. Trong trường hợp xấu nhất bạn gặp phải vấn đề cư trú. vi.wikipedia.org/wiki/Type_inhabitation
Mostowski Thu gọn

Câu trả lời:


8

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 :A1A2

Γt:Πx:A1.BΓu:A2Γt u:B[u/x]A1A2

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, A1A2

Hoặc cách khác, giữ quy tắc trước đó và thêm quy tắc

Γ1,x:C,Γ2x:ACA

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.


Điều này rất hữu ích. Bạn có biết bất kỳ tài liệu tham khảo nào mô tả một hệ thống đầy đủ cho việc này không? Cụ thể, tôi gặp sự cố khi tạo các ràng buộc cho biểu thức lambda, xử lý các biến miễn phí từ loại Pi.
jmite

1
Chúng tôi có một bài báo về arXiv cung cấp các chi tiết gritty nitty. Có lẽ bạn sẽ quan tâm nhất đến phần 3.5, mặc dù tôi e rằng nó không mang tính mô phạm như tôi muốn.
cody

@ j4nbur53: điều đó đúng, bạn thực sự cần phải giải quyết một hạn chế như vậy nói chung. Hầu hết thời gian, việc lấy loại làm -type khá dễ dàng và tương ứng là một hệ quả. Ý tưởng này tiềm ẩn trong khái niệm kiểm tra kiểu hai chiều . tΠB(x)
cody ngày

Thực tế tôi có nghĩa là , vì đó là những gì bạn đang tìm kiếm (nhận là tầm thường từ đó). Tôi không chắc ý của bạn là gì khi "(=) / 2 giới thiệu". Trong liên kết đầu tiên, hệ thống với các ràng buộc tuyến tính. B(x)B(u)
cody ngày

Trong bài báo, chúng tôi giả sử bất cứ điều gì, kể cả , có thể là một biến meta. Trong trường hợp này, và trong trường hợp không có các ràng buộc bổ sung trên , chúng tôi xem xét rằng vấn đề đã bị hạn chế và đưa ra một thông báo lỗi (như Coq). Tôi sẽ tranh luận rằng đây là hành vi chính xác. Tất nhiên, nếu loại trong tình huống này là, nhân chứng của một loại cư trú loại, thì bạn sẽ muốn một thói quen chuyên biệt để tìm kiếm một cư dân như vậy. ttt
cody ngày

4

Nếu bạn mô hình hóa các thuật ngữ lambda thông qua các chỉ mục deBruijn và các biến meta thông qua các biến Prolog, bạn có thể xây dựng một bộ giải ràng buộc Prolog. Dưới đây là một ví dụ hoạt động khá tốt, các ràng buộc cơ bản đã được sử dụng như sau:

% shift (+ Indexed, + Nat, + Nat,-Indexed)
% subs (+ Indexed, + Nat, + Indexed,-Indexed)
% giảm (+ Indexed, + Indexed,-Indexed)
https: //gist.github. com / jburse / 0ccd12698bfa24ce5c36 # file-implicit2-p

Toàn bộ máy móc cũng giả định rằng chúng tôi cố gắng cho các hình thức bình thường, trong đó chúng tôi giảm beta theo một thứ tự nhất định. Có một sự tương tác giữa bộ chuẩn hóa và cách tạo ra các ràng buộc mới ở trên. Vì việc giảm một redex có thể yêu cầu đánh giá lại sự chuẩn hóa.

Bộ giải ràng buộc đã thực hiện một vài đơn giản hóa ràng buộc chéo, không có các đơn giản hóa này và chỉ có độ trễ ràng buộc, bộ giải ràng buộc sẽ quá câm và không thực tế có thể sử dụng được. Chúng tôi vẫn đang lên kế hoạch để thêm một hoặc hai đơn giản hóa nữa. Một trove để đơn giản hóa là giấy sau đây:

Lý thuyết còn lại trong-tính toán
Một sự phát triển chính thức, Gerard Huet, 1998
http://pauillac.inria.fr/~huet/PUBLIC/residuals.pdf

Trong bài báo, người ta cũng tìm thấy các định nghĩa quy nạp ban đầu về các ràng buộc mà chúng ta đang sử dụng. Xem các phần sau:
2.2 Nâng
2.3 Thay thế
3.1 Giảm một bước

Cảnh báo: Các điều khoản deBruijn giúp chúng tôi bình đẳng với các điều khoản thông thường, chúng tôi không cần bất kỳ bước nào để chuyển đổi alfa. Nhưng chúng tôi sử dụng một loại phụ thuộc không phân cấp, vì vậy, ví dụ, không có sự phân biệt giữa các loại và các loại dưới mui xe. Điều này làm cho toàn bộ liên doanh đặc biệt đơn giản, mặt khác điều này là không chuẩn.

Tạm biệt


Vì vậy, bạn không sử dụng sự hợp nhất của Prolog cho các metas của bạn được biểu thị dưới dạng các biến của Prolog và thay vào đó, bạn có tự giải quyết ràng buộc không?
Saizan
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.