MathLabs

Nền tảng toán học

Định lý bất toàn Gödel

Mọi hệ hình thức đủ mạnh để mô tả số học đều chứa những mệnh đề đúng mà nó không chứng minh được, và không thể tự chứng minh tính nhất quán của chính mình — một giới hạn nền tảng được phát hiện năm 1931, làm thay đổi logic học, lý thuyết tính toán và triết học toán học.

Trực giácMột câu tự nói về chính nó

Xét câu: "Câu này không thể chứng minh được." Nếu nó chứng minh được, nó sẽ sai (vì nó nói nó không chứng minh được), điều này tệ cho một hệ chứng minh chỉ chứng minh những điều đúng. Vậy nó phải không chứng minh được — nhưng khi đó điều nó nói lại đúng. Ta đã tìm ra một mệnh đề đúng nhưng không chứng minh được. Đây không phải một trò chơi chữ rẻ tiền; năm 1931 Kurt Gödel đã chỉ ra cách xây dựng một câu thuần túy số học, trung thực, có đúng hành vi này bên trong bất kỳ hệ hình thức đủ mạnh nào.

Phổ thôngMột hệ hình thức là một trò chơi với luật cố định

Hãy hình dung một hệ hình thức giống như cờ vua: một thế cờ khởi đầu cố định (tiên đề), các luật cố định để di chuyển quân (quy tắc suy luận), và một ván đấu "thắng" khi đạt tới một thế cờ hợp lệ (một định lý được chứng minh). Các luật này không biết gì về thế giới thực — một máy tính có thể kiểm tra từng nước đi một cách máy móc, mà không cần hiểu một chứng minh "nghĩa là" gì. Phát hiện của Gödel chính là về điều này: dù bạn cố định tiên đề và luật cho số học như thế nào, một số sự thật đúng về các số sẽ không bao giờ đạt tới được như một "thế cờ hợp lệ" trong trò chơi.

Đại họcĐúng so với chứng minh được, và mã hóa Gödel

Định nghĩa: Tính nhất quán và tính đầy đủ

Một hệ hình thức FF là nhất quán (không mâu thuẫn) nếu không có mệnh đề φ\varphi nào mà FF chứng minh được cả φ\varphi lẫn ¬φ\neg\varphi (viết là F⊢φF \vdash \varphi và F⊢¬φF \vdash \neg\varphi). Hệ là đầy đủ nếu với mọi câu φ\varphi trong ngôn ngữ của nó, hoặc F⊢φF \vdash \varphi hoặc F⊢¬φF \vdash \neg\varphi. Và FF được tiên đề hóa hiệu quả nếu một máy tính có thể quyết định một văn bản cho trước có phải là một chứng minh hợp lệ trong FF hay không.

Làm sao một công thức về các con số lại có thể nói về các chứng minh? Bằng mã hóa Gödel: gán một số tự nhiên duy nhất ⌜φ⌝\ulcorner\varphi\urcorner cho mỗi ký hiệu, mỗi công thức φ\varphi, và mỗi dãy công thức (hệt như máy tính lưu mọi tập tin thành một con số). Việc kiểm tra một dãy công thức có phải là chứng minh hợp lệ hay không là một phép tính cơ giới trên các con số đó, nên "số pp mã hóa một chứng minh của công thức có mã nn" là một quan hệ số học thông thường PrfF(p,n)\mathrm{Prf}_F(p, n) chỉ dùng ++, ×\times, và các lượng từ. Khái niệm chứng minh được trong FF trở thành công thức số học ProvF(n):=∃p PrfF(p,n)\mathrm{Prov}_F(n) := \exists p\,\mathrm{Prf}_F(p, n).

⌜φ⌝=2a13a2⋯pkak\ulcorner\varphi\urcorner = 2^{a_1} 3^{a_2} \cdots p_k^{a_k}

Đọc một công thức φ\varphi như một chuỗi ký hiệu hữu hạn, và gọi a1,a2,…,aka_1, a_2, \dots, a_k là các mã số của những ký hiệu đó theo thứ tự (chẳng hạn, một bảng tra cố định gán cho mỗi ký hiệu của ngôn ngữ một số nhỏ). Mã của toàn bộ công thức, ⌜φ⌝\ulcorner\varphi\urcorner, khi đó chính là con số ở trên: số mũ trên số nguyên tố thứ ii, tức p1,p2,…,pkp_1, p_2, \dots, p_k (tức là 2,3,5,…2, 3, 5, \dots), ghi lại mã của ký hiệu thứ ii. Vì mọi số tự nhiên đều phân tích ra thừa số nguyên tố theo đúng một cách duy nhất, con số này luôn có thể giải mã ngược lại thành chuỗi ký hiệu ban đầu — mã hóa công thức thành số không làm mất thông tin gì, hệt như máy tính lưu một tệp văn bản thành một dãy byte.

T⊢G↔¬ProvT(⌜G⌝)T \vdash G \leftrightarrow \neg\mathrm{Prov}_T(\ulcorner G\urcorner)

Phương trình ở trên, T⊢G↔¬ProvT(⌜G⌝)T \vdash G \leftrightarrow \neg\mathrm{Prov}_T(\ulcorner G\urcorner), là hình dạng chung của mọi câu đường chéo (điểm bất động): với một lý thuyết TT, nó tạo ra một câu GG tương đương chứng minh được với khẳng định "Tôi, GG, không chứng minh được trong TT." Đây không phải mẹo riêng cho ví dụ của Gödel — cùng một công thức đó dựng được một câu tự quy chiếu cho bất kỳ tính chất nào diễn đạt được trong số học, và đó chính là lý do vòng vẽ dưới đây không có phụ thuộc nào mà nó không khép lại được: mũi tên rời khỏi GG luôn tìm được đường quay trở lại GG.

Một đồ thị mạng thể hiện một vòng có hướng giữa một câu tự quy chiếu và mệnh đề số học khẳng định tính chứng minh được của chính nó, minh họa tính tự quy chiếu ở trung tâm phép dựng đường chéo của Gödel.
Một vòng phụ thuộc: câu GFG_F nói về chính tính chứng minh được của nó. Nút "GFG_F" trỏ tới nút "ProvF(⌜GF⌝)\mathrm{Prov}_F(\ulcorner G_F\urcorner)" (mệnh đề khẳng định nó chứng minh được), rồi mệnh đề đó lại trỏ ngược về GFG_F — đúng vòng khép kín mà mã hóa Gödel làm cho khả thi ngay bên trong số học thuần túy.

Cho FF là một hệ hình thức nhất quán, được tiên đề hóa hiệu quả và đủ mạnh để diễn đạt số học sơ cấp. Khi đó tồn tại một câu GFG_F trong ngôn ngữ của FF đúng trên tập số tự nhiên chuẩn N\mathbb{N}, nhưng F⊬GFF \nvdash G_F (và nếu FF là ω\omega-nhất quán thì cũng có F⊬¬GFF \nvdash \neg G_F). Nói riêng, FF không đầy đủ.

Vì sao đúng?

Nhờ bổ đề đường chéo (người họ hàng hình thức của lập luận đường chéo Cantor), số học có thể dựng một câu GFG_F thỏa F⊢GF↔¬ProvF(⌜GF⌝)F \vdash G_F \leftrightarrow \neg\mathrm{Prov}_F(\ulcorner G_F\urcorner) — một câu tự khẳng định rằng nó không chứng minh được trong FF. Nếu F⊢GFF \vdash G_F, thì ProvF(⌜GF⌝)\mathrm{Prov}_F(\ulcorner G_F\urcorner) đúng, nên F⊢¬GFF \vdash \neg G_F, mâu thuẫn với tính nhất quán. Do đó F⊬GFF \nvdash G_F — đó chính xác là điều GFG_F khẳng định, khiến GFG_F đúng trên N\mathbb{N}. (Về sau Rosser đã bỏ được giả thiết ω\omega-nhất quán.)

Chứng minh

Bước 1 (số học hóa cú pháp). Cố định một cách mã hóa tính toán được, gán cho mỗi ký hiệu, mỗi công thức, và mỗi dãy hữu hạn công thức trong ngôn ngữ của FF một số tự nhiên duy nhất, gọi là số Gödel của nó. Vì FF được tiên đề hóa hiệu quả, quan hệ PrfF(p,n)\mathrm{Prf}_F(p, n) — "pp là mã của một chứng minh cho công thức có mã nn" — có thể diễn đạt bằng một công thức số học chỉ dùng ++, ×\times và các lượng từ, vì việc kiểm tra một chứng minh từng dòng là một thủ tục cơ giới hữu hạn. Đặt ProvF(n):=∃p PrfF(p,n)\mathrm{Prov}_F(n) := \exists p\, \mathrm{Prf}_F(p, n).

Bước 2 (bổ đề đường chéo). Với mọi công thức số học ψ(x)\psi(x) có một biến tự do, bổ đề đường chéo tạo ra một câu DD sao cho F⊢D↔ψ(⌜D⌝)F \vdash D \leftrightarrow \psi(\ulcorner D \urcorner) — DD khẳng định về chính mã của nó rằng ψ(x)\psi(x) đúng với nó. Áp dụng điều này cho ψ(x):=¬ProvF(x)\psi(x) := \neg\mathrm{Prov}_F(x): ta thu được một câu GFG_F với F⊢GF↔¬ProvF(⌜GF⌝)F \vdash G_F \leftrightarrow \neg\mathrm{Prov}_F(\ulcorner G_F \urcorner). Nói nôm na, GFG_F nói rằng "Tôi không chứng minh được trong FF."

Bước 3 (F⊬GFF \nvdash G_F). Giả sử phản chứng rằng F⊢GFF \vdash G_F. Vì FF được tiên đề hóa hiệu quả, bản thân chứng minh này có một mã p0p_0, nên PrfF(p0,⌜GF⌝)\mathrm{Prf}_F(p_0, \ulcorner G_F \urcorner) đúng, do đó F⊢ProvF(⌜GF⌝)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner) (các sự kiện số học chứng minh được về những con số cụ thể thì tự chúng cũng chứng minh được trong FF). Nhưng tương đương đường chéo kết hợp với F⊢GFF \vdash G_F lại cho F⊢¬ProvF(⌜GF⌝)F \vdash \neg \mathrm{Prov}_F(\ulcorner G_F \urcorner). Vậy FF chứng minh được cả một mệnh đề lẫn phủ định của nó, mâu thuẫn với tính nhất quán. Do đó F⊬GFF \nvdash G_F.

Bước 4 (GFG_F đúng, và — với giả thiết ω\omega-nhất quán — F⊬¬GFF \nvdash \neg G_F). Vì F⊬GFF \nvdash G_F, không số nào mã hóa một chứng minh của GFG_F, nên ¬ProvF(⌜GF⌝)\neg\mathrm{Prov}_F(\ulcorner G_F \urcorner) đúng trên N\mathbb{N}; theo tương đương đường chéo, đây chính xác là điều GFG_F khẳng định, nên GFG_F đúng. Nếu FF cũng chứng minh được phủ định của GFG_F, tức F⊢¬GFF \vdash \neg G_F, thì kết hợp điều này với tương đương đường chéo sẽ cho F⊢ProvF(⌜GF⌝)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner) — "có số pp nào đó mã hóa một chứng minh của GFG_F" — mà không hề có một chứng minh cụ thể nào làm chứng, đúng là tình huống mà ω\omega-nhất quán loại trừ. Vậy với ω\omega-nhất quán, F⊬¬GFF \nvdash \neg G_F cũng đúng, và FF không đầy đủ.

Cho FF là một hệ hình thức nhất quán, được tiên đề hóa hiệu quả, mở rộng số học Peano (hoặc đủ mạnh để hình thức hóa vị từ chứng minh của chính nó), và đặt Con(F):=¬ProvF(⌜0=1⌝)\mathrm{Con}(F) := \neg\mathrm{Prov}_F(\ulcorner 0 = 1\urcorner) là câu số học diễn đạt rằng FF nhất quán. Khi đó F⊬Con(F)F \nvdash \mathrm{Con}(F).

Vì sao đúng?

Chính phép chứng minh của định lý thứ nhất — "nếu FF nhất quán thì FF không chứng minh được GFG_F" — có thể được hình thức hóa ngay bên trong FF, cho ra F⊢Con(F)→GFF \vdash \mathrm{Con}(F) \to G_F. Nếu FF chứng minh được Con(F)\mathrm{Con}(F), quy tắc modus ponens sẽ suy ra F⊢GFF \vdash G_F, mâu thuẫn với định lý thứ nhất.

Chứng minh

Bước 1 (vị từ chứng minh được hình thức hóa được, chứ không chỉ định nghĩa được). Vì ProvF\mathrm{Prov}_F được xây dựng từ quan hệ cơ giới, kiểm tra được PrfF(p,n)\mathrm{Prf}_F(p,n), ba "điều kiện suy dẫn được" sau tự chúng chứng minh được ngay bên trong FF (đây là chỗ lập luận cần FF mở rộng số học Peano, chứ không chỉ cần nhất quán): (P1P_1) nếu FF chứng minh được φ\varphi thì FF chứng minh được ProvF(⌜φ⌝)\mathrm{Prov}_F(\ulcorner\varphi\urcorner); (P2P_2) FF chứng minh được ProvF(⌜φ→ψ⌝)→(ProvF(⌜φ⌝)→ProvF(⌜ψ⌝))\mathrm{Prov}_F(\ulcorner\varphi\to\psi\urcorner) \to (\mathrm{Prov}_F(\ulcorner\varphi\urcorner)\to\mathrm{Prov}_F(\ulcorner\psi\urcorner)); (P3P_3) FF chứng minh được ProvF(⌜φ⌝)→ProvF(⌜ProvF(⌜φ⌝)⌝)\mathrm{Prov}_F(\ulcorner\varphi\urcorner) \to \mathrm{Prov}_F(\ulcorner\mathrm{Prov}_F(\ulcorner\varphi\urcorner)\urcorner).

Bước 2 (hình thức hóa chính lập luận của Định lý 1). Theo tương đương đường chéo, F⊢¬GF→ProvF(⌜GF⌝)F \vdash \neg G_F \to \mathrm{Prov}_F(\ulcorner G_F \urcorner). Lập luận không hình thức của Định lý 1 — "nếu GFG_F chứng minh được, thì chính chứng minh đó sẽ làm chứng cho ProvF(⌜GF⌝)\mathrm{Prov}_F(\ulcorner G_F\urcorner), và tương đương đường chéo khi đó sẽ trao cho ta một chứng minh của ¬GF\neg G_F luôn" — không dùng gì ngoài thao tác cơ giới trên ký hiệu đã được bao trùm bởi (P1P_1)–(P3P_3), nên nó có thể được mô phỏng từng bước như một suy diễn hình thức ngay bên trong FF, cho ra F⊢ProvF(⌜GF⌝)→ProvF(⌜¬GF⌝)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner) \to \mathrm{Prov}_F(\ulcorner \neg G_F \urcorner). Vì chứng minh được cả GFG_F lẫn phủ định của nó cho phép FF suy ra 0=10 = 1 bằng nguyên lý ex falso quodlibet, điều này cho F⊢ProvF(⌜GF⌝)→¬Con(F)F \vdash \mathrm{Prov}_F(\ulcorner G_F \urcorner) \to \neg\mathrm{Con}(F), tức F⊢Con(F)→GFF \vdash \mathrm{Con}(F) \to G_F.

Bước 3 (kết luận). Giả sử phản chứng rằng F⊢Con(F)F \vdash \mathrm{Con}(F). Kết hợp với F⊢Con(F)→GFF \vdash \mathrm{Con}(F) \to G_F bằng modus ponens, FF sẽ chứng minh được GFG_F. Nhưng Định lý 1 đã cho thấy F⊬GFF \nvdash G_F với FF nhất quán — mâu thuẫn. Vậy FF không thể chứng minh được Con(F)\mathrm{Con}(F), đúng như khẳng định.

Vào thập niên 1920, David Hilbert đề xướng chương trình Hilbert: tiên đề hóa toàn bộ toán học rồi chứng minh, chỉ bằng những lập luận hữu hạn đơn giản trên các ký hiệu, rằng hệ tiên đề đó là nhất quán và đầy đủ. Hai định lý của Gödel chỉ ra rằng điều này không thể thực hiện đúng như mong muốn: số học Peano thậm chí không tự chứng minh được tính nhất quán của chính nó, chưa nói tới lý thuyết tập hợp, nếu không dùng những nguyên lý mạnh hơn chính hệ đang được kiểm tra.

Với mọi lý thuyết bậc nhất TT và mọi câu φ\varphi, T⊢φT \vdash \varphi khi và chỉ khi φ\varphi đúng trong mọi mô hình của TT (T⊨φT \models \varphi).

Vì sao đúng?

Được Gödel chứng minh năm 1929 (luận án tiến sĩ của ông), định lý này nói rằng các quy tắc suy luận của logic bậc nhất là đầy đủ: chúng không bỏ sót hệ quả logic nào. Định lý bất toàn (1931) không mâu thuẫn với điều đó: GFG_F không chứng minh được là vì FF có những mô hình phi chuẩn trong đó GFG_F sai, dù GFG_F đúng trong mô hình chuẩn N\mathbb{N}.

Chứng minh

Bước 1 (tính đúng đắn — chiều dễ, T⊢φT \vdash \varphi kéo theo T⊨φT \models \varphi). Lập luận bằng quy nạp theo độ dài của một chứng minh hình thức của φ\varphi từ TT. Mọi tiên đề của TT đúng trong bất kỳ mô hình MM nào của TT theo định nghĩa; mọi tiên đề thuần túy logic (chẳng hạn φ→(ψ→φ)\varphi \to (\psi \to \varphi)) là hằng đúng, đúng dưới mọi cách diễn giải bất kỳ. Và mỗi quy tắc suy luận bảo toàn tính đúng trong MM: với modus ponens, nếu M⊨θM \models \theta và M⊨θ→φM \models \theta \to \varphi thì tự động M⊨φM \models \varphi. Vậy mọi dòng của chứng minh đều đúng trong MM, đặc biệt dòng cuối, φ\varphi, cũng đúng; vì MM là một mô hình bất kỳ của TT, nên T⊨φT \models \varphi.

Bước 2 (tính đầy đủ — chiều khó, bằng phản đảo: T⊬φT \nvdash \varphi kéo theo T⊭φT \not\models \varphi). Giả sử T⊬φT \nvdash \varphi. Khi đó tập T∪{¬φ}T \cup \{\neg\varphi\} nhất quán (nếu nó chứng minh được một mâu thuẫn, TT sẽ chứng minh được φ\varphi bằng phản chứng). Dùng phương pháp Henkin, mở rộng nó thành một tập nhất quán tối đại Σ\Sigma có nhân chứng: mỗi khi ∃x ψ(x)\exists x\, \psi(x) nằm trong Σ\Sigma, một hằng số cc mới được thêm vào sao cho ψ(c)\psi(c) cũng nằm trong Σ\Sigma. Dựng mô hình số hạng MΣM_\Sigma có các phần tử là những số hạng đóng của ngôn ngữ mở rộng, đồng nhất theo đẳng thức chứng minh được trong Σ\Sigma, với các quan hệ và hàm được diễn giải trực tiếp từ Σ\Sigma. Một phép quy nạp theo độ dài số hạng ("bổ đề chân lý") khi đó cho MΣ⊨θ  ⟺  θ∈ΣM_\Sigma \models \theta \iff \theta \in \Sigma với mọi câu θ\theta.

Bước 3 (lắp ráp mô hình, và kết luận). Vì ¬φ∈Σ\neg\varphi \in \Sigma, bổ đề chân lý cho MΣ⊨¬φM_\Sigma \models \neg\varphi, và vì mọi tiên đề của TT đều nằm trong Σ\Sigma, cũng có MΣ⊨TM_\Sigma \models T. Vậy MΣM_\Sigma là một mô hình thực sự của TT trong đó φ\varphi sai, tức T⊭φT \not\models \varphi. Điều này chứng minh mệnh đề phản đảo của Bước 2, và kết hợp với Bước 1, T⊢φT \vdash \varphi đúng khi và chỉ khi T⊨φT \models \varphi — đây chính là kết quả trong luận án tiến sĩ năm 1929 của Gödel, sau này được Leon Henkin (1949) tinh gọn lại thành phép dựng mô hình số hạng dùng ở đây.

Nâng caoBất toàn, bài toán dừng và các bài toán không quyết định được

Không tồn tại thuật toán (máy Turing) HH nào nhận mã của một chương trình tùy ý PP cùng dữ liệu vào xx và luôn dừng với câu trả lời đúng cho việc P(x)P(x) có dừng hay không.

Vì sao đúng?

Giả sử H(P,x)H(P, x) quyết định được việc dừng. Ta dựng một máy D(P)D(P) chạy H(P,P)H(P, P), rồi lặp vô hạn nếu HH trả lời "dừng", và dừng nếu HH trả lời "lặp". Đưa cho DD chính mã của nó: D(D)D(D) dừng khi và chỉ khi H(D,D)H(D, D) nói rằng nó lặp — mâu thuẫn. Đây là người anh em song sinh bên phía tính toán của câu đường chéo Gödel.

Chứng minh

Bước 1 (giả sử tồn tại bộ quyết định việc dừng). Giả sử phản chứng rằng tồn tại một thuật toán HH sao cho H(P,x)H(P, x) luôn dừng và trả lời đúng "dừng" nếu chương trình có mã PP dừng trên đầu vào xx, và "lặp" nếu ngược lại.

Bước 2 (dựng một máy đường chéo từ HH). Định nghĩa một thuật toán mới D(P)D(P) mà, với đầu vào là mã một chương trình PP, trước hết tính H(P,P)H(P, P) — chạy HH với PP được đưa vào làm cả hai vai trò chương trình lẫn đầu vào. Nếu H(P,P)H(P, P) trả lời "dừng", thì DD cố tình đi vào vòng lặp vô hạn; nếu H(P,P)H(P, P) trả lời "lặp", thì DD dừng ngay lập tức (chẳng hạn, trả về 00).

Bước 3 (đưa cho DD chính mã của nó). Vì DD tự nó là một thuật toán, nó có một mã, và không gì ngăn ta chạy DD trên chính mã đó: xét D(D)D(D). Có hai trường hợp, cả hai đều bất khả: nếu D(D)D(D) dừng, thì theo cách dựng điều này xảy ra chính xác khi H(D,D)H(D, D) trả lời "lặp" — nghĩa là HH đã báo sai rằng DD trên DD không dừng, dù nó vừa mới dừng. Nếu ngược lại D(D)D(D) chạy mãi mãi, điều này xảy ra chính xác khi H(D,D)H(D, D) trả lời "dừng" — nghĩa là HH đã báo sai rằng nó dừng, dù nó lặp vô hạn.

Bước 4 (kết luận). Dù trường hợp nào, HH cũng cho câu trả lời sai trên đầu vào (D,D)(D, D), mâu thuẫn với giả thiết rằng HH luôn đúng. Vậy không thể tồn tại thuật toán HH như thế: bài toán dừng không quyết định được.

Bài toán dừng suy ra ngay định lý bất toàn thứ nhất: nếu một hệ FF đúng đắn, được tiên đề hóa hiệu quả mà lại đầy đủ cho số học, ta có thể quyết định P(x)P(x) có dừng hay không chỉ bằng cách liệt kê lần lượt mọi chứng minh trong FF cho tới khi tìm thấy một chứng minh rằng P(x)P(x) dừng hoặc một chứng minh rằng nó không dừng. Và tính không quyết định được còn vươn tới tận số học thông thường: bài toán thứ 10 của Hilbert (`hilbert-tenth-problem`), hỏi về một thuật toán kiểm tra phương trình đa thức hệ số nguyên có nghiệm nguyên hay không, đã được Davis, Putnam, Robinson và Matiyasevich (1970) chứng minh là không có thuật toán như vậy. Hệ quả là, trong bất kỳ hệ nhất quán FF nào, cũng có một phương trình Diophantine cụ thể vô nghiệm nguyên nhưng FF không thể chứng minh tính vô nghiệm của nó.

Đại họcỨng dụng thực tiễn và Ví dụ minh họa

Giới hạn của Gödel và Turing không chỉ là chuyện tò mò triết học: chúng đặt ra những ranh giới cứng cho những gì công cụ phần mềm có thể hứa hẹn. Mọi công cụ phân tích tĩnh kiểu "chứng minh chương trình của tôi không có lỗi", mọi bộ chứng minh định lý tự động hoàn toàn, và mọi phần mềm diệt virus tuyên bố phát hiện mọi hành vi độc hại đều đụng thẳng vào những định lý này — một số câu hỏi về chương trình đơn giản là không quyết định được bằng bất kỳ thuật toán nào, dù có bao nhiêu sức mạnh tính toán hay sự khôn khéo được đổ vào. Hai ví dụ dưới đây làm điều này cụ thể: một ví dụ cho thấy thu nhỏ bộ máy đánh số nằm ở trung tâm chứng minh, ví dụ kia cho thấy một công việc kỹ thuật phần mềm thực thụ thừa hưởng tính không quyết định được trực tiếp từ bài toán dừng.

Ví dụ

Cố định một bảng tra chơi mẫu cho một bảng chữ cái logic nhỏ: ¬↦1\neg \mapsto 1, ∃↦3\exists \mapsto 3, x↦4x \mapsto 4. Dùng công thức mã hóa Gödel, tính mã ⌜¬∃x⌝\ulcorner \neg \exists x \urcorner của chuỗi ba ký hiệu "¬∃x\neg \exists x".

Lời giải

Bước 1 (đọc ra mã các ký hiệu theo thứ tự). Chuỗi "¬∃x\neg \exists x" có ba ký hiệu theo thứ tự: ¬\neg, ∃\exists, xx. Tra bảng ta được dãy mã a1=1a_1 = 1, a2=3a_2 = 3, a3=4a_3 = 4.

Bước 2 (áp dụng công thức mã hóa). Với k=3k = 3 ký hiệu, công thức là ⌜¬∃x⌝=2a1⋅3a2⋅5a3=21⋅33⋅54\ulcorner \neg \exists x \urcorner = 2^{a_1} \cdot 3^{a_2} \cdot 5^{a_3} = 2^{1} \cdot 3^{3} \cdot 5^{4}, dùng ba số nguyên tố đầu tiên 2,3,52, 3, 5 làm cơ số.

Bước 3 (tính từng lũy thừa của số nguyên tố). 21=22^{1} = 2, 33=273^{3} = 27, và 54=6255^{4} = 625.

Bước 4 (nhân lại). ⌜¬∃x⌝=2×27×625=33,750\ulcorner \neg \exists x \urcorner = 2 \times 27 \times 625 = 33{,}750. Vì 33,75033{,}750 phân tích duy nhất thành 21⋅33⋅542^1 \cdot 3^3 \cdot 5^4, bất kỳ ai cầm con số duy nhất này đều khôi phục lại được các số mũ 1,3,41, 3, 4 và do đó đọc lại được đúng chuỗi gốc "¬∃x\neg \exists x" — không có thông tin nào bị mất trong việc mã hóa.

Ví dụ

Một nhóm phân tích tĩnh muốn thêm một tính năng ZZ vào công cụ của họ: cho mã nguồn của bất kỳ hàm ff nào trong ngôn ngữ của họ, Z(f)Z(f) luôn dừng và báo cáo đúng liệu có một đầu vào nào đó khiến ff ném ra ngoại lệ con trỏ null hay không. Hãy chứng minh không thể tồn tại ZZ như vậy, bằng cách quy bài toán dừng về nó.

Lời giải

Bước 1 (quy bài toán dừng về việc phát hiện con trỏ null). Giả sử phản chứng rằng ZZ tồn tại. Với một chương trình PP và đầu vào xx tùy ý — một thể hiện của bài toán dừng — dựng một hàm mới fP,xf_{P,x} (không có đầu vào riêng) như sau: fP,xf_{P,x} trước hết mô phỏng PP chạy trên xx từng bước một, không dùng con trỏ null nào trong đoạn mã mô phỏng đó.

Bước 2 (gắn tín hiệu quan sát được). Ngay sau khi mô phỏng P(x)P(x) kết thúc — điều này chỉ xảy ra nếu P(x)P(x) dừng — fP,xf_{P,x} thực thi thêm một dòng cố tình giải tham chiếu một con trỏ null, ném ra ngoại lệ. Nếu mô phỏng của P(x)P(x) không bao giờ kết thúc, dòng này không bao giờ được chạy tới và không có ngoại lệ nào được ném ra cả.

Bước 3 (phép quy chính xác). Theo cách dựng, fP,xf_{P,x} ném ra một ngoại lệ con trỏ null trên một đầu vào nào đó khi và chỉ khi P(x)P(x) dừng: "một đầu vào nào đó" ở đây không quan trọng vì fP,xf_{P,x} bỏ qua tham số của nó, nhưng quyết định của công cụ về fP,xf_{P,x} trả lời chính xác câu hỏi dừng cho (P,x)(P, x).

Bước 4 (mâu thuẫn). Chạy bộ quyết định giả định như Z(fP,x)Z(f_{P,x}) khi đó sẽ quyết định được, với PP và xx tùy ý, liệu P(x)P(x) có dừng hay không — nhưng định lý ở trên đã cho thấy không thuật toán nào làm được điều đó. Vậy tính năng phân tích tĩnh ZZ không thể tồn tại cho các chương trình tùy ý, dù phân tích có tinh vi đến đâu.

Nghiên cứuCác mệnh đề độc lập tự nhiên và giả thuyết continuum

Câu GFG_F của Gödel trông có vẻ nhân tạo — nó được chế tạo riêng để tự nói về chứng minh của chính mình. Liệu tính bất toàn có bao giờ chạm tới những câu hỏi mà các nhà toán học vốn đã đặt ra từ trước không? Có. Ví dụ nổi tiếng nhất là giả thuyết continuum (`continuum-hypothesis`) của Cantor: có tồn tại tập hợp nào có lực lượng nằm nghiêm ngặt giữa lực lượng của N\mathbb{N} và lực lượng của R\mathbb{R} không? Gödel (1940) chứng minh rằng lý thuyết tập hợp ZFC không thể bác bỏ giả thuyết này (bằng cách dựng vũ trụ kiến thiết được LL), còn Paul Cohen (1963) phát minh phương pháp forcing (ép buộc) để chứng minh rằng ZFC cũng không thể chứng minh được nó. Ngay trong số học, định lý Paris–Harrington (1977) và định lý Goodstein (1944, được Kirby–Paris chứng minh là độc lập năm 1982) là những sự kiện tổ hợp thực thụ về các số hữu hạn, đúng trên N\mathbb{N} nhưng không chứng minh được trong số học Peano.

Vì sao định lý bất toàn thứ nhất của Gödel không áp dụng cho số học Presburger (lý thuyết bậc nhất của N\mathbb{N} chỉ có phép cộng ++, không có phép nhân ×\times)?

Định lý bất toàn thứ hai của Gödel nói gì về một hệ hình thức FF nhất quán, được tiên đề hóa hiệu quả và mở rộng số học Peano?

Gödel chứng minh một định lý đầy đủ năm 1929 và một định lý bất toàn năm 1931. Vì sao hai định lý này không mâu thuẫn nhau?

Nếu một hệ hình thức FF đúng đắn, được tiên đề hóa hiệu quả mà lại đầy đủ cho số học, điều đó sẽ kéo theo hệ quả gì cho bài toán dừng?

Tài liệu tham khảo

  1. Kurt Gödel (ed. Jean van Heijenoort) (1967). On formally undecidable propositions of Principia Mathematica and related systems I (1931), in From Frege to Gödel · DOI:10.1007/BF01700692
  2. Peter Smith (2013). An Introduction to Gödel's Theorems · DOI:10.1017/cbo9780511800962
  3. Torkel Franzén (2005). Gödel's Theorem: An Incomplete Guide to Its Use and Abuse