Giáo trình lý thuyết tính toán
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
GIÁO TRÌNH
LÝ THUYẾT TÍNH TOÁN
PGS.TS PHAN HUY KHÁNH
ĐÀ NẴNG 1999
Trang 3PGS.TS PHAN HUY KHÁNH biên soạn 1
MỤC LỤC
CHƯƠNG 1 NHẬP MÔN LÝ THUYẾT TÍNH TOÁN 1
I CÁC ĐỐI TƯỢNG ĐƯỢC XỬLÝ TRONG TIN HỌC 1
II CÁC MÁY (MACHINES) 2
II.1 Khía cạnh chức năng (functional look) 2
II.2 Khía cạnh cấu trúc (structural look) 3
III MÔ HÌNH TÍNH TOÁN 4
IV ĐỊNH NGHĨA BÀI TOÁN 5
CHƯƠNG 2 MÔ HÌNH CÁC MÁY RAM 9
I CÁC MÁY RAM 9
II MÔPHỎNG MỘTMÁYBỞIMỘTMÁYKHÁC 16
III MỘTMÔHÌNHTHÔSƠKIỂU RAM 19
III.1 Mô phỏng các phép toán trên chuỗi ký tự bởi các phép toán trên các số nguyên 19
III.2 Thu gọn tập hợp các lệnh ngắt 20
III.3 Thu gọn tập hợp các lệnh số học 20
IV MÁY RAMVẠN NĂNG 22
CHƯƠNG 3 MÔ HÌNH CÁC MÁY TURING 25
I MÔ TẢVÀ HOẠT ĐỘNG CỦA MÁY TURING 25
I.1 Mô tả máy Turing 25
I.2 Hoạt động của máy Turing 26
I.3 Cấu hình xuất phát của máy Turing 29
I.4 Máy Turing đơn định 29
II CAC HÀM T-TÍNH ĐƯỢC 30
III LỚP CÁC HÀM T-TÍNH ĐƯỢC 32
III.1 Một số hàm sơ cấp 32
III.1.1 Các hàm hằng (constant functions) 32
III.1.2 Các hàm chiếu (projection functions) 33
III.2 Các hàm kế tiếp (successor functions) 33
III.3 Các hàm kế trước (predecessor functions) 34
III.4 Sự hợp thành (composition) 34
III.3.1 Các máy được tiêu chuẩn hóa 35
III.3.2 Các máy Turing được chuẩn hóa 36
III.3.3 Tổ hợp các máy Turing 36
III.5 Lập trình trên ngôn ngữ bậc cao máy Turing 37
III.4.1 Cấu trúc if then else và cấu trúc rẽ nhiều nhánh 37
III.4.2 Cấu trúc while 38
III.6 Quản lý bộ nhớ 39
III.5.1 Máy Turing chuyển một ô qua phải 39
Trang 4III.5.2 Máy Turing chỉ sử dụng phần băng bên phải
kể từ vị trí đầu tiên của đầu đọc-ghi 39
III.7 Một số máy Turing thông dụng 40
III.6.1 Sao chép 40
III.6.2 Kiểm tra bằng nhau 41
III.6.3 Liệt kê các câu, các cặp câu và dãy các câu 41
III.6.4 Các hàm chiếu ngược (antiprojection function) 42
III.6.5 Các hàm giao hoán 42
III.7 Các hàm T-tính được phức tạp hơn 42
III.8 Nhận xét 43
IV CÁC BIẾN THẾKHÁC CỦA MÔ HÌNH MÁY TURING 46
IV.1 Mô phỏng một máy Turing bởi một máy khác 46
IV.2 Các biến thể của máy Turing 48
IV.2.1 Máy Turing có k băng 48
IV.2.2 Các máy off−line và các máy có băng ra 49
IV.2.3 Các máy Turing không đơn định 49
IV.2.4 Thu gọn một bảng chữ còn ba ký tự 50
IV.2.5 Rút gọn một bảng chữ còn hai ký tự 52
IV.3 Các máy Turing có băng vô hạn một phía 52
V MÁY TURING VẠN NĂNG 53
VI TỒN TẠI CÁC HÀM KHÔNG LÀT−TÍNH ĐƯỢC 55
CHƯƠNG 4 LUẬN ĐỀ CHURCH 59
I TƯƠNG ĐƯƠNG GIỮA CÁC MÔ HÌNH MÁY TURING VÀ MÁY RAM 59
I.1 Mọi hàm T-tính được cũng là R−tính được 59
I.2 Mọi hàm R−tính được cũng là T−tính được 60
I.2.1 Tăng nội dung thanh ghi n lên 1 60
I.2.2 Giảm 1 nội dung thanh ghi n 60
I.2.3 Đưa nội dung thanh ghi n về 0 60
I.2.4 Nhảy theo nội dung thanh ghi n 61
I.2.5 Hoán vị nội dung hai thanh ghi n và m 61
I.3 Sự khác nhau giữa máy Turing và máy RAM 61
II MÔ HÌNH CÁC HÀM ĐỆQUY 62
II.1 Các hàm đệ quy nguyên thủy (primitive recursive functions) 62
II.1.1 Xây dựng các hàm sơ cấp 62
II.1.2 Sơ đồ hợp thành tổng quát 62
II.1.3 Sơ đồ đệ quy đơn (simple recurrence) 63
II.1.4 Sơ đồ đệ quy đồng thời 63
II.1.5 Các hàm được định nghĩa bởi case 65
II.2 Các hàm đệ quy 67
II.2.1 Sơ đồ tối thiểu 67
II.2.2 Các hàm đệ quy trừu tượng (abstract recursive functions) 68
II.2.3 Một số ví dụ 68
II.3 Các hàm đệ quy đều T−tính được 70
II.3.1 Sơ đồ hợp thành tổng quát 70
II.3.2 Sơ đồ đệ quy đơn 70
II.3.3 Sơ đồ tối thiểu 71
Trang 5Nhập môn lý thuyết tính toán 3
II.4 Mọi hàm T−tính được là đệ quy bộ phận 71
III LUẬN ĐỀCHURCH 73
CHƯƠNG 5 CÁC BÀI TOÁN KHÔNG QUYẾT ĐỊNH ĐƯỢC 77
I C ÁC N GÔN N G Ữ L I Ệ T K Ê ĐỆ Q UY V À C ÁC N GÔN N G Ữ ĐỆ Q UY 77
II C ÁC B ÀI T OÁN K HÔNG Q UY Ế T Đ ịNH Đ Ư Ợ C 82
III T HU Ậ T T OÁN R ÚT GỌ N MỘ T B ÀI T OÁN VỀ B ÀI T OÁN K HÁC 83
CHƯƠNG 6 ĐỘ PHỨC TẠP TÍNH TOÁN 93
I ĐỘPHỨC TẠP VỀTHỜI GIAN VÀ VỀBỘNHỚ 84
II CÁC LỚP CỦA ĐỘPHỨC TẠP 84
II.1 Hiện tượng nén 84
II.2 Các họ P, NP và P−bộ nhớ (P−space) 84
III RÚ T GỌ N Đ A T H Ứ C VÀ CÁ C BÀ I T O Á N N P −ĐẦ Y ĐỦ 84
III.1 Khái niệm 84
III.2 Các bài toán cổ điển 84
III.3 Ví dụ về rút gọn kiểu đa thức 84
Trang 7PGS.TS PHAN HUY KHÁNH biên soạn 1
CHƯƠNG 1
Nhập môn lý thuyết tính toán
(Introduction to the theory of computation)
It’s not bad being the small fish
I Các đối tượng được xử lý trong Tin học
Trong Tin học, các đối tượng (objects) được xử lý thông thường là những
phần tử thuộc vào những tập hợp vô hạn đếm được Những phần tử này luôn luôn
được biểu diễn (represented) dưới một dạng nào đó
Chẳng hạn trong ngôn ngữ tự nhiên, số nguyên 1999 được biểu diễn trong hệ đếm cơ số 10 (hệ thập phân) gồm một dãy bốn chữ số thập phân thuộc bảng chữ
số {0, 1, , 9} Việc xử lý (thực hiện các phép toán số học thông thường) đối với các số nguyên được tiến hành trên cách biểu diễn cơ số 10 này
Một bảng chữ S là một tập hợp hữu hạn các chữ (letters), hay là các ký tự
(symbols, hay characters)
Số lượng các ký tự, còn gọi là bản số (cardinality) hay lực lượng của S, được
ký hiệu ||S||, hay |S|, nếu không sợ nhầm lẫn
Một câu, hay một từ, trên bảng chữ S đã cho là một dãy hữu hạn các ký tự của
bảng chữ S được viết liên tiếp nhau
Độ dài (length) của một câu (trên bảng chữ S đã cho) là số lượng các ký tự có mặt trong câu Câu rỗng (empty word), được ký hiệu là e (ω hoặc e, hoặc l), là
câu có độ dài không, tức không chứa ký tự nào
Ghép (concatenation) của hai câu là đặt kế tiếp hai câu đã cho (trên cùng
dòng) để nhận được một câu mới Bằng cách ghép liên tục như vậy cho mọi ký
tự, mọi câu của S, ta nhận được một tập hợp chứa mọi câu có thể trên S, ký hiệu
S* Người ta nói S*là một cấu trúc đồng đẳng (nonoide), mà phần tử trung hòa (neutral element) chính là câu rỗng
Cho trước một bảng chữ S, người ta định nghĩa một quan hệ có thứ tự toàn phần (total order) trên S* như sau : cho một thứ tự tùy ý trên các ký tự của S,
Trang 8người ta sắp xếp các câu theo một thứ tự phân cấp (hierechical order), đầu tiên là theo độ dài câu, sau đó theo thứ tự từ vựng (lexicography), hay thứ tự ABC
Ví dụ :
Cho S = {a, b, c}, với giả thiết thứ tự phân cấp của các ký tự là a < b < c, ta
có thể đánh số các câu của S* (kể cả câu rỗng e) bắt đầu từ 1 trở đi như sau :
Hình 1.1 Thứ tự phân cấp trong S*
II Các máy (machines)
II.1 Khía cạnh chức năng (functional look)
Một máy (machine) được biểu diễn một cách hệ thống như sau :
Hình 1.2 Khía cạnh chức năng của một máy
Ở lối vào, người ta cung cấp một hoặc nhiều dữ liệu (data) cho máy, thì lối ra, người ta nhận được kết quả (result)
Giả thiết rằng các dữ liệu vào có dạng là dãy các ký tự, là một câu trên một bảng chữ nào đó đã cho (vào từ bàn phím chẳng hạn) Kết quả là một phần tử của một tập hợp xác định trước (predefini) Người ta phân biệt các kiểu máy (machine type) tùy theo bản chất của tập hợp kết quả này như sau :
1 Nếu tập hợp chỉ có hai phần tử { không, có } hay {0, 1}, máy sẽ chia dữ
liệu vào thành ba phần tùy theo kết quả :
Tập hợp các câu trên bảng chữ vào sau khi được xử lý sẽ cho ra một kết
quả là có (đúng, true), hoặc không (sai, false)
Tập hợp các câu mà máy đưa ra một kết quả khác
Tập hợp các câu trên bảng chữ vào mà máy không cho kết quả nào
Trang 9Nhập môn lý thuyết tính toán 3 Các tập hợp này tạo thành các ngôn ngữ (language) Hai tập hợp đầu là bù
nhau nếu với mọi dữ liệu vào, máy đều cho một kết quả Người ta gọi đó là
máy đoán nhận (recognition machine) câu
2 Nếu kết quả là một dãy hữu hạn các ký tự, ta nhận được một câu trên một
bảng chữ G nào đó
Cho S là bảng chữ vào, máy xác định một hàm f từ S* vào G*, ta viết :
f : S* → G*
nghĩa là với một câu vào w ∈ S*, f(w) ∈ G* Người ta nói máy thực hiện
hàm f Nếu với mọi câu vào w ∈ S*, máy đều cho một kết quả f(w) ∈ G*,
thì f được gọi là hàm toàn phần (partial function) Người ta gọi đó là máy
tính toán (computation machine) hay máy tính
Chú ý rằng kiểu máy thứ nhất (máy đoán nhận) mà chúng ta vừa phân biệt
thực ra chỉ là một trường hợp đặc biệt của kiểu máy thứ hai (máy tính)
3 Nếu kết quả là một dãy vô hạn các ký tự và bảng chữ đang sử dụng chỉ có
tối thiểu hai ký tự, trong đó có một dấu phân cách (separator) #, thì người ta
nhận được kết quả là một dãy liên tiếp các câu phân cách nhau bởi dấu #,
tạo thành một ngôn ngữ Người ta gọi ngôn ngữ này là liệt kê được
(enumerated) bởi máy
II.2 Khía cạnh cấu trúc (structural look)
Ở đây, ta chỉ quan tâm đến các máy được mô tả đầy đủ về chức năng hoạt
động của chúng Những máy này có thê :
Thực hiện các phép toán sơ cấp (elementary operation) trong một khoảng
thời gian hữu hạn Mỗi phép toán, giả thiết không chia cắt nhỏ hơn được,
được chọn trong một tập hợp hữu hạn các phép toán là một phần mô tả cấu
trúc máy
Lần lượt thực hiện các phép toán sơ cấp theo một thứ tự xác định trước, tạo
thành một chương trình (program), là một phần mô tả cấu trúc máy
Một dãy các phép toán sơ cấp được máy thực hiện liên tiếp được gọi là một
tính toán (computation) của máy
Trang 10III Mô hình tính toán
Thay vì phải thay đổi lại máy tính mỗi lần thay đổi bài toán cần giải, người ta định nghĩa các lớp máy có cùng nguyên lý hoạt động và chúng chỉ khác nhau ở chương trình
Người ta gọi mô hình tính toán (model), ký hiệu T, là sự mô tả tất cả các phép toán sơ cấp có thể được thực hiện trên những đối tượng nào, cách tác động lên mỗi một trong chúng như thế nào, và mô tả cách thức chương trình được thực hiện (execution) trên máy
Một trường hợp riêng (instance) của mô hình là một máy biệt lập nào đó, gọi
tắt là máy, hoạt động theo cách mô hình tính toán đã chỉ ra Máy này được định nghĩa bởi dữ liệu vào của chương trình :
Mô hình + Chương trình = Máy
Một khi một mô hình tính toán T được định nghĩa, được gọi là một T−máy, vấn đề đặt ra là làm sao để có thể biết :
− lớp ngôn ngữ đoán nhận được (recognized), được gọi là T−nhận biết được,
hoặc
− lớp các hàm tính được (computable), được gọi là T−tính được, hoặc
− lớp các ngôn ngữ liệt kê được (enumerable) được gọi là T −liệt kê được,
bởi một máy nào đó của mô hình này ?
Hai mô hình tính toán được đưa ra so sánh với nhau : một mô hình T1 được
nói là mạnh hơn so với một mô hình T2 nếu :
− mọi ngôn ngữ T2−nhận biết được cũng là T1−nhận biết được, hoặc
− mọi hàm T2-tính được cũng là T1−tính được, hoặc
− mọi ngôn ngữ T2-liệt kê được cũng là T1-liệt kê được
Hai mô hình được gọi là tương đương (equivalent) nếu mỗi mô hình mạnh
hơn mô hình kia và ngược lại
Hai mô hình là không thể so sánh với nhau được nếu không tồn tại mô hình
nào ít ra đủ mạnh hơn mô hình kia
Trang 11Nhập môn lý thuyết tính toán 5
IV Định nghĩa bài toán
Trong Tin học lý thuyết, định nghĩa về bài toán (problem) có vai trò đặc biệt
quan trọng, khác với khái niệm thông thường về bài toán được dùng trong lĩnh
vực Toán học hoặc hiểu theo nghĩa thông dụng
Định nghĩa 1.2 :
Một bài toán là :
− Sự mô tả cách biểu diễn (hữu hạn) các phần tử của một tập hợp hữu hạn
hay vô hạn đếm được
− Một phát biểu liên quan đến các phần tử của tập hợp này, có thể là đúng,
hoặc có thể là sai tùy theo phần tử được chọn
Sau đây là một số ví dụ :
Bài toán 1 :
Dữ liệu: Một số nguyên viết trong hệ 10
Câu hỏi : Số nguyên đã cho có là số nguyên tố hay không ?
Bài toán 2 :
Dữ liệu : Một số nguyên viết trong hệ 10
Câu hỏi : Có phải số nguyên này được viết dưới dạng tổng của 4 số bình phương
?
Bài toán 3 :
Dữ liệu : Một số nguyên viết dưới dạng tích của các số hạng trong hệ 10
Câu hỏi : Số nguyên đã cho có là số nguyên tố hay không ?
Bài toán 4 :
Dữ liệu : Một đồ thị hữu hạn được biểu diễn bởi một danh sách gồm các đỉnh
và các cung, trong đó mỗi đỉnh được biểu diễn bởi một số nguyên trong hệ 10
Câu hỏi : Có tồn tại một đường đi Hamilton (đi qua hết tất cả các đỉnh của
đồ thị, mỗi đỉnh đi qua đúng một lần) trong đồ thị đã cho không ?
Bài toán 5 :
Dữ liệu : Một biểu thức chính quy (regular expression) được xây dựng trên
một bảng chữ S (là một biểu thức nhận được từ các câu w∈S* bởi
các phép hoặc, phép ghép tiếp, phép * và lấy bù)
Câu hỏi : Có phải biểu thức đã cho biểu diễn (hay chỉ định) một ngôn ngữ
trống (empty language) hay không ?
Bài toán 6 :
Dữ liệu : Một dãy hữu hạn các cặp câu (u1, v1), (u2, v2) , (uk, vk)
Câu hỏi : Tồn tại hay không một dãy chỉ số i 1 , i 2 , i n sao cho thoả mãn
u i1 u i2 u in = v i1 v i2 v in ?
Trang 12Việc biểu diễn tường minh các dữ liệu là một thành phần của bài toán Điều này đóng vai trò đặc biệt quan trọng khi người ta quan tâm đến độ phức tạp (complexity) của một bài toán Mỗi dữ liệu sẽ tạo thành một trường hợp cá biệt của bài toán, được biểu diễn bởi một câu trên một bảng chữ hữu hạn đã cho
Với mỗi bài toán P được hợp thành từ một biểu diễn các phần tử của một tập
hợp và từ một phát biểu liên quan đến các phần tử này, người ta thường kết hợp
bài toán P với một ngôn ngữ, gọi là ngôn ngữ đặc trưng (characteristic language)
của bài toán, được hợp thành từ tập hợp các câu biểu diễn một phần tử của tập
hợp để từ đó, kết quả của bài toán là câu trả lời đúng Người ta ký hiệu LP là
ngôn ngữ đặc trưng của bài toán P
Cho trước một bài toán P, bài toán ngược lại CP là bài toán nhận được từ P
bằng cách giữ nguyên cách biểu diễn các dữ liệu nhưng riêng câu hỏi thì đặt ngược lại Ví dụ, bài toán ngược với bài toán 1 sẽ là :
Bài toán 1’ :
Dữ liệu : Cho một số nguyên viết trong hệ 10
Câu hỏi : Số nguyên này không phải là một số nguyên tố ?
Từ đó, lời giải một bài toán đưa đến sự nhận biết của một ngôn ngữ : ngôn ngữ kết hợp với bài toán này Người ta đưa ra định nghĩa hình thức sau đây :
Định nghĩa 1.2 :
Một máy giải (solve) một bài toán P nếu và chỉ nếu với mọi câu f biểu diễn
một phần tử của tập hợp liên quan đến bài toán này, máy cho phép xác định,
trong một khoảng thời gian hữu hạn, nếu câu này thuộc về LP hay LCP
Người ta phân lớp các bài toán tùy theo độ khó (difficulty) để đưa ra câu trả
lời từ dữ liệu vào đã cho
Một bài toán là tầm thường (trivial) nếu LP = ∅ hoặc nếu LCP= ∅
Thật vậy, trong trường hợp này, không cần thiết biết dữ liệu đưa vào để đưa ra câu trả lời Chú ý rằng, những gì là tầm thường, đó là việc đưa ra câu trả lời, nhưng có thể rất khó để chứng minh rằng bài toán là tầm thường theo nghĩa này
Ví dụ, bài toán 2 là tầm thường
Các bài toán 1 và 3 có cùng câu hỏi, nhưng bài toán 3 giải quyết rất dễ dàng : chỉ cần đọc qua dữ liệu vào, người ta có thể đưa ra kết quả, tuy nhiên trong bài toán 1 thì cần phải xử lý dữ liệu vào Bài toán 4 phức tạp hơn : người ta chưa biết
phương pháp nào hoạt động một cách đơn định (deterministic) tiêu tốn một lượng thời gian đa thức (polynomial times) để giải quyết vấn đề đặt ra
Đối với bài toán 5 thì tính phức tạp còn lớn hơn nữa : người ta biết rằng mọi phương pháp đều hoạt động theo thời gian tối thiểu là lũy thừa Cuối cùng bài
toán 6 không thể giải được theo nghĩa đã đưa ra Bài toán này được gọi là bài toán tương ứng Post (Post’s correspondence problem)
Trang 13Nhập môn lý thuyết tính toán 7
Bài tập
1) Chứng minh rằng một tập hợp E là hữu hạn hay vô hạn đếm được nếu tồn tại
một đơn ánh từ E vào N Tương tự, nếu tồn tại một toàn ánh (surjection) từ Ν
vào E
2) Chứng minh rằng tích Đê-cac của hai tập hợp vô hạn đếm được cũng là một
tập hợp vô hạn đếm được
3) Chứng minh các tập hợp sau đây là vô hạn đếm được : N×N, Q, tập hợp Ν*
gồm các dãy số nguyên, S*, S*×G*, S*×N, tập hợp (S*)* gồm các dãy các
câu Thể hiện các song ánh (bijection) giữa N và mỗi một tập hợp vừa nêu
4) Cho S là một bảng chữ kích thước (bản số) n Với mọi câu w∈S*, ký hiệu |w|
là độ dài của w và m(w) là số thứ tự của w trong thứ tự phân cấp đã cho Hãy
tìm cách tính m(w) khi biết w
5) Chứng minh rằng N N không phải là vô hạn đếm được Tập hợp các chương
trình Pascal có phải là vô hạn đếm được hay không ? Tập hợp các hàm f: N →
N tính được nhờ một chương trình Psacal có là vô hạn đếm được hay không ?
Từ đó suy ra rằng tồn tại các hàm từ N vào N không là vô hạn đếm được nhờ
một chương trình Pascal
6) Viết một chương trình để liệt kê :
− các cặp số nguyên
− các dãy hữu hạn các số nguyên
− các câu trên một bảng chữ hữu hạn (chẳng hạn S={a, b, c})
− các cặp câu
− các dãy hữu hạn các câu
Trang 15PGS.TS PHAN HUY KHÁNH biên soạn 9
CHƯƠNG 2
Mô hình các máy RAM
« I like the dreams of the future better than
the history of the past »
Jefferson
I Các máy RAM
Máy RAM là một mô hình tính toán rất gần với máy tính điện tử và ngôn ngữ assembler Máy RAM có các thành phần đặc trưng chung như sau :
Một băng vào, hay dải vào (input tape) được chia thành nhiều ô (square hay
pigeonhole) liên tiếp nhau, mỗi ô chứa một số nguyên hoặc một ký tự Một
đầu đọc (read head) đọc lần lượt nội dung từng ô trên băng vào, đọc từ trái
qua phải
Một băng ra (output tape) cũng chia ra thành nhiều ô liên tiếp nhau và một
đầu ghi (write head) có thể ghi mỗi lần lên một ô và tiến từ trái qua phải
Người ta nói rằng đầu đọc (hoặc ghi) được đặt trên (tại) một ô và di chuyển qua phải mỗi lần một ô Trước tiên, ta xem rằng mỗi ô chứa một số nguyên có thể lớn tuỳ ý Băng vào và băng ra của máy RAM được gọi là các cơ quan vào/ra Máy RAM còn có các thành phần bên trong như sau :
Các thanh ghi (registers) là các phần tử nhớ được đánh số thứ tự, số lượng
các thanh ghi có thể lớn tuỳ ý Mỗi thanh ghi có thể lưu giữ một số nguyên Các thanh ghi lần lượt được đặt tên là R0, R1, R2, , Rn
Chỉ số i, i = 0, 1, 2, , được gọi là địa chỉ (address) của mỗi thanh ghi (hay
của bộ nhớ) Riêng R0 là một thanh ghi đặc biệt, được gọi là thanh tổng (ACC −
accumulator) hay thanh tích luỹ
Một tập hợp các đơn vị nhớ được đánh số chứa chương trình của máy RAM dưới dạng một dãy các lệnh sơ cấp (primary instructions) không bị thay đổi trong quá trình chạy (thực hiện) Mỗi lệnh được lưu trữ trong một đơn vị nhớ, được đánh số tương ứng với số thứ tự hay nhãn của lệnh (label)
Một đơn vị nhớ chứa số thứ tự của lệnh đang được thực hiện, được gọi là
thanh đếm lệnh (OC − Ordinal Counter) Lúc đầu nội dung là của OC là 1
Trong kiểu máy này, người ta truy cập trực tiếp đến mỗi thanh ghi bởi địa chỉ của thanh ghi đó Chính lý do này mà kiểu máy này được đặt tên là Random Access Memory (viết tắt RAM)
Trang 16Hình 2.1 Sơ đồ một máy RAM Mỗi chương trình của máy RAM gồm một dãy lệnh sơ cấp, mỗi lệnh được tạo thành từ 2 thành phần : mã lệnh (operation code) và toán hạng (operand) :
x1 x2 xn Băng vào
Trang 17Mô hình các máy RAM 11
Theo nguyên tắc địa chỉ, phần toán hạng là địa chỉ (address) của toán hạng
tham gia phép toán chỉ định bởi phần mã lệnh Toán hạng có thể là một trong ba kiểu sau :
Kiểu địa chỉ Ý nghĩa
Số nguyên n Chỉ nội dung của thanh ghi thứ n (Rn)
A: n (A = Absolute) toán hạng chính là số nguyên n đó
I: n (I = Indirection) toán hạng là nội dung của thanh ghi có số thứ
tự là nội dung của thanh ghi Rn Đây là kiểu lệnh gián tiếp Nếu lệnh là một lệnh nhảy thì địa chỉ chính là số thứ tự của lệnh trong chương trình Các lệnh trên đây của máy RAM điển hình cho các lệnh của ngôn ngữ assembler Tuy nhiên ở đây vắng mặt các lệnh xử lý ký tự và các lệnh logic nhằm đơn giản cách trình bày
Thứ tự thực hiện các lệnh của chương trình là tuần tự (on sequence), bắt đầu
từ lệnh đầu tiên (có nhãn 1) Ngoại lệ duy nhất là khi gặp lệnh nhảy (hay chuyển điều khiển) thì lệnh tiếp theo được thực hiện có nhãn chỉ định bởi lệnh nhảy này Nguyên tắc thực hiện như sau : OC luôn luôn chứa nhãn của lệnh sẽ được thực hiện, lúc đầu nội dung OC là 1 Sau khi thực hiện lệnh, nội dung OC được
tự động tăng thêm 1 (increment) nếu như lệnh vừa thực hiện không là lệnh nhảy Nếu như lệnh vừa thực hiện là lệnh nhảy thì nội dung của OC lấy nhãn là phần địa chỉ của lệnh nhảy này
Sau đây sử dụng một số quy ước để giải thích cách thực hiện lệnh
← dấu gán ; quy ước số nguyên i nằm bên trái dấu gán chỉ thanh ghi
thứ i là Ri, số nguyên i nằm bên phải dấu gán chỉ giá trị chính là số nguyên i đó
<i> Chỉ nội dung của thanh ghi Ri
<<i>> Chỉ nội dung của thanh ghi có số thứ tự được chứa trong thanh ghi
Ri đối với kiểu lệnh gián tiếp
ACC Chỉ thanh ghi R0
CO Chỉ thanh đếm lệnh
<CO> Nội dung của CO
Sau đây là bảng các lệnh RAM và ý nghĩa sử dụng của chúng
Trang 18đầu ghi dịch qua phải một ô
Ví dụ 2.1 : Chương trình RAM sau đây đánh giá trị n!
JZERO 10 nếu n = 0, nhảy đến nhãn 10,
nếu không, thực hiện lệnh tiếp theo STORE 1 R1 ← <ACC>
4: STORE 2 R2 ← <ACC>
DECR 1 R1 ← < R1> − 1
LOAD 1 ACC ← <R1>
JZERO 12 nếu <ACC> = 0 nhảy đến 12
MULT 2 ACC ← <ACC> * <R2>
Trang 19Mô hình các máy RAM 13
JGTZ 14 nếu <ACC> ≥ 0, nhảy đến 14
JUMP 21 nhảy đến 21 nếu <ACC> < 0
Ta có thể giải thích ánh xạ này ở dưới hai dạng : dạng hàm và dạng ngôn ngữ
Trang 20Dạng hàm f : S* → S*
Giả sử chương trình P luôn đọc được từ băng vào n số nguyên x 1 , x 2 , , x n và
ghi lên băng ra không quá một số nguyên y ở ô đầu tiên, khi đó ta nói P tính hàm
f (x 1 , x 2 , , x n ) = y
Dạng ngôn ngữ L ⊆ S*
Giả sử trên băng vào có câu w = a 1 a 2 a n với ai ở ô thứ i, i = 1 n, còn ô thứ n+1 chứa # là ký tự kết thúc dãy Ta nói w được thừa nhận bởi chương trình RAM nếu nó đọc được hết w, kể cả ký tự #, sau đó viết lên ô đầu tiên của băng ra
một ký tự kết quả và dừng
Ta nói máy RAM thừa nhận một ngôn ngữ L đã cho nếu thừa nhận mọi câu w∈L Nếu w∉L thì máy RAM có thể không đọc hết w, ghi ký tự kết thúc lên
băng ra, hoặc bị hóc (crash), hoặc không bao giờ dừng
Sự khác nhau cơ bản giữa mô hình máy RAM vừa mô tả ở trên và các máy tinh điện tử hiện nay là ở chỗ :
1) Ta đã giả thiết có thể sử dụng một số lớn tùy ý các thanh ghi, tuy nhiên trong thực tế điều này rất khó thực hiện Tương tự, ta đã giả thiết có thể đặt một số nguyên lớn tùy ý vào một thanh ghi nào đó, hoặc vào một ô nào đó trên băng vào, hoặc trên băng ra Nhưng điều này cũng rất khó thực hiện trong thực tiễn
2) Ta đã giả thiết rằng chương trình có sẵn trong bộ nhớ RAM chỉ có thể đọc (không thể bị thay đổi khi chạy chương trình), khác với các bộ nhớ kiểu thanh ghi Điều này cũng không xảy ra với các máy tính thông dụng
Sự khác nhau chi tiết như sau :
3) Các lệnh sơ cấp được chọn hạn chế hơn so với các ngôn ngữ assembler Tuy nhiên, người ta có thể nói rằng vẫn không làm mất tính tổng quát nếu giảm đáng kể tập hợp các lệnh sơ cấp
4) Các dữ liệu đưa vào không phải dưới dạng các số nguyên được đọc toàn bộ một lần trong một ô, mà dưới dạng một dãy ký tự (một dãy các chữ số), tương tự như vậy đối với các kết quả ra
Ta hãy xem làm cách nào để giải quyết vấn đề do 4) đặt ra : Trong các máy
tính, các số nguyên thường được biểu diễn theo hai cách phân biệt là biểu diễn thập phân, hoặc biểu diễn nhị phân Cách biểu diễn nhị phân có lợi thế hơn vì chỉ
sử dụng hai chữ số Máy tính sẽ chuyển đổi chuỗi ký tự biểu diễn số nguyên thành biểu diễn nhị phân để đặt trong các thanh ghi, sau đó chuyển đổi kết quả đang ở dạng biểu diễn nhị phân của số nguyên thành chuỗi ký tự trên băng ra Điểm 1) trên đây có nghĩa : trong mọi trường hợp, kích thước của bài toán cần giải là đủ bé để bộ nhớ máy tính có thể chứa hết ở dạng nhị phân trong các đơn vị
nhớ, hay từ nhớ (memory word) Chú ý rằng nếu chỉ làm việc với cách biểu diễn
số nguyên bởi chuỗi các chữ số thì không còn giả thiết số lớn tùy ý nữa
Trang 21Mô hình các máy RAM 15 Cuối cùng, sự khác nhau ở điếm (2) đưa đến việc xây dựng một mô hình tương tự mô hình RAM, nhưng chương trình được đặt trong các thanh ghi (và do vậy có thể bị thay đổi), được gọi là mô hình các máy RASP (Random Access with Stored Program) Sự khác nhau cơ bản với các máy RAM là vùng nhớ lưu giữ chương trình của RASP hoàn toàn không khác gì so với các vùng nhớ khác
Máy RASP
Để thuận tiện cách trình bày, ta quy ước rằng mỗi lệnh RASP chiếm chỗ hai thanh ghi liên tiếp nhau : thanh ghi đầu chứa trường toán hạng, thanh ghi thứ hai chứa trường địa chỉ của lệnh
Hình 2.2 Sơ đồ một máy RASP
Trong máy RASP, thanh tổng luôn luôn là R0, thanh ghi R1 dùng để lưu giữ trung gian nội dung của thanh tổng
Các thanh ghi từ 2 p (với p là một số nguyên lẻ) chứa chương trình của máy RASP, và các thanh ghi tiếp theo, từ p + 1 trở đi, là các thanh ghi còn trống
Sự khác nhau cớ bản với mô hình máy RAM là có thể thay đổi một thanh ghi chứa chương trình, và do vậy, có thể thay đổi chương trình
R1
R2 Chương trình
Rp
Các thanh ghi khác Thanh đếm lệnh
i
y1 y2 y3 Băng ra
x1 x2 xn Băng vào
Trang 22II Mô phỏng một máy bởi một máy khác
Từ đây trở đi, người ta thường phải mô phỏng một máy bởi một máy khác : máy mô phỏng sẽ bắt chước hay nhại lại (mime) mỗi một lệnh của máy được mô phỏng, bằng cách thực hiện nhiều lệnh (nói chung) để đi đến cùng một kết quả
Khi có một máy RAM M có chương trình P chạy và sử dụng đến thanh ghi 0
và các thanh ghi từ 1 đến p (giá trị của p thay đổi tùy theo dữ liệu), người ta nói rằng một máy RAM M’ có chương trình P’ mô phỏng chức năng của máy RAM
M nếu :
Tồn tại một ánh xạ I từ N vào N mà biến 0 thành 0
Mỗi lệnh của P được thay thế bởi một lệnh của P’ sao cho, mỗi lần thực hiện chương trình P (nghĩa là với mọi dữ liệu), nội dung mỗi thanh ghi I (r) của M’ sau khi thực hiện dãy các lệnh của P’ là giống như nội dung của thanh ghi R của M sau khi thực hiện các lệnh tương ứng của P
Ví dụ 2.3 : Dịch chuyển các địa chỉ thanh ghi
Xuất phát từ một máy RAM có chương trình P khi chạy sử dụng thanh ghi 0
và các thanh ghi từ 1 đến p, ta có thể xây dựng một máy RAM khác có chương trình P k mô phỏng trình P với ánh xạ I xác định bởi :
I (0) = 0
I (r) = k + r với r > 0
Việc mô phỏng máy RAM sẽ trở nên tầm thường nếu không xử lý các lệnh gián tiếp Đối với kiểu lệnh này, vấn đề là thay đổi địa chỉ các thanh ghi sử dụng
đến, bằng cách thêm giá trị k (nhờ lệnh ADD A:k) vào nội dung của thanh ghi
liên quan (đặt sau I) để thực hiện kiểu gián tiếp
Các máy RASP cũng có thể được mô phỏng và có thể xử lý kiểu lệnh gián tiếp
Dịch chuyển các địa chỉ thanh ghi của RASP
Những gì mà một máy RAM làm được thì một máy RASP cũng có thể được làm được Thật vậy, nếu chương trình của RASP được lưu giữ trong các thanh
ghi từ 2 đến p, chỉ cần thực hiện một sự biến đổi của p lên tất cả các số của thanh
ghi sử dụng bởi máy RAM tương ứng
Tuy nhiên trong mô hình của RASP, kiểu lệnh gián tiếp được xử lý như sau :
Giả sử một chương trình P của máy RASP được lưu giữ từ thanh ghi số 2 đến
p và khi chạy sử dụng đến các thanh ghi từ p + 1 đến q Ta sẽ xây dựng một chương trình mới mô phỏng P được lưu giữ trong các thanh ghi từ 2 đến p’
Khi chạy, chương trình sử dụng đến các thanh ghi từ p’ + 1 đến q + p’ − p,
bằng cách thay thế mỗi lệnh kiểu gián tiếp bởi 6 lệnh không là kiểu gián tiếp, sao
cho kết quả của 6 lệnh này là tương tự trên mỗi thanh ghi số p’ + i với kết quả của lệnh được mô phỏng trên mỗi thanh ghi số p + i
Trang 23Mô hình các máy RAM 17
Một cách cụ thể hơn, p’ − p có giá trị 2 × (6 − 1) × s = 10s với s là tổng số
lệnh kiểu gián tiếp của chương trình
Giả sử ta cần mô phỏng một trong các lệnh MULT I: n của chương trình RASP cần mô phỏng, được lưu giữ trên các thanh ghi 30 và 31 của máy xuất phát Để mô phỏng, ta cần tạo ra nhóm 6 lệnh chiếm 12 liên tiếp, giả sử từ thanh ghi số 50 đến 61, với giả thiết chương trình có trên hai lệnh kiểu gián tiếp Lệnh đầu tiên của nhóm 6 lệnh này là lưu giữ nội dung của thanh tổng vào thanh ghi
R1 :
50 STORE
Lệnh thứ hai nạp vào thanh tổng nội dung của thanh ghi n + p’ − p (tương ứng
với thanh ghi n trong chương trình xuất phát) :
52 LOAD
53 n + p’- p ACC ← <Rn> + (p’ − p)
Lệnh thứ ba tăng nội dung của thanh tổng lên p’ − p để lúc này thanh tổng
chứa địa chỉ của thanh ghi chứa giá trị cần nhân :
Trang 24Ví dụ 2.4 : Dịch chuyển một trình RASP có một lệnh dạng giân tiếp :
b a b
b a a
nếu
nếu 1
Trang 25Mô hình các máy RAM 19
III Một mô hình thô sơ kiểu RAM
Trong phần này, ta sẽ chỉ ra rằng có thể thu gọn về một tập hợp lệnh sơ cấp rất nhỏ Đặc biệt, ta sẽ chỉ ra rằng có thể xử lý ký tự và xử lý các số nguyên
Trước hết, ta quay lại cách biểu diễn các số nguyên Trong máy tính, có hai cách biểu diễn : biểu diễn nhị phân cho phép lưu trữ một số nguyên trong một thanh ghi làm tiết kiệm chỗ và tính toán nhanh chóng nhưng có nhược điểm là độ lớn của số nguyên phụ thuộc vào kích thước thực tế của thanh ghi (hữu hạn) Cách biểu diễn thứ hai là sử dụng một dãy chữ số trên bảng chữ {0 9} Thực
tế, ngay cả khi người ta có thể biểu diễn trong một thanh ghi nhiều ký tự (thường không quá 4), thì để biểu diễn một số nguyên cũng đòi hỏi có nhiều thanh ghi Mặc dù dải số nguyên có thể biểu diễn được là khá lớn, nhưng do số lượng các thanh ghi trong máy tính hiện nay bị hạn chế nên cách biểu diễn này cũng chưa phải tối ưu
III.1 Mô phỏng các phép toán trên chuỗi ký tự bởi các
phép toán trên các số nguyên
Mỗi ký tự được mã hóa bởi một dãy các chữ số nhị phân {0, 1} (chẳng hạn 8 chữ số cho một ký tự) Một chuỗi bit như vậy có thể dùng để biểu diễn các số nguyên nhờ thực hiện các phép toán trên các số nguyên
Chẳng hạn, ghép 198 và 7, dẫn đến phép nhân số nguyên biểu diễn chuỗi 198 với 28 rồi cộng thêm số nguyên biểu diễn chuỗi 7 vào tích số nhận được :
Trang 26JZERO n’ goto n’, if <ACC> = 0
Trong đó n’ là nhãn của lệnh STORE 1 đặt trước ngay lệnh có nhãn n trong máy xuất phát
Bài tập : Một cách tương tự, xây dựng lại lệnh JGTZ (nhảy nếu kết quả dương) III.3 Thu gọn tập hợp các lệnh số học
Có thể chuyển đổi các lệnh số học (cộng, trừ, nhân, chia) về hai kiểu lệnh là INCR (tăng 1) và DECR (giảm 1)
Chẳng hạn, lệnh nhân MULT n sẽ được chuyển đổi bằng cách thêm <n> lần
nội dung của thanh tổng Sử dụng các thanh ghi từ 1 đến 3 làm trung gian, ta có thể thay lệnh nhân bởi các lệnh sau :
STORE 1 LOAD n STORE 2
STORE 3
JZERO lab DECR 2 LOAD 1 ADD 1 STORE 3 JUMP return
Một cách tương tự, lệnh ADD n tăng thêm 1 (INCR) đúng <n> lần nội dung
của thanh tổng nhờ các lệnh STORE, LOAD, JGTZ, DECR
Trang 27Mô hình các máy RAM 21
Từ đó, người ta có thể thu hẹp về một mô hình tính toán, gọi là mô hình RAM thô sơ, chỉ có tập hợp các lệnh tối thiểu sau :
I <n> Tăng thêm 1 nội dung của thanh ghi n
D <n> Giảm bớt 1 nội dung của thanh ghi n
Z <n> Đặt nội dung của thanh ghi n về 0
S <n, m> Hoán đổi nội dung các thanh ghi n và m
J <n> (i, j) Nếu nội dung của thanh ghi n là 0, nhảy đến lệnh có nhãn i,
nếu không nhảy đến lệnh có nhãn j HALT Dừng máy
Với tập hợp các lệnh trên, chương trình cũng là một dãy lệnh có mang nhãn
Nếu <n> chỉ định nội dung của thanh ghi n, thì <<n>> chỉ định nội dung của thanh ghi có số thứ tự là <n>
Trang 28IV Máy RAM vạn năng
Trong phần này, chúng ta sẽ chỉ ra cách xây dựng một máy kiểu RAM có thể
mô phỏng bất kỳ máy RASP nào không sử dụng kiểu gián tiếp Nguyên lý mô
phỏng như sau : lúc đầu, người ta đọc chương trình của máy RASP, chương trình
này được lưu giữ trong các thanh ghi từ 4 đến p của máy RAM Thanh ghi R1
dùng làm địa chỉ gián tiếp ; thanh ghi R2 dùng để mô phỏng thanh đếm lệnh của RASP Thanh ghi R3 dùng để mô phỏng thanh tổng của RASP Sau đó, thực hiện một vòng lặp trên các phép toán được mô tả dưới đây, mỗi lần lặp là một lần mô phỏng một lệnh của RASP
Giả thiết rằng thanh ghi R2 chứa địa chỉ của thanh ghi đầu tiên trong hai thanh ghi chứa lệnh cần mô phỏng (bắt đầu từ 4) Vòng lặp như sau :
Loop:
− Nội dung của thanh ghi của R2 được gán cho thanh tổng :
LOAD I: 2
− Phân tích mã phép toán của lệnh này và tùy theo mã đã phân tích mà nhảy
đến dãy lệnh tương ứng với nó Ví dụ, nếu x là mã của phép chia DIV và y
là nhãn của dãy phép toán mô phỏng DIV, nếu z là mã của phép nhảy dương JGTZ và t là nhãn của dãy phép toán mô phỏng JGTZ :
Sau đó, từ nhãn y, thực hiện mô phỏng phép toán chia DIV :
− Tăng nội dung R2 lên 1 để R2 chứa địa chỉ của thanh ghi chứa toán hạng : INCR 2
− Gán địa chỉ này cho thanh ghi R1 :
Trang 29Mô hình các máy RAM 23
− Tăng nội dung thanh ghi R2 lên 1 để R2 chứa địa chỉ của thanh ghi đầu tiên trong hai thanh ghi chứa lệnh tiếp theo cần mô phỏng :
INCR 2
− Quay lại từ đầu vòng lặp bởi lệnh nhảy :
JUMP loop
Tương tự, từ nhãn t, thực hiện mô phỏng phép toán nhảy dương JGTZ :
− Kiểm tra nội dung thanh tổng của RASP, nếu dương thì nhảy :
LOAD 3
JGTZ lab
− Nếu kết quả âm, tăng nội dung của R2 lên 2 để R2 chứa địa chỉ của thanh ghi đầu tiên trong hai thanh ghi chứa lệnh tiếp theo cần mô phỏng và quay lại đầu vòng lặp :
− Thay đổi sao cho thanh ghi R2 mô phỏng thanh đếm lệnh OC của RASP,
và quay lại đầu vòng lặp :
STORE 2
JUMP loop
Như vậy mỗi phép toán sơ cấp của RASP được mô phỏng bởi một dãy các lệnh
lặp của máy RAM Máy RAM vừa mô phỏng có dữ liệu là chương trình P của một máy RASP bất kỳ, theo sau là một dữ liệu D cho chương trình P Máy RAM có kết quả là kết quả của P trên dữ liệu D Máy RAM mô phỏng hoạt động của mọi máy
Trang 30Bài tập
1 Viết chương trình của một máy RAM tính n n với số nguyên n cho trước
2 Viết chương trình của một máy RASP tính giá trị bình quân nguyên của dãy n
số nguyên cho trước, với n lẻ
3 Viết chương trình của một máy RASP không sử dụng kiểu gián tiếp để tính giống bài 2
4 Viết chương trình của một máy RAM thô sơ tính :
a Phần dư của phép chia m cho n, với m và n cho trước
b Số nguyên tố thứ n, với n cho trước
5 Chứng tỏ rằng có thể rút lệnh hoán đổi : S <n, m> trong máy RAM thô sơ
6 Hãy tìm cách mô phỏng các phép toán logic sơ cấp trong một máy RAM, trong một máy RASP và trong một máy RAM thô sơ
7 Hãy cho biết tập hợp các phép toán sơ cấp để xử lý ký tự Hãy tìm cách mô phỏng chúng trong một máy RAM, trong một máy RASP và trong một máy RAM thô sơ
8 Viết chương trình của một máy RAM vạn năng
Trang 31PGS TS PHAN HUY KHÁNH biên soạn 25
CHƯƠNG 3
Mô hình các máy Turing
« If the human brain was so simple that we could understand it, then we would be so simple that we could not »
(L Watson)
Mô hình các máy Turing (Turing machines model) là một trong trong những
mô hình được sử dụng rất rộng rãi trong lý thuyết tính toán Trong chương này, chúng ta sẽ tập trung mô tả hình thức các máy Turing, chức năng đoán nhận ngôn ngữ và tính hàm của chúng Từ đó chúng ta sẽ nghiên cứu các tính chất của lớp
các hàm T−tính được Phần cuối chương trình bày các biến thể khác của mô hình
các máy Turing và các máy Turing không đơn định
I Mô tả và hoạt động của máy Turing
I.1 Mô tả máy Turing
Một máy Turing gồm :
Một băng vô hạn cả hai phía trái và phải được chia thành các ô liên tiếp nhau Mỗi ô chứa một thông tin hữu hạn (finite information) nào đó được biểu diễn bởi một chữ cái (letter) hay ký tự Tập hợp các chữ cái (hay ký tự) này tạo ra bảng chữ của máy Turing, đưọc định nghĩa đồng thời với máy Turing
Một đầu đọc−ghi để đọc hay ghi (làm thay đổi) nội dung từng ô của băng,
và mỗi lần chỉ di chuyển, qua phải hoặc qua trái, một vị trí tương ứng với một ô Như vậy, tại mỗi thời điểm, chỉ duy nhất một ô được đọc, hoặc được ghi mà thôi
Một bộ nhớ phụ hữu hạn có thể tiếp cận tại mọi thời điểm, có thể biết được nội dung và thay đổi được Tất cả các nội dung có thể của bộ nhớ phụ này được liệt kê hết lúc định nghĩa máy Turing, được chỉ định bởi một số thứ
tự, gọi là trạng thái của máy Turing
Một chương trình là một tập hợp hữu hạn các quy tắc chỉ ra sự thay đổi các thông tin trên băng và nội dung của bộ nhớ phụ
Một cách hình thức, máy Turing được định nghĩa từ các thành phần sau đây :
Trang 32Một bảng chữ S có tối thiểu hai ký tự, một trong chúng là một ký tự trắng,
ký hiệu # (hoặc B) Trên băng của máy Turing, mỗi ô chứa một ký tự của bảng chữ này
Một tập hợp hữu hạn các trạng thái Q Mỗi trạng thái là một tên chỉ định
thông tin của bộ nhớ phụ hữu hạn
Một chương trình P là một tập hợp con của Q×S´S´M´Q, trong đó,
M = {L, R} là tập hợp các chuyển động có thể của đầu đọc−ghi, tương ứng
với việc chuyển đầu đọc qua trái (Left) một ô, hoặc qua phải (Right) một ô
Mỗi phần tử (q, x, y, m, p) của P là một quy tắc, được viết như sau :
q, x → y, m, p
với x và y ∈ S, q và p ∈ Q, m ∈ M, trong đó :
Cặp (q, x) là vế trái của quy tắc, cho biết điều kiện để áp dụng quy tắc
Bộ ba (y, m, p) là vế phải của quy tắc, cho biết các thay đổi khác nhau khi
áp dụng quy tắc, theo một thể thức sẽ trình bày dưới đây
Người ta thường biểu diễn một quy tắc của P dưới dạng sơ đồ như sau :
Hình 3.1 Biểu diễn dạng sơ đồ một quy tắc của máy Turing
Như vậy, một máy Turing là một bộ ba T = <S, Q, P> được đặc tả một cách
hữu hạn Trước khi giải thích họat động của một máy Turing, ta có nhận xét rằng tồn tại nhiều cách định nghĩa máy Turing Mặc dù những định nghĩa này không làm ảnh hưởng đến hiệu lực của mô hình, nhưng đều có các nhược điểm
Mô hình được chọn định nghĩa ở đây cũng có những điều bất tiện Đó là cách
mô tả các ô của băng vô hạn Ở đây ta đã quy ước rằng các máy Turing luôn luôn
có vô hạn các ô chứa ký tự trắng # về phía bên trái và về phía bên phải, chỉ có một phần của băng gồm một số hữu hạn ô (nhưng không bị giới hạn) là hữu ích,
gọi là phần hữu ích (usable part)
Dãy ký tự chứa trong phần hữu ích này là một câu f trên bảng chữ S, nằm giữa hai ký tự # Người ta viết f#f
Chú ý rằng một số tài liệu xem ký tự trắng không thuộc bảng chữ S, # ∉ S
I.2 Hoạt động của máy Turing
Người ta gọi c là cấu hình (configuration) của một máy Turing T =<S, Q, P>
là một bộ ba :
c = (f, q, xg) ∈ S* ´ Q ´ SS*sao cho câu fxg tạo thành phần hữu ích của băng vô hạn Trạng thái q chỉ định nội
dung của bộ nhớ phụ Đầu đọc−ghi được đặt trên ô chứa ký tự x
x | y, m
q p
Trang 33Mô hình các máy RAM 27 Một máy Turing và một cấu hình của máy cho phép mô tả đầy đủ hệ thống
Cho máy Turing T = <S, Q, P>, và c = (f, q, xg) là một cấu hình nào đó, ta nói rằng tồn tại một chuyển tiếp (transition) hay dịch chuyển từ cấu hình c thành cấu
− nếu m = L thì f = f’z và g’ = zyg, với z là ký tự trên băng
Trong cả hai trường hợp, chuyển tiếp làm thay đổi nội dung của ô nằm dưới đầu đọc−ghi, và dịch đầu đọc−ghi qua trái hoặc qua phải tuỳ theo giá trị chỉ
hướng của m (L hoặc R) Cuối cùng chuyển tiếp làm thay đổi nội dung của bộ nhớ phụ, chuyển từ trạng thái q thành trạng thái q’
Hình 3.2 Máy Turing trong cấu hình c = (f, q, xg) Cho máy Turing T = <S, Q, P>, và c là một cấu hình, ta nói rằng tồn tại một phép tính hợp lệ (valid computation) có độ dài n ≥ 0 dẫn từ cấu hình c đến cấu
hình c’, ký hiệu c Ã− n c’, nếu và chỉ nếu :
− tồn tại một dãy các cấu hình c 0 , c 1 , , c n sao cho c = c 0 , c’ = c n
− với mỗi i ∈ {0 n-1}, tồn tại một chuyển tiếp giữa c i và c i+1 : c i Ã− ci+1
Ta ký hiệu cÃ−* c’ là phép tính hợp lệ dẫn từ cấu hình c đến cấu hình c’ có độ
dài không biết chắc chắn (quan hệ Ã−*là đóng đối với các phép phản xạ và bắc cầu của quan hệ Ã−)
Chú ý rằng người ta không xét các phép tính không hợp lệ
Trang 34Ã− (e, q 3 , 1111) = (#, q 3, 1111)
Ã− (e, q 3, # 1111) Ã− (#, q1 , 1111) = (e, q 1, 1111)
Cấu hình cuối cùng nhận được chính là cấu hình xuất phát c’ Như vậy quá
trình tính toán có thể lặp lại vô hạn
Chú ý rằng phép tính trên không là phép tính duy nhất có thể, từ cấu hình
(111, q 3, 1) chẳng hạn, người ta có thể thực hiện chuyển tiếp :
(111, q 3, 1) Ã− (1111, q3, #)
Chúng ta sẽ quay lại xét hiện tượng này
Như vậy, trong một số cấu hình, khi không còn tồn tại một chuyển tiếp nào có
thể, người ta nói rằng máy Turing dừng (halt) tại những cấu hình đó
Một phép tính hợp lệ dẫn đến một cấu hình như vậy sẽ không thể kéo dài Người ta có thể nói về phép tính hợp lệ tối đa trong trường hợp này Ký hiệu :
c Ã−
T c’
là sự kiện tồn tại một phép tính hợp lệ giữa các cấu hình c và c’ và không một chuyển tiếp nào có thể kể từ cấu hình c’
Ngược lại, xuất phát từ một số cấu hình, tồn tại các phép tính hợp lệ không
bao giờ dừng Từ đó người ta có thể chia tập hợp các câu f ∈ S* thành hai phần :
Trang 35Mô hình các máy RAM 29
Tập hợp các câu f sao cho xuất phát từ cấu hình (e, q 1 , f), máy Turing có ít nhất một phép tính hợp lệ dừng, gọi là L(T)
Tập hợp các câu f sao cho từ cấu hình (e, q 1 , f), máy Turing không có một
phép tính hợp lệ nào dừng
I.3 Cấu hình xuất phát của máy Turing
Bây giờ, ta cần xem xét những yếu tố bất tiện của mô hình máy Turing Ta dễ nhận thấy rằng không thể biết đâu là điểm bắt đầu và đâu là điểm kết thúc của dữ liệu trên băng Bởi vì phần hữu ích không phân biệt được với phần còn lại trên băng Để khắc phục điều bất tiện này, người ta đưa vào các quy ước đối với các cấu hình xuất phát như sau :
Lúc đầu, phần hữu ích phải khác rỗng để loại trừ các khả năng liệt của các máy Turing
Lúc đầu, phần hữu ích không chứa hai ký tự # liên tiếp nhau và dễ dàng xác định được vị trí bắt đầu và vị trí kết thúc để phân biệt với phần còn lại trên băng
Lúc đầu, đầu đọc−ghi được đặt trong phần hữu ích để chỉ định phần này Mặt khác, người ta cũng quy ước thêm như sau :
Trạng thái xuất phát phải luôn luôn là q 1 , gọi là trạng thái đầu (initial)
Đầu đọc−ghi đặt tại ký tự khác # và sát bên trái nhất của phần hữu ích
Một câu f ∈ S* được gọi là được thừa nhận (accepted) bởi máy Turing nếu, xuất phát từ cấu hình ban đầu (e, q 1 , f), máy Turing đã thực hiện một phép tính hợp lệ và dừng Ngôn ngữ L(T) gồm tập hợp các câu được thừa nhận, được gọi là ngôn ngữ được thừa nhận (accepted language) bởi máy Turing
Trong ví dụ trên, ngôn ngữ được thừa nhận là các câu chứa một số lẻ số 1 :
L(T) = { f ∈ S * | f gồm một số lẻ chữ số 1 }
I.4 Máy Turing đơn định
Điểm bất tiện thứ hai trong mô hình máy Turing là có thể thực hiện nhiều
phép tính khác nhau tại mỗi thời điểm Nếu với mọi cặp (q, x) ∈ Q ´ S, tồn tại nhiều nhất một quy tắc của máy Turing có (q, x) là phần bên trái, khi đó từ một cấu hình đã cho c, tồn tại duy nhất một phép tính hợp lệ có thể Người ta gọi máy Turing như vậy là đơn định (deterministic)
Ta dễ nhận thấy tính đơn giản của các máy Turing đơn định với quan niệm
như sau : một câu f ∈ S* không được thừa nhận ngay khi phép tính hợp lệ xuất
phát từ (e, q 1 , f) không dừng Trong trường hợp này, chương trình P của máy
Turing :
P ⊆ Q ´ S ´ S ´ M ´ Q
Trang 36là một hàm bộ phận (partial function) của Q ´ S vào S ´ M ´ Q, dễ dàng được
phân tách thành ba hàm bộ phận khác nhau có cùng miền xác định (domain)
nếu và chỉ nếu (q, x, y, m, q’) là một quy tắc của P
Các máy Turing được sử dụng theo nhiều cách khác nhau Ví dụ vừa được trình bày trên đây mô tả cách thức máy Turing nhận biết các ngôn ngữ Dưới đây,
ta sẽ tiếp tục trình bày cách máy Turing tính toán các hàm
II Các hàm T −tính được
Giả sử ta chỉ xét các máy Turing đơn định
Cho T =<S, Q, P> là một máy Turing Ta nói T xác định một hàm bộ phận f T
từ S* → S* như sau : miền xác định của hàm fT là ngôn ngữ được thừa nhận bởi
T, và với mỗi câu f ∈ S*, ta có một phép tính hợp lệ tối đa :
(e, q 1 , f) Ã−
T c’ = (g, q, h)
với fT được xác định bởi :
fT (f) = gh
gh được gọi là kết quả của phép tính của T đối với câu vào f
Người ta cũng nói náy Turing T thực hiện (tính) hàm f T
Trang 37Mô hình các máy RAM 31
Bây giờ xét các cấu hình c 1 = (e, q 1 , 10100) và c 2 = (e, q 1, 100111) Tồn tại
phép tính tối đa dẫn c 1 và c 2 đến các cấu hình (1010, q 3 , 1) và (10, q 3, 1000) tương ứng như sau :
Người ta nói máy Turing T 1 đã thực hiện hàm tính số nguyên kế tiếp (successor) trên một biểu diễn nhị phân của số nguyên
Nếu qui ước biểu diễn đơn nguyên (unary) của một số nguyên bởi viết liên
tiếp n+1 chữ số 1 (số nguyên 0 được biểu diễn bởi một chữ số 1) và các cặp số
nguyên biểu diễn theo quy ước này được đặt cách nhau một ký tự trắng #, khi đó,
dễ dàng nhận thấy rằng máy Turing T 2 thực hiện hàm tính tổng hai số nguyên cho kết quả là một biểu diễn đơn nguyên Chẳng hạn :
(ε, q1, 11 # 111) Ã−
T (##1111, q 4, 111)
Định nghĩa 3.1 :
Một hàm bộ phận φ từ S* → S* được gọi là tính được bởi máy Turing (Turing
−computable), viết tắt T−tính được, nếu tồn tại một máy Turing đơn định tính
được hàm này
Rõ ràng, với mỗi hàm T−tính được, sẽ có vô số các máy Turing tính nó
Chú ý rằng quan điểm tính được trong lý thuyết tính toán được nêu ra ở đây
liên quan chặt chẽ đến sự nhận biết (cognition) :
Một mặt, với mọi ngôn ngữ L ⊂ S*, sẽ có một hàm đặc trưng
(characteristic function) δLtương ứng được định nghĩa bởi :
δL (f) = 1 nếu f ∈ L
δL (f) = 0 nếu không (f ∉ L)
Trang 38Người ta cũng kết hợp L với một hàm đặc trưng cục bộ (partial characteristic
function) δ‘L được định nghĩa bởi :
δ‘L (f) = 1 nếu f ∈ L
δ‘L (f) không xác định nếu không (f ∉ L)
Mặt khác, với mọi hàm φ : S* → S*, φ được kết hợp với một ngôn ngữ Gφ , trên S ∪ {#} chẳng hạn, gọi là đồ thị của hàm, được xác định bởi :
Gφ= { f # φ(f) | f ∈ Dom(φ) } Sau đây ta sẽ chỉ ra rằng, lớp các hàm T−tính được là rất lớn, trước khi chỉ ra rằng tồn tại các hàm không là T−tính được
III Lớp các hàm T −tính được
Trong mục này, ta sẽ xét một số hàm T-tính được rất sơ cấp (elementary
functions), để từ đó, ta xây dựng các hàm phức tạp hơn nhờ phép hợp thành Ta cũng tìm cách mở rộng khả năng hoạt động của các máy Turing
III.1 Một số hàm sơ cấp
Ta xây dựng máy Turing để tính toán một số hàm rất sơ cấp từ G* vào G*, hay (G*)n vào G*, trong đó, G là một bảng chữ không chứa ký tự trắng #, và các bộ−n (n−tuple) gồm các phần tử được ngăn cách nhau bởi một ký tự trắng # Đó
là các hàm hằng, hàm chiếu, hàm kế tiếp và hàm kế trước
III.1.1 Các hàm hằng (constant functions)
Xây dựng máy Turing thực hiện hàm hằng Bin_Fiv 2G như sau :
T =<S, Q, P> với S = G ∪ {#}, Q = {q 1 , q 2 , q 3 , q 4 , q 5} và
P = { q 1, 1 → $, R, q1,
q 1, # → #, R, q2,
q 1, 0 → #, R, q1,
Trang 39Mô hình các máy RAM 33
Hàm hằng rất dễ triển khai và có thể xây dựng bất kỳ hàm hằng nào
III.1.2 Các hàm chiếu (projection functions)
Trang 40III.3 Các hàm kế trước (predecessor functions)
Tương tự hàm kế tiếp, ta có thể dễ dàng xây dựng hàm kế trước :
PredG : G* → G*
sao cho với mọi câu f∈G*, hàm PredG trả về câu kế trước của f trong thứ tự đã cho của bảng chữ S Để hàm PredG là toàn phần, ta cần quy ước rằng câu đứng
trước câu rỗng cũng chính là câu rỗng
Bài tập : Xây dựng một máy Turing thực hiện hàm kế trước
III.4 Sự hợp thành (composition)
Nhiều hàm được định nghĩa từ nhiều hàm khác hợp thành Ta sẽ nghiên cứu
các kỹ thuật cho phép xây dựng lớp các hàm T−tính được nhờ phép hợp thành