Xem mẫu

  1. CHƯƠNG IV: MÁY TURING Khi thiết kế và cài đặt một phần mềm tin học cho một vấn đề nào đó, ta cần phải đưa ra phương pháp giải quyết mà thực chất đó là thuật toán giải quyết vấn đề này. Rõ ràng rằng, nếu không tìm được một phương pháp giải quyết thì không thể lập trình được. Chính vì thế, thuật toán là khái niệm nền tảng của hầu hết các lĩnh vực của tin học. Ta có thể hiểu khái niệm thuật toán như sau. Nếu cho trước một bài toán thì một cách giải bài toán được phân định ra thành một số hữu hạn bước, có kết thúc cuối cùng và đạt được kết quả mong muốn gọi là thuật toán. Về mặt lịch sử, trong những năm 30 của thế kỷ trước, khi khoa học và công nghệ phát triển, nhân loại đã nêu ra nhiều bài toán mà không tìm thấy lời giải. Có nghĩa là không tìm được thuật toán để giải chúng. Người ta đã phải tìm cách định nghĩa chính xác khái niệm thuật toán. Năm 1936 A. Turing đã đưa ra một công cụ rất tốt để mô tả thuật toán mà ngày nay người ta gọi là máy Turing. Để ghi nhớ công lao này, Hội Tin học Mỹ (ACM) đã đặt ra giải thưởng Turing trong tin học. Cho đến nay, giải thưởng Turing là giải thưởng tin học lớn nhất thế giới. Tiếp theo Turing, một số nhà khoa học khác đã đưa ra các công cụ chính xác hoá khái niệm thuật toán. Đó là các khái niệm hàm đệ quy, thuật toán Marcop, văn phạm sinh của N. Chomsky. Những khái niệm này là cơ sở phát triển của việc nghiên cứu và ứng dụng thuật toán. Mặt khác chính nhờ các khái niệm này, người ta cũng xác định được những bài toán không thể giải được bằng thuật toán. A. Turing đã đề xuất khái niệm máy Turing nhằm chính xác hoá khái niệm thuật toán. Thực tế đã chứng tỏ rằng máy Turing là một công cụ rất tốt để mô tả thuật toán. Trải qua nhiều thập niên, lý thuyết về máy Turing đã phát triển không ngừng bởi sự đóng góp công sức của nhiều nhà khoa học, trong đó có những công trình nền tảng của Hartmanis, Lewis, Stearns, Minsky, Blum, Hopcroft, Ullman. Thực chất, máy Turing là một mô hình máy. Nó phân rã toàn bộ quá trình hoạt động ra thành các bước thao tác rất đơn giản. Bản thân máy Turing là một mô hình khái quát và đơn giản có thể mô hình hoá một quá trình tính toán bất kỳ. Máy Turing có thể xem là một máy với bộ nhớ ngoài có dung lượng được xem như vô hạn. Trong bộ nhớ ngoài, các giá trị được bố trí sao cho có thể truy cập, đọc và sửa đổi được. Ta có thể xem máy Turing như là một máy đoán nhận một ngôn ngữ gọi là ngôn ngữ đếm được đệ quy. Đồng thời được sử dụng để mô tả một lớp hàm quan trọng, gọi là các hàm có thể tính được. Chương này cũng mô tả một máy Turing 60
  2. phổ dụng mà nó có thể bắt chước hoạt động của tất cả các máy Turing khác. Từ đó ta đi đến khái niệm bài toán không giải được bằng thuật toán. 4.1. MÁY TURING VÀ LỚP CÁC HÀM CÓ THỂ TÍNH ĐƯỢC. 4.1.1. Định nghĩa: Máy Turing đơn định là một bộ bảy M = , trong đó, − Q là tập hữu hạn khác rỗng, gọi là tập các trạng thái; − Σ là một bảng chữ, gọi là bảng chữ vào hay bảng chữ trong; − ∆ là một bảng chữ, ∆ ⊃ Σ, gọi là bảng chữ ngoài hay tập các ký hiệu có thể ghi được lên băng; − δ: D ⎯ → Q x ∆ x {R, L}, với D⊂Q x ∆ và R, L∉Q x ∆, gọi là ánh xạ chuyển; ⎯ − s0∈Q, gọi là trạng thái đầu; − B∈∆ \ Σ, gọi là ký hiệu trắng; − F⊂Q, gọi là tập các trạng thái kết thúc. Trong trường hợp miền giá trị của δ là P(Q x ∆ x {R, L}) thì máy Turing được gọi là không đơn định và lớp các ngôn ngữ được đoán nhận bởi máy Turing đơn định và không đơn định sẽ trùng nhau. Ngoài ra, có nhiều dạng máy Turing; chẳng hạn, máy Turing với băng vô hạn một đầu hoặc băng vô hạn hai đầu. Ở đây, ta chỉ xét lớp các máy Turing đơn định với băng vô hạn hai đầu. 4.1.2. Định nghĩa: Cho máy Turing M = . Bộ ba , trong đó ϕ, ψ∈∆*, s∈Q, a∈∆, ϕ không được bắt đầu và ψ không được kết thúc bởi B, được gọi là một hình trạng của M. ϕaψ được gọi là từ ứng với hình trạng đã cho. Bộ ba , trong đó a∈∆, ψ∈∆*, được gọi là hình trạng đầu (có từ ứng với nó là aψ). 4.1.3. Định nghĩa: Cho máy Turing M = . Ta nói hình trạng α= chuyển đến hình trạng β của M, ký hiệu α M β hay đơn giản là α β, nếu thoả mãn một trong các điều sau: 1) δ(s, a)=: a) ψ=cψ1≠ε, c∈∆, ψ1∈∆*: + α , nếu ϕb∉{B}*, ϕ ψ1 ϕ ψ1 B a c B b c B ⇒ B s q , nếu ϕb∈{B}*, +α 61
  3. ψ1 B ψ1 B a c B B c B ⇒ q s b) ψ=ε: , nếu ϕb∉{B}*, + α= a b ϕ ⇒ ϕ B B B B B s q , nếu ϕb∈{B}*, + α= B B a B B B B ⇒ B B B B B B B s q 2) δ(s, a)=: a) ϕ=ϕ1d≠ε, d∈∆, ϕ1∈∆*: + α , nếu dbψ∉{B}*, ψ ϕ1 ⇒ ϕ1 ψ B d b B B d a B q s , nếu dbψ∈{B}*, +α ϕ1 ϕ1 ⇒ B B a B B B B B B B B B q s b) ϕ=ε: , nếu Bbψ∉{B}*, + α= ψ ⇒ ψ B B a B b B q s 62
  4. , nếu Bbψ∈{B}*, + α= ⇒ B B B B B B B B B a B B B B q s Dãy hình trạng αi (1≤i≤n) của máy Turing M sao cho αi αi+1 (1≤i≤n-1) M α hay đơn giản là α được gọi là quá trình tính toán trong M, ký hiệu α1 αn. n 1 Các hình trạng không thể chuyển đến hình trạng mới được gọi là hình trạng cuối. Quá trình tính toán được bắt đầu bởi hình trạng đầu và kết thúc bởi hình trạng cuối được gọi là một quá trình tính toán hoàn chỉnh. 4.1.4. Định nghĩa: Cho máy Turing M = và ω∈Σ*. Ta nói M đoán nhận ω nếu tồn tại quá trình tính toán hoàn chỉnh với q∈F. Tập hợp các từ được đoán nhận bởi máy Turing M được gọi là ngôn ngữ được đoán nhận bởi M, ký hiệu T(M). Ngôn ngữ được đoán nhận bởi máy Turing còn được gọi là ngôn ngữ đệ quy đếm được (Recursively Enumerable). Ngôn ngữ được đoán nhận bởi máy Turing mà nó sẽ dừng sau một số hữu hạn bước đối với mọi từ vào được gọi là ngôn ngữ đệ quy. Từ định nghĩa suy ra rằng mọi ngôn ngữ đệ quy đều là ngôn ngữ đệ quy đếm được. 4.1.5. Chú ý: Sự hoạt động của máy Turing được thể hiện ở ánh xạ chuyển. Ánh xạ này có thể được mô tả bằng bảng hoặc đồ thị chuyển. Bảng gồm các cột được đánh dấu bằng các ký hiệu của ∆ và các dòng được đánh dấu bằng các trạng thái. Nếu δ(s, a)=, với a, b∈∆, s, q∈Q, C∈{R, L} thì bộ ba được ghi vào ô ứng với dòng s cột a. Đồ thị chuyển là một đa đồ thị có hướng, có khuyên G với tập đỉnh của G là Q. Với a, b∈∆, s, q∈Q, C∈{R, L}, nếu δ(s, a)= thì có một cung từ s đến q với nhãn là . Thí dụ 1: Cho máy Turing: M = , trong đó δ(s0, 0)=, δ(s0, 1)=, δ(s1, 0)=, δ(s1, 1)=, δ(s1, B)=, δ(s2, 0)=, δ(s2, 1)=, δ(s2, B)=, δ(s3, 0)=, δ(s4, 1)=, δ(s5, 0)=, δ(s5, 1)=, δ(s5, X)=, δ(s6, 0)=, δ(s6, 1)=, δ(s6, X)=. 63
  5. Ánh xạ chuyển có thể cho bằng bảng sau: B 0 1 X S0 S1 S2 S3 S4 S5 S6 Đồ thị chuyển của M là: s4 s6 s2 s0 s5 s1 s3 Ta hãy xem máy Turing M hoạt động như thế nào đối với các từ 001 và 1001. Đối với từ 001, ta có dãy hình trạng: . Rõ ràng hình trạng cuối, nhưng s3 không phải là trạng thái kết thúc, do đó M không đoán nhận từ 001. Đối với từ 1001, ta có dãy hình trạng: . là hình trạng cuối và s0 là trạng thái kết thúc nên từ 1001 được đoán nhận bởi máy Turing M. Từ đồ thị chuyển dễ dàng thấy rằng M hoạt động với xâu vào ω như sau: M đọc xâu ω từ trái sang phải. Bắt đầu từ trạng thái s0, thay ký hiệu đã đọc bởi ký hiệu X, đồng thời nếu ký hiệu vừa đọc là 0 thì chuyển sang trạng thái s1 và nếu 64
  6. ngược lại thì chuyển sang trạng thái s2. Tại các trạng thái s1 hoặc s2, máy M chuyển đầu đọc qua phải mà không thay đổi ký hiệu được đọc cho đến khi gặp ký hiệu B. Từ s1 máy chuyển sang s3 và từ s2 máy chuyển sang s4. Từ s3 nếu gặp 0 thì xoá 0 và sang s5, từ s4 nếu gặp 1 thì xoá 1 và sang s6. Ở đây, ta cần lưu ý rằng xoá 0 trong trường hợp xuất phát từ s0, máy thay 0 bởi X và xoá 1 trong trường hợp xuất phát từ s0, máy thay 1 bởi X. Tại các trạng thái s5 và s6, máy dịch chuyển qua trái mà không làm thay đổi các ký hiệu trên băng cho đến khi gặp ký hiệu X, máy quay trở lại s0 và tiếp tục quá trình trên cho đến khi máy dừng ở các trường hợp sau: − Máy ở trạng thái s3 gặp 1 hoặc ở trạng thái s4 gặp 0. Trong trường hợp này rõ ràng ω ban đầu không có dạng ααR và máy không đoán nhận từ này. − Máy ở trạng thái s0 và gặp ký hiệu B. Điều này có nghĩa là các ký hiệu 0, 1 trên băng đã được thay bằng X hoặc B. Điều này chỉ xảy ra khi xâu vào ω có dạng ααR. Vậy T(M)={ααR | α∈{0, 1}*}. 4.1.6. Định nghĩa: Cho máy Turing M = . Hàm được xác định bởi máy Turing M là hàm: ⎧ψ khi < ε , s 0 , aω ' > < ψ ' , q, bψ ' ' > là một quá trình tính toán hoàn chỉnh ⎪ f M (ω ) = ⎨ ở đây aω ' = ω , ψ ' bψ ' ' = ψ ; ⎪ Không xác định khi không tồn tại quá trình như vậy. ⎩ Thí dụ 2: Cho hàm f(ω)=ωBω (ω∈{0, 1}*). Ta xây dựng máy Turing M xác định hàm f như sau: M = , trong đó ánh xạ chuyển δ được chỉ ra trong đồ thị chuyển dưới đây: s3 s4 s7 s8 s0 s6 s5 s1 s2 M hoạt động như sau: ký hiệu đầu tiên của ω được thay bởi X hoặc là Y tuỳ thuộc vào ký hiệu đó là 0 hay 1, sau đó đầu đọc/ghi chuyển sang phải để tìm ký hiệu B, thay ký hiệu B tiếp theo bằng 0 hoặc 1 tuỳ thuộc trước đó đã ghi x hay Y. Sau đó chạy ngược lại để tìm ký hiệu X hay Y và thay nó bởi 0 hoặc 1 tương ứng và lại chuyển sang phải. Nếu ký hiệu này là B thì tính toán kết thúc, ngược lại thì 65
  7. lặp lại quá trình trên. Dễ dàng thấy rằng, sau mỗi vòng thực hiện một ký hiệu của ω được ghi sang bên phải và khi quá trình tính toán kết thúc trên băng là ωBω hay fM=ωBω. 4.1.7. Định nghĩa: Cho hàm f: D ⎯ → N, với N là tập số tự nhiên, D⊂Nm và m là ⎯ một số nguyên dương. Ở đây, với mỗi số tự nhiên n, ký hiệu n =1n+1. Ta nói hàm f có thể tính được bằng máy Turing nếu tồn tại máy Turing M xác định hàm sau: ⎧ϕB f (n1 , n2 ,..., nm ) nếu f(n1, n2, …, nm) tồn tại và ⎪ ⎪ h(B n1 B n 2 … n m−1 B n m )= ⎨
  8. ⎧0 khi n2 ≥ n1 ; Thí dụ 5: Cho hàm f(n1, n2)= ⎨ Khi đó hàm f có thể tính được bằng ⎩1 khi n2 < n1 . máy Turing M có đồ thị chuyển dưới đây. Hình trạng đầu là , hình trạng cuối là sẽ là trong trường hợp n2≥n1 và trong trường hợp n1>n2.
  9. 1: print B, 2: move left, 3: if 1 then go to 2, 4: print 1, 5: move left, 6: if 1 then go to 5, 7: print 1, 8: move right, 9: if 1 then go to 1, 10: stop, Các máy Turing và các hàm có thể tính được bằng máy Turing đóng vai trò quan trọng trong lý thuyết thuật toán. Cơ sở cho việc xây dựng một số lý thuyết thuật toán từ máy Turing là định đề Church sau đây. Định đề Church: Lớp các hàm có thể tính được bằng thuật toán trùng với lớp các hàm có thể tính được bằng máy Turring. 4.2. MÁY TURING PHỔ DỤNG. 4.2.1. Mở đầu: Máy Turing phổ dụng là một máy Turing có thể bắt chước sự hoạt động của bất kỳ máy Turring nào. Máy Turing phổ dụng U có thể được hiểu như sau: với một cách mã hoá thích hợp ánh xạ chuyển trạng thái của máy Turing bất kỳ và từ ω trên bảng chữ vào. Với từ đã mã hoá này, máy Turing phổ dụng U dừng khi và chỉ khi máy Turing M dừng với từ ω. Ta có thể xem máy Turing phổ dụng như là mô hình toán học của máy tính điện tử ngày nay. Các máy này thực hiện công việc bằng cách mã hoá chương trình theo ngôn ngữ bên trong được gọi là ngôn ngữ máy. Tập các ký hiệu ghi lên băng là hữu hạn nên ta có thể ký hiệu chúng như sau: S0=B, S1, S2, …, Sm và có thể mã hoá bằng bộ các chữ số 1. Chẳng hạn, B−1, S1−11, S2−111, …, Sm−1m+1. Tương tự, tập các trạng thái là hữu hạn và ta cũng có thể mã hoá chúng: q0−1, q1−11, q2−111, …, qn−1n+1. Cuối cùng hai ký hiệu L và R cũng có thể mã hoá: L−1, R−11. Bây giờ để mã hoá ánh xạ chuyển trạng thái của máy Turing, ta sử dụng bảng biểu diễn ánh xạ này. Trong bảng, các cột được ký hiệu bởi các ký hiệu có thể ghi lên băng, các dòng được ký hiệu bởi các trạng thái. Tiếp theo liệt kê các phần tử của bảng theo dòng cùng với các chỉ số dòng và cột tương ứng của chúng, thứ tự là các phần tử của dòng 1, dòng 2, …từ trái sang phải. Chẳng hạn, trên một dòng xuất hiện bộ có nghĩa là δ(qi, Sj)=. Giữa các dãy mã 68
  10. của các bộ năm có chèn hai chữ số 0 và giữa mã các ký hiệu trong cùng một bộ năm được chèn bởi một chữ số 0. Máy Turing M được mã hoá như vậy ký hiệu là [M]. Ta chấp nhận mà không chứng minh ở đây là với máy Turing M bất kỳ tồn tại một máy Turing tương đương chỉ có một trạng thái kết thúc, vì vậy ta có thể xem q0 là trạng thái đầu và q1 là trạng thái kết thúc duy nhất của máy Turing M. Thí dụ 7: Cho máy Turing M với ánh xạ chuyển được cho bởi bảng sau: B S1 q0 q1 q2 Các phần tử của bảng được sắp xếp thành dãy dưới đây: , , , . Dãy này sẽ được mã hoá dưới dạng xâu nhị phân: [M] = 10101101101100101101101101001101101101011100111011011010111. Nếu trên băng vào có ω=S1S1BS1 thì mã tương ứng của nó là: [ω] = 1101101011. 4.2.2. Hoạt động của máy Turing phổ dụng: Bây giờ giả sử máy Turing M có n trạng thái và bảng chữ ghi lên băng có m ký hiệu, thêm vào đó các ký hiệu, các trạng thái và ánh xạ chuyển của M được mã hoá như đã nói ở trên. Mô hình hoá hoạt động của máy Turing M bằng một máy Turing phổ dụng U có thể mô tả khái quát như sau: Trước hết [M] và [ω] cần phải được ghi lên băng của máy Turing phổ dụng U theo quy cách sau đây. Ký hiệu X được ghi lên băng chia băng thành hai nửa vô hạn. Nửa băng bên phải được dành ra ba đoạn kề nhau kể từ vị trí ký hiệu ngay sau X: Đoạn đầu tiên được gọi là Buffer gồm n+m+2 vị trí ký hiệu và tất cả được nhận ký hiệu 0; đoạn tiếp theo được gọi là vùng mã hoá của M, bắt đầu bởi ký hiệu Y, tiếp sau Y là [M] và được kết thúc bởi ba chữ số 0; đoạn sau cùng được gọi là đoạn mã của ω, bắt đầu bởi ký hiệu Z và tiếp theo là [ω]. Hình ảnh của băng lúc đầu là như sau: Y X Z Buffer Mã hoá ω Mã hoá M Buffer phục vụ cho việc ghi nhận hình trạng của M trong từng bước. Ta có thể sao chép vào vùng này trạng thái bên trong và mã hoá của ký hiệu đang đọc. Ký hiệu Y thường đứng trước bộ năm xác định trạng thái hiện hành của M, ký hiệu 69
  11. hiện hành trên băng, hướng chuyển động của đầu đọc trên băng. Z đánh dấu ký hiệu đang đọc trên băng của M. Quá trình tính toán trong U mô phỏng hoạt động của máy Turing M với xâu vào ω được chia ra các pha thích hợp với việc dịch chuyển các hình trạng của M. Một giai đoạn (pha) hoạt động của máy Turing phổ dụng U có thể tóm tắt như sau. Đầu tiên sao chép vào Buffer một khối các ký hiệu 1 nằm ngay sau Y (gọi là khối Y), sau đó ghi vào cuối khối vừa được chép một ký hiệu X, tiếp theo xoá ký hiệu Y, chạy sang phải tìm ký hiệu Z và sao chép khối ký hiệu 1 ngay sau Z (gọi là khối Z) vào Buffer ngay sau ký hiệu X rồi ghi lại ký hiệu Y trước [M]. Như vậy sau giai đoạn này trong Bufffer chứa mã của trạng thái và ký hiệu hiện hành của máy Turing M. Bước tiếp theo, máy Turing phổ dụng U so sánh hai khối ký hiệu 1 liên tiếp nhau sau Y với nội dung Buffer. Nếu trùng nhau thì tìm được bộ năm cần tìm. Nếu ngược lại thì tìm đến mã hoá của bộ năm tiếp theo sau Y và lại tiếp tục so sánh. Trong trường hợp giữa các bộ năm mô tả M không tìm thấy bộ nào thích hợp thì U dừng. Ngược lại, nếu tìm được bộ năm cần tìm thì xoá nội dung buffer rồi chuyển Y đến trước phần tử thứ ba trong bộ năm đó. Đổi nội dung của khối sau Z bởi nội dung của khối sau Y và chuyển Y đến trước phần tử thứ tư của bộ năm. Sau khi đã đọc xong phần tử thứ tư mà nó xác định hướng chuyển động của đầu đọc/ghi của M và U chuyển ký hiệu Y đến sau phần tử trước phần tử thứ năm. Tuỳ thuộc vào nội dung của khối thứ tư (một ký hiệu 1 hay hai ký hiệu 1) U chuyển Z qua phải hay qua trái một khối. Nếu Z lúc đầu nằm ở tận cùng trái của băng ghi và M cần dịch chuyển sang phải thì U đẩy mã của từ sang phải và ghi mã hoá của ký hiệu trắng vào sau Z. Nếu Z nằm tận cùng phải của băng và cần chuyển sang phải, khi đó U ghi mã của ký hiệu trắng vào cuối từ. Khi hoàn thành các công việc trên khối ký hiệu 1 đứng sau Y, ký hiệu trạng thái hiện hành của M, còn khối sau Z xác định ký hiệu M cần đọc tiếp theo. Như vậy, giai đoạn tiếp theo của việc mô phỏng bước tiếp theo của M có thể bắt đầu. Các giai đoạn hoạt động của máy Turing phổ dụng U mô hình hoá hoạt động từng bước của máy Turing M như dã chỉ ở trên. Ngoài ra, U còn thực hiện công việc sau đây. Đầu tiên U thay tất cả các ký hiệu 0 trên ba đoạn của băng vào bằng các khoảng trắng, cuối công việc, khi M dừng máy U còn kiẻm tra liệu trạng thái cuối của M có phải là trạng thái kết thúc hay không. Các pha của một máy Turing phổ dụng U được chia thành chín phần: − Phần 1: Thay các ký hiệu 0 bởi ký hiệu B và đầu đọc/ghi chuyển đến trước Y. − Phần 2: Sao chép mã của trạng thái hiện hành vào buffer. − Phần 3: Sao chép mã của ký hiệu cần đọc trên băng của M vào buffer. − Phần 4: Đặt X và Y vào trước buffer và trước ký hiệu của [M]. 70
  12. − Phần 5: Tìm bộ năm có mã của trạng thái và ký hiệu trên băng trùng với buffer. − Phần 6: Xoá buffer. − Phần 7: Thay mã ký hiệu đã đọc bằng mã ký hiệu mới của M. − Phần 8: Đẩy Z sang phải hay sang trái một khối mà mã ký hiệu của khối đó sẽ được đọc trong pha tiếp theo. Nếu cần thì ghi mã một khoảng trắng vào phải hoặc trái từ trên băng của M. − Phần 9: Máy Turing phổ dụng U dừng ở trạng thái kết thúc khi và chỉ khi M dừng ở trạng thái kết thúc. Đồng thời trong vùng mã hoá của từ trên băng sẽ chứa mã của từ đáng ra còn lại trên băng của M, còn mã của trạng thái cuối của M có thể thấy trên buffer. Dưới đây là đồ thị chuyển trạng thái phù hợp cho việc mô tả máy Turing phổ dụng U. Sao chép khối Sao chép khối X vào Y vào Buffer Buffer Đẩy mã của băng So sánh khối qua phải hai vị trí X với khối Y ký hiệu Trùng Không trùng Trùng So sánh khối X với khối Y Thay khối Z bằng khối Y Không trùng 71
  13. 4.3. VẤN ĐỀ KHÔNG GIẢI ĐƯỢC BẰNG THUẬT TOÁN. 4.3.1. Mở đầu: Trong toán học thường gặp vấn đề cần xác định liệu một phần tử của một lớp vô hạn nào đó có một số tính chất đã cho hay không. Chẳng hạn, ta có thể hỏi liệu hai số tự nhiên cho trước có nguyên tố cùng nhau hay không, hoặc là một máy Turing có dừng sau một số hữu hạn bước hay không, … Các vấn đề trên được gọi là vấn đề thuật toán và có thể quy về vấn đề là liệu một từ trên bảng chữ nào đó có thuộc vào một ngôn ngữ hình thức đã cho hay không. Một bài toán được gọi là không giải được bằng thuật toán nếu không tồn tại một máy Turing nào sau một số hữu hạn bước xác định được liệu một sự mã hoá cụ thể nào đó của bài toán có thuộc ngôn ngữ hình thức đã cho hay không. Trong trường hợp ngược lại thì bài toán được gọi là giải được bằng thuật toán. Như vậy, một vấn đề giải được bằng thuật toán nếu và chỉ nếu ngôn ngữ hình thức mô tả nó là đệ quy. Sau đây ta sẽ nghiên cứu một vài tính chất của ngôn ngữ đệ quy và đệ quy đếm được. Việc chứng minh các tính chất này khá phức tạp nên ta không đi sâu vào chi tiết. 4.3.2. Định lý: Phần bù của một ngôn ngữ đệ quy là ngôn ngữ đệ quy. Chứng minh: Giả sử L là một ngôn ngữ đệ quy trên bảng chữ Σ. Điều này có nghĩa là tồn tại một máy Turing M mà với từ ω∈Σ* tuỳ ý nó dừng sau một số hữu hạn bước và T(M)=L. Thay tập trạng thái kết thúc của M bằng phần bù của nó, ta được một máy Turing mới M’. Dưới tác động cùng một từ, M’ dừng với trạng thái kết thúc khi và chỉ khi dưới tác động của từ đó M dừng với trạng thái không kết thúc. Điều này dẫn đến T(M’)= L . Do M’ dừng sau một số hữu hạn bước với mọi từ vào nên T(M’)= L cũng là ngôn ngữ đệ quy. 4.3.3. Định lý: Nếu L là ngôn ngữ đệ quy đếm được trên bảng chữ Σ và phần bù L của nó cũng là đệ quy đếm được thì L là đệ quy. Chứng minh: Giả sử M1, M2 là các máy Turing sao cho T(M1)=L và T(M2)= L . Ta cần xây dựng máy Turing M’ mà nó mô hình hoá đồng thời sự hoạt động của M1, M2. Điều ta cần có là dưới tác động của từ ω, máy Turing M’ ngừng hoạt động khi và chỉ khi M1 hoặc M2 đoán nhận từ ω. Ta muốn M1 dừng với trạng thái kết thúc, còn M2 dừng với trạng thái không kết thúc. Việc xây dựng này là có thể thực hiện được và với mọi từ ω máy Turing M’ sau một số hữu hạn bước sẽ dừng. Nếu ω∈Σ* thì ω∈L hoặc ω∈ L . Nếu ω∈ L thì M2 sẽ đoán nhận ω sau một số hữu hạn bước. Từ đó nếu M1 không dừng sau một số hữu hạn bước thì M’ phải hoàn thành công việc của mình trong thời gian hữu hạn. Như vậy T(M1)=L là đệ quy. 4.3.4. Định lý: Tồn tại một ngôn ngữ đệ quy đếm được nhưng không đệ quy. 72
  14. Chứng minh: Xét ngôn ngữ T(U) được đoán nhận bởi máy Turing U. Khi đó T(U) là đệ quy đếm được. Giả sử T(U) là đệ quy. Điều này có nghĩa là tồn tại một máy Turing M (không đòi hỏi là trùng với U) sao cho T(M)=T(U) và sẽ dừng sau một số hữu hạn bước dưới tác động của mọi từ trên bảng chữ vào. Ta xây dựng máy Turing M’ như sau: Giả sử ω là một từ trên bảng chữ vào của M’. Trước hết M’ cho mã [ω] của ω, đồng thời trên cơ sở sắp xếp các từ trên bảng chữ vào tìm chỉ số i của ω (số thứ tự của ω trong dãy là i). Tiếp theo ứng với các chỉ số i, máy Turing M’ thiết lập sự mô tả mã của máy Turing thứ i trong dãy các máy Turing M1, M2, …Cuối cùng M thiết lập sự mô tả chuẩn của từ ωi và Mi, . M’ bắt chước sự hoạt động của máy Turing M với từ mà theo giả thiết nó tồn tại, đoán nhận ngôn ngữ T(U) và dừng sau một số hữu hạn bước đối với mọi từ trên bảng chữ vào. Nếu M kết thúc sự hoạt động với trạng thái không kết thúc thì khi đó M’ chuyển sang một trạng thái kết thúc riêng và dừng. Nếu M dừng ở trạng thái kết thúc thì M’ bắt đầu bắt chước sự hoạt động của máy Turing mà nó không dừng với mọi từ của bảng chữ vào. Rõ ràng rằng máy Turing M’ đoán nhận từ ω=ωi khi và chỉ khi không đoán nhận . Ta biết rằng T(M)=T(U)={ | ϕ∈T(Mi)}. Đồng thời mọi máy Turing đều có mặt trong dãy M1, M2, … và do đó M’ cũng nằm trong dãy này, có nghĩa là tồn tại một số tự nhiên h sao cho M’=Mh. Bây giờ ta xem máy Turing M1 hoạt động như thế nào với từ ω1. Ta nhận được ω1∈T(M’) khi và chỉ khi ω1∈T(M1). Điều này mâu thuẫn với giả thiết. Vậy T(U) không đệ quy. 4.3.5. Hệ quả: Tồn tại một ngôn ngữ hình thức nhưng không đệ quy đếm được. Chứng minh: Như trong chứng minh của Định lý 4.3.4, T(U) là đệ quy đếm được nhưng không đệ quy. Do đó theo Định lý 4.3.3, phần bù của T(U) là không đệ quy đếm được. 4.3.6. Định lý: Một ngôn ngữ hình thức là loại 0 khi và chỉ khi nó là đệ quy đếm được. Điều này có nghĩa là lớp ngôn ngữ hình thức loại 0 chính là lớp ngôn ngữ đệ quy đếm được. 4.3.7. Chú ý: Nhờ vào Định lý 4.3.4, ta thấy rằng có những ngôn ngữ đệ quy đếm được nhưng không đệ quy. Với việc mã hoá thích hợp, ta chỉ ra rằng nhiều vấn đề không giải quyết được bằng thuật toán. Ta sẽ khảo sát một số vấn đề liên quan đến lớp các ngôn ngữ đệ quy đếm được. Chẳng hạn như một ngôn ngữ đệ quy đếm được có rỗng hay không, có hữu hạn hay không, có chính quy hay không, có là phi ngữ cảnh hay không và có là cảm ngữ cảnh hay không, … Tất cả các ngôn ngữ có 73
  15. tính chất này hình thành lên một lớp con của lớp các ngôn ngữ đệ quy đếm được. Khi ta khảo sát một ngôn ngữ có hay không một tính chất đã cho thì thực tế ta cần giải quyết vấn đề ngôn ngữ này có thuộc hay không lớp con đã cho của lớp các ngôn ngữ đệ quy đếm được. Ta nói rằng một tính chất của các ngôn ngữ đệ quy đếm được là tầm thường nếu hoặc mọi ngôn ngữ đệ quy đếm được đều có tính chất này hoặc ngược lại mọi ngôn ngữ đệ quy đếm được không có tính chất này. Điều này có nghĩa là lớp con các ngôn ngữ xác định bởi tính chất này hoặc bằng rỗng hoặc bằng chính lớp các ngôn ngữ đệ quy đếm được. Như vậy các tính chất: một ngôn ngữ đã cho có rỗng hay không, có hữu hạn hay không, có chính quy hay không, … là không tầm thường. Có những ngôn ngữ đệ quy đếm được có những tính chất trên và có những ngôn ngữ đệ quy đếm được không có tính chất trên. Từ Định lý 4.3.3, ta biết rằng muốn xác định bằng thuật toán việc thực hiện một tính chất nào đó thì vấn đề này được giải quyết bằng thuật toán khi và chỉ khi việc phủ định của tính chất này cũng được giải quyết bằng thuật toán. 4.3.8. Định lý: Cho trước một tính chất không tầm thường của lớp các ngôn ngữ đệ quy đếm được. Khi đó vấn đề xác định rằng một ngôn ngữ có tính chất này hay không là không giải quyết được bằng thuật toán. 4.3.9. Hệ quả: Việc xác định rằng một ngôn ngữ đệ quy đếm được có là: a) Rỗng, b) Hữu hạn, c) Chính quy, d) Phi ngữ cảnh, e) Cảm ngữ cảnh, f) Đệ quy hay không là vấn đề không giải được bằng thuật toán. 4.3.10. Định lý: Mọi ngôn ngữ cảm ngữ cảnh đều là ngôn ngữ đệ quy. 4.3.11. Định lý: Tồn tại một ngôn ngữ đệ quy mà không là ngôn ngữ cảm ngữ cảnh. 74
  16. BÀI TẬP CHƯƠNG IV: 1. Hãy xây dựng một máy Turring M sao cho T(M)={anbncn | n≥1}. 2. Cho máy Turing M = , trong đó: δ(s0, 0)=, δ(s0, Y)=, δ(s1, 0)=, δ(s1, 1)=, δ(s1, Y)=, δ(s2, 0)=, δ(s2, X)=, δ(s2, Y)=, δ(s3, Y)=, δ(s3, B)=. a) Hãy vẽ đồ thị chuyển của M. b) Hãy trình bày các quá trình tính toán hoàn chỉnh của máy M xuất phát từ các hình trạng đầu sau: , , , . c) Hãy xác định ngôn ngữ T(M). 3. Chứng tỏ rằng các hàm dưới đây có thể được xác định bằng máy Turing. a) f (ω ) = ωBωB...Bω , ω ∈ {1}+ . 14243 n lần ω b) f (ω ) = ωBω R , ω ∈ {0,1}+ . c) f (ωBωω ), ω ∈ {0,1}+ . d) f (1n B1m ) = 1nm , n, m ≥ 0 . e) f (1n ) = (0011) n . ⎧1 khi ϕ = ϕ R , ⎪ f) f (ϕ ) = ⎨ ⎪0 khi ϕ ≠ ϕ R ; ϕ ∈ {0,1}∗ . ⎩ 4. Chứng tỏ rằng các hàm dưới đây có thể tính được bằng máy Turing. a) f(n1)=3n1. b) f(n1)=n1+3. c) f(n1, n2)=n1n2. d) f(n1, n2)=|n1−n2|. ⎧n − n2 khi n1 ≥ n2 , e) f(n1, n2)= ⎨ 1 ⎩0 khi n1 < n2 . ⎧0 khi n1 = n2 , f) f(n1, n2)= ⎨ ⎩1 khi n1 ≠ n2 . 5. Cho f1, f2, …, fn là các hàm m biến và g là hàm n biến. Chứng minh rằng nếu các hàm trên đều có thể tính được bằng máy Turing thì hàm h(x1, x2, …xm)=g(f1(x1, x2, …xm), f2(x1, x2, …xm), …, fn(x1, x2, …xm)) 75
  17. cũng có thể tính được bằng máy Turing. 76
nguon tai.lieu . vn