Nền tảng toán học
Lý thuyết kiểu
Một nền tảng cho toán học và tính toán trong đó mỗi hạng đều mang một kiểu, dùng trong các trợ lý chứng minh.
Trực giácMọi giá trị đều có nhãn
Trong hầu hết ngôn ngữ lập trình, là `int` và `"hello"` là `string` — trình biên dịch từ chối `3 + "hello"` trước khi chương trình chạy. Lý thuyết kiểu biến ý tưởng thường ngày này thành một nền tảng cho toàn bộ toán học: thay vì bắt đầu từ tập hợp và quan hệ thuộc (), bắt đầu từ hạng và kiểu (, " có kiểu "). Đáng chú ý, khi kiểu đủ phong phú, một kiểu có thể mã hóa một mệnh đề toán học, và một hạng của kiểu đó trở thành một chứng minh — chương trình và chứng minh trở thành cùng một loại đối tượng.
Đại họcPhép tính lambda đơn định kiểu
Định nghĩa: Phán đoán kiểu
Một phán đoán kiểu nói "trong ngữ cảnh (danh sách cặp biến-kiểu ), hạng có kiểu ". Các quy tắc cốt lõi: một biến có kiểu mà ngữ cảnh gán cho nó; một trừu tượng hóa có kiểu bất cứ khi nào có kiểu trong ngữ cảnh mở rộng bởi ; và áp dụng có kiểu bất cứ khi nào và .
Lý thuyết kiểu phụ thuộc Martin-Löf tổng quát hóa điều này xa hơn: kiểu kết quả của một hàm có thể phụ thuộc vào giá trị của đối số nó. **Kiểu ** (kiểu hàm phụ thuộc) gom các hàm gửi mỗi tới một hạng kiểu — khi không nhắc tới , nó suy biến thành thông thường. Đối ngẫu, **kiểu ** (kiểu cặp phụ thuộc) gom các cặp với và — một cặp mà kiểu thành phần thứ hai phụ thuộc vào thành phần thứ nhất; khi không nhắc tới , nó suy biến thành tích thông thường.
| Kiến trúc kiểu | Trường hợp riêng không phụ thuộc | Cách đọc Curry–Howard |
|---|---|---|
| (khi hằng) | ||
| (khi hằng) | ||
| Tiên đề đơn trị: | — | Các kiểu tương đương được đồng nhất |
Nếu trong phép tính lambda đơn định kiểu, thì là chuẩn hóa mạnh: mọi dãy thu gọn bắt đầu từ đều kết thúc sau hữu hạn bước.
Vì sao đúng?
Đây là lý do vì sao phép tính lambda đơn định kiểu, dù có áp dụng hàm và lồng kiểu đệ quy, không đầy đủ Turing — không hạng được định kiểu nào có thể chạy mãi, chính điều này làm trình kiểm tra kiểu trong mảnh này luôn dừng.
Chứng minh
(Phương pháp khả quy Tait.) Định nghĩa, bằng quy nạp theo cấu trúc kiểu, một tập các "hạng khả quy" cho mỗi kiểu : với kiểu cơ sở , đặt là tập gồm mọi hạng chuẩn hóa mạnh; với kiểu hàm, đặt .
Trước hết ta chứng minh, bằng quy nạp theo , ba tính chất kỹ thuật cùng lúc: (CR1) mọi hạng trong đều chuẩn hóa mạnh; (CR2) đóng dưới thu gọn (nếu và thì ); (CR3) mọi hạng "trung tính" (một biến hay áp dụng, không phải trừu tượng hóa) mà mọi thu gọn một bước của nó đã nằm trong thì chính nó cũng nằm trong . Trường hợp cơ sở hiển nhiên từ định nghĩa ; trường hợp kiểu hàm khai triển định nghĩa và dùng giả thiết quy nạp trên các kiểu nhỏ hơn và .
Tiếp theo, ta chỉ ra mọi hạng được định kiểu đều khả quy dưới bất kỳ phép thế nào của các hạng khả quy cho biến tự do của nó: bằng quy nạp theo dẫn xuất kiểu của , nếu gán mỗi biến trong một hạng , thì . Trường hợp biến hiển nhiên. Trường hợp áp dụng theo trực tiếp từ định nghĩa . Trường hợp trừu tượng hóa cần cẩn thận nhất: với áp lên bất kỳ, hạng thu gọn trong một bước về , nằm trong theo giả thiết quy nạp (áp cho phép thế mở rộng); tính chất (CR3) — đóng dưới "mở rộng" cho các hạng mà mọi thu gọn đã khả quy — khi đó đặt chính vào , nên theo định nghĩa.
Cuối cùng, áp dụng điều này cho phép thế đồng nhất: mỗi biến tự nó trung tính và không có thu gọn nào cả, nên nó nằm trong một cách hiển nhiên theo (CR3). Vậy với mọi dẫn xuất đóng , lấy gửi mỗi tới chính nó cho . Theo (CR1), , nên : mọi hạng được định kiểu đều chuẩn hóa mạnh.
Nâng caoSự tương ứng Curry–Howard
Đọc là "nếu thì ", đọc là " và ", và một chứng minh của một mệnh đề trở thành một chương trình được định kiểu đúng với kiểu tương ứng — đây là mệnh đề-là-kiểu, chứng minh-là-chương trình. Kiểm tra chứng minh quy về kiểm tra kiểu của một hạng; xây chứng minh quy về viết chương trình đúng kiểu.
Cho là công thức mệnh đề xây từ nguyên tử, , và , và cho là kiểu đơn thu được bằng cách dịch nguyên tử thành kiểu cơ sở, thành tích , và thành kiểu hàm . Khi đó chứng minh được trong logic mệnh đề trực giác khi và chỉ khi có cư dân: tồn tại một hạng đóng với .
Vì sao đúng?
Đây là phát biểu chính xác đằng sau câu "trợ lý chứng minh chỉ là một trình kiểm tra kiểu": Coq, Agda, và Lean chấp nhận một chứng minh được máy kiểm tra của một định lý đúng khi chúng chấp nhận một hạng của kiểu tương ứng, và kiểm tra kiểu (khác với chứng minh định lý nói chung) là một thuật toán nhỏ, nhanh, máy móc, và rất đáng tin cậy.
Chứng minh
(Chứng minh trở thành chương trình.) Bằng quy nạp theo dẫn xuất suy luận tự nhiên của . Nếu quy tắc cuối là dẫn nhập , dẫn từ một chứng minh con của dưới giả thiết : theo giả thiết quy nạp chứng minh con đó dịch thành hạng với (giả thiết trở thành biến tự do ); khi đó đóng và có kiểu . Nếu quy tắc cuối là loại bỏ (modus ponens) từ và : theo giả thiết quy nạp ta có các hạng và ; khi đó . Các quy tắc dẫn nhập và loại bỏ dịch đối xứng thành ghép cặp và hai phép chiếu. Mọi quy tắc của hệ chứng minh đều có quy tắc xây hạng tương ứng, nên quy nạp theo dẫn xuất cho ra một hạng đóng được định kiểu thuộc kiểu .
(Chương trình trở thành chứng minh.) Ngược lại, bằng quy nạp theo dẫn xuất kiểu . Mỗi quy tắc kiểu — biến, trừu tượng hóa, áp dụng, ghép cặp, phép chiếu — có đúng hình dạng cây như một quy tắc suy luận tự nhiên — giả thiết, dẫn nhập , loại bỏ , dẫn nhập , loại bỏ . Vậy lấy cùng cây dẫn xuất, xóa mọi hạng, và đọc mỗi kiểu như công thức nó dịch từ: đây chính xác là một chứng minh trực giác hợp lệ của (với ).
Vì hai phép dịch (chứng minh hạng, và hạng chứng minh) là nghịch đảo cấu trúc của nhau trên các cây dẫn xuất — mỗi phép hoàn tác chính xác điều phép kia làm, quy tắc theo quy tắc — chứng minh được đúng khi có cư dân.
Đại họcỨng dụng thực tiễn và Ví dụ minh họa
Hệ kiểu phong phú bắt được cả lớp lỗi trước khi chương trình chạy: kiểu sở hữu của Rust ngăn dùng-sau-giải-phóng và tranh chấp dữ liệu ngay lúc biên dịch, và ngôn ngữ định kiểu phụ thuộc có thể mã hóa bất biến như "danh sách này có đúng phần tử" hay "chỉ số này trong khoảng hợp lệ" trực tiếp vào kiểu, khiến một số lỗi runtime không thể biểu diễn được. Ứng dụng sâu nhất nằm chính trong trợ lý chứng minh: Coq, Agda, và Lean có lõi nhỏ, được kiểm toán cẩn thận, chỉ làm mỗi việc kiểm tra kiểu hạng — vì sự tương ứng Curry–Howard, chấp nhận một hạng thuộc kiểu của một định lý chính là chấp nhận một chứng minh được máy kiểm tra, nên tin một kết quả toán học cỡ định lý Feit–Thompson hay định lý bốn màu quy về tin vài trăm dòng mã kiểm tra kiểu, không phải các chiến thuật (lớn hơn, khó kiểm toán hơn nhiều) đã xây nên hạng chứng minh.
Ví dụ: Một kiểu mà kiểu hàm thường không diễn đạt được
Cho là kiểu danh sách độ dài gồm phần tử kiểu . Viết một hạng cư trú — "với mọi độ dài , một hàm trên vector độ dài " — và giải thích vì sao kiểu đơn (không có ) hoàn toàn không diễn đạt được đặc tả này.
Lời giải
Hạng hoạt động: với mỗi số tự nhiên , nó nhận một vector độ dài là và trả về nguyên vẹn — rõ ràng được định kiểu tốt, vì được trả về ở kiểu , với bất kỳ nào được cung cấp.
Điều làm đây là một sử dụng thật sự của thay vì kiểu hàm thường là kiểu của đối số thứ hai () nhắc tới giá trị của đối số thứ nhất (). Trong phép tính lambda đơn định kiểu, kiểu đối số và kết quả của một hàm được cố định một lần cho mãi mãi — với chọn trước khi biết giá trị nào của kiểu . Không có cách nào viết "cho tôi số tự nhiên , và tùy vào số bạn cho, tôi sẽ đòi một vector đúng độ dài đó" chỉ dùng : bạn cần một kiểu cố định duy nhất nào đó hoạt động cho mọi cùng lúc, không phải điều có nghĩa.
Cụ thể, nếu bạn thử viết điều này bằng kiểu hàm thường, tốt nhất bạn được với một độ dài giữ chỗ CỐ ĐỊNH — vô dụng, vì nó sẽ từ chối vector độ dài khác, hoặc chấp nhận vector sai độ dài. Kiểu , , chính xác là kiến trúc kiểu cho phép miền đích "nhìn lại" giá trị cụ thể của nhận được, đúng là sự phụ thuộc mà kiểu đơn không diễn đạt được.
Ví dụ: Curry–Howard cho phép hợp thành hàm
Công thức diễn đạt tính bắc cầu của kéo theo. Theo Curry–Howard, tìm hạng chứng minh nó, và kiểm tra dẫn xuất kiểu từng bước.
Lời giải
Hạng là — chính xác là hợp thành hàm áp lên .
Dẫn xuất kiểu từ trong ra ngoài. Trong ngữ cảnh : vì và , áp dụng cho . Vì và , áp dụng cho .
Giờ giải phóng các trừu tượng hóa từ trong ra ngoài. có kiểu trong ngữ cảnh . Rồi có kiểu trong ngữ cảnh . Cuối cùng có kiểu không còn giả thiết tự do nào — một hạng đóng.
Vậy , nghĩa là là một chứng minh Curry–Howard của tính bắc cầu: "nếu kéo theo , và kéo theo , thì kéo theo " — cùng hạng mà một lập trình viên hàm sẽ viết để hợp thành hai hàm.
Nghiên cứuNghiên cứu hiện nay
Trong phép tính lambda đơn định kiểu, nếu và , kiểu của là gì?
Vì sao một trợ lý chứng minh như Coq, Agda, hay Lean có thể tin một chứng minh được máy kiểm tra dài hàng nghìn dòng?
Khi thực ra không phụ thuộc , suy biến thành gì?
Tiên đề đơn trị nói rằng...
Tài liệu tham khảo
- The Univalent Foundations Program (2013). Homotopy Type Theory: Univalent Foundations of Mathematics
- Wikipedia contributors (2024). Curry–Howard correspondence
- Wikipedia contributors (2024). Intuitionistic type theory