Nhiều người quan tâm đến việc chứng minh loại điều này. Neel Krishnaswami đã đề cập đến định lý đặc biệt này ở đây . Tôi cũng đã thấy Frank Pfenning đưa ra một số ví dụ tuyệt vời cho logic đã ra lệnh. Ví dụ: nếu bạn có , thì trong hệ thống loại có thứ tự, phải nối thêm danh sách và .A,x:[A],y:[A]⊢e:[A]exy
Câu trả lời ngắn gọn là có, chúng tôi có thể chứng minh ví dụ đầu tiên của bạn. Trong bối cảnh của lambda tính toán, một cách tiếp cận dựa trên quan hệ logic được mô tả trong bài viết này . Họ sẽ chứng minh định lý của bạn theo hai bước:
- Xác định một cách giải thích quan hệ của các loại và sử dụng nó để chứng minh một định lý tự do thông thường hoàn toàn bỏ qua tính tuyến tính, tức là sử dụng cùng một lý do mà bạn thấy, ví dụ, Định lý Free cho Free! Cho , định lý miễn phí thông thường cho chúng ta biết rằng trả về một danh sách chỉ chứa các phần tử có trong danh sách mà nó được đưa ra. Đưa ra một danh sách các biến tuyến tính miễn phí riêng biệt , chúng tôi suy luận rằng ước tính cho một số danh sách trong đó .⊢f:∀A.[A]⊸[A]fx1…xnf[x1,...,xn][y1,...,ym]{y1,…,ym}⊆{x1,...,xn}
- Lưu ý rằng các biến tuyến tính miễn phí phải được bảo tồn theo đánh giá. Điều này cho phép chúng tôi tận dụng lợi thế của tuyến tính. Nếu không phải là hoán vị của , thì điều đó có nghĩa là một số bị mất hoặc trùng lặp trong quá trình đánh giá, điều đó không thể xảy ra.[y1,…,ym][x1,...,xn]xi
Nhưng, những loại định lý này trở nên thú vị hơn khi chúng ta nhìn vào một ngôn ngữ có hiệu ứng và khả năng chứng minh chúng cho những ngôn ngữ như vậy bị hạn chế một cách đáng buồn. Ví dụ: hãy xem xét đẳng cấu từ Hệ thống F. Trong cài đặt gọi theo giá trị, sự đồng hình này bị phá vỡ khi chúng ta thêm không kết thúc. Tuy nhiên, chúng ta có thể khôi phục một đẳng cấu tương tự, với các loại tuyến tính: . Thật không may, chúng tôi không có quan hệ logic hoạt động có thể chứng minh điều này.τ≅∀A.(τ→A)→Aτ≅∀A.(τ→A)⊸A
Điều đó nói rằng, cũng có các phương pháp cú pháp có thể chứng minh cả đẳng cấu và định lý của bạn. Đây dường như là một cách tiếp cận đặc biệt hữu ích trong một thiết lập tuyến tính và ít gánh nặng hơn nhiều so với việc thiết lập một mối quan hệ logic để chứng minh các định lý đơn giản.
Chỉnh sửa: Vì bạn đã hỏi, đây là một ví dụ về bằng chứng cú pháp của một định lý miễn phí cho loại trong một cài đặt có thuật ngữ lặp lại mãi mãi và được gõ tốt trong bất kỳ bối cảnh nào ở bất kỳ loại nào. Ý tưởng là tìm một tập hợp các thuật ngữ chính tắc của một loại và sử dụng nó để xác định giá trị trả về có thể có của hàm là gì. Chúng tôi bắt đầu với một định lý đúng đắn cho các thuật ngữ được đánh máy tốt.∀A.(A⊗A)⊸A⊥
Định lý (Canonicity). Nếu sau đó, hoặcΔ;Γ⊢e:τ
- e≈v , là một giá trị sao cho .Δ;Γ⊢v:τ
- e≈n , một thuật ngữ bị kẹt vì nó đang cố sử dụng một biến miễn phí trong và HOẶCΓΔ;Γ⊢n:τ
- e≈⊥
Ở đây, là khái niệm yêu thích của bạn về sự tương đương cho ngôn ngữ và là một môi trường chứa các biến loại miễn phí. Tôi sẽ coi các biến miễn phí là giá trị. Đối với các ngôn ngữ đơn giản, một đối số tiến trình & bảo toàn đơn giản có thể được đưa ra để biện minh cho định lý này.≈Δx
Bây giờ, được đưa ra một giá trị , chúng tôi biết rằng nơi . Từ loại e, chúng tôi có một vài trường hợp có thể:⊢f:∀A.(A⊗A)⊸Af≈λx.eA;x:(A⊗A)⊢e:A
- e tương đương với cặp . Trường hợp này là không thể vì và phải giá trị của loại , mà là một loại biến miễn phí. Không có giá trị như vậy bởi vì có được không biến trong bối cảnh loại .A;x:(A⊗A)⊢(v1,v2):Av1v2AA
- e tương đương với một thuật ngữ cố gắng sử dụng biến miễn phí .x
- e phân kỳ. Trường hợp này cung cấp cho chúng tôi một giá trị có thể cho : .fλx.⊥
Vì trường hợp thứ hai là trường hợp duy nhất còn lại, nên chúng tôi giả sử trong đó . Cho đến nay trong bằng chứng, chúng tôi đã thiết lập rằng . Cuối cùng, chúng tôi áp dụng định lý canonic của chúng tôi một lần nữa và thấy rằng phải phân kỳ: các giá trị duy nhất của loại là các biến nhưng chúng tôi có hai biến trong ngữ cảnh, vì vậy không thể là trường hợp .e≈ let(x1,x2)=x in e′A;x1:A,x2:A⊢e′:Af≈λx.let (x1,x2)=x in e′e′Ae′≈xi
Do đó, chúng ta có cư dân duy nhất của là .∀A.(A⊗A)⊸Aλx.⊥≈λx.let (x1,x2)=x in ⊥
Bạn đã yêu cầu một tài liệu tham khảo cho loại bằng chứng này, nhưng tôi không chắc chắn về một bằng chứng tốt. Kiểu lý luận này nổi tiếng trong một số vòng tròn nhất định và có lẽ quay trở lại như Gentzen. Tôi đã nói rằng nó gợi nhớ đến việc tìm kiếm bằng chứng tập trung cho phép tính liên tiếp, nhưng tôi không biết chính xác kết nối là gì.
Điều đó nói rằng, tôi không biết về bất kỳ công trình hiện đại nào giải thích phương pháp tương đối đơn giản này. Phải thừa nhận rằng, nó có một chút hạn chế về khả năng ứng dụng vào các ngôn ngữ đơn giản hơn. Mặt khác, tôi nghĩ rằng nó đã bị lu mờ bởi Định lý miễn phí! et al và kết quả là thậm chí nhiều nhà nghiên cứu cao cấp nghĩ ngay đến mối quan hệ logic khi nghe cụm từ định lý miễn phí, không biết rằng các kỹ thuật như thế này có thể là một cách tiếp cận thay thế đơn giản hơn cho các bằng chứng như vậy (đặc biệt là trong bối cảnh của các hệ thống loại tuyến tính).
Đối với ví dụ thứ hai của bạn, tôi không nghĩ rằng định lý miễn phí mà bạn muốn thực sự nắm giữ. Ví dụ, tôi có thể khởi tạo với kiểu số nguyên và sau đó chuyển vào hàm trả về các số nguyên không có trong danh sách tôi đưa cho . Có lẽ gần với loại bạn có trong tâm trí. Nhưng ngay cả khi đó, không có chức năng nào thuộc loại vì nó sẽ phải sao chép đầu vào của nó.Af∀A.(∀B.B⊸(B,B))⊸[A]⊸[A]∀B.B⊸(B,B)