Giới thiệu về lý thuyết loại Martin-Löf


36

Điều gì sẽ là phần giới thiệu tốt nhất cho các ý tưởng của Per Martin-Löfs về lý thuyết loại? Tôi đã xem một số bài giảng từ trường hè Oregon PL, nhưng tôi vẫn còn bối rối với câu hỏi sau đây:

Một loại là gì?

Tôi biết một tập hợp là gì, vì bạn có thể định nghĩa chúng bằng các tiên đề ZF thông thường và chúng có một mô hình cụ thể rất trực quan; Chỉ cần nghĩ về một cái giỏ chứa đầy thứ. Tuy nhiên, tôi vẫn chưa thấy một định nghĩa hợp lý về một loại và tôi đã tự hỏi liệu có một nguồn nào đó sẽ chắt lọc ý tưởng này cho hình nộm.


4
Cuốn sách HoTT có phần giới thiệu so sánh các loại và bộ, có lẽ sẽ giúp ích, xem Phần 1.1 của homotopytypetheory.org/book . Nhưng quan trọng hơn, bạn muốn chúng tôi cấy trực tiếp vào đầu bạn ý tưởng chính xác về các loại, trong khi đối với các bộ bạn rất vui khi được chúng mô tả bằng các tiên đề, mà không khăng khăng muốn biết "chúng thực sự là gì". Vâng, các loại được mô tả bởi các quy tắc suy luận cho các loại. Và họ có một mô hình bê tông rất trực quan, bạn biết đấy, một cái chậu chứa đầy các khối Lego. Bất cứ điều gì bạn có thể xây dựng từ họ là trong các loại.
Andrej Bauer

Tôi nghĩ rằng việc đưa bộ não của tôi ra khỏi lý thuyết tập hợp là vấn đề lớn nhất. Tuy nhiên, tôi không chắc sự tương tự Lego tốt như thế nào. Các khối là gì? Nếu x: A và y: A thông thường tôi không thể tạo bất cứ thứ gì từ chúng trừ khi A là một loại mũi tên đệ quy. Tất nhiên tôi thường có thể trộn các thứ thuộc loại khác nhau để tạo ra thứ gì đó thuộc loại thứ ba ...
dst

4
Các khối Lego là các nhà xây dựng loại. Vì vậy, ví dụ từ x:Mộty:A bạn có thể xây dựng (x,y)(x,x)tôintôi(x) , và và . Bạn cũng có thể xây dựng các loại mới, ví dụ và λz:Một. x I d (x,y)z : A I d (x,z)retôifxλz:Một.xtôid(x,y)Σz:Mộttôid(x,z), v.v. Mọi người có trực giác khác nhau về các loại. Bộ là một trong số họ, nhưng thô. Các loại cũng giống như không gian tôpô. Chúng cũng giống như dữ liệu có cấu trúc trong lập trình. Chúng cũng giống như -groupoids. Đó là vẻ đẹp của nó, sự phong phú của các khả năng. Chọn một khả năng và chạy với nó. ω
Andrej Bauer

Câu trả lời:


31

Một loại là một tài sản của tính toán. Đó là những gì bạn viết ở phía bên phải của dấu hai chấm.

Hãy để tôi giải thích về điều đó. Lưu ý rằng thuật ngữ không hoàn toàn chuẩn: một số bài viết hoặc sách có thể sử dụng các từ khác nhau cho các khái niệm nhất định.

Một thuật ngữ là một yếu tố của một cú pháp trừu tượng được dự định để đại diện cho tính toán. Theo trực giác, nó là một cây phân tích. Chính thức, nó là một cây hữu hạn nơi các nút thuộc về một số bảng chữ cái. Một phép tính chưa được định nghĩa xác định một cú pháp cho các thuật ngữ. Ví dụ: phép tính lambda (chưa được ) chứa các thuật ngữ (viết , , v.v.) được xây dựng từ ba loại nút:NMN

  • các biến, của arity 0 (một bộ sưu tập có thể đếm được), được viết , , v.v.;yxy
  • áp dụng một biến, của arity 1 (một bộ sưu tập có thể đếm được, với một mệnh đề cho các biến), được viết , v.v.;λx.M
  • ứng dụng, của arity 2, được viết .MN

Một thuật ngữ là một cú pháp xây dựng. Một ngữ nghĩa liên quan đến các điều khoản để tính toán. Có nhiều loại ngữ nghĩa, phổ biến nhất là hoạt động (mô tả cách các thuật ngữ có thể được chuyển đổi thành các thuật ngữ khác) hoặc biểu thị (mô tả các thuật ngữ bằng cách chuyển đổi sang không gian khác, thường được xây dựng từ lý thuyết tập hợp).

Một loại là một tài sản của các điều khoản. Một hệ thống loại cho một phép tính chưa được mô tả mô tả thuật ngữ nào có loại nào. Về mặt toán học, ở cốt lõi, một hệ thống loại là mối quan hệ giữa các điều khoản và loại. Chính xác hơn, một hệ thống kiểu là một họ các quan hệ như vậy, được lập chỉ mục bởi các bối cảnh - thông thường, một bối cảnh cung cấp ít nhất các loại cho các biến (tức là một bối cảnh là một phần chức năng từ biến đến loại), vì vậy một thuật ngữ chỉ có thể có một loại trong bối cảnh cung cấp một loại cho tất cả các biến miễn phí của nó. Loại đối tượng toán học nào phụ thuộc vào hệ thống loại.

Một số hệ thống loại được mô tả với các loại là tập hợp, sử dụng các khái niệm về lý thuyết tập hợp như giao điểm, kết hợp và hiểu. Điều này có lợi thế của việc nghỉ ngơi trên nền tảng toán học quen thuộc. Một hạn chế của phương pháp này là nó không cho phép suy luận về các loại tương đương.

Nhiều hệ thống kiểu tự mô tả các loại như các thuật ngữ trong một phép tính các loại. Tùy thuộc vào hệ thống loại, đây có thể là các điều khoản giống nhau hoặc các điều khoản khác nhau. Tôi sẽ sử dụng thuật ngữ cơ sở cụm từ để chỉ một thuật ngữ tính toán mô tả tính toán. Ví dụ: phép tính lambda được nhập đơn giản sử dụng phép tính các loại sau (viết , v.v.):τ

  • các loại cơ sở, của arity 0 (một bộ sưu tập hữu hạn hoặc có thể đếm được), được viết , , v.v.;BMộtB
  • chức năng, của arity 2, được viết .τ0τ1

Mối quan hệ giữa các thuật ngữ và loại xác định phép tính lambda được gõ đơn giản thường được xác định bằng cách gõ quy tắc . Quy tắc gõ không phải là cách duy nhất để xác định một hệ thống loại, nhưng chúng là phổ biến. Chúng hoạt động tốt cho các hệ thống loại thành phần, tức là các hệ thống loại trong đó loại (s) của một thuật ngữ được xây dựng từ các loại subterms. Quy tắc gõ xác định một hệ thống loại theo quy nạp: mỗi quy tắc gõ là một tiên đề cho biết đối với bất kỳ công thức khởi tạo nào trên quy tắc ngang, công thức bên dưới quy tắc cũng đúng. Xem Làm thế nào để đọc quy tắc gõ? để biết thêm chi tiết. Có tồn tại một tính toán Turing lambda hoàn thành gõ? cũng có thể được quan tâm.

Đối với phép tính lambda được gõ đơn giản, phán đoán gõ có nghĩa là có kiểu trong ngữ cảnh . Tôi đã bỏ qua định nghĩa chính thức về bối cảnh. M τ gamma x : τ gammaΓM:τMτΓ

x:τΓΓx:τ(Γ)Γ,x:τ0M:τ1Γλx.M:τ0τ1(tôi)ΓM:τ0τ1ΓN:τ0ΓMN:τ1(E)

Ví dụ, nếu B đều dựa loại, sau đó λ x . λ y . xMộtB có loại ( A B ) A B trong bất kỳ bối cảnh nào (từ dưới lên trên, áp dụnghai lần, sau đóvà cuối cùngtrên mỗi nhánh).λx.λy.xy(MộtB)MộtB(tôi)(E)(Γ)

Có thể giải thích các loại phép tính lambda được gõ đơn giản là tập hợp. Số tiền này để đưa ra một ngữ nghĩa biểu thị cho các loại. Một ngữ nghĩa biểu thị tốt cho các thuật ngữ cơ sở sẽ gán cho mỗi thuật ngữ cơ sở là thành viên của biểu thị của tất cả các loại của nó.

Lý thuyết loại trực giác (còn được gọi là lý thuyết loại Martin-Löf) phức tạp hơn chỉ đơn giản là gõ tính toán lambda, vì nó có nhiều yếu tố hơn trong phép tính các loại (và cũng thêm một vài hằng số vào các thuật ngữ cơ bản). Nhưng các nguyên tắc cốt lõi là như nhau. Một đặc điểm quan trọng của lý thuyết loại Martin-Löf là các loại có thể chứa các thuật ngữ cơ sở (chúng là các loại phụ thuộc ): vũ trụ của các thuật ngữ cơ sở và vũ trụ của các loại là như nhau, mặc dù chúng có thể được phân biệt bằng các quy tắc cú pháp đơn giản (thường được gọi là sắp xếp, tức là gán các loại cho các thuật ngữ, trong lý thuyết viết lại).

Có các hệ thống loại đi xa hơn và hoàn toàn trộn lẫn các loại và các điều khoản cơ bản, do đó không có sự phân biệt giữa hai loại. Hệ thống loại như vậy được cho là có thứ tự cao hơn . Trong phép tính như vậy, các loại có các loại - một loại có thể xuất hiện ở phía bên trái của . Tính toán của xây dựng là mô hình của các loại phụ thuộc bậc cao. Khối lambda (còn được gọi là khối Barendregt) phân loại các hệ thống loại theo việc chúng có cho phép các thuật ngữ phụ thuộc vào các loại ( đa hình - một số thuật ngữ cơ sở chứa các loại dưới dạng subterms), các loại phụ thuộc vào các thuật ngữ (loại phụ thuộc) hoặc loại phụ thuộc trên các loại ( toán tử loại - phép tính của các loại có khái niệm tính toán).:

Hầu hết các hệ thống loại đã được đưa ra ngữ nghĩa lý thuyết tập hợp, để gắn kết chúng với nền tảng thông thường của toán học. Làm thế nào là ngôn ngữ lập trình và nền tảng của toán học liên quan? sự khác biệt giữa các khung nhìn ngữ nghĩa và cú pháp của các loại hàm là gì? có thể được quan tâm ở đây. Cũng đã có nghiên cứu sử dụng lý thuyết loại làm nền tảng của toán học - lý thuyết tập hợp là nền tảng lịch sử, nhưng nó không phải là sự lựa chọn duy nhất có thể. Lý thuyết loại đồng luân là một cột mốc quan trọng theo hướng này: nó mô tả ngữ nghĩa của lý thuyết loại trực giác có chủ ý về mặt lý thuyết đồng luân và xây dựng lý thuyết đặt trong khung này.

Tôi khuyên bạn nên sử dụng các loại sách và ngôn ngữ lập trình của Benjamin Pierce và các chủ đề về ngôn ngữ lập trình . Họ có thể truy cập vào bất kỳ đại học nào mà không có điều kiện tiên quyết nào ngoài sự quen thuộc cơ bản với lý luận toán học chính thức. TAPL mô tả nhiều hệ thống loại; các loại phụ thuộc là chủ đề của chương 2 của ATTAPL.


+1 cho TAPL. Tôi đã có thể dạy bản thân khá nhiều về các loại từ việc đọc cuốn sách đó.
Guy Coder

Tôi không chắc ATTAPL là điểm khởi đầu tốt để tìm hiểu về các loại phụ thuộc.
Martin Berger

15

Có lẽ một câu hỏi tốt hơn cho ai đó đến từ lý thuyết tập hợp và vật lộn với lý thuyết tập hợp và lý thuyết loại Martin-Löf khác nhau, là để phản ánh về tập hợp nào. Trực giác của bạn về lý thuyết tập hợp và nền tảng của toán học sẽ bị nhiễm các giả định lý thuyết tập hợp không nghi ngờ mà bạn cho là điều hiển nhiên. Lý thuyết loại Alas Martin-Löf không chia sẻ những giả định này.

Trái với cách hiểu thông thường, lý thuyết tập hợp là một lý thuyết về hai mối quan hệ: bình đẳngthiết lập thành viên , không chỉ thiết lập tư cách thành viên. Và hai mối quan hệ này được xây dựng theo các giai đoạn khác biệt đáng kể.

  1. Chúng tôi xây dựng logic thứ nhất như một lý thuyết về sự bình đẳng của những thứ tùy ý (không chỉ là tập hợp). Logic thứ nhất sử dụng một khái niệm không chính thức về bằng chứng. Bằng chứng khái niệm không phải là chính nó có thể biểu hiện chính thức trong logic đơn hàng đầu tiên.

  2. Sau đó, chúng tôi xây dựng lý thuyết tập hợp trên đầu logic thứ nhất như một lý thuyết về tập hợp và thiết lập tư cách thành viên.

  3. Đặt thành viên và bình đẳng sau đó có liên quan bởi tiên đề của tính mở rộng trong đó nói rằng hai bộ bằng nhau chính xác khi chúng có cùng các thành viên.

  4. Cuối cùng, khái niệm chứng minh không chính thức từ (1) có được sự hợp lý hóa bài cũ như một số bộ nhất định (cây chứng minh).

Điều quan trọng cần nhận ra là khái niệm bằng chứng là một công dân hạng hai trong lý thuyết tập hợp.

Thiết lập này hoạt động tốt cho toán học cỡ nhỏ / vừa thông thường, nhưng vì chúng ta hiện đang giải quyết các bằng chứng quy mô lớn, chẳng hạn như phân loại tất cả các nhóm đơn giản hữu hạn hoặc xác minh các chương trình máy tính không tầm thường, vì nó bị phá vỡ, bởi vì nó không dẫn đến cơ giới hóa dễ dàng.

TT

λ


Điều này là vô cùng hữu ích. Tôi nghĩ một vấn đề lớn của bất kỳ ai đến với toán học xây dựng là không học được nhiều thứ.
dst

Tôi đồng ý. Phải mất một thời gian để học hỏi những giả định lý thuyết tập hợp chưa được kiểm chứng. Làm rất nhiều chương trình Agda đã giúp tôi, và có thể cũng có hiệu quả với bạn nếu bạn đến từ một nền tảng khoa học máy tính.
Martin Berger

10

Tôi không nhận thức được con đường dễ dàng vào lý thuyết loại Martin-Löf. Tôi đoán sau đây có thể phục vụ như giới thiệu.

Tuy nhiên, nếu bạn bối rối trước câu hỏi "loại nào", trước tiên tôi khuyên bạn nên đi vào lý thuyết loại đơn giản hơn nhiều. Bất kỳ ngôn ngữ lập trình đánh máy nào cũng được, nhưng ví dụ Ocaml, F # và Haskell sẽ đặc biệt hữu ích. Đơn giản hóa một chút, người ta có thể nói rằng lý thuyết loại Martin-Löf mở rộng các loại đằng sau các ngôn ngữ nói trên theo hai cách:

  1. Với các loại phụ thuộc . Bạn tìm thấy chúng ở dạng tamer trong các ngôn ngữ lập trình khác nhau.
  2. Với các loại danh tính. Đây là sự đổi mới chính của Martin-Löf so với các lý thuyết loại phụ thuộc trước đây.

Ý tưởng chính đằng sau các loại phụ thuộc rất đơn giản: các loại có thể được tham số hóa bởi các chương trình. Điều này là không thể (đơn giản hóa một chút) trong các hệ thống gõ thông thường hơn như các hệ thống được đề cập ở trên. Mặc dù đơn giản, nhưng hậu quả rất sâu sắc: các loại phụ thuộc nâng sự tương ứng của Curry-Howard lên logic xây dựng bậc nhất. Các loại danh tính là một chút khác thường. Nếu / khi bạn cảm thấy thoải mái với một ngôn ngữ như Haskell, bạn có thể học Agda , về cơ bản là Haskell với lý thuyết loại Martin-Löf. Tôi cảm thấy Agda dễ học hơn đối với một lập trình viên so với việc đọc những cuốn sách được đề cập ở trên.


Tôi thực sự biết Haskell. Vấn đề của tôi là bất kỳ hướng dẫn nào sẽ chỉ cho bạn cách xác định các loại, nhưng không bao giờ chúng thực sự là gì. Nó dường như chỉ là một thẻ ma thuật được đính kèm với tất cả dữ liệu của bạn, để trình kiểm tra loại có thể chọn đúng phiên bản của hàm đa hình và kiểm tra xem mọi thứ không bị trộn lẫn theo cách không có ý nghĩa. Họ vẫn để ngỏ câu hỏi về một loại là gì. Tôi đặc biệt bối rối vì điều này, vì Voevodsky & co đang cố gắng dựa trên tất cả toán học về điều này, tuy nhiên, tôi chưa bao giờ thấy một định nghĩa chính xác.
dst

2
ΓM:αMαMMΓ

Các loại được xác định rất chính xác trong Haskell, trong lý thuyết loại Martin-Löf và trong lý thuyết loại đồng luân của Voevodsky. Không có sự mơ hồ nào. Ví dụ, Phụ lục A.2 đưa ra một hệ thống bằng chứng cho tất cả các điều khoản và loại lý thuyết loại đồng luân. Nếu bạn muốn nghiêm ngặt hơn nữa, bạn có thể xem các hình thức Coq hoặc Agda .
Martin Berger

2
Có lẽ bạn cần phải nuốt những loại đó không có bản chất nào ngoài cách chúng được định nghĩa. Điều này không khác với các bộ, ví dụ, chúng được đưa ra bởi các tiên đề của lý thuyết tập hợp. (Điều này không hoàn toàn đúng, nhưng nó vẫn rất quan trọng để hiểu.)
Martin Berger
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.