MathLabs
Định lýĐã chứng minh

Tính không quyết định của bài toán dừng

Phát biểu

Không tồn tại thuật toán H(e,x)H(e,x) mà, với mọi chỉ số chương trình ee và đầu vào xx, luôn dừng và cho ra chính xác việc φe(x)\varphi_e(x) (chạy chương trình ee trên đầu vào xx) 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.

Phác thảo chứng minh

Giả sử phản chứng tồn tại bộ quyết định HH: H(e,x)=1H(e,x)=1 nếu φe(x) ⁣↓\varphi_e(x)\!\downarrow (dừng) và H(e,x)=0H(e,x)=0 nếu φe(x) ⁣↑\varphi_e(x)\!\uparrow (chạy mãi), và bản thân HH luôn dừng với đáp án đúng.

Dùng HH, xây một chương trình mới DD mà, với đầu vào ee: tính H(e,e)H(e,e); nếu H(e,e)=1H(e,e)=1, thì DD vào vòng lặp vô hạn; nếu H(e,e)=0H(e,e)=0, thì DD dừng ngay. DD được xây hiệu quả từ HH (chỉ là HH 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 đó dd, tức D=φdD=\varphi_d.

Giờ đặt câu hỏi tự quy chiếu: φd(d)\varphi_d(d) có dừng không?

Trường hợp 1: nếu φd(d)\varphi_d(d) dừng, thì theo tính đúng của HH, H(d,d)=1H(d,d)=1. Nhưng theo định nghĩa của DD, H(d,d)=1H(d,d)=1 làm DD chạy mãi ở đầu vào dd — tức φd(d)\varphi_d(d) không dừng. Mâu thuẫn.

Trường hợp 2: nếu φd(d)\varphi_d(d) không dừng, thì theo tính đúng của HH, H(d,d)=0H(d,d)=0. Nhưng theo định nghĩa của DD, H(d,d)=0H(d,d)=0 làm DD dừng ở đầu vào dd — tức φd(d)\varphi_d(d) có dừng. Mâu thuẫn.

Cả hai trường hợp đều mâu thuẫn, nên giả thiết HH tồn tại là sai. Bài toán dừng không quyết định được. ■\blacksquare

Chủ đề chứa định lý này

Chứng minh từng bước

Chưa có chứng minh từng bước cho định lý này.

Tài liệu tham khảo

  1. Wikipedia contributors (2024). Halting problem
  2. Wikipedia contributors (2024). Rice's theorem
  3. Wikipedia contributors (2024). Ackermann function