MỤC LỤC MỤC LỤC 1 PHẦN 1: 2 10.1 ĐỆ QUY VÀ LIỆT KÊ ĐỆ QUY 2 10.2 LIỆT KÊ MỘT NGÔN NGỮ 5 10.3 KHÔNG PHẢI MỌI NGÔN NGỮ ĐỀU LÀ LIỆT KÊ ĐỆ QUY 8 PHẦN 2: BÀI TẬP 16 PHẦN 3: TÀI LIỆU THAM KHẢO 19 PHẦN 1: PHẦN LÝ THUYẾT 10.1 ĐỆ QUY VÀ LIỆT KÊ ĐỆ QUY Chương này chúng ta sẽ tập trung (to concentrate on) vào nhận dạng ngôn ngữ (languagerecognition), một khía cạnh của các máy Turing (TMs) và nghiên cứu chi tiết hơn về các ngôn ngữ có thể được chấp nhận nhờ máy Turing. Chúng ta bắt đầu bằng cách hình thức hóa sự khác biệt giữa thừa nhận (accepting) và nhận ra (recognizing) một ngôn ngữ. Định nghĩa 10.1. Cho L là một ngôn ngữ nào đó. Một máy Turing cùng bộ kí tự nhập được phát biểu là thừa nhận L nếu L(T) = L. Máy Turing T recognizes hoặc decides L nếu T tính được hàm bộ phận (characteristic function XL: . Mặt khác, T đón nhận L nếu T dừng với bất kì chuỗi x nào trong tập , kết quả trả về 1 nếu x L và ngược lại trả về là 0. Một ngôn ngữ L là liệt kê đệ quy (recursively enumerable) nếu có tồn tại một máy Turing T chấp nhận (accept) L và đệ quy nếu có một máy Turing nhận ra L. Mọi ngôn ngữ đệ quy cũng đều là liệt kê đệ quy nếu: T là một máy Turing nào đó nhận ra L thì khi đó một máy bổ sung sẽ crash thay vì trả về kết quả 0 chấp nhận L. Vậy là chúng ta đã nhận diện được vấn đề còn tồn đọng (potential) với hướng đi trái ngược nhau. Nếu T là một máy Turing chấp nhận L thì có thể có các chuỗi không nằm trong L mà T crashes và khi đó sẽ không bao giờ có được câu trả lời. Sau chương này chúng ta sẽ nghiên cứu (investigate) thêm các ngôn ngữ có khả năng không thể loại bỏ (khử) được. Còn bây giờ chúng ta hãy ghi nhận một phần (partial) kết quả mà chúng ta đã đề cập. Định lý 10.1 Nếu L được chấp nhận bởi một máy Turing T không xác định và mỗi bước di chuyển có thể của T cho ra kết quả hoặc là dừng hoặc là crash thì khi ấy L là đệ quy.
Trang 1ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
Tel (84-511) 736 949, Fax (84-511) 842 771 Website: itf.ud.edu.vn , E-mail: cntt@edu.ud.vn
Tiểu luận môn học
LÝ THUYẾT TÍNH TOÁN
Đề tài:
CÁC NGÔN NGỮ ĐỆ QUY VÀ ĐỆ QUY
LIỆT KÊ
- NGUYỄN ĐÔNG KỲ
- VÕ TRƯƠNG HOÀNG OANH
- NGUYỄN THỊ UYÊN THẢO
ĐÀ NẴNG, 05/2010
Trang 2MỤC LỤC
10.1 ĐỆ QUY VÀ LIỆT KÊ ĐỆ QUY 3
10.2 LIỆT KÊ MỘT NGÔN NGỮ 6
10.3 KHÔNG PHẢI MỌI NGÔN NGỮ ĐỀU LÀ LIỆT KÊ ĐỆ QUY 9
PHẦN 2: BÀI TẬP 17
PHẦN 3: TÀI LIỆU THAM KHẢO 19
Trang 3PHẦN 1: PHẦN LÝ THUYẾT
10.1 ĐỆ QUY VÀ LIỆT KÊ ĐỆ QUY
Chương này chúng ta sẽ tập trung (to concentrate on) vào nhận dạng ngôn ngữ (language-recognition), một khía cạnh của các máy Turing (TMs) và nghiên cứu chi tiết hơn về các ngôn ngữ có thể được chấp nhận nhờ máy Turing Chúng ta bắt đầu bằng cách hình thức hóa sự khác biệt giữa thừa nhận
(accepting) và nhận ra (recognizing) một ngôn ngữ
Định nghĩa 10.1 Cho L ⊆∑* là một ngôn ngữ nào đó Một máy Turing cùng bộ kí tự nhập ∑ được phát biểu là thừa nhận L nếu L(T) = L Máy Turing T recognizes hoặc decides L nếu T tính được hàm bộ phận (characteristic function XL: ∑* →{0 , 1} Mặt khác, T đón nhận L nếu T dừng với bất kì chuỗi x nào trong tập ∑*
, kết quả trả về 1 nếu x ∈L và ngược lại trả về là 0
Một ngôn ngữ L là liệt kê đệ quy (recursively enumerable) nếu có tồn tại một máy Turing T chấp nhận (accept) L và đệ quy nếu có một máy Turing
nhận ra L
Mọi ngôn ngữ đệ quy cũng đều là liệt kê đệ quy nếu: T là một máy Turing nào đó nhận ra L thì khi đó một máy bổ sung sẽ crash thay vì trả về kết quả 0 chấp nhận L Vậy là chúng ta đã nhận diện được vấn đề còn tồn đọng (potential) với hướng đi trái ngược nhau Nếu T là một máy Turing chấp nhận
L thì có thể có các chuỗi không nằm trong L mà T crashes và khi đó sẽ không
bao giờ có được câu trả lời Sau chương này chúng ta sẽ nghiên cứu (investigate) thêm các ngôn ngữ có khả năng không thể loại bỏ (khử) được Còn bây giờ chúng ta hãy ghi nhận một phần (partial) kết quả mà chúng ta đã
đề cập
Định lý 10.1 Nếu L được chấp nhận bởi một máy Turing T không xác định và
mỗi bước di chuyển có thể của T cho ra kết quả hoặc là dừng hoặc là crash thì khi ấy L là đệ quy
Trang 4Chứng minh: chúng ta xây dựng máy Turing T’ sao cho có một sự thay đổi
của máy Turing T2 trong phần chứng minh định lý 9.2 Trong trường hợp đó,
T2 tái tạo mỗi bước di chuyển hữu hạn có thể của T, máy T dừng lại nếu T tìm thấy bước mà gây cho T dừng, và ngược lại máy T sẽ lặp mãi mãi Máy mà chúng ta cần bây giờ phải khác với hai dấu hiệu này Trước tiên, nếu và khi T’ tìm thấy một bước di chuyển của T làm cho T dừng thì T sẽ tạo xuất ra ∆ 1 trên băng 1 trước khi máy T dừng Thứ 2, sự thay đổi này mới quan trọng hơn Nếu không có bước di chuyển nào gây cho T dừng thì T’ phải xác định một vài thời điểm và dừng lại với ∆ 0 trên băng 1
Nhớ lại chứng minh trong định lý 9.2, T2 theo dõi các bước di chuyển bằng cách dùng một chuỗi các con số trên băng 2, số thứ i chỉ ra sự lựa chọn
mà T2 thực hiện tại bước thứ i Rõ ràng nếu có một vài số nguyên n sao cho mọi chuỗi có thể của n số trình bày lại tuần tự các bước di chuyển mà dẫn đến crash, vì bất kì một chuỗi số nào dài hơn mà được bắt đầu bằng chuỗi có chiều dài n thì khi ấy chuỗi nhập sẽ không được chấp nhận
Định lý 10.2 Giả sử L1 và L2 là các ngôn ngữ liệt kê đệ quy trên ∑, khi đó L1
∪L2 và L1∩L2 cũng là ngôn ngữ liệt kê đệ quy.
Chứng minh: Giả sử rằng T1 = (Q1, ∑, Γ1, q1, δ1) và T2 = ((Q2, ∑, Γ2, q2, δ2)
là các máy Turing chấp nhận L1 và L2 Chúng ta cần xây dựng các máy Turing chấp nhận L1 ∪L2 và L1∩L2 Ý tưởng này giống như chứng minh trong định lý
3.4, khi đó chúng ta kết hợp Fas chấp nhận L1 và L2 để có được sự chấp nhận
L1 ∩L2 Chúng ta gom (include in) tập các trạng thái các cặp trong Q2 x Q2.
Nên nhớ lại (recall) kỹ thuật này không làm việc với PDAs vì các ngăn xếp
Lý do để máy Turing thực hiện được ở đây là chúng ta thoải mái sử dụng 2 băng trong máy Turing Chúng ta mô tả giải pháp này cho L1 ∪L2.
Máy Turing 2 băng (two – tape) T = (Q 1 , ∑, Γ , q0, δ ) bắt đầu bằng
việc sao chép chuỗi nhập x trên băng 2 và chèn một dấu # để đánh dấu lúc bắt đầu trên mỗi băng Mô phỏng đồng thời (the simultaneous simulation) máy Turing T1 trên băng 1 và máy Turing T2 trên băng 2 thực hiện (to accomplish) bằng cách cho phép các bước di chuyển có thể:
Trang 5δ ((p1,p2), (a1,a2))=((q1,q2), (b1,b2), (D1,D2))
Trong đó: cả hai giá trị của i, δi(pi, ai) = (qi, bi, Di) Các kết quả mô phỏng này
có thể là:
1 Cả T1 và T2 đều dừng lại trong trường hợp T không bao giờ dừng
2 Ít nhất một trong hai máy T1 và T2 dừng trong trường hợp T dừng
3 Một trong hai máy crash Nếu cả hai máy crash đồng thời thì T crash Nếu một máy crash, T cũng bỏ qua mô phỏng này (ví dụ như là bỏ qua băng đó) và tiếp tục với máy khác Nếu một máy dừng lại do hoặc là crash hoặc là dừng, thì T cũng dừng theo cách đó
Việc xây dựng gây cho T dừng khi và chỉ khi có ít nhất một trong hay máy
T1 và T2 dừng, có thể bao gồm trường hợp T chấp nhận ngôn ngữ L1 ∪L2.
Ngôn ngữ L1 ∩L2 cũng được xử lý theo cách tương tự, chấp nhận máy
Turing có thể crash ngay khi hoặc T1 crach hoặc là T2 crash và máy Turing có thể chỉ dừng sau khi cả T1 và T2 đã dừng
Giao và hội cũng là thuộc tính riêng của đệ quy Đối với các ngôn ngữ đệ quy, chúng ta có thể thêm phép tính bù cho danh sách này cũng được (as well)
Định lý 10.3 If L is recurse, so is L’
Chứng minh: Nếu T là máy Turing chấp nhận L, chúng ta có thể tạo ra máy
Turing đón nhận L’ bằng sự thay đổi 2 băng xuất
Chứng minh đơn giản này không thích hợp trong (to adapt) bất cứ
trường hợp nào rõ ràng trong các ngôn ngữ liệt kê đệ quy It does not immediatetly follow that the coresponding statement for RE languages is false (although it is); howerver, the next result suggests that it is at least less likely
to be true
Định lý 10.4 Nếu L là ngôn ngữ liệt kê đệ quy whose complement is RE thì L
là đệ quy
Trang 6Chứng minh: Cho T1 và T2 là các máy Turing chấp nhận ngôn ngữ L và L’.
Chúng ta xây dựng một máy Turing T hai băng dùng để đón nhận L, bắt đầu việc xây dựng như trong chứng minh định lý 10.2 cho trường hợp hợp của 2 ngôn ngữ Sự khác nhau ở chỗ là bây giờ chúng ta biết trước (in advance)
được bất cứ chuỗi nhập x nào, rõ ràng (precisely) là một trong 2 máy Turing
T1 và T2 sẽ dừng lại Do đó, có đủ khả năng để hiệu chỉnh máy T như sau: Lúc T1 hoặc T2 dừng, T sẽ xóa bỏ trên băng 1 và xuất ra 0 hoặc 1 trước khi dừng, điều này tùy thuộc vào máy dừng chấp nhận L hoặc L’ hay không
10.2 LIỆT KÊ MỘT NGÔN NGỮ
Chúng ta bắt đầu bằng việc mô tả một cách chính xác cách mà một máy Turing liệt kê 1 ngôn ngữ Điều này có ích khi sử dụng máy Turing có ít nhất hai băng, trong đó một băng được thiết kế như là băng xuất
Định nghĩa 10.2 Cho T là máy Turing k băng, trong đó k >= 2, và cho L
∑
⊆ * Chúng ta nói rằng T liệt kê L nếu T hoạt động sao cho các điều kiện sau được thỏa mãn:
1 Băng đầu trên băng đầu tiên không được dịch chuyển sang trái
2 Tại mỗi một thời điểm trong hoạt động của T, băng 1 chứa:
x1#x2# #xn#y , trong đó n ≥0, mỗi xi, xi’ là phân biệt nhau, và
y là một tiếp đầu ngữ của phần tử L
3 Với mọi x ∈L, x xuất hiện nhưng là một chuỗi xi trên băng 1.
Nếu L là một ngôn ngữ hữu hạn, máy Turring theo định nghĩa có thể hoặc là dừng khi tất cả các phần tử L xuất hiện trên băng 1 hoặc là máy Turing tiếp tục thực hiện việc di chuyển mà không cần phải in ra những chuỗi khác trên băng 1 Nếu L là vô hạn, máy T tiếp tục di chuyển mãi mãi Định nghĩa này rõ ràng là cách thích hợp để hiện thực (to formulate) ý tưởng của máy T là
“liệt kê các phần tử của L”
Như chúng ta đã định nghĩa, một ngôn ngữ là liệt kê đệ quy nếu có thể được chấp nhận bởi một số máy Turing
Trang 7Mặc khác, nếu chúng ta có một máy Turing T dùng để liệt kê L thì khi
đó cho trước một chuỗi nhập x, chúng ta có thể thử (to attempt) kiểm tra xem
x đối với phần tử trong L bằng cách chờ xem (waiting to see) x có xuất hiện trên băng xuất của T hay không Máy Turing T1 có thực hiện chiến lược này bảo đảm (guarantee) chấp nhận L vì nếu chuỗi x nằm trong L thì cuối cùng x cũng sẽ xuất hiện, còn nếu x không nằm trong L thì x sẽ không xuất hiện (vì thế máy Turing sẽ lặp mãi trừ phi L là hữu hạn)
Mặc khác, nếu T là một máy Turing chấp nhận L thì khi đó liệt kê L, chúng ta bắt đầu bằng một vài thứ tự chuẩn của tất cả các chuỗi nằm trong
∑*
, chẳng hạn như thứ tự kinh điển (canonical order) đã được giới thiệu
trong phần 9.6 Trong thứ tự này, những chuỗi nào ngắn hơn đến trước (to precede) những chuỗi dài hơn, đồng thời những chuỗi nào có cùng độ dài thì được xếp theo thứ tự alphabe Chúng ta xét tất cả các chuỗi theo thứ tự này, đồng thời với mỗi chuỗi x chúng ta thử chọn kể cả x trong việc liệt kê của chúng ta Đây là chỗ mà lý luận cần phức tạp một chút: máy T có thể lặp mãi trên chuỗi nhập x Chứng minh chính thức của chúng ta có thể sẽ vận dụng (handle) vấn đề này
Định lý 10.5 Một ngôn ngữ L ⊆∑*
là liệt kê đệ quy (có thể được chấp nhận bởi một số mát Turing) khi và chỉ khi L có thể được liệt kê bởi một số máy Turing
Chứng minh: Giả sử T là một máy Turing liệt kê L Một máy T1 chấp nhận L được xây dựng có hơn 1 băng, băng 1 là băng thêm vào ( tape 1 being the extra tape) có vai trò như là băng xuất Máy Turing T1 mô phỏng (simulate) T
chấp nhận bất cứ lúc nào dấu # được ghi trên băng 2, mô phỏng máy T dừng khi T1 đối sánh chuỗi nhập với chuỗi đã được liệt kê phía trước dấu # Nếu hai chuỗi kết hợp giống nhau thì T1 dừng Rõ ràng là T1 chấp nhận một cách chính xác các chuỗi đã được tạo ra trên băng 2, giả định là các phần tử của L
Chính xác hơn, T1 có thể kết hợp với các chuyển tiếp của T , xét các băng khác trừ băng 1 của máy T bằng sự thay đổi như sau: mỗi một chuyển tiếp đòi hỏi phải (involve) ghi dấu # trên băng 2 được thay thế bởi tuần tự các chuyển tiếp trong đó các băng ngoại trừ băng 1 và băng 2 được bỏ qua, chuỗi
Trang 8nhập được so với chuỗi ngay trước dấu # trên băng 2, và nếu không kết hợp T1
quay trở lại tình trạng mà dẫn đến kết quả từ chuyển tiếp ban đầu
Theo hướng ngược lại (in the converse direction), giả sử T chấp nhận L Chúng ta xây dựng một máy Turing T1 ba băng liệt kê ngôn ngữ L Băng 1 là băng xuất, băng 2 được dùng bởi T1 để tạo ra các chuỗi trong tập ∑* và băng
3 là băng T1 sử dụng để mô phỏng hành động của T trên mỗi chuỗi được tạo
Để tránh khó khăn được thảo luận ở trước, T1 mô phỏng tuần tự hữu hạn các bước chuyển động của T hơn là cố tiếp tục hoàn thành việc xử lý T trên một chuỗi đơn Vì lý do này trên băng 2 không chỉ lưu lại các chuỗi được tạo
ra cho đến bây giờ (so far) mà số lượng các bước di chuyển của T cũng được thực hiện trên mỗi chuỗi đó
Chúng ta chọn (adopt) thứ tự trên ∑*
Lấy ví dụ nếu ∑ ={a,b} thì các chuỗi được tạo ra theo thứ tự sẽ là :
∧, a, b, aa, ab, ba, bb, aaa, aab, …, bbb, aaaa, aaab,…
Máy Turing T1 tạo một dãy các vị trí (pass) Với vị trí đầu tiên, T1 tạo ra
chuỗi ∧ đồng thời mô phỏng một bước di chuyển của T trên chuỗi nhập đó Ở
vị trí thứ 2, T1 mô phỏng hai bước di chuyển của T trên chuỗi nhập ∧, rồi tạo
ra a đồng thời mô phỏng một bước di chuyển trên chuỗi nhập đó Trên vị trí thứ ba, T1 tạo ra 3 bước di chuyển trên ∧, 2 bước di chuyển trên a và một
bước di chuyển trên b Sau khi vị trí i hoàn thành, băng 2 sẽ trông giống như thế này :
1
1
11 1
11 1
∆∆ a b x
Trong đó x là chuỗi thứ i theo thứ tự Suốt các vị trí tiếp theo T1 xử lý mỗi chuỗi thứ i trên băng 2 bằng cách thêm vào một số 1 đằng sau chuỗi ∆, sao chép chuỗi này vào trên băng thứ 3, mô phỏng T trên chuỗi nhập đó cho các bước được chỉ định, đồng thời xóa băng 3 Nếu mô phỏng dừng, T1 sao chép chuỗi này trên băng 1 và theo sau chuỗi này là dấu # Bước cuối cùng tại
i i - 1 i - 2
Trang 9vị trí này là để kết thúc băng 2 phần tử tiếp theo của ∑*
(phần tử này đứng sau x), đặt một chữ 1 sau x đồng thời mô phỏng bước di chuyển của T trên chuỗi nhập đó
Chúng ta không chỉ ra một cách rõ ràng (explicitly) các thiết bị theo dõi
mà T cần để thực hiện những bước này, tuy nhiên các bước này hoàn toàn dễ
hiểu (straightforward) Rõ ràng mọi chuỗi đều được chấp nhận bởi máy T
ngay cả chuỗi được liệt kê trên băng 1 và không có chuỗi được liệt kê
Trong phần chứng minh định lý 10.5, chúng ta nên lưu ý rằng mặc dầu những chuỗi trong ∑*
được tạo theo thứ tự cổ điển trên băng 2, nói chung các chuỗi trong ngôn ngữ L không được liệt kê theo thứ tự trên băng 1 Với các
giả định tốt hơn (stronger assumption) về máy T có nghĩa là giả định rằng
(amount to assuming) ngôn ngữ L không chỉ là có thể liệt kê đệ quy mà còn đệ quy Ngược lại, dễ dàng chỉ ra rằng nếu có một máy Turing T liệt kê ngôn ngữ
L theo thứ tự cổ điển thì khi ấy L phải là đệ quy
Định lý 10 6: L là đệ quy khi và chỉ khi có một máy Turing liệt kê ngôn ngữ
L theo thứ tự cổ điển
Chứng minh: Chứng minh xem bài tập Exercise 10.7
10.3 KHÔNG PHẢI MỌI NGÔN NGỮ ĐỀU LÀ LIỆT KÊ ĐỆ QUY
Các mô hình tính toán đơn giản mà chúng ta vừa xem xét trước đây, Automat hữu hạn (Fas) và Automat đẩy xuống (PDAs) đều có khả năng (capable) chấp nhận một vài kiểu ngôn ngữ Chúng ta cần chỉ ra được một số máy Turing (TMs) chúng ta chỉ ra cái gì trong cả hai trường hợp này: Có các ngôn ngữ
Định nghĩa 10.3: Một tập S là vô hạn đếm được (countably infinite) nếu có một song ánh từ (bijection) từ N đến S, và có thể đếm được (countable) nếu tập S hoặc là vô hạn đếm được hoặc là hữu hạn đếm được Tập A là vô hạn
hạn không đếm được (uncountably infinte) hoặc nói đơn giản là không đếm được nếu tập A này không đếm được
Trang 10Ta nói rằng f: N →S nghĩa là có ba điều cần có:
1 Với mọi số tự nhiên n, f(n) ∈S
2 Với bất kì 2 số m và n khác nhau, f(m) ≠f(n)
3 Mọi phần tử của S đều là f(n) đối với một vài số tự nhiên n
Do đó, ta nói rằng S là vô hạn đếm được (kích thước tương tự như N) nghĩa là các phần tử của S có thể được liệt kê chẳng hạn như f(0), f(1), sao cho mọi phần tử của S đều xuất hiện chính xác một lần trên danh sách Ta nói rằng S đếm được cũng có nghĩa là như vậy, ngoại trừ danh sách này có thể dừng sau một số hữu hạn các số hạng nào đó
Có ít nhất 2 cách mà trong đó cách thứ nhất có thể hiểu sai (misinterpret) cụm từ “có thể được liệt kê” Dĩ nhiên điều này có thể không bao giờ thực hiện được việc liệt kê tất cả các phần tử của một tập vô hạn bằng vật lý Ta nói rằng S “có thể được liệt kê” nghĩa là chỉ có duy nhất một hàm f như ở trên sao cho bất kì chuỗi x ∈S, nếu chúng ta ghi xuống đầy đủ các số hạng (term) f(0), f(1), thì khi đó x xuất hiện như là một trong những số hạng này Quan trọng hơn nữa, khi chúng ta nói rằng một tập S là vô hạn đếm được, chúng ta không nói có một số giải thuật để liệt kê các phần tử này Chúng ta
chỉ nói rằng “có tồn tại” một song ánh (bijection) f; có thể có hoặc không có
một giải thuật nào cho phép chúng ta tìm ra được f(n) đối với một số tự nhiên
n đã cho
Lưu ý rằng bất kì 2 tập hữu hạn đếm được nào cũng đều có kích thước tương tự nhau Nó có thể là trường hợp mà tất cả các tập không đếm được đều
có kích thước giống nhau Nếu trên thực tế (in fact) có các tập vô hạn kích thước khác nhau, tuy nhiên bất cứ một tập không đếm được nào cũng đều lớn hơn một tập có thể đếm được Mặc dù điều này không được rõ ràng lắm nhưng
đây là một kết quả có được ngay tức thì (immediate consequence) của cơ sở lập luận (fact) sau.