Professional Documents
Culture Documents
toán
Máy Turing
Ngôn ngữ và hàm tính được
Nội dung
Ngôn ngữ đoán nhận bởi máy Turing
Ngôn ngữ và hàm tính được - khả tính
2/ Ngôn ngữ đoán nhận bởi máy
Turing (tiếp)
Ngôn ngữ đoán nhận bởi máy Turing
Ngôn ngữ đoán nhận bởi máy Turing
Ngôn ngữ được chấp nhận bởi máy Turing
tập hợp các xâu đoán nhận bởi máy Turing
L(M) ∗ ∗ ∗
Ngôn ngữ đoán nhận bởi máy T được gọi là ngôn ngữ đệ quy liệt kê
(recursively enumerable - RE) => lớp ngôn ngữ đệ quy liệt kê
Lớp ngôn ngữ đệ quy liệt kê chứa lớp ngôn ngữ phi ngữ cảnh (CFL)
khi đó là kết quả của phép tính của máy M với xâu vào f
Nói M tính hàm
f g h
q0 qi
Định nghĩa: Hàm bộ phận ∗ ∗
được gọi là T-tính được (Turing
computable) nếu tồn tại máy Turing M đơn định tính được
Ví dụ: Xây dựng/thiết kế máy Turing tính hàm F(n) = n+1, nN
số n biểu diễn: nhị phân 5=B101. 100 => 101; 101 => 110
ý tưởng:
B1/ dịch phải đến ký tự cuối (khác trắng)
B2/ nếu 0: ghi 1 và kết thúc
B3/ nếu 1: ghi 0, dịch trái
B4/ lặp lại B3 đến khi gặp 0, hoặc gặp B
Ví dụ: Xây dựng/thiết kế máy Turing tính hàm F(n) = n+1, nN
số n biểu diễn: nhị phân 5=B101. 100 => 101; 101 => 110
input: , output: \
ý tưởng:
• lặp lại:
(1) thay thế 0 ở nửa trái bằng B,
(2) trượt sang phải qua ký tự 1 tìm 0 trái nhất của nửa bên phải, thay bằng 1
(3) trượt sang trái (đến B-dịch phải) để gặp 0 đầu tiên - lặp
• dừng khi:
(2) trượt phải tìm 0 của nửa bên phải thì gặp B =>đã thay hết nửa phải => chuyển các số 1 thành B !
(3) trượt trái đến B không gặp 0 => m số 0 đã xóa thành B => thay tất cả 0 và 1 còn lại thành B !
Kết quả ...
4/ Lớp các hàm T-tính được
Hàm đơn giản
Xây dựng một số máy Turing tính các hàm đơn giản G* G*
G: bảng chữ không chứa ký tự trắng B
Bộ n phần tử (n tuple) - các phần tử phân cách bởi 1 ký tự B/
các Hàm hằng
∗ ∗
Ví dụ:
cho G={0,1}, n=2, hàm có thể chọn như sau
input: output: 101
ý tưởng:
xóa từ gặp # - xóa xong
xóa từ gặp # - xóa xong
ghi ra băng từ 101
Hàm chiếu
,
Ý tưởng
xóa phần tử 1 - đến khi gặp #
trượt qua phần tử 2
xóa phần tử 3, 4 - dừng
Hợp thành
Máy được tiêu chuẩn hóa - standardized
Khái niệm: máy M là được tiêu chuẩn hóa nếu sau khi tính xong, đầu đọc ở ký
tự khác B trái nhất
B a
qf
Mệnh đề (4.1):
Cho máy Turing M, có thể xây dựng từ M máy M' được tiêu chuẩn hóa, thực hiện
chức năng tính toán như M - tương đương M
ý tưởng:
Máy được tiêu chuẩn hóa - standardized
Mệnh đề (4.2):
Có thể luôn giả thiết đc rằng trạng thái đầu không nằm trong vế phải của bất kỳ quy
tắc chuyển nào.
Tức là không tồn tại quy tắc chuyển dạng , là trạng thái đầu
Ý tưởng:
Có thể tách trạng thái đầu ra khỏi phần còn lại (đặt là ), mô tả:
q1
Máy được chuẩn hóa - normalized
Khái niệm: máy M là được chuẩn hóa nếu có tập con các trạng thái
thỏa
(1) Không có trạng thái nào thuộc A nằm ở vế trái của mọi quy tắc chuyển
(2) : tồn tại quy tắc chuyển có (q,x) ở vế trái
Nói cách khác: một phép tính dừng khi và chỉ khi máy M rơi vào trạng thái
, trạng thái của A được gọi là trạng thái dừng
x
q A
Q
Máy được chuẩn hóa - normalized
Mệnh đề (4.3):
Cho máy M, có thể xây dựng từ M máy M' được chuẩn hóa, thực hiện cùng chức năng
như M
Ý tưởng:
Có thể xem máy M: có 1 trạng thái mở đầu, 1 trạng thái dừng
q1 qh
Từ máy M, có thể xây dựng máy M' được tiêu chuẩn hóa (standardized) và
chuẩn hóa (normalized) có cùng chức năng như M
Tổ hợp các máy Turing: ghép nối tiếp
Cho máy Turing T được chuẩn hóa (normalized) có trạng thái dừng duy nhất
, máy T'
Máy Turing tổ hợp từ T và T' theo cách ghép nối tiếp, ký hiệu T next T':
+ đánh số lại các trạng thái của T' để không trùng với trạng thái của T
+ lấy làm trạng thái khởi đầu của T'
q1 qh
T next T’
Tổ hợp các máy Turing
q1 qh
T next T’
Nếu T' được tiêu chuẩn hóa (chuẩn hóa) thì T next T' cũng được tiêu chuẩn
hóa (chuẩn hóa)
Nếu
• T được tiêu chuẩn hóa, thực hiện hàm f,
• T' thực hiện hàm g,
thì máy T next T' thực hiện hàm g(f)
Tổ hợp các máy Turing: ghép rẽ nhánh
Cho máy Turing T được chuẩn hóa (normalized), dừng ở các trạng thái
Và k máy Turing
Phép tổ hợp ghép nối rẽ nhánh T ra là
q1
h2
2
[ q , B, B ]
Ví dụ: xây dựng máy Turing tìm xem ký tự đầu tiên trên băng có còn xuất
hiện ở phía sau hay không ?
Ví dụ: xây dựng máy Turing tìm xem ký tự đầu tiên trên băng có còn xuất
hiện ở phía sau hay không ?
• Đọc ký tự đầu, lưu vào ô nhớ tạm 0 1 1 B
• ([q1,B],0) ([q2,0],0,R)
• ([q1,B],1) ([q2,1],1,R) [q,B ]
• Dịch phải 0 1 1 B
• nếu đọc đc ký tự khác trong ô nhớ tạm => dịch phải
• đến khi đọc được B => kết thúc - ký tự không xuất hiện [q,0 ]
• ([q2,0],1) ([q2,0],1,R)
• ([q2,1],0) ([q2,1],0,R)
• ([q2,0],B) ([qf,B],B,R) ([q2,1],B) ([qf,B],B,R)
• Nếu đọc đc ký tự giống trong ô nhớ tạm => dừng/halt - ký tự xuất hiện
• ([q2,0],0) ([q2,1],1)
Ví dụ: dịch phải xâu trên băng đi 1 ô nhớ
• bảng chữ: 0,1,#
• điều khiển: [q,B]
• đọc ký tự đầu => lưu ô nhớ tạm trong bộ điều khiển, ghi #, dịch phải
• bắt đầu lưu và dịch: [q,a] đọc được ký tự tiếp x,
lưu x vào ô nhớ tạm ; ghi a xuống băng (vị trí của x), dịch phải
• tiếp tục đến khi đọc được ký tự # thì: ghi nốt ký tự từ ô nhớ tạm xuống & dừng
0 1 1 B B B 1 1 B B B 0 1 B B B 0 1 1 B
1 B
[q,B] [q,0] [q,1] [q,B]
Máy Turing nhiều rãnh
Máy Turing:
• băng nhớ chia thành k phần (hữu hạn)
• Ví dụ: kiểm tra số n (biểu diễn nhị phân) có chia hết cho k < n không => kiểm tra n
có phải số nguyên số
Máy Turing nhiều rãnh
• Ví dụ: kiểm tra số n (biểu diễn nhị phân) có chia hết cho k < n không => kiểm tra n
có phải số nguyên số
• Ý tưởng:
sử dụng máy có 3 rãnh
+ rãnh 1: chứa số n nằm giữa ký tự phân cách đầu, cuối: ,$
+ rãnh 2: chưa số k
+ rãnh 3: ban đầu copy giá trị n; sau đó trừ (liên tiếp) số ở rãnh 2, đến khi
1 0 1 1 $ B 1 0 1 1 $ B 1 0 1 1 $ B
B B B B B B B B B B 1 0 B B B B B 1 0 B B
B B B B B B B B 1 0 1 1 B B B 1 0 0 1 B B
Chương trình con
Máy T có thể vận hành như chương trình con
• ý tưởng:
• Máy M có
• 1 trạng thái khởi đầu
• 1 trạng thái dừng => không có quy tắc chuyển tiếp theo => trạng thái trở về
• Từ trạng thái trở về có thể
• trạng thái của máy T khác - chương trình lớn
• trạng thái khởi đầu máy T khác - gọi tiếp chương trình khác
Ƭ
Ƭ’
Ví dụ: thiết kế máy T thực hiện phép nhân số nguyên m*n
• input: output: ∗
ý tưởng
• đặt ký tự 1 ở bên phải
• lặp lại m lần việc copy n số 0 tới bên phải
• mỗi lần "đánh dấu" một ký tự 0 của
α α
B x B B y B
q q
α
B B B
q
Máy Turing với băng nhớ vô hạn 2 chiều:
• Nếu ngôn ngữ L đoán nhận bởi máy M1 có băng vô hạn 2 phía
• thì L cũng đoán nhận bởi máy M2 có băng vô hạn 1 phía
• Ý tưởng:
• M2 có 2 rãnh,
• rãnh trên - biểu diễn nửa băng bên phải (từ vị trí ban đầu) của M1,
• rãnh dưới - biểu diễn nửa băng bên trái
#
M2
• Trạng thái: Q2 : trạng thái là bộ [q,{U,D}] với q: trạng thái thuộc Q1 , U/D: rãnh
up/down
• Bảng chữ: :
• Trạng thái kết thúc:
• Hàm chuyển
• lần đầu
• nếu M1 dịch phải: thì M2 có
• tiếp theo
• nếu M1 đang làm việc phía phải ô đầu: M2 thao tác với rãnh trên, R/L cùng
hướng
nếu M đang làm việc phía trái ô đầu: M thao tác với rãnh dưới, R/L ngược
Máy Turing nhiều băng, vô hạn 2 phía
Máy Turing nhiều băng, vô hạn 2 phía
• có k băng nhớ (vô hạn 2 phía)
• có k đầu đọc ghi
• hàm chuyển:
• (q1 , a , b , c,...) (q2 , x , m1 , y , m2 , z , m3 ,...); mi {R,L}
q q
B x B x ..
B x B .. y
Mệnh đề B x B z
Máy Turing offline
Máy Turing có băng vào
• có nhiều băng, trong đó có
• một băng mà đầu đọc ghi chỉ đọc => gọi là đầu đọc
• băng này - băng vào/băng nhập
L chấp nhận bởi máy không đơn định M1 thì cũng chấp nhận bởi máy đơn
định M2 nào đó.