Nó cung cấp những kiến thức cơ bản về máy tính như: Các máy truy cấp ngẫu nhiên, các ôtômát hữu hạn trạng thái, các ngôn ngữ hình thức và văn phạm được sử dụng, lý thuyết về độ phúc tạp
Trang 1BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
Đề tài:
UNDECIDABLE PROBLEMS ABOUT TURING
MACHINE
GVHD: PGS.TS PHAN HUY KHÁNH NHÓM HỌC VIÊN: NGUYỄN TUẤN TRUNG
LÊ QUỐC DŨNG
NGUYỄN VĂN PHÚ
MÔN: LÝ THUYẾT TÍNH TOÁN LỚP: CAO HỌC KHÓA 24 CHUYÊN NGÀNH: KHOA HỌC MÁY TÍNH
Đà Nẵng, tháng 05 năm 2012
MỤC LỤC
***
Trang 2BỘ GIÁO DỤC & ĐÀO TẠO 1
TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG 1
MỤC LỤC 1
U 6
M 7
M’ 7
M 10
ML 10
M’ 10
LỜI MỞ ĐẦU
Trong thời kỳ phát triển công nghệ cao, thời đại mà thông tin, tri thức trở thành lực lượng sản xuất trực tiếp, thời đại của xã hội thông tin và nền kinh tế tri thức được hình thành trên cơ sở phát triển và ứng dụng rộng rãi công nghệ thông tin và truyền thông Cuộc cách mạng thông tin cùng với quá trình toàn cầu hóa đang ảnh hưởng sâu sắc đến mọi lĩnh vực trong đời sống kinh tế - xã hội, đưa con người chuyển nhanh từ
xã hội công nghiệp sang xã hội thông tin, từ kinh tế công nghiệp sang kinh tế tri thức,
ở đó năng lực cạnh tranh phụ thuộc chủ yếu vào năng lực sáng tạo, thu thập, lưu trữ,
Trang 3xử lý và trao đổi thông tin Máy tính đóng vai trò quan trọng trong cuộc cách mạng này
Lý thuyết tính toán là nền tảng lý thuyết của thông tin và tính toán để tạo ra sự thực thi và các ứng dụng trên hệ thống máy tính Nó nghiên cứu các khả năng tính toán khi áp dụng trên các loại máy tính hiện hành Nguyên lý đã được phát triển bởi Alan Turing và những nhà khoa học khác Nó cung cấp những kiến thức cơ bản về máy tính như: Các máy truy cấp ngẫu nhiên, các ôtômát hữu hạn trạng thái, các ngôn ngữ hình thức và văn phạm được sử dụng, lý thuyết về độ phúc tạp tính toán, lý thuyết ước tính, mô hình máy Turing, các hàm đệ quy, …
Trong khuôn khổ đề tài này chúng tôi chỉ trình bày những hiểu biết về một phần của lĩnh vực về máy Turing Đề tài gồm các phần chính như sau:
Phần I: Lý thuyết – Dịch nội dung “ Chapter 9.3: Undecidable Problems About Turing Machine”.
Phần II: Bài tập
Chúng tôi xin chân thành cảm ơn PGS.TS Phan Huy Khánh đã tận tình giảng
dạy và hướng dẫn để chúng tôi hoàn thành tiểu luận này
Mặc dù đã nghiên cứu kỹ phần lý thuyết để có được cách giải quyết bài tập đúng đắn nhưng không thể tránh khỏi những thiếu sót, kính mong nhận được sự góp ý của Thầy và các anh chị trong lớp để đề tài được hoàn thiện tốt hơn
Nhóm thực hiện báo cáo:
Nguyễn Tuấn Trung (nhóm trưởng)
Lê Quốc Dũng
Nguyễn Văn Phú
Phần I:
NỘI DUNG LÝ THUYẾT
(Chapter 9.3: Undecidable Problems About Turing Machine)
9.3 Các bài toán không giải được của máy Turing:
Chúng ta sẽ sử dụng ngôn ngữ Lu và Ld liên quan đến ngôn ngữ liệt kê đệ quy
và các ngôn ngữ đệ qui để minh họa cho các khả năng không giải được và ngôn ngữ không liệt kê đệ qui Kỹ thuật rút gọn sẽ được sử dụng để chứng minh Phần này sẽ liên quan đến việc chứng minh “định lý Rice”, định lý này cho rằng bất kỳ thuộc tính
dị thường nào của máy Turing phụ thuộc vào ngôn ngữ mà máy Turing chấp nhận thì ngôn ngữ đó là ngôn ngữ không giải được
9.3.1 Sự rút gọn:
Thông thường, nếu ta có thuật toán để chuyển trường hợp của bài toán P1 sang trường hợp của bài toán P2 mà nó cho cùng đáp số thì chúng ta nói P1 rút gọn xuống
Trang 4P2 Chúng ta cũng có thể sử dụng cách chứng minh này để minh họa rằng P2 dễ hơn P1 Vì vậy, nếu P1 là không đệ qui thì P2 không thể đệ qui Nếu P1 không là liệt kê đệ qui thì P2 cũng không thể là liệt kê đệ qui
Hình 9.7: Các rút gọn chuyển trạng thái khẳng định sang khẳng định
và trạng thái phủ định qua phủ định.
Như trong hình 9.7, một sự rút gọn phải chuyển đổi bất kỳ một trạng thái nào của P1 có trả lời “yes” sang một trạng thái của P2 cũng phải có trả lời “yes”, và mỗi trạng thái nào của P1 có trả lời “no” sang một trạng thái của P2 cũng phải trả lời “no” Chú ý rằng không cần thiết mỗi trạng thái của P2 phải là kết quả của một trong các trạng thái của P1, và trong thực tế thì thường chỉ một phần nhỏ trạng thái của P2 là kết quả của sự rút gọn
Thông thường sự rút gọn P1 thành P2 là một máy Turing lấy một trạng thái của P1 được ghi trên băng của nó và sẽ dừng tại một trạng thái của P2 trên băng từ Trong thực tế, ta thường mô tả các sự rút gọn như là các chương trình máy tính lấy một trạng thái của P1 như nhập liệu và tạo ra trạng thái của P2 như phần xuất Việc tương đương của máy Turing và chương trình máy tính cho phép chúng ta mô tả sự rút gọn bằng hai phương pháp Sự quan trọng của việc rút gọn được nhấn mạnh bởi định lý sau:
* Định lý 9.5: Nếu có một sự rút gọn từ P1 thành P2 thì:
a Nếu P1 không giải được thì P2 cũng không giải được.
b Nếu P1 không là liệt kê đệ qui thì P2 cũng không là liệt kê đệ qui.
Chứng minh: Giả sử P1 không giải được Nếu ta có thể giải P2 thì chúng ta có thể kết hợp sự rút gọn P1 thành P2 với giải thuật giải bài toán P2 để xây dựng một giải thuật giải bài toán P1
yes
no
yes no
Trang 5Để chi tiết hơn, giả sử rằng ta có thể hiện w của P1 Áp dụng thuật toán sau vào w: chuyển w thành trạng thái x của P2, sau đó áp dụng thuật toán giải P2 cho trạng thái
x Nếu thuật toán cho câu trả lời “yes” thì x thuộc P2
Do chúng ta rút gọn P1 thành P2 nên câu trả lời cho w của P1 cũng là “yes”, nghĩa là w thuộc P1 Ngược lại, nếu x không thuộc P2 thì w sẽ không thuộc P1 Tóm lai câu trả lời “x có thuộc P2 hay không?” cũng sẽ là câu trả lời cho “w có thuộc P1 hay không?”
Nhưng điều này lại trái với giả thuyết “P1 không thể giải được”, kết luận “nếu P1 không thể giải được thì P2 cũng không thể giải được”
Với phần (b), giả thuyết rằng P1 là không liệt kê đệ qui và P2 là liệt kê đệ qui
Ta có thuật toán rút gọn P1 thành P2, nhưng ta chỉ có một thủ tục để nhận dạng P2 Đó là: có một máy Turing trả lời “yes” nếu nhập liệu của nó thuộc P2 nhưng nó có thể không dừng nếu nhập liệu của nó không thuộc P2 Như trong phần (a), bắt đầu bằng thể hiện w trong P1, chuyển đổi nó bằng giải thuật rút gọn thành thể hiện x trong P2 và sau đó ứng dụng máy Turing đối với P2 cho thể hiện x Nếu x được chấp nhận thì w cũng sẽ được chấp nhận
Thủ tục này mô tả một máy Turing (sẽ không dừng) có ngôn ngữ là P1 Nếu w thuộc P1 thì x thuộc P2 vì máy Turing này chấp nhận w Nếu w không thuộc P1 thì x không thuộc P2 Máy Turing này có thể dừng hoặc không nhưng chắc chắn rằng nó không chấp nhận w vì chúng ta giả sử rằng không có máy Turing nào có ngôn ngữ P1 tồn tại Như vậy, ta đã chỉ ra được điều trái ngược là không có máy Turing cho ngôn ngữ P2 tồn tại Nghĩa là: nếu P1 không là liệt kê đệ qui thì P2 cũng là không liệt kê đệ qui
9.3.2 Các máy Turing chấp nhận ngôn ngữ rỗng:
Trong ví dụ rút gọn liên quan đến máy Turing, ta sẽ kiểm chứng hai ngôn ngữ sau Le và Lne Mỗi ngôn ngữ chứa các chuỗi là số nhị phân Nếu w là một chuỗi nhị phân thì nó sẽ biểu diễn cho một máy Turing bất kỳ Mi trong danh sách các máy Turing đã liệt kê ở phần 9.1.2
Nếu L(Mi)=φ, nghĩa là Mi không chấp nhận ngôn ngữ nào thì w sẽ thuộc Le Vì vậy, Le là ngôn ngữ chứa tất cả các mã hóa của các máy Turing có ngôn ngữ là rỗng Ngược lại, nếu L(Mi) không là ngôn ngữ rỗng thì w sẽ thuộc Lne Vì vậy Lne là ngôn ngữ chứa tất cả các mã hóa của các máy Turing chấp nhận ít nhất là một chuỗi nhập liệu (không rỗng)
Trang 6Để tiện thì ta xem các chuỗi như là các máy Turing mà nó biểu diễn, do vậy ta
có thể định nghĩa cho hai ngôn ngữ vừa đề cập như sau:
- Le = {M | L(M) = φ}
- Lne = {M | L(M) ≠φ}
Chú ý rằng Le và Lne là hai ngôn ngữ chứa các số nhị phân {01} và một ngôn ngữ sẽ là phần bù của ngôn ngữ kia
* Định lý 9.8: Lne là liệt kê đệ qui.
Chứng minh: Ta phải chỉ ra có một máy Turing chấp nhận Lne Dễ nhất là chỉ
ra một máy Turing M không xác định,vì theo định lý 8.11 thì M có thể chuyển thành máy Turing xác định, như hình 9.8
Hình 9.8 : Xây dựng một máy Turing không xác định chấp nhận Lne
Họat động của máy M như sau:
1 M lấy nhập liệu như máy Turing Mi
2 Sử dụng khả năng không xác định của nó, M phỏng đoán nhập liệu w mà Mi
có thể chấp nhận nó
3 M kiểm tra liệu Mi có chấp nhận w hay không? Đối với phần này M có thể
mô phỏng máy phổ dụng U chấp nhận ngôn ngữ Lu
4 Nếu Mi chấp nhận w thì M chấp nhận nhập liệu của nó (nhập liệu của Mi) Bằng cách này, nếu Mi chấp nhận một chuỗi thì M sẽ phỏng đoán chuỗi đó và chấp nhận Mi Tuy nhiên, nếu L(Mi) = φ thì không có phỏng đóan nào cho w dẫn đến việc chấp nhận bởi Mi, vì vậy M không chấp nhận Mi Do vậy, L(M)=Lne
Bước kế tiếp chúng ta chứng minh Lne không đệ qui Để làm việc này, ta rút gọn Lu thành Lne Nghĩa là: Ta sẽ mô tả một giải thuật chuyển đổi một nhập liệu (M,w) thành một dữ liệu xuất M’, một đoạn mã cho một máy Turing khác, sao cho w thuộc L(M) nếu và chỉ nếu L(M’) không rỗng Nghĩa là: M chấp nhận w nếu và chỉ nếu M’ chấp nhận ít nhất một chuỗi Thủ thuật ở đây là có một máy Turing M’ bỏ qua nhập liệu của nó thay vì mô phỏng máy Turing M với nhập liệu w Nếu m chấp nhận thì M’ chấp nhận nhập liệu của nó, do vậy việc chấp nhận w của M tương đương với
U
Accept Accept
Guesed
w
Mi
M for Lne
Trang 7L(M’) không rỗng Nếu Lne là đệ qui thì ta có thể có giải thuật cho biết liệu M có chấp nhận w hay không? Bằng cách xây dựng M’ và kiểm tra L(M’) = φ hay không?
* Định lý 9.9: Lne là không đệ qui.
Chứng minh: Chúng ta sẽ theo như cách chứng minh ở trên Ta phải thiết kế
một giải thuật để chuyển đổi một nhập liệu theo cặp mã hóa nhị phân (M,w) thành một máy Turing M’ sao cho L(M’) ≠φ nếu và chỉ nếu M chấp nhận nhập liệu w Việc xây dựng M’ được minh họa trong hình 9.9
Hình 9.9: Phác họa máy Turing M’ được xây dựng từ (M,w) trong định lý 9.9;
M’ chấp nhận nhập liệu bất kỳ nếu và chỉ nếu M chấp nhận w.
Nếu M không chấp nhận w thì M’ không chấp nhận nhập liệu của nó Nghĩa là L(M’) = φ Tuy nhiên nếu M chấp nhận w thì M’ chấp nhận mọi nhập liệu và vì vậy L(M’) ≠φ
M’ được thiết kế để thực hiện các công việc sau:
1 M’ không quan tâm đến nhập liệu của chính nó Hơn nữa, nó thay thế nhập liệu của nó bằng chuỗi biểu diễn cho máy Turing M với nhập liệu w Do M được thiết
kế cho một cặp cụ thể (M,w) có chiều dài n bất kỳ nên ta có thể xây dựng M’ có một chuỗi các trạng thái q0, q1, …, qn với q0 là trạng thái đầu tiên
(a) Tại trạng thái qi với i=0,1,…, n-1; M’ sẽ viết (i+1) bit đầu tiên của chuỗi (M,w), chuyển sang trạng thái qi+1 và dịch chuyển sang phải
(b) Tại trạng thái qn, M’ dịch chuyển sang phải, thay thế bất kỳ dữ liệu không rỗng nào bằng khoảng trắng (có thể là sau x nếu nhập liệu đó có chiều dài lớn hơn n)
2 Khi M’ đạt tới khoảng trống trong trạng thái qn, nó sẽ dùng bộ trạng thái tương tự để định vị lại đầu đọc về bên trái cuối cùng của băng
3 Bây giờ ta sử dụng thêm trạng thái để M’ mô phỏng máy Turing phổ dụng U trên băng từ hiện tại
M
Accept Accept
w x
M’
Trang 84 Nếu U chấp nhận thì M’ chấp nhận Nếu U không chấp nhận thì M’ cũng không chấp nhận
Việc mô tả M’ như trên sẽ hiệu quả để chỉ ra rằng ta có thể thiết kế một máy Turing mà nó có thể chuyển đổi mã cho M và chuỗi nhập liệu w thành mã cho M' Nghĩa là có 1 thuật toán để thực hiện việc rút gọn Lu thành Lne Ta thấy rằng nếu M chấp nhận w thì M’ chấp nhận bất kể nhập liệu x nào trên băng từ Thực tế x được lờ
đi là không thích hợp, việc định nghĩa sự chấp nhận bởi máy Turing cho biết rằng bất
kể những gì được đặt trên băng từ là những gì máy Turing chấp nhận Do vậy, nếu M chấp nhận w thì mã cho M’ sẽ thuộc Lne
Ngược lại, nếu M không chấp nhận w thì M’ sẽ không bao giờ chấp nhận những nhập liệu cho nó Vì thế, trong trường hợp này mã cho M’ không thuộc Lne Ta
đã thành công trong việc rút gọn Lu thành Lne bằng thuật toán xây dựng M’ từ M và w
Ta kết luận rằng do Lu không đệ qui nên Lne cũng không đệ qui Việc tồn tại sự rút gọn này rất có ích để kết luận điều cần chứng minh Tuy nhiên, để minh họa tác động của việc rút gọn ta sẽ quay lại vấn đề này thêm một lần nữa Nếu Lne là đệ qui thì ta có thể phát triển một thuật toán cho Lu như sau:
1 Chuyển (M,w) thành máy Turing M’ như trên
2 Dùng thuật toán giả thuyết cho Lne để biết liệu L(M’) = φ hay không? Nếu đúng thì nói rằng M không chấp nhận w, nếu L(M’) ≠φ thì nói M chấp nhận w
Do định lý 9.6 nói rằng không có thuật toán nào như thế cho Lu tồn tại nên điều này trái ngược với giả thuyết rằng Lne là đệ qui
Kết luận: Lne không đệ qui.
Bây giờ chúng ta đã biết trạng thái của Le Nếu Le liệt kê đệ qui thì theo định lý 9.4 cả Le và Lne sẽ đệ qui Do Lne không đệ qui như định lý 9.9 nên ta kết luận rằng:
* Định lý 9.10: Le không liệt kê đệ qui.
9.3.3 Định lý Rice và các thuộc tính của ngôn ngữ liệt kê đệ qui:
Trong thực tế các ngôn ngữ Le và Lne không thể giải được là một trường hợp đặc biệt của một định lý có tính tổng quát: Tất cả các thuộc tính không tầm thường của ngôn ngữ không liệt kê đệ qui đều không thể giải được Một ví dụ về thuộc tính của các ngôn ngữ liệt kê đệ qui là “ngôn ngữ có ngữ cảnh tự do” Nó không thể giải được bất kể là máy Turing cho trước có chấp nhận ngôn ngữ có ngữ cảnh tự do hay không? Đó là trường hợp đặc biệt của một nguyên lý: Tất cả các thuộc tính không tầm thường của các ngôn ngữ liệt kê đệ qui đều không thể giải được
Trang 9Một thuộc tính của các ngôn ngữ liệt kê đệ qui hoàn toàn là một tập các ngôn ngữ liệt kê đệ qui Do vậy, thuộc tính của ngữ cảnh tự do cũng là một tập các ngôn ngữ có ngữ cảnh tự do Thuộc tính của rỗng là một tập {φ} chỉ chứa ngôn ngữ rỗng
Chú ý rằng thuộc tính rỗng, φ , khác thuộc tính của ngôn ngữ rỗng, {φ}
* Tại sao các bài toán và phần bù của nó lại khác nhau:
Bằng trực giác ta nhận thấy rằng các bài toán và phần bù của nó thực sự giống nhau Để giải quyết một bài toán này ta có thể dùng thuật toán cho phần bù của
nó và tại bước cuối cùng thì phần bù sẽ là dữ liệu xuất: “yes” thay cho “no” và ngược lại Điều này đúng khi bài toán và phần bù của nó là đệ qui.
Tuy nhiên như đã đề cập ở 9.2.2, ta có hai khả năng khác: Đầu tiên, nếu bài toán và phần bù của nó không phải là liệt kê đệ qui thì cả hai sẽ không thể giải được bằng tất cả các loại máy Turing, vì vậy ta thấy chúng giống nhau Tuy nhiên, trong trường hợp đáng quan tâm đối với Le và Lne thì một ngôn ngữ là RE còn ngôn ngữ kia không RE.
Đối với các ngôn ngữ là RE thì ta có thể thiết kế một máy Turing sẽ lấy nhập liệu w và tìm kiếm lý do tại sao w thuộc ngôn ngữ Do vậy, đối với Lne, cho trước một máy Turing M nhập liệu và ta sẽ cho máy Turing này tìm các chuỗi mà máy Turing M chấp nhận, ngay khi tìm thấy một chuỗi ta chấp nhận ngay M Nếu M là một máy Turing có ngôn ngữ rỗng thì ta sẽ không bao giờ biết chắc rằng “M không thuộc Lne” nhưng chúng ta không chấp nhận M và đó là sự phản hồi chính xác từ máy Turing.
Mặt khác, đối với bài toán bù là Le không liệt kê đệ qui thì không có cách nào
để chấp nhận tất cả các chuỗi của nó Giả sử rằng chúng ta được cho trước chuỗi M
và chúng ta có thể không bao giờ tìm thấy một chuỗi được M chấp nhận, tuy nhiên ta không chắc rằng không có nhập liệu nào mà chúng ta chưa kiểm tra Do vậy, M có thể không được chấp nhận mặc dù nó cần được chấp nhận.
Một thuộc tính là tầm thường nếu nó là rỗng hoặc là các ngôn ngữ liệt kê đệ qui Ngược lại là các thuộc tính không tầm thường
Ta không thể nhận dạng một tập các ngôn ngữ như các ngôn ngữ của chính nó
Lý do là ngôn ngữ tiêu biểu (không hữu hạn) không thể được viết như là các chuỗi có chiều dài xác định, đó là những chuỗi nhập liệu cho máy Turing Hơn nữa, chúng ta phải nhận dạng các máy Turing chấp nhận những ngôn ngữ này, mã cho các máy Turing là giới hạn cho dù ngôn ngữ mà nó chấp nhận không hữu hạn Do vậy, nếu ρ là thuộc tính của các ngôn ngữ liệt kê đệ qui thì ngôn ngữ Lρ là một tập các mã cho máy
Trang 10Turing Mi sao cho L(Mi) là một ngôn ngữ trong ρ Khi ta nói đến khả năng giải được của thuộc tính ρ thì ta cũng nói Lρ có thể giải đựơc
* Định lý 9.11: (Định lý Rice) Mỗi thuộc tính không tầm thường của các ngôn ngữ liệt kê đệ qui là không thể giải được.
Chứng minh: Cho ρ là thuộc tính không tầm thường của các ngôn ngữ liệt kê
đệ qui Giả sử bắt đầu từ φ, ngôn ngữ rỗng, không thuộc ρ, ta sẽ trả về trường hợp ngược lại Do ρ không tầm thường nên phải có một vài ngôn ngữ L không rỗng thuộc
ρ, cho ML là máy Turing chấp nhận L
Ta sẽ rút gọn Lu thành Lρ, do ta đã chứng minh Lρ không thể giải được, vì vậy
Lu sẽ không thể giải được Thuật toán để thực hiện việc rút gọn sẽ lấy nhập liệu là cặp (M,w) và tạo ra một máy Turing M’ Thiết kế của máy Turing M’ được cho như hình 9.10, L(M’)=φ nếu M không chấp nhận w và L(M’)=L nếu M chấp nhận w
Hình 9.10: Xây dựng máy Turing M’ để chứng minh định của Rice.
M’ là một máy Turing có 2 băng Một băng được dùng để mô phỏng M trên nhập liệu w Chú ý rằng thuật toán để thực hiện việc rút gọn là cho máy M với nhập liệu là w, ta có thể dùng nhập liệu này trong thiết kế các chuyển tiếp của M Do vậy
mô phỏng M trên nhập liệu w là “xây dựng nên” máy M’ và máy M’ không phải đọc các chuyển tiếp của M trên băng của nó Một băng còn lại của M’ được mô phòng ML trên nhập liệu x cho M’ nếu cần thiết Các chuyển tiếp của ML được biết như là thuật toán rút gọn và có thể “xây dựng nên” các chuyển tiếp của M’ Máy Turing M’ được xây dựng để làm các việc sau:
1 Mô phỏng M trên nhập liệu w Chú ý rằng w không nhập liệu cho M’, hơn nữa M’ viết M và w trên một băng của nó và mô phỏng một máy Turing phổ dụng U trên cặp này
ML
x
w Accept start
M’