Toán học bị ma ám
(overreacted.io)- Lean là ngôn ngữ lập trình được thiết kế để hình thức hóa toán học, cho phép các nhà toán học thao tác các định lý toán học như những đoạn mã
- Người dùng viết định lý, chứng minh, tiên đề dưới dạng mã, và quá trình chứng minh được thực hiện thông qua tập lệnh gọi là tactic
- Ngay cả khi chứng minh chưa được hoàn thành, vẫn có thể tạm dừng bằng
sorry, nhưng đây là một dạng chứng minh giả giống vớianytrong TypeScript - Nếu thêm sai tiên đề (ví dụ:
2 = 3), sẽ phát sinh nguy cơ mâu thuẫn logic và khả năng chứng minh mọi khẳng định - Lean chỉ suy ra kết luận dựa trên các tiên đề đã chọn và hệ thống chứng minh về mặt logic, nên việc giữ gìn tính đúng đắn toán học có ý nghĩa quan trọng
Lean: Ngôn ngữ làm việc với toán học như mã
- Lean là ngôn ngữ lập trình chuyên dùng để viết các phát biểu toán học được hình thức hóa
- Các nhà toán học dùng Lean để biểu diễn toán học bằng mã và cấu trúc hóa định lý, chứng minh của nhau nhằm hợp tác và chia sẻ
- Họ đưa ra một tương lai trong đó một lượng lớn tri thức toán học của nhân loại có thể được biểu diễn dưới dạng mã, từ đó kiểm chứng tự động và kết hợp một cách cơ giới
Những bước đầu trong chứng minh với Lean
- Trong Lean có thể viết một khai báo định lý đơn giản như
theorem two_eq_two : 2 = 2 := by sorry - Khi chứng minh chưa hoàn thiện, ta chèn
sorry, nhưng đây chỉ là mẹo tạm thời chứ không phải chứng minh thật sựsorrysẽ qua được kiểm tra chứng minh của Lean, nhưng về logic thì không đáng tin cậy
- Để có chứng minh đầy đủ, cần dùng tactic như
rfl(reflexivity) để chứng minh các đẳng thức hiển nhiên như2 = 2 - Những nội dung đã chứng minh có thể được tái sử dụng trong các định lý khác bằng
exactvà các lệnh tương tự, nhấn mạnh tính mô-đun
Tiên đề và mâu thuẫn: Khi toán học bị ma ám
- Nếu thêm tiên đề như
axiom math_is_haunted : 2 = 3, Lean sẽ xem tiên đề đó là đúng - Tiên đề này có thể được dùng trong các bước chứng minh sau đó, và thậm chí có thể chứng minh các kết luận toán học vô lý (ví dụ:
2 + 2 = 6) - Việc sử dụng tactic
rewritecho phép thay thế2bằng3, rồi kết thúc quy trình chứng minh đẳng thức bằngrfl - Nếu tiên đề sai gây ra mâu thuẫn, Lean cũng rơi vào trạng thái mọi mệnh đề đều chứng minh được (sụp đổ logic)
- Trên thực tế, vào đầu thế kỷ 20, các mâu thuẫn trong hệ tiên đề như nghịch lý Russell đã dẫn tới những suy tư nền tảng căn bản về toán học
- Như vậy, Lean cho thấy việc chọn tiên đề là nhân tố quyết định để duy trì tính hợp lệ của hệ thống logic
Lean với tư cách trình kiểm tra chứng minh
- Nếu các tiên đề được chọn đúng và Lean nhất quán về logic, nó cung cấp các kết luận có độ tin cậy về mặt lý thuyết
- Từ những đẳng thức đơn giản đến các định lý cực kỳ phức tạp (ví dụ: Fermat’s Last Theorem), tất cả đều được kiểm chứng theo cùng một nguyên lý
- Các định lý lớn được hoàn thiện như một cấu trúc cây, tích lũy qua chứng minh lặp lại các cấu trúc con và định lý cấp thấp
- Ví dụ, có một dự án quy mô lớn đang hình thức hóa Fermat's Last Theorem trong Lean; vào giai đoạn cuối sẽ có một hệ thống chứng minh chính thức hoàn chỉnh không còn dùng
sorry
Niềm vui khi học Lean
- Chứng minh với Lean là sự kết hợp sáng tạo giữa lập trình và toán học
- Bắt đầu từ việc chứng minh các mệnh đề đơn giản, rồi dần dần xây dựng chặt chẽ những toán học sâu và phức tạp trở thành một niềm vui quan trọng
- Các tài liệu hướng dẫn chính thức và cộng đồng (ví dụ: Natural Numbers Game, Mathematics in Lean, v.v.) rất phù hợp cho người mới bắt đầu
- Khi dùng Lean, bạn trực tiếp hình thức hóa logic và có thể khám phá lại vẻ đẹp của ý tưởng tinh tế cùng lập luận
- Kết luận rằng, ngay cả khi không có lý do rõ ràng, với một số nhóm người, Lean mang lại một niềm thích thú đặc biệt
1 bình luận
Ý kiến trên Hacker News
rflchẳng hạn) quá bao quát, nên ngay cả học qua tutorial cũng khó nắm chính xác ý nghĩa; ví dụ trong C thì có thể lần theo sự thay đổi trạng thái tới tận mức bit, còn Lean thì có gì đó hơi mơ hồ; với cả cú pháp tacticrewrite(rw) cũng khiến tôi thấy không tự nhiênrewritelại không hoạt động vì những lý do khó giải thích (có lẽ liên quan đến định nghĩa của cấu trúc trung gian); trong khi đó Metamath và cơ sở dữ liệu set.mm thì buộc bạn chứng minh hoàn toàn bằng suy luận cụ thể, không có tactic nào cả (chỉ dùng các quy tắc suy diễn như ax-mp), nhưng đổi lại lại phải nhớ hàng loạt utility lemma nên cũng không hề dễrflhoặcrewriteđi lặp lại; có thể Lean có thứ gì đó như prelude để tự động hóa phần này chăngrw [x]nên rất khó đọc; đúng là trong editor có thể xem trạng thái từng dòng, nhưng cứ phải bấm liên tục thì mất mạch, giống như nếu Python mà không có thụt đầu dòng, chỉ có cấu trúc khối rồi bắt bạn nhấp từng chỗ để hiểu luồng thì cũng vậy; có thể do góc nhìn của tôi bị ảnh hưởng bởi việc đầu game chỉ có ít lệnh bị giới hạn, nhưng tôi vẫn muốn biết trong môi trường Lean đầy đủ thì luồng đó có đỡ hơn khôngby ...ở những chỗ mà chi tiết không quá quan trọng; tôi không biết Lean có thứ tương tự không, nhưng ít nhất đây cũng là vài từ khóa tìm kiếm hoặc chủ đề để hỏi trên diễn đàn Leanintrolà biết đang đi vào quantifier, nhìnconstructorlà biết đang tách goal, v.v.; rốt cuộc tactics là một macro/DSL tạo ra proof tree (term tree), và khi nhìn mã chứng minh tôi cảm giác như đang thao tác trên một cái cây (chia nhánh, điền các chỗ trống theo thứ tự, v.v.); dù vậy, việc phải nhấp để biết chính xác assertion ở giữa chứng minh vẫn là một hạn chế; một chứng minh có ý tưởng tốt thì có thể đọc rõ ràng giống như diễn tiến logic trong một bài báo, nên người muốn truyền đạt ý đồ thường sẽ viết tên dễ hiểu, trình bày mạch lạc, tách lemma nhỏ, và đưa giả thuyết lên trước rồi giải bằng đoạn proof ngắn; ngược lại, những phần mà về mặt máy móc thì dài dòng nhưng với nhà toán học lại quá hiển nhiên thường được xử lý kiểu “golfing” (viết ngắn nhất có thể); kiểu golf đôi khi làm mã ngắn hơn bằng cách chỉ nói tới những phần mà con người đã trực giác nắm được; tóm lại, cấu trúc khi đọc Lean thường là ngầm định, nhưng có thể làm cho rõ hơn, và khi bạn quen tactic hơn thì cũng sẽ nắm được cấu trúc tốt hơn mà không cần nhấp; chỉ cần lướt tên lemma cũng có thể thấy dòng chảy lớn, và thứ tự thường cũng dễ tái dựngCộng đồng Lean tập trung khá đông trên Zulip, và bạn có thể xem nhiều luồng tham khảo trong kênh Machine-Learning-for-Theorem-Proving
sorrycòn để trống trong phần bài tập (các lời giải của tôi ở đây)proofvớisorry) hoặc cứ thêm tiên đề mới hay không; ví dụ có kiểm tra được kiểu “chứng minh này hoàn toàn không dùngsorrytheo bất kỳ cách nào” hoặc “nó chỉ phụ thuộc vào sức mạnh chứng minh của một tập tiên đề cố định” không?#print axioms some_theoremđược nhắc ở phần cuối bài chính là thứ bạn đang tìm; với nó, bạn có thể biết chứng minh đó phụ thuộc trực tiếp hay gián tiếp vàosorryhoặc các tiên đề chưa được kiểm tra hay khôngprint axiomsđể kiểm tra xem có tiên đề bổ sung nào không, và đồng thời xem nó có biên dịch được mà không có warning hay error không; tiện ích SafeVerify còn bắt được cả một số mẹo mà các hệ RL từng tìm ra