1. Trang chủ
  2. » Giáo án - Bài giảng

Giáo trình lý thuyết tính toán

108 1,3K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 108
Dung lượng 1,19 MB

Nội dung

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 3

PGS.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 4

III.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à Rtính được 59

I.2 Mọi hàm Rtính được cũng là Ttí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 Ttí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 5

Nhập môn lý thuyết tính toán 3

II.4 Mọi hàm Ttí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à Pbộ nhớ (Pspace) 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 7

PGS.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 8

ngườ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 9

Nhậ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 10

III 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à Tnhậ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 11

Nhậ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 12

Việ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 13

Nhậ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 15

PGS.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 16

Hì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 17

Mô 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 19

Mô 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 20

Dạ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

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 21

Mô 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 22

II 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 23

Mô 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 24

Ví 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 25

Mô 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 26

JZERO 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 27

Mô 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 28

IV 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 29

Mô 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 30

Bà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 31

PGS 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 32

Mộ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 33

Mô 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 35

Mô 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 36

là 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 37

Mô 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 38

Ngườ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 :

= { 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à Ttí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 39

Mô 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 40

III.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

Ngày đăng: 08/06/2014, 13:00

HÌNH ẢNH LIÊN QUAN

Hình 1.1. Thứ tự phân cấp trong S * - Giáo trình lý thuyết tính toán
Hình 1.1. Thứ tự phân cấp trong S * (Trang 8)
Hình 2.1 Sơ đồ một máy RAM - Giáo trình lý thuyết tính toán
Hình 2.1 Sơ đồ một máy RAM (Trang 16)
Hình 2.2 Sơ đồ một máy RASP - Giáo trình lý thuyết tính toán
Hình 2.2 Sơ đồ một máy RASP (Trang 21)
Hình 2.3. Trình P’ bị thay đổi khi thực hiện - Giáo trình lý thuyết tính toán
Hình 2.3. Trình P’ bị thay đổi khi thực hiện (Trang 24)
Hình 3.2. Máy Turing trong cấu hình c = (f, q, xg) - Giáo trình lý thuyết tính toán
Hình 3.2. Máy Turing trong cấu hình c = (f, q, xg) (Trang 33)
Hình 3.3 Máy Turing được tiêu chuẩn hóa - Giáo trình lý thuyết tính toán
Hình 3.3 Máy Turing được tiêu chuẩn hóa (Trang 41)
Hình 3.7. Máy Turing T next if h 1  : T 1 , if h 2  : T 2 - Giáo trình lý thuyết tính toán
Hình 3.7. Máy Turing T next if h 1 : T 1 , if h 2 : T 2 (Trang 44)
Hình 3.9. Máy Turing có một băng vào và một băng ra - Giáo trình lý thuyết tính toán
Hình 3.9. Máy Turing có một băng vào và một băng ra (Trang 55)
Hình 5.1 Rút gọn bài toán A về bài toán B - Giáo trình lý thuyết tính toán
Hình 5.1 Rút gọn bài toán A về bài toán B (Trang 90)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w