Tải bản đầy đủ (.doc) (20 trang)

TIỂU LUẬN LÝ THUYẾT TÍNH TOÁN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (282.67 KB, 20 trang )

Lý thuyết: Chapter 6. Context-Free Grammar (Section 6.5, 6.6)
Bài tập: Viết chương trình tính số thứ thứ tự của câu trong thứ tự phân
cấp.
Lý thuyết: Chapter 6. Context-Free Grammar (Section 6.5, 6.6)
Bài tập: Viết chương trình tính số thứ thứ tự của câu trong thứ tự phân
cấp.
GVHD: PGS.TS PHAN HUY KHÁNH
Học viên: Nhóm 5
1. Ngô Phương Nam
2. Trần Anh Tài
3. Nguyễn Trần Trọng
Ngành: KHOA HỌC MÁY TÍNH
Khóa: 12 (2009-2011)
ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
o O o
Đà Nẵng, 5/2010
TIỂU LUẬN
LÝ THUYẾT TÍNH TOÁN
TIỂU LUẬN
LÝ THUYẾT TÍNH TOÁN
Nội dung tiểu luận gồm 2 phần:
Phần I. Lý thuyết (trang 3 -> trang 16):
* Chapter 6. Context-Free Grammar
- Section 6.5. An Unambiguous CFG for Algebric Expressions
- Section 6.6. Simplified Form and Normal Forms
Phần II. Bài tập (trang 17 -> trang 21):
* Cho Σ là một bảng chữ có kích thước (bản số) n. Với mọi câu w∈Σ
*
, 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 viết một chương trình trong một ngôn ngữ tùy chọn để tính m(w) khi biết
w?
2
Phần I. Lý thuyết
6.5. Một cấu trúc CFG rõ ràng áp dụng giải thích các biểu thức đại số .
Mặc dù một số CFL là "vốn mơ hồ" theo nghĩa đó chúng không thể được tạo ra
ngoại trừ bằng một cấu trúc ngữ pháp mơ hồ, sự mơ hồ như vậy thường là đặc tính của
cấu trúc ngữ pháp hơn là ngôn ngữ. Nếu một CFG là mơ hồ, nó thường có thể, và thường
mong muốn tìm một CFG tương đương rõ ràng cho nó. Trong phần này, chúng ta sẽ giải
quyết vấn đề này trong trường hợp ngữ pháp của biểu thức đại số được thảo luận trong ví
dụ 6.5 này.
Để đơn giản, chúng ta chỉ sử dụng hai toán tử + và * trong phần thảo luận của
chúng ta, vì vậy mà G có cấu trúc sau:
S  S + S | S * S | (S) | a
Sau khi chúng ta có được mộtcấu trúc ngữ pháp rõ ràng tương đương với trường
hợp này, việc phục hồi các chức năng khác sẽ là hiển nhiên.
Như chúng ta đã thấy, cấu trúc S  S + S bản thân nó đã không không rõ ràng, và
chúng ta sẽ cần phải loại bỏ các loại cấu trúc này. Đồng thời chúng ta sẽ lưu ý về khả
năng, được đề cập trong ví dụ 6.5, kết hợp cấu trúc ngữ pháp vào các quy tắc chuẩn của
cấu trúc trật tự và ưu tiên: * cần phải có ưu tiên cao hơn +, a + b + c nên "hiểu là" ( a +
b) + c, không phải là a + (b + c).
Bởi không mong muốn S  S + S, nên chúng ta sẽ không nghĩ đến biểu thức liên
quan đến + như phép tính tổng như trong các biểu thức khác. Hiển nhiên, chúng là phép
tính tổng của cái gì đó; chúng ta hãy sử dụng từ term để thay cho những cái được thêm
vào (tức là, kết hợp sử dụng +) để tạo ra các biểu thức. Biến tương ứng trong ngữ pháp
sẽ là T. Biểu thức cũng có thể là sản phẩm, tuy nhiên, vì hai biểu thức a + b * c và a * b
+ c là công thức tính tổng, nên thích hợp hơn để hiểu rằng số hạng có thể là sản phẩm.
(Hãy nhớ rằng một biểu thức có thể bao gồm một số hạng duy nhất.) và chúng ta nói rằng
"hệ số" là cái được nhân lên (kết hợp sử dụng *) để tạo ra số hạng. biểu thức như thế này

sẽ được đại diện bởi biến số F.
Cho đến nay, chúng ta có một hệ thống phân cấp của các cấp. Các biểu thức, các
đối tượng chung nhất được dùng là tổng của một hay nhiều số hạng, và các số hạng là
sản phẩm của một hoặc nhiều thừa số. Hệ thống Phân cấp này kết hợp của phép nhân
hơn hơn phép cộng.
Bây giờ chúng ta giải quyết với dấu ngoặc đơn. Chúng ta có thể nói rằng (A) có
thể là một biểu thức, thuật ngữ, hay một thừa số. Tuy nhiên, bởi vì chúng ta muốn cho
phép chúng ta chỉ có một cách để thu được (A) mà chúng ta nhầm hiểu là thích hợp nhất
3
khi đã được đánh giá xong. Nói cách khác, việc đánh giá một biểu thức trong dấu ngoặc
đơn , chúng ta phải sẽ ưu tiên tính toán các số hạng trong đó trước. Các thừa số sẽ được
đánh giá trước tiên trong hệ thống phân cấp, và do đó hợp lý khi nói rằng (A) là một thừa
số và rằng A chính nó có thể là một biểu thức tùy ý.
Ở giai đoạn này, biểu thức là tổng của một hay nhiều số hạng, số hạng là các sản
phẩm của một hoặc nhiều thừa số, và các thừa số là một trong hai biểu thức trong ngoặc
đơn hoặc là định danh duy nhất. "tổng của các số hạng" có thể có nghĩa như là
S  T + T | T
Tuy nhiên, để có được một tổng hợp của ba thừa số với phương pháp tiếp cận này,
chúng ta sẽ buộc phải thử T T  + T hay cái gì so sánh, và một lần nữa, chúng ta lại có
thể bị mơ hồ. Và chúng ta co thể nói rằng một biểu thức là một số hạng duy nhất hoặc là
tổng của một số hạng và một biểu thúc khác và câu hỏi duy nhất là liệu chúng ta muốn S
 S + T hay là S T  + S. Nếu chúng ta nhớ rằng a + b + c = (a + b) + c, chúng ta có lẽ
sẽ có S  S + T một cách thích hợp; nói cách khác, một biểu thức với nhiều hơn một số
hạng sẽ có được bằng cách thêm các số hạn cuối vào các biểu thức phụ có chứa tất cả,
ngoại trừ số hạng cuối cùng. Vì lý do đó, chúng ta tạo ra cấu trúc T T  * F, thay vì T
 F * T.
Các cấu trúc ngữ pháp có được là G1 = (V, Σ, S, P), với V = (S, T, F) và P chứa
các sản phẩm
S  S + T | T
T  T * F | F

F  (S) | a
Bây giờ chúng ta phải chứng minh được hai điều: Thứ nhất, G1 thực sự là tương
đương với cấu trúc ngữ pháp G ban đầu, và thứ hai, G1 là rõ ràng. Để tránh nhầm lẫn,
chúng ta thay thế nhãn hiệu biểu tượng bắt đầu trong G1.
Định lý 6.2. Cho G là một cấu trúc ngữ pháp tự do ta có:
S  S + S | S * S | (S) | a
và cho G1 là CFG với các sản phẩm là
S1  S1 + T | T
T  T * F | F
F  (S1) | a
suy ra L (G) = L (G1)
Chứng minh.
Trước tiên, để chứng minh rằng L(G1)…. L(G), chứng minh bằng phép quy
nạp độ dài của một chuỗi trong L (G1). Các bước cơ bản để cho thấy rằng a… L(G), và
điều này là rõ ràng.
4
Trong bước quy nạp chúng ta cho rằng k ≥ 1 và rằng mọi y trong L (G1), đáp ứng |
y | ≤ k là trong L (G). Chúng ta thấy rằng nếu x L (G1) và | x | = k + 1, suy ra x L(G).
Bởi vì x ≠ a, bất kỳ sự suy diễn nào của x trong G1 phải bắt đầu bằng một trong ba cách
sau:
S1  S1 + T
S1  T  T * F
S1  F  (S1)
Chúng ta chứng minh một trường hợp đầu tiên, và hai trường hợp còn lại là tương
tự. Nếu x ban đàu có một lối diển dịch S1  S1 + T, suy ra x = y + z, với S1  *
G1
y và
T  *
G1
z. Vì S1  T

G1
*, suy ra S1  *
G1
z. Vì vậy, vì | y | và | z | ≤ k, giả sử ta quy
nạp y, z là cả hai trong L (G). vì G chứa các sản phẩm S  S + S, y + z là chuỗi diển
dịch từ S ở G, và do đó x … L (G).
Thứ hai, để chứng minh rằng L(G)…. L(G1). Một lần nữa, chúng ta sử dụng
phép quy nạp trên | x |, và cũng giống như ở phần trước, bước cơ sở là đơn giản. Chúng
ta giả định rằng k ≥ 1 và rằng cho mỗi y L (G) với y k | ≤ |, y L (G1); chúng ta muốn
chứng minh rằng nếu x L (G) và | x | = k + 1, suy ra x L (G1).
Trường hợp đơn giản là trong đó x có một lối diển dịch trong đó G bắt đầu bằng S 
(S). Trong trường hợp này x = (y) + z, suy ra cả y và z đều thuộc L (G), và giả sử rằng y
… L (G1). Vì vậy, chúng ta có thể lấy được x trong G1 bằng cách bắt đầu suy diển S1
 T  F  (S1) vậy suy ra y bắt nguồn từ S1.
Giả sử x có một sự diển dịch trong G bắt đầu S  S + S. Suy ra, giống như trước,
các giả thuyết quy nạp cho chúng ta biết x = y + z, trong đó y, z là cả hai trong L (G1).
Bây giờ, tuy nhiên, để kết luận rằng x L (G1), chúng ta cần z tới diển dịch từ T; nói
cách khác, chúng ta muốn Z phải là một thuật ngữ duy nhất, cuối cùng của số hạng có
tổng là x. Với điều này, hãy cho
x = x
1
+ x
2
+ + x
n

trong đó mỗi x
1
L (G1) và n là như là số lớn nhất có thể. Chúng ta đã xác định
rằng n ≥ 2. Bởi vì các n cách được xác định, không có x

i
's có thể có một lối diển dịch
trong G1 bắt đầu S1  S1 + T, do vậy, mỗi x
i
có thể được bắt nguồn từ T trong G1. Để
cho
y = x
1
+ x
2
+ + x
n-1
(z = x
n)

Suy ra, y có thể được bắt nguồn từ S1, kể từ S1  T
G1
* + T + + T (n-1 từ), và
Z có thể được bắt nguồn từ T. gian suy ra x L (G1), kể từ khi chúng ta có thể bắt đầu với
 tạo ra S1 S + T.
Cuối cùng, giả sử rằng mọi lối diển dịch của x trong G bắt đầu S  S * S. Suy ra
cho một số y, z trong L (G), x = y * z. lúc này, chúng ta cho phép
5
x = x
1
* x
2
* * x
n


Trong đó mỗi x
i
L (G1) và n là như là lớn nhất có thể. (Lưu ý sự khác biệt câu
phát biểu náy khác với câu trước). Theo giả thuyết quy nạp, mỗi x
i
L (G1). lúc này,
chúng ta muốn mỗi x
i
được diển dịch từ F trong G
1.
Chúng ta có thể dễ dàng quy tắc ra
trường hợp trong đó một số x
i
có một lối diển dịch trong G1 bắt đầu S1 T  T  * F.
Nếu điều này là đúng, x
i
sẽ là của
i
y mẫu * z
i
cho một số
i
y, z
i
L (G1), tuy nhiên, bởi
vì chúng ta biết rằng L (G1) L (G), điều này sẽ mâu thuẫn với các đặt tính tối đa số hạng
n.
Giả sử rằng một số x
i
có lối diển dịch là G1 S1  S1 + T. Suy ra, x

i
=
i
y + z
i
cho một số
i
y, z
i
L (G1) L (G). Trong trường hợp này,
x = x
1
* x
2
* * x
i-1
* y
i
+ z
i
* x
i +1
* * x
n

Nhưng điều này cũng không thể. Nếu chúng ta để cho u và v là chuỗi con trước
và sau khi +, tương ứng, chúng ta rõ ràng có u, v L (G), và do đó x = u + v. Điều này có
nghĩa rằng chúng ta có thể lấy được x trong G sử dụng một lối diển dịch bắt đầu S  S +
S, và chúng ta đã nhận định rằng đây không phải là trường hợp.
Chúng ta có thể kết luận rằng mỗi x

i
là diển dịch từ F trong G1. Suy ra, như
chúng ta đã làm trong trường hợp trước, chúng ta cho phép
x = x
1
* x
2
* * x
n-1
z = x
n

Các chuỗi y là T mẫu diển dịch tại G1, kể từ F * F * * F (n-1 thừa số) là diển
dịch từ T trong G1. Vì vậy, chúng ta có thể lấy được x từ S1 trong G1 bằng cách bắt đầu
các lối diển dịch S1  T  * F, và do đó x L (G1).
Để chứng minh cấu trúc ngữ pháp G1 là rõ ràng, thật hữu ích để tập trung vào các
dấu ngoặc đơn trong chuỗi, tạm thời bỏ qua các biểu tượng khác. Theo đó, chúng ta
muốn thuyết phục bản thân rằng ngữ pháp là phạm vi rõ ràng là nó tạo ra chuỗi ngoặc
đơn; do đó nó sẽ cho phép chúng ta để chứng minh các sự rõ ràng của toàn bộ cấu trúc
ngữ pháp. Trong bài tập 5.11, chúng ta xác định một chuỗi các dấu ngoặc đơn trong
chuỗi cân bằng nếu đó là một chuỗi các dấu ngoặc đơn xuất hiện trong một số biểu thức
đại số. tuy nhiên, chúng ta cần phải hiểu rõ hơn.
Định nghĩa 6.4. Một chuỗi các ngoặc trái và phải được cân bằng nếu nó có số
lượng bằng nhau của ngoặc trái và bên phải, và hiển nhiên không có nhiều tiền tố bên
phải hơn trái. Dấu ngoặc trái trong chuỗi cân bằng là dấu Ngoặc phải đầu tiên để cân
bằng cho chuỗi chứa hai và nhiều số hạng ở giữa ngoặc. Nếu x là một chuỗi có chứa
ngoặc đơn và các ký hiệu khác, và các ngoặc đơn trong x tạo thành một chuỗi cân bằng,
một biểu tượng trong δ x trong ngoặc đơn nếu δ xuất hiện giữa một ngoặc trái và ngoặc
phải.
6

Bạn nên nghĩ rằng mỗi một dấu ngoặc trái trng chuỗi cân bằng đều có dấu ngoặc
phải (bài tập 6.30).
Đầu tiên, chúng ta làm một cuộc quan sát để thấy rằng một chuỗi dấu ngoặc đơn ở bất kỳ
một chuỗi nào từ S1 trong ngữ pháp G1 là được cân bằng. Chắc chắn số lượng của ngoặc
trái bằng nhau với bên phải, bởi vì chúng tồn tại trong một cặp. Hơn nữa, cứ mỗi ngoặc
đơn phải được tạo ra bởi một lối diển dịch tại G1, và một ngoặc trái xuất hiện trước nó sẽ
tồn tại đồng thời, và do đó không không thể tồn tại nhiều dấu ngoặc phải hơn dấu ngoặc
trái.
Thứ hai, quan sát rằng trong bất kỳ lối diển dịch tại G1 nào, các ngoặc giữa và bao
gồm cả cặp ngoặc được tạo ra bởi một công thức duy nhất F  (S1) tạo thành một chuỗi
cân bằng. Điều này là do ngoặc trong chuỗi xuất phát từ S1 làm, và bởi vì việc kèm theo
một chuỗi ngoặc đơn cân đối trong ngoặc tạo thành một chuỗi cân bằng.
Bây giờ giả sử x L (G1), và
(0
là bất kỳ dấu ngoặc trái nào trong x. Các phát
biểu rằng chỉ có một lối diển dịch tận cùng bên trái của x trong G1 nằm ở sau cùng và
nếu chúng ta có thể thấy rằng G1 là rõ ràng, và chúng ta sẽ sớm có thể làm điều này. Tuy
nhiên, cuộc thảo luận trước đó cho phép chúng ta nói rằng, ngay cả khi có một vài lối
diển dịch tận cùng bên trái của x, thì ngoặc đơn bên phải cũng xuất hiện đồng thời. - đơn
giản là chúng tồn tại lẫn nhau
(0.
Để thấy điều này, chúng ta hãy xem xét một lối diển dịch
cố định của x. Trong lối diển dịch này, các bước trong đó
(0
là sản phẩm còn tạo ra một
ngoặc đơn bên phải, mà chúng ta gọi)
0.
Như chúng ta đã thấy trong đoạn trước, trong
ngoặc đơn x bắt đầu với
(0

và kết thúc với)
0,
bởi vì đó là cách mà "một cặp" được xác
định. Tuy nhiên, nó không thể xuất hiện trước khi một trong hai dấu xuất hiện, chúng
xuất hiện đồng thời. Bởi vì chuỗi dấu ngoặc bắt đầu bằng dấu ngoặc đơn với
(0
và kết
thúc với dấu tương ứng với nó là cân bằng, các chuỗi thu được bằng cách bỏ đi
(0
có một
dấu ngặc phải dư; nếu cặp ngoặc tương ứng của
0

(0
xuất hiện trước)
,
cũng có thể là tiền
tố của chuỗi ngoặc đơn cân đối giữa
(0
và)
0.
Vì vậy ta sẽ có cặp ngoặc tương ứng của
0

(0
song trùng)
.

Điểm chính của cuộc thảo luận này là khi chúng ta bắt gặp cái gì đó "trong ngoặc
đơn," chúng ta có thể chắc chắn rằng hai ngoặc tạo ra bởi F  (S1), sẽ không có vấn đề

gì khi chúng ta bắt gặp bất kì một lối diễn dịch nào . Đây là thành phần chúng ta cần bổ
sung trong định lý.
Định lý 6,3 cấu trúc ngữ pháp G1 tự do với các sản phẩm của nó.
S1  S1 + T | T
T  T * F | F
F  (S1) | a
là rõ ràng.
7
Chứng minh. Chúng ta muốn chứng minh rằng mỗi chuỗi x trong L (G1) chỉ có
một lối diển dịch tận cùng bên trái từ S1. Phương pháp chứng minh bằng phép quy nạp
toán học trên | x |, và nó thực sự sẽ dễ dàng hơn để chứng minh một cách rõ ràng và chặt
chẽ hơn. Đối với bất kỳ x diển dịch từ một trong các biến S1, T, hoặc F, x chỉ có một lối
diển dịch tận cùng bên trái từ biến đó.
Đối với những bước cơ bản, chúng ta quan sát rằng a có thể được bắt nguồn từ
một trong ba biến, và rằng trong mỗi trường hợp chỉ có một lối diển dịch.
Trong bước quy nạp, chúng ta giả định rằng k ≥ 1 và rằng cho mỗi y xuất phát từ
S1, T, hay F mà | y | ≤ k, y chỉ có một lối diển dịch tận cùng bên trái từ biến đó. Chúng ta
muốn hiển thị các kết quả tương tự cho một chuỗi x với | x | = k + 1.
Hãy xem xét, đầu tiên là trường hợp trong đó x có chứa ít nhất một + không nằm
trong ngoặc đơn. Bởi vì chỉ + 's nằm trong chuỗi xuất phát từ T hoặc F là mới trong
ngoặc đơn, x có thể chỉ xuất phát từ S1, và lối diển dịch bất kỳ của x phải bắt đầu S1 S1
 + T, với + là cuối + trong x không phải là trong dấu ngoặc đơn. Vì vậy, bất kỳ lối
diển dịch tận cùng bên trái của x từ S1 đều có dạng
S1  S1 + T  * y + T  * y + z
Trường hợp này hai bước cuối cùng đại diện lối diển dịch tận cùng bên trái của x
từ S1 và z từ T, tương ứng, và + vẫn là một nhân tố không nằm trong dấu ngoặc đơn.
Giả thuyết quy nạp cho chúng ta biết, y chỉ có một lối diển dịch tận cùng bên trái từ S1
và z chỉ có một từ T. Vì vậy, x chỉ có một lối diển dịch tận cùng bên trái từ S1.
Tiếp theo là trường hợp trong đó x không chứa + ngoặc đơn bên ngoài, nhưng ít
nhất một * ngoài ngoặc đơn. Lúc này x có thể chỉ xuất phát từ S1 hoặc T; bất kỳ lối diển

dịch từ S1 phải bắt đầu S1 T  T  * F; và lối diển dịch nào phải bắt đầu từ T T T  *
F. Trong mỗi trường hợp, * phải là nhân tố cuối cùng trong x không nằm trong ngoặc
đơn. Như trong trường hợp đầu tiên, các bước tiếp theo của bất kỳ lối diễn dịch nào tận
cùng bên trái thì có lối diễn dịch sau
T * F  * y * F  * y * z
Bao gồm phần đầu tiên của một lối diển dịch tận cùng bên trái của y từ T và là
phần của một lối diển dịch tận cùng bên trái của z từ F. Một lần nữa, giả thuyết quy nạp
cho chúng ta biết chỉ có một cách để có thể có những lối diển dịch, và do đó chỉ có một
của lối diển dịch tận cùng bên trái x từ S1 hoặc T.
Cuối cùng, giả sử x không chứa + 's hoặc *' s bên ngoài ngoặc đơn. Suy ra x có
thể được bắt nguồn từ bất kỳ các biến nào, tuy nhiên lối diễn dịch duy nhất từ S1 được
bắt đầu S1  T  T  F  (S1), và lối diển dịch duy nhất từ T hoặc F bắt đầu theo
cùng một cách như vậy, với một hoặc hai bước đầu tiên được lược bỏ. Do đó, x = (y), S1
8
 * y. Theo các giả thuyết quy nạp, y chỉ có một lối diển dịch tận cùng bên trái từ S1, và
suy ra x chỉ có một trong ba biến và chúng ta đã hoàn thành việc chứng minh.
6.6. Hình thức đơn giản và hình thức thường
Sự mơ hồ là một trong những điều không mong muốn của một ngôn ngữ phi ngữ cảnh mà chúng ta muốn
loại bỏ. Trong phần này chúng ta thảo luận về một số vấn đề đơn giản nhằm cải tiến hơn về ngữ pháp mà không làm
thay đổi kết quả của ngôn ngữ. Đầu tiên bằng cách loại bỏ một số loại sản phẩm làm bất tiện công việc, và sau đó
tiêu chuẩn hóa các sản phẩm để tất cả đều có " hình thức bình thường."
Chúng tôi bắt đầu bằng cách cố gắng để loại bỏ “ ^- sản phẩm”,có dạng A -> ^, trong đó đơn giản là biến
này được thay thế bằng biến khác. Để minh họa
làm thế nào các cải tiến này có thể có ích, giả sử không có cú pháp loại hình sản xuất, và xem xét một mã nguồn có
chứa các phần
β
⇒∞
Nếu ở đó không có ^ - sản xuất, sau đó là chuỗi
β
phải có ít nhất miễn là


, nếu không có các đơn
vị sản xuất,


β
có thể được chiều dài bằng nhau chỉ khi tập hợp các bước này thay thế một
biến bằng một thiết bị đầu cuối duy nhất. Nói cách khác, nếu và đại diện cho chiều dài của chuỗi hiện tại và số
lượng thiết bị đầu cuối trong chuỗi hiện hành tương ứng, sau đó số lượng phải gia tăng tại mỗi bước của derivation
này. Giá trị của
t
+

là cho chuỗi S và 2k cho một chuỗi dài x của k trong ngôn ngữ. Chúng
tôi có thể kết luận rằng một derivation của x có thể có không quá 2k - bước l. Đặc biệt,
hiện nay chúng tôi có một lgorithm để xác định liệu một chuỗi cho x là trong ngôn ngữ
tạo ra bởi văn phạm sau: Nếu | x | = k, hãy thử tất cả các dãy có thể có của 2k - 1 sản
phẩm, và xem nếu có sản xuất ra x. Mặc dù đây không phải là một thuật toán thực tế, ít
nhất là nó minh họa một một cách thực tế là thông tin về các hình thức sản xuất có thể được sử dụng để lấy
được kết luận về các ngôn ngữ kết quả.
Trong khi đang cố gắng để loại bỏ - sản phẩm từ ngữ pháp, chúng ta phải bắt đầu với một tiêu chuẩn. Chúng
tôi rõ ràng là không thể loại bỏ tất cả các sản phẩm của mẫu này nếu chuỗi A chính nó là trong ngôn ngữ. trở ngại
này chỉ là nhỏ, tuy nhiên: Chúng tôi sẽ có thể cho thấy rằng đối với bất kỳ ngôn ngữ phi ngữ cảnh
{ }
∧−LL,

thể được tạo ra bởi một CFG với ^- sản xuất. Một ví dụ sơ bộ sẽ giúp chúng tôi xem làm thế nào để tiến
hành.
Chọn G và các với các sản phẩm


ABCBCDAS →
CDA →
CbB →
∧→ |aC
∧→ |bDD
Điều đầu tiên ở ví dụ này có lẽ là minh họa phải rõ ràng: Chúng tôi có thể không chỉ đơn giản là ^- sản
xuất mà không cần thêm bất cứ điều gì. Trong trường hợp này, nếu
AD

đã loại trừ và không có gì có thể
được bắt nguồn, bởi vì các ^-sản phẩm là cách duy nhất để loại bỏ các D biến từ chuỗi hiện hành.
9
Hãy cho chúng tôi xem xét việc sản xuất
ABCBCDAS

, mà chúng tôi viết tạm thời là
DABCABCS
21

Ba biến
C2 C1,
và D ở phía bên phải tất cả bắt đầu ^-sản phẩm, và mỗi cũng có thể được sử
dụng để lấy được một chuỗi. Trong vấn đề này chúng tôi có thể thay thế không có bất kỳ hoặc tất cả bằng A. Nếu
không có một sản phẩm chúng tôi sẽ cần phải cho phép cho tất cả các tùy chọn này bằng cách thêm các sản phẩm
α
→S
của các hình thức, mà là một chuỗi thu được từ
ABCBCDA
bằng cách xóa một số
hoặc tất cả tập

D} C2, {C1,
. Nói cách khác, chúng tôi sẽ cần ít nhất các sản phẩm

|A BCABC |BDA ABC |DA ABBCS
2112

|BA ABC |A ABBC |ABBCDA
12
ABBA
Để đảm bảo thu được tất cả các chuỗi có thể được thu được từ ngữ pháp ban đầu. Nếu bây giờ chúng ta
xem xét các biến A, chúng ta thấy rằng các sản phẩm vẫn còn chưa đủ. Mặc dù A không bắt đầu một ^-sản xuất,
chuỗi A có thể xuất phát từ A (như chuỗi có thể khác). Bắt đầu với đưa ra
CD -A
>
chúng ta có thể bỏ qua C
hoặc D, bằng cách sử dụng các đối số như trước. Chúng ta không thể bỏ qua cả hai. bởi vì chúng ta không muốn các
sản phẩm
∧→A
trong ngữ pháp cuối cùng của chúng ta.
Nếu chúng ta thêm phần đến xuất hiện của A, như chúng ta đã làm cho những phần ở C, do đó việc sản
xuất ban đầu là
2211
DABCBCAS →
Chúng ta cần thêm sản phẩm, trong đó phía bên phải là thu được bằng cách để lại một số tập hợp con của
{ }
DCCAA ,,,,
2121
trong đó có 32 tập con, có nghĩa là từ này sản xuất ban đầu chúng ta có được những người
khác 3L đó sẽ được thêm vào ngữ pháp của chúng ta.
Lý do áp dụng cùng để đón các sản phẩm chính ban đầu. Nếu chúng ta có thể xác định trong

sản xuất
α
→X
tất cả các biến xảy ra trong
α
từ đó

có thể được bắt nguồn, sau đó chúng
tôi có thể thêm tất cả các sản phẩm
'
α
→X
nơi
'
α
thu được từ
α
bằng cách xoá bỏ một số
trong những lần xuất hiện. Nói chung thủ tục này có thể sản xuất mới ^- sản xuất nếu có, họ sẽ
được bỏ qua, và nó có thể sản xuất các sản phẩm của các hình thức
X - X >
mà cũng không có gì để góp
phần ngữ pháp và có thể được bỏ qua.
Trong trường hợp này văn phạm phi ngữ cảng sau cùng chúng ta có 40 sản phẩm, bao gồm S-32 sản
xuất đã được đề cập.

bbDD
aC
bCbB
DCCDA

|
|
||




Các thủ tục nêu trong Ví dụ 6,14 là một trong đó chúng tôi sẽ hiển thị làm việc nói
chung. Hiện tại nó có hệ thống hơn, chúng tôi cung cấp cho cách khử đệ quy đầu tiên của một biến không có hiệu
lực (A từ đó có thể được xuất phát), và sau đó chúng ta cung cấp cho các thuật toán được đề xuất bởi thành phần này
để xác định các biến đó.
10
Định nghĩa các biến 6,6
Một biến nullable được định nghĩa như sau.
1. Bất kỳ một biến mà P chứa sản phẩm trong nullable.
2. Nếu P chứa các sản xuất và được nullable biến, sau đó là nullable.
3. Không có các biến trong V được nullable.
Thuật toán FindNull (Tìm các biến nullabla trong A)
( )
PS,,V, G CFG ∑=
)

{ }
;A -A production thecontains P|VAN
0
>∈=
0; i =
do
1; i i +=
{

}
*
1-i1-i
N somefor ofA contains P|A N ∈→∪=
αα
i
N
While
1−

ii
NN
i
N
là tập hợp của các biến nullable.

Bạn có thể dễ dàng chấp nhận rằng các biến được định nghĩa trên là 6,6 các biến A mà. Lấy Findnull thuật
toán từ định nghĩa là đơn giản, và một thủ tục tương tự có thể được sử dụng bất cứ khi nào chúng ta có một định
nghĩa đệ quy (xem Tập thể dục ,70). Khi chúng tôi áp dụng các thuật toán.
Ví dụ 6,14, thiết lập được. Các thiết lập cũng có chứa A, như là kết quả của sản
xuất. Do không có sản phẩm khác có mặt ngay trong ba là các chỉ biến nullable trong ngữ
pháp.
Thuật toán 6.1 (Tìm một CFG tương đương với sản phẩm không-A) Cho một CFG, G = (V, Z, S, P),
xây dựng một CFG G1 = (V, E, S, P1) mà không có một sản phẩm-như sau:
1. Để khởi tạo P1 P2.
2. Tìm tất cả các biến nhận giá trị null trong V, bằng cách sử dụng thuật toán FindNull.
3. Đối với mỗi sản xuất A-> α trong P, thêm vào mỗi P1 sản xuất có thể thu được từ này bằng
cách xóa từ α một hoặc nhiều lần xuất hiện của các biến có giá trị null trong α.
4. Xóa tất cả các sản xuất từ P1. Cũng xóa bất kỳ bản sao, cũng như sản phẩm của mẫu A-> A.
Định lý 6,5

Cho G = (V, Σ, S, P) bởi ngôn ngữ phi ngữ cảnh, và để cho G1 là ngôn ngữ thu được từ G bằng thuật toán 6.1. Sau
đó G không có sản xuất ^-sản phẩm, và:
L(G1)=L(G)-{A}.
Chứng minh:
G1 không có sản phẩm-là hiển nhiên. Chúng ta thấy một sự phát biểu mạnh hơn trong các định lý: đối
với bất kỳ biến A є V, và đối với các giá trị không rỗng bất kỳ x є Σ *,
A => *
G
x nếu và chỉ nếu A> = *
G1
x
Chúng ta sử dụng ký hiệu A => k
G
x có nghĩa là có một phép lấy đạo hàm k-bước của x từ A trong G.
11
Chúng ta thấy trước rằng đối với bất kỳ n ≥ 1, nếu A => n
G
x, thì A> = *
G1
x. Bằng chứng là do lý luận bằng
phương pháp quy nạp toán học trên n. Đối với bước cơ sở, giả sử A => 1
G
x. thì A-> x là một sản xuất trong P. Vì x
≠ ^, sản xuất này cũng có trong P1, và do đó A => *
G1
x.
Trong bước giới thiệu chúng ta giả định rằng k ≥ 1 và bất kỳ chuỗi khác nhận được từ A trong k hoặc ít
bước hơn trong G nhận được từ A trong G1. Chúng ta muốn chứng minh rằng nếu x ≠ ^ và A =>
k+1


G
x, thì A => *
G1
x. Giả sử rằng ở bước đầu tiên trong một phép lấy đạo hàm (k +1) bước của x trong G là A -> X1.X2 Xn, trong
đó Xi là hoặc bằng Xi hoặc nhận được từ Xi trong k hoặc ít bước hơn trong G. Bất kỳ Xi mà tương ứng với xi là ^ là
một biến có giá trị null trong G. Nếu chúng ta xóa các Xi từ chuỗi X1.X2 Xn, vẫn còn lại một số giá trị bên trái ,
vì x ≠ ^, và việc sản xuất kết quả là một phần tử của P1. Hơn nữa, phương pháp quy nạp cho ta biết rằng đối với
mỗi Xi còn lại ở phía bên phải của sản xuất này, Xi => *
G1
xi. Do, A => *
G1
x.
Bây giờ chúng ta chỉ chỉ đề cập, đối với bất kỳ n ≥ 1, nếu A => n
G1
x, thì A => *
G
x; một lần nữa chứng minh
được bằng quy nạp trên n. Nếu A =>1
G1
x, thì A -> x là một sản xuất trong P1. Điều này có nghĩa là A -> α là một
sản xuất tại P, trong đó x thu được từ α bằng cách xóa số không hay nhiều biến có giá trị null. Điều đó chỉ ra rằng
A=> *
G
x, bởi vì chúng ta có thể bắt đầu một phép lấy đạo hàm sản xuất A

α và đi đến từ ^ với mỗi biến có giá trị
null mà chúng đã bị xóa để có được x.
Giả sử k ≥ 1 và bất kỳ chuỗi khác nhận được từ A trong k hoặc ít bước hơn trong G1 nhận được từ A trong
G. Chúng ta muốn hiển thị các kết quả tương tự cho một chuỗi x mà A =>
k+1

G1
x. Một lần nữa, lấy bước đầu tiên của
phép lấy đạo hàm k+1 bước của x trong G1 là A -> X1.X2 Xn, trong đó mối Xi hoặc hoặc một biến hoặc giới
hạn. Chúng ta có thể viết x = x1x2 xn, trong đó xi là hoặc bằng Xi hoặc nhận được từ Xi trong k hoặc ít bước hơn
trong G1. Bởi giả thuyết quy nạp, Xi => *
G
xi cho mỗi i. Theo định nghĩa của G1, có một sản xuất A -> α trong P
sao cho X1.X2 Xn có thể được lấy từ α bằng cách xóa các biến null nhất định. Từ A => *
G
X1.X2 Xn, chúng ta
có thể lấy được x từ A trong G đầu tiên bắt nguồn từ của X1.X2 Xn và sau đó bắt nguồn từ mỗi xi từ Xi tương ứng.
Loại bỏ các sản phẩm từ một ngôn ngữ có khả năng tăng số lượng các sản phẩm cơ bản. Chúng ta có thể hỏi
bất kỳ thuộc tính không mong muốn khác được giới thiệu. Một phần câu trả lời là nếu ngôn ngữ phi ngữ cảnh G
không mơ hồ, thì ngôn ngữ G1 sản xuất bởi giải thuật 6,1 cũng được (bài tập 6.64).
Các phương pháp tiếp theo của việc sửa đổi một ngôn ngữ phi ngữ cảnh, loại trừ các đơn vị sản xuất, tương tự như
đủ về nguyên tắc với những gì chúng ta đã được thực hiện mà chúng ta bỏ qua nhiều chi tiết hoặc để lại cho các bài
tập. Cũng như nó cần thiết trước khi xem xét tất cả các biến null cùng với những vấn đề thực sự bắt đầu ^-sản xuất,
ở đây cần thiết để xem xét tất cả các cặp của các biến A, B mà A => * B cùng với các cặp mà thật sự là một sản xuất
A -> B. Trong trường hợp khác để đảm bảo rằng việc loại trừ các sản phẩm đơn lẻ cũng không loại bỏ các chuỗi
trong ngôn ngữ, chúng ta chắc chắn rằng bất khi B -> α là một sản xuất không đơn lẻ và A => *B, chúng ta thêm
sản xuất A -> α.
Trong trường hợp khác để đơn giản hóa quá trình tìm kiếm tất cả các cặp như A, B, chúng ta thực hiện đơn giản
hóa giả định rằng chúng ta đã sử dụng thuật toán 6.1 Nếu cần thiết ngôn ngữ không có ^-sản xuất. Trong trường hợp
này là một biến có thể được bắt nguồn từ một chỉ bởi một chuỗi các đơn vị sản xuất. Đối với bất kỳ biến A, chúng ta
có thể xây dựng các định nghĩa đệ quy sau đây của các bộ "A-derivable" (chủ yếu, biến B khác với A mà A => * B)
và sau đó định nghĩa có thể dễ dàng được điều chỉnh để có được một thuật toán.
1. nếu A -> B là một sản xuất, B là “A- derivable”.
2. Nếu C là “A- derivable”, C -> B là một sản xuất, và B ≠ A, thì B là “A- derivable”.
3. Không có biến nào khác là “A- derivable”.
(Lưu ý rằng theo định nghĩa của chúng ta, một biến A là “A- derivable” chỉ và khi A→A thực sự là một

sản xuất.)
12
Thuật toán 6,2 (Tìm một CFG tương đương với sản phẩm không có đơn vị) Cho một ngôn ngữ phi ngữ cảnh
G = (V, Σ, S, P) mà không có ^-sản xuất xây dựng một văn phạm G1 = (V, Σ, S, P1) không có đơn vị sản xuất như
sau.
1. P1 được khởi tạo P.
2. Đối với mỗi A є V, tìm tập hợp các biến “A- derivable”
3. Đối với mỗi cặp (A, B) sao cho B là “A- derivable”, và mỗi B sản xuất không đơn lẻ B-
> α tới P1 nếu nó không phải là đã có trong P1.
4. Xóa tất cả các đơn vị sản xuất từ P1.

Định lý 6,6
Cho G là CFG bất kỳ mà không ^-sản xuất, và cho G1 là CFG thu được từ G bằng thuật toán 6.2. thì, G1 không
chứa các đơn vị sản xuất và L (G1) = L (G).
Bằng chứng là bỏ qua (Bài tập 6,62). Đó là điểm không có giá trị, một lần nữa không có bằng chứng, nếu
G là ngôn ngữ rõ ràng, thì là ngôn ngữ G1 cũng nhận được từ các thuật toán.
Ví dụ loại bỏ sản xuất đơn lẻ:
Cho G là ngôn ngữ đại số thu được trong phần trước, với sản phẩm.
S-> S + T | T
T-> T * F | F
F-> (S) | a
Các biến “S-derivable” là T và F, và F là T derivable trong bước 3 của thuật toán 6.2, sản xuất S -> T * F |
(S) | a và T-> (S) | a được thêm vào P1 . Khi sản phẩm đơn lẻ được xóa, chúng được để lại với:
S-> S + T | T * F | (S) |a
T-> T * F | (S) | a
F-> (S) | a
Ngoài việc loại bỏ các sản phẩm đặc biết như là ^-Productions và các sản phẩm đơn lẻ, nó cũng có thể hữu
ích để áp đặt các hạn chế đối với hình thức của sản phẩm còn lại. Một số kiểu "hình thức bình thường" đã được
giới thiệu, chúng ta sẽ trình bày một trong số chúng, các hình thức bình thường Chomsky.
Định nghĩa hình thức bình thường 6,7 Chomsky.

Một ngôn ngữ phi ngữ cảnh ở dạng bình thường Chomsky (CNF) là mỗi sản xuất của một trong hai loại:
A>-BC
A>-a
Trong đó A, B và C là các biến và là một ký hiệu kết thúc.
Việc chuyển một văn phạm G=(V, ∑, S, P) sang dạng Chomsky thường có thể
thực hiện trong 3 bước. Bước dầu tiên là áp dụng thuật toán 6.1 và 6.2 để thu được một
CFG G1=(V, ∑, S, P) không sinh mã A cũng không sinh đơn vị, như vậy: L(G1) = LG)-
{A}. Bước 2 ta thu được văn phạm G2 = (V2, ∑, S, P) phép sinh giống như G1. Như vậy
quá trình sinh mã trong P2 cũng có dạng:
13
A -> B
1
B
2
…B
k
Khi k≥2 và mỗi B
i
là một biến trong V2 hoặc có dạng
A -> a
Cho một vài a∈∑
Các chỉ thị của G2 rất đon giản. Khi P1 không có phép sinh A và đơn vị , mọi
phép phép sinh trong P1 A->a giống như A->α cho các chuỗi α dài hơn 2. Cho mọi vị trí
đầu cuối xuất hiện trong chuỗi α ta sẽ giới thiệu được một biến mới X
0
và một phép sinh
X
0
->a và thay thế a bởi X
0

trong tất cả các phép sinh xuất hiện ở đây.
Cho ví dụ, nếu như chúng ta có 2 phép sinh A->aAb và B->ab, chúng sẽ được thay
thế bởi A->X
0
AX
b
và B->X
0
X
b
và phép sinh X
a
->a và X
b
->b được bổ sung.
Văn phạm G2 thu được nhiều cách giống như văn phạm CNF, trong các phép sinh,
hoặc là phép biến đổi cuối hoặc chuỗi của hai hay nhiều biến. Bước cuối cùng là thay thế
mỗi phép sinh có hơn 2 biến bằng một tập hợp các phép sinh tương đương. Quá trình này
được mô tả tốt nhất bằng ví dụ:
Phép sinh A -> BCDBCE
Sẽ được thay thế bởi:
A -> BY
1
Y
1
-> CY
2
Y
2
-> DY

3
Y
3
-> BY
4
Y
4
-> CE
Các biến mới Y
1
, Y
2
, Y
3
, Y
4
là đặc trưng của phép sinh này và không dược dùng ở
bất cứ nới nào khác. Mặc dù cách làm này là hoang tốn, trong giới hạn số lượng biến ít ,
không nghi ngờ hiệu quả của 5 phép toán đặc trưng tương đương với phép sinh ban đầu.
Bổ sung các biến mới, các phép sinh mới không làm thay đổi ngôn ngữ sinh.
Nếu chúng ta có đầy đủ luận cứ cho thông tin này chúng ta sẽ thu được kết quả
sau:
Định lý 6.7
Cho văn phạm phi ngữ cảnh bất kỳ G = G=(V, ∑, S, P) , có một CFG G’ =
(V’, ∑, S, P’) trong Chomsky dạng thường đó là L(G’) = L(G) – {A}.
Ví dụ 6.16
Cho G là ngôn ngữ với các phép sinh:
S -> AACD
A -> aAb | A
C -> aC | a

D -> aDa | bDb | A
14
Chúng ta sẽ đi từng bước một trong quá trình biến đổi đến CNF.
Loại trừ phép sinh A: Các biến Null là A và D và giải thuật 6.1 tạo ra ngôn ngữ với các
phép sinh:
S -> AACD | ACD | AAC | CD | AC | C
A -> aAb | ab
C -> aC | a
D -> aDa | bDb | aa | bb
Loại trừ phép sinh đơn vị: Ở đây chúng ta có thể bổ sung các phép sinh đơn
giản:
S -> aC | a
Và xóa S -> C.
Giới hạn vế phải của phép sinh cho phép toán cuối hoặc chuỗi có hơn 2 biến.
Bước này sẽ tạo ra các phép sinh sau:
S -> AACD | ACD | AAC | CD | AC | X
n
C | A
A -> X
a
AX
b
| X
a
X
b
C -> X
a
C | a
D -> X

a
DX
a
| X
b
DX
b
| X
a
X
a
| X
b
X
b

X
a
-> a
X
b
-> b
Bước cuối cùng chuyển sang CNF: Có 6 phép sinh mà vế phải quá dài. Áp dụng
thuật toán 6.1 để tạo ra ngôn ngữ có các phép sinh như sau:
S -> AT
1
T
1
-> AT
2

T
2
-> CD
S -> AU
1
U
1
-> CD
S -> AV
1
V
1
-> AC
S -> CD | AC | X
a
C | a
A -> X
a
W
1
W
1
-> AX
b
A -> X
a
X
b

C -> X

a
C | a
D -> X
a
Y
1
Y
1
-> DX
a
D -> X
b
Z
1
Z
1
-> DX
b
D -> X
a
X
b
| X
b
X
b
X
a
-> a X
b

-> b
15
Phần 2. Bài tập
Nhóm thực hiện bài tập 11 có nội dung như sau:
* Cho Σ là một bảng chữ có kích thước (bản số) n. Với mọi câu w∈Σ
*
, 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 viết một chương trình trong một ngôn ngữ tùy chọn để tính
m(w) khi biết w?
Từ ví dụ trong giáo trình:
16
Cho bảng chữ S = {a,b,c}, với giả thiết thứ tự phân cấp a<b<c, ta có thể đánh
dấu các câu của S* (kể cả câu rỗng e) bắt đầu từ 1 trở đi như sau: e(1), a(2), b(3),
c(4), aa(5), ab(6), ac(7), ba(8), bb(9), bc(10), ca(11), cb(12), cc(13), aaa(14), aab(15),
aac(16)…
* aab(15): chuỗi aab có số thứ tự 15
Biểu diễn trên sơ đồ dạng cây:
Từ sơ đồ trên, để tính số thứ tự của một chuỗi trong thứ tự phân cấp ta tìm được
hai cách giải quyết như sau:
Cách 1: Sử dụng hàng đợi Q
Cách 2: Tương tự cách tính giá trị một số dựa vào vị trí các chữ số của chúng.
Cách 1:
* Từ sơ đồ trang trước ta thấy, các chuỗi sinh ra theo thứ tự phân cấp có thể được
thực hiện bằng cách sử dụng một hàng đợi. Đầu tiên đưa chuỗi rỗng (có số thứ tự
là 1) vào đầu hàng đợi. Quá trình tiếp theo được
Lặp lại:
• Lấy phần tử ở đầu hàng đợi (Remove_Queue), lần lượt nối nó với từng
phần tử của bảng chữ.
17

e
1
a
2
b
3
c
4
ba
8
bb
9
bc
10
aa
5
ab
6
ac
7
ca
11
cb
12
cc
13
aaa
14
aab
15

aac
16
• Mỗi chuỗi thu được sẽ được đưa vào cuối hàng đợi (Add_Queue).
Cho đến khi chuỗi thu được bằng chuỗi cần tìm.
Thuật toán 1
-
{Tạo hàng đợi Q có phần tử đầu chứa chuỗi rỗng và có số thứ tự =1}
- Init(Q); Add(Q,’ ’,1);
- Repeat
{Lấy 1 phần tử (chuỗi) ra khỏi hàng đợi}
Remove(Q, st, sothutu); i:=1;
Repeat

{Nối chuỗi với từng ký tự của bảng chữ}
temp := st;
temp := temp+S(i);
Inc(sothutu); inc(i);

{So sánh với chuỗi nhập w}
If (temp<>chuỗinhập) then

{Đưa chuỗi sinh vào cuối hàng đợi}
Add(temp, sothutu, Q);
EndIf;
Until (i>n);
{n: số phần tử của bảng chữ}
Until (temp = chuỗinhập);
{w: chuỗi nhập}
Write(sothutu);
Thuật toán 1 được hiện thực bằng chương trình BT_LTTT.PAS và mô phỏng bằng

đồ họa ở chương trình BT_LTTT1.PAS viết trên Ngôn ngữ lập trình Pascal.
Cách 2:
18
Dựa vào cách tính giá trị của một số (trong hệ đếm B) dựa vào vị trí của các chữ
số trong số đó.
Ví dụ: Số 1101 viết trong hệ nhị phân (0,1).
Vị trí: 3 2 1 0
1 1 0 1
1x23 + 1x22 + 0x21 + 1x20 = 13
Từ sơ đồ thứ tự phân cấp trong S* (tr 4) ta thiết lập được công thức tính số thứ
tự của một chuỗi như sau:
* Chuỗi: b
m
b
m-1
b
m-2
… b
1
b
0

Trong đó:
- b
m
: là một ký tự trong bảng chữ
- m : là vị trí ký tự trong chuỗi
(vị trí được đánh chỉ số từ 0 và được tính từ phải qua trái)
* Sẽ có số thứ tự trong thứ tự phân cấp là:
Stt = V

m
.N
m
+ V
m-1
.N
m-1
+ … + V
1
.N
1
+ V
0
.N
0 + 1
Trong đó:
- V
m
: Số thứ tự của b
m
trong bảng chữ.
- N : số ký tự trong bảng chữ
Ví dụ:
Với bảng chữ S = {a,b,c}, chuỗi aab sẽ có số thứ tự:
Vị trí: 2 1 0
a a b
Stt = 1.3
2
+ 1.3
1

+ 2.3
0
+ 1 = 15
19
Thuật toán 2:
Begin
luythua := 1;
stt := 1;
{Chạy từ cuối chuỗi lên đầu chuỗi}
for i:=length(w) downto 1 do
begin
stt := stt + luythua * giatri(w(i));
luythua := luythua*N;
end;
End;
{Hàm Giatri() trả về vị trí của một ký tự trong bảng chữ}
Thuật toán 2 được hiện thực bằng chương trình BT_LTTT2.PAS và được viết trên
Ngôn ngữ lập trình Pascal.
20

×