Nền tảng toán học
Hàm đệ quy, máy Turing
Các mô hình hình thức xác định chính xác những hàm nào có thể tính được bằng thuật toán.
Trực giácMáy tính được những gì?
Máy tính bỏ túi cộng và nhân được; trình biên dịch kiểm tra kiểu được; AI (đôi khi) trả lời câu hỏi được. Nhưng có hàm nào mà không thuật toán nào, dù thông minh đến đâu, có thể tính được không? Câu trả lời của Alan Turing — có — đến từ một mô hình toán học chính xác cho "thuật toán": máy Turing, gồm một băng, một đầu đọc/ghi, và một bảng quy tắc hữu hạn. Hai cách hình thức hóa tưởng chừng khác nhau, hàm đệ quy (xây từ các mảnh đơn giản bằng hợp thành và đệ quy) và máy Turing (một quá trình cơ học từng bước), hóa ra tính được chính xác cùng một lớp hàm — bằng chứng mạnh cho luận đề Church–Turing rằng đây thực sự là "mọi thứ tính được".
Đại họcHàm đệ quy nguyên thủy và hàm -đệ quy
Định nghĩa: Hàm đệ quy nguyên thủy
Hàm đệ quy nguyên thủy là lớp hàm nhỏ nhất chứa hàm không, hàm kế tiếp , mọi phép chiếu, và đóng dưới hợp thành và đệ quy nguyên thủy: cho và , phép đệ quy , định nghĩa một hàm đệ quy nguyên thủy mới . Cộng, nhân, lũy thừa, và mọi chương trình "vòng lặp for" có chặn cố định đều là đệ quy nguyên thủy — và mọi hàm đệ quy nguyên thủy đều toàn phần (xác định trên mọi đầu vào) và dừng sau số bước bị chặn với mỗi đầu vào.
Để bắt trọn mọi hàm tính được — kể cả hàm có thể không dừng — ta thêm một phép toán nữa. Hàm **-đệ quy (đệ quy tổng quát) thêm phép cực tiểu hóa không chặn**: trả về nhỏ nhất sao cho , tìm kiếm — và đơn giản không bao giờ trả về nếu không tồn tại như vậy. Chính điều này làm hàm -đệ quy có khả năng không dừng, và định lý Kleene chỉ ra chúng tính đúng cùng lớp hàm (bộ phận) như máy Turing.
| Lớp | Xây từ | Luôn dừng? | Ví dụ |
|---|---|---|---|
| Đệ quy nguyên thủy | Hợp thành + đệ quy có chặn | Có, luôn toàn phần | lũy thừa |
| Đệ quy tổng quát () | Đệ quy nguyên thủy + không chặn | Không, có thể chạy mãi | Hàm Ackermann |
| Khả tính Turing (bộ phận) | Trạng thái + băng + quy tắc chuyển | Không, đúng bằng -đệ quy | Bất kỳ thuật toán nào |
Không tồn tại thuật toán mà, với mọi chỉ số chương trình và đầu vào , luôn dừng và cho ra chính xác việc (chạy chương trình trên đầu vào ) có dừng hay không.
Vì sao đúng?
Đây là lý do toán học vì sao không phần mềm diệt vi-rút, trình biên dịch, hay IDE nào có thể phát hiện hoàn hảo vòng lặp vô hạn, mã chết, hay "hàm này luôn lỗi" một cách tổng quát — không phải giới hạn kỹ thuật hiện tại, mà là một bức tường toán học cứng.
Chứng minh
Giả sử phản chứng tồn tại bộ quyết định : nếu (dừng) và nếu (chạy mãi), và bản thân luôn dừng với đáp án đúng.
Dùng , xây một chương trình mới mà, với đầu vào : tính ; nếu , thì vào vòng lặp vô hạn; nếu , thì dừng ngay. được xây hiệu quả từ (chỉ là cộng một câu lệnh if và một vòng lặp), nên nó có chỉ số chương trình nào đó , tức .
Giờ đặt câu hỏi tự quy chiếu: có dừng không?
Trường hợp 1: nếu dừng, thì theo tính đúng của , . Nhưng theo định nghĩa của , làm chạy mãi ở đầu vào — tức không dừng. Mâu thuẫn.
Trường hợp 2: nếu không dừng, thì theo tính đúng của , . Nhưng theo định nghĩa của , làm dừng ở đầu vào — tức có dừng. Mâu thuẫn.
Cả hai trường hợp đều mâu thuẫn, nên giả thiết tồn tại là sai. Bài toán dừng không quyết định được.
Nâng caoĐịnh lý Rice
Bài toán dừng chỉ là một ví dụ của hiện tượng rộng lớn hơn nhiều. Gọi tính chất của các hàm khả tính bộ phận là ngữ nghĩa nếu nó chỉ phụ thuộc vào hàm mà chương trình tính, không phụ thuộc mã nguồn, và không tầm thường nếu một hàm khả tính có nó và một hàm khác thì không.
Với mọi tính chất ngữ nghĩa không tầm thường của các hàm khả tính bộ phận, tập không quyết định được.
Vì sao đúng?
Định lý duy nhất này ngay lập tức loại trừ thuật toán cho "chương trình này có tính hàm không hay không", "chương trình này có tính toàn phần không", "hai chương trình này có tương đương không", và vô số câu hỏi tự nhiên khác về hành vi chương trình — tất cả cùng một lúc, không cần lập luận đường chéo riêng cho từng câu.
Chứng minh
Không mất tổng quát giả sử hàm không xác định khắp nơi (tính bởi chương trình không bao giờ dừng ở đầu vào nào) không có tính chất — nếu không thì lập luận với tính chất bù , tính chất này quyết định được đúng khi quyết định được. Vì không tầm thường, cố định một chương trình mà hàm của nó có tính chất .
Giả sử phản chứng quyết định được bởi thuật toán nào đó (cho một chỉ số chương trình, dừng và báo cáo đúng liệu hàm của chương trình đó có tính chất hay không). Ta quy về bài toán dừng bởi , mâu thuẫn với Định lý 1.
Cho một cặp bất kỳ, xây dựng hiệu quả (bằng thao tác văn bản đơn giản — định lý s-m-n của Kleene) một chương trình mới mà, với đầu vào bất kỳ: trước hết mô phỏng chương trình chạy trên đầu vào ; nếu mô phỏng đó dừng, thì tiếp tục mô phỏng chương trình trên đầu vào và cho ra bất cứ gì nó cho ra.
Xét hai khả năng. Nếu dừng ở : mô phỏng trên kết thúc, nên sau đó hành xử y hệt ở mọi đầu vào, tức — hàm này có tính chất (vì ngữ nghĩa, chỉ phụ thuộc hàm được tính, và có ). Nếu không dừng ở : mô phỏng trên không bao giờ kết thúc, nên không bao giờ tới bước mô phỏng ở bất kỳ đầu vào nào; do đó là hàm không xác định khắp nơi , theo giả định không có tính chất .
Vậy: dừng ở có tính chất trả lời "có". Vì tính được, thuật toán "tính từ , rồi chạy " sẽ quyết định được bài toán dừng — mâu thuẫn Định lý 1. Vậy không tồn tại như thế: không quyết định được.
Đại họcỨng dụng thực tiễn và Ví dụ minh họa
Trình tối ưu hóa biên dịch phải quyết định những điều như "đoạn mã này có tới được không?" hay "giá trị biến này có quan trọng không?" — theo định lý Rice, những điều này không quyết định được một cách tổng quát, đó chính xác là lý do trình biên dịch thật dùng xấp xỉ bảo thủ (có thể giữ lại mã chết thật sự thay vì mạo hiểm xóa mã sống). Hàm Busy Beaver — số bước lớn nhất một máy Turing -trạng thái dừng có thể thực hiện trước khi dừng — là một hàm cụ thể, không tính được: các giá trị đã biết là , , , , và năm 2024 dự án hợp tác Busy Beaver Challenge (dẫn dắt bởi Tristan Stérin và cộng sự, với chứng minh được xác minh bằng Coq từ một người đóng góp dùng bút danh "mxdys") xác lập — cho thấy ngay cả câu hỏi tổ hợp "đơn giản" này cũng chỉ tính được từng trường hợp, không bao giờ bằng một thuật toán tổng quát.
Ví dụ: Khai triển hàm Ackermann
Dùng các quy tắc , với , và với , tính từng bước, và giải thích vì sao hàm Ackermann toàn phần nhưng không đệ quy nguyên thủy.
Lời giải
theo quy tắc thứ ba. Trước hết cần , và theo quy tắc thứ hai.
(khai triển hai lần bằng quy tắc thứ hai và thứ nhất). Vậy , nên .
, và . Vậy . Nên .
Quay lại đỉnh: ; khai triển ; nên . Vậy .
Hàm Ackermann được chứng minh toàn phần (nó luôn cuối cùng quy về trường hợp ), nên nó thuộc lớp hàm đệ quy tổng quát — nhưng nó tăng nhanh hơn mọi hàm đệ quy nguyên thủy (ví dụ , đã là tháp lũy thừa). Vì có thể chỉ ra mọi hàm đệ quy nguyên thủy cuối cùng bị chặn bởi một cố định nào đó, không hàm đệ quy nguyên thủy nào có thể bằng chính — một lập luận thống trị kiểu đường chéo, không phải toán tử , mới là điều đặt Ackermann ra ngoài đệ quy nguyên thủy dù nó toàn phần.
Ví dụ: Quy bài toán dừng về "chương trình này có in hello không?"
Chứng minh bài toán "cho chương trình , chạy (không đầu vào) có bao giờ in chuỗi `hello` không?" không quyết định được, bằng quy về trực tiếp từ bài toán dừng — không dùng định lý Rice.
Lời giải
Giả sử phản chứng thuật toán quyết định được việc chạy có bao giờ in `hello` không. Ta dùng để quyết định bài toán dừng, mâu thuẫn Định lý 1.
Cho chương trình và đầu vào bất kỳ, xây hiệu quả chương trình mới (không cần đầu vào) mà: mô phỏng chạy trên ; nếu mô phỏng đó dừng, tiếp đó in `hello` rồi dừng.
Nếu dừng ở : mô phỏng kết thúc, nên tới bước in và in `hello`. Nếu không dừng ở : mô phỏng không bao giờ kết thúc, nên không bao giờ tới bước in và không bao giờ in `hello`.
Vậy dừng ở trả lời "có". Vì tính được, "xây rồi chạy " quyết định được bài toán dừng — mâu thuẫn Định lý 1. Vậy không thể tồn tại: bài toán "in hello" không quyết định được. (Đây chính là khuôn mẫu phân tích trình biên dịch: "dòng mã này có bao giờ được tới không" có cùng hình dạng.)
Dùng , bằng bao nhiêu?
Điều nào sau đây là hệ quả của tính không quyết định của bài toán dừng đối với thiết kế trình biên dịch?
Định lý Rice KHÔNG áp dụng cho tính chất nào?
Trong chứng minh đường chéo của tính không quyết định của bài toán dừng, điều gì dẫn tới mâu thuẫn?
Tài liệu tham khảo
- Wikipedia contributors (2024). Halting problem
- Wikipedia contributors (2024). Rice's theorem
- Wikipedia contributors (2024). Ackermann function