Tải bản đầy đủ (.pdf) (53 trang)

Nghiên cứu phương pháp xây dựng mô hình tự động

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 (1.15 MB, 53 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ


LÊ BÁ CƯỜNG


NGHIÊN CỨU PHƯƠNG PHÁP XÂY DỰNG MÔ HÌNH
TỰ ĐỘNG

Ngành: Công nghệ thông tin
Chuyên ngành: Công nghệ phần mềm
Mã Số: 60 48 10

LUẬN VĂN THẠC SĨ

NGƯỜI HƯỚNG DẪN KHOA HỌC: TS. PHẠM NGỌC HÙNG





Hà nội – 11/2011
i


Mục lục
LỜI CẢM ƠN ii
LỜI CAM ĐOAN iii
DANH MỤC HÌNH VẼ iv
DANH MỤC THUẬT TOÁN v


Chương 1: Giới thiệu 1
Chương 2: Các phương pháp hình thức cho đặc tả phần mềm 3
2.1 Hệ thống chuyển trạng thái được gán nhãn 3
2.2 Phép ghép nối song song 7
2.3 Hệ chuyển trạng thái được gán nhãn an toàn, thuộc tính an
toàn, tính thỏa mãn 9
2.4 Thành phần phần mềm 12
2.5 Ôtômát hữu hạn trạng thái 12
Chương 3: Các phương pháp sinh tự động mô hình thành phần phần mềm 17
3.1 Phương pháp học sử dụng giải thuật L
*
18
3.1.1 Phương pháp xây dựng mô hình sử dụng thuật toán L
*
19
3.1.2 Giải thuật Vasilevskii-Chow 22
3.2 Phương pháp xây dựng mô hình sử dụng thuật toán Thompson24
3.2.1 Sinh dẫn xuất 24
3.2.2 Xây dựng mô hình 27
3.2.3 Tối ưu hóa mô hình 34
3.2.4 Độ phức tạp tính toán 40
Chương 4: Thực nghiệm 41
4.1 Công cụ xây dựng mô hình thành phần phần mềm 41
4.2 Thực nghiệm 43
4.3 Ý nghĩa công cụ xây dựng mô hình 45
KẾT LUẬN 47
TÀI LIỆU THAM KHẢO 49

iv


DANH MỤC HÌNH VẼ
Hình 2.1: Một hệ thống chuyển trạng thái được gán nhãn. 4
Hình 2.2 – a: Hệ chuyển trạng thái được gán nhãn không đơn định. 5
Hình 2.2 – b: Hệ chuyển trạng thái được gán nhãn đơn định. 6
Hình 2.3: Hệ chuyển trạng thái được gán nhãn. 6
Hình 2.4: Ghép nối song song hai hệ chuyển trạng thái được gán nhãn. 9
Hình 2.6: Xây dựng LTS ghép nối song song Input || Output || p
err
. 11
Hình 2.7: Minh họa ôtômát M được mô tả ở trên. 14
Hình 2.8: Phương pháp chuyển một ôtômát M thành LTS L. 15
Hình 3.1: Mô hình giả thiết về thành phần phần mềm C 17
Hình 3.2: Sơ đồ thuật toán L
*
. 19
Hình 3.3: Xây dựng một DFA tương ứng với bảng quan sát đóng (S, E, T). 20
Hình 3.4: Sơ đồ thuật toán Vasilevskii – Chow. 23
Hình 3.5–a: Ôtômát thành phần. 29
Hình 3.5–b: Ôtômát thành phần. 29
Hình 3.5–c: Ôtômát thành phần. 30
Hình 3.5–d: Ôtômát thành phần. 30
Hình 3.6–a: Ôtômát thành phần. 33
Hình 3.6–b: Ôtômát thành phần. 33
Hình 3.6–c: Ôtômát thành phần. 33
Hình 3.6–d: Ôtômát đoán nhận tập dẫn xuất đã cho. 34
Hình 3.7–a: Ôtômát đã loại bỏ quy tắc rỗng. 38
Hình 3.7–b: Ôtômát đơn định. 39
Hình 4.1: Kiến trúc công cụ sinh mô hình. 42
Hình 4.2: Giao diện GenModelTool. 42
Hình 4.3: Đầu vào cho công cụ GenModelTool. 43

Hình 4.4: Một Ôtômát đầu ra của công cụ GenModelTool. 45

v

DANH MỤC THUẬT TOÁN

Giải thuật 3.1: L* học một mô hình chính xác M của C. 22
Giải thuật 3.2: VC(S, E, C, n) 23
Giải thuật 3.3: isTraceOfC(, T) 25
Giải thuật 3.4: makeTraceSet(C, maxLength) 26
Giải thuật 3.5: makeDFA(L) 31
Giải thuật 3.6: Loại bỏ cung rỗng ε 35
Giải thuật 3.7: Đơn định hóa ôtômát 36
Giải thuật 3.8: Xây dựng ôtômát tối tiểu 37
1

Chương 1: Giới thiệu
Công nghệ phần mềm hướng thành phần đang được xem như là một phương
pháp hiệu quả cho phát triển phần mềm. Với công nghệ này, chúng ta có thể
giảm thiểu thời gian và công sức trong khi vẫn đảm bảo được chất lượng
phần mềm. Công nghệ hướng thành phần giúp cho việc xây dựng cũng như
tiến hóa phần mềm rất nhanh chóng bằng việc tái sử dụng và tích hợp các
thành phần phần mềm. Các ứng dụng được xây dựng bằng cách tích hợp các
thành phần độc lập cùng tương tác với nhau. Các thành phần này có thể được
xây dựng nên bởi nhà phát triển phần mềm hoặc bởi bên thứ ba.
Một trong những vấn đề cấp thiết và khó khăn nhất của công nghệ
hướng thành phần là làm thế nào để đảm bảo rằng các thành phần phần mềm
có thể cộng tác được với nhau để đạt được mục tiêu của hệ thống. Giải pháp
phổ biến hiện nay để giải quyết vấn đề này là áp dụng các phương pháp kiểm
thử hoặc kiểm chứng mô hình [7]. Trong công nghiệp, các phương pháp kiểm

thử đang được áp dụng phổ biến nhất nhằm đảm bảo tính đúng đắn của phần
mềm. Tuy nhiên, các ca kiểm thử thường vẫn được sinh thủ công nên rất tốn
công sức và tính bao phủ của chúng không cao. Kiểm thử tự động đang được
xem là giải pháp tiềm năng để giải quyết vấn đề này. Bên cạnh đó, các
phương pháp kiểm chứng mô hình [7] hứa hẹn sẽ là cách tiếp cận hiệu quả
nhằm chứng minh tính đúng đắn của phần mềm.
Để áp dụng các phương pháp kiểm chứng mô hình và các phương pháp
kiểm thử tự động, chúng ta phải xây dựng mô hình mô tả chính xác hành vi
của hệ thống . Các nghiên cứu hiện nay về kiểm chứng mô hình và kiểm thử
tự động đều giả thiết rằng mô hình của hệ thống là sẵn có và đúng đắn. Trên
thực tế, việc xây dựng mô hình của hệ thống là công việc khó khăn và tiềm
ẩn nhiều lỗi. Hơn nữa, cho dù mô hình của hệ thống đã sẵn có và đúng đắn
thì nó chưa chắc đã là mô hình đúng đắn khi phần mềm được tiến hóa với
việc thêm bớt một số hành vi của hệ thống. Một khó khăn nữa của việc xây
dựng mô hình của hệ thống là trong trường hợp các thành phần phần mềm
được phát triển bởi bên thứ ba vì khi đó chúng ta không có mã nguồn và tài
liệu đầy đủ và nếu có thì cũng rất khó hiểu.
Như vậy, bài toán xây dựng mô hình mô tả chính xác hành vi của hệ
thống không những có ý nghĩa rất to lớn trong việc kiểm chứng mô hình và
2

kiểm thử tự động mà còn có giá trị thực tiễn cao và được nhiều người quan
tâm. Do đó, tôi quyết định chọn đề tài “Nghiên cứu phương pháp xây dựng
mô hình tự động” cho nghiên cứu của mình.
Đề tài này nhằm mục đích nghiên cứu phương pháp xây dựng mô hình
tự động mô tả chính xác hành vi của hệ thống, làm cơ sở cho việc áp dụng
các kỹ thuật kiểm chứng mô hình và kiểm thử tự động nhằm góp phần nâng
cao chất lượng phần mềm.
Nội dung của luận văn được trình bày trong bốn chương và phần kết
luận.

Chương 1 giới thiệu về đề tài. Chương này trình bày các ngữ cảnh,
những lý do chọn đề tài, mục tiêu của đề tài và cấu trúc của luận văn.
Chương 2 trình bày các khái niệm cơ bản phục vụ cho đề tài. Chương
này mô tả các phương pháp hình thức cho đặc tả phần mềm, các khái niệm về
thành phần phần mềm và đặc tả thành phần phần mềm, máy hữu hạn trạng
thái, hệ chuyển trạng thái được gán nhãn, ôtômát hữu hạn trạng thái và các
khái niệm liên quan.
Chương 3 nghiên cứu phương pháp xây dựng tự động mô hình mô tả
chính xác hành vi của một thành phần phần mềm. Trong chương này, chúng
tôi đề xuất hai giải pháp cho việc xây dựng mô hình thành phần phần mềm.
Giải pháp thứ nhất là xây dựng mô hình sử dụng thuật toán học L
*
. Đây là
phương pháp học lặp đi lặp lại để xây dựng mô hình ứng viên tương ứng với
thành phần phần mềm C. Ở mỗi bước lặp, chúng ta sẽ kiểm tra tính tương
thích giữa mô hình ứng viên với thành phần C và cập nhật lại mô hình ứng
viên nếu không tương thích. Giải pháp thứ hai là xây dựng mô hình sử dụng
thuật toán Thompson [11]. Phương pháp này xây dựng ôtômát hữu hạn như
một mô hình mô tả chính xác hành vi của thành phần phần mềm C tương
đương với biểu thức chính quy sinh tập dẫn xuất trên C.
Chương 4 giới thiệu về kết quả thực nghiệm. Chương này trình bày
những kết quả đạt được, công cụ sinh mô hình của một thành phần phần mềm
và áp dụng cho một số ví dụ cụ thể.
Cuối cùng là phần kết luận, định hướng mở rộng và tài liệu tham khảo.
3

Chương 2: Các phương pháp hình thức cho đặc tả
phần mềm
2.1 Hệ thống chuyển trạng thái được gán nhãn
Mỗi thành phần phần mềm được đặc tả bởi một mô hình tương ứng mô tả

hành vi của thành phần đó. Mô hình của thành phần phần mềm có thể được
biểu diễn bởi một hệ chuyển trạng thái được gán nhãn [10], đó là một đồ thị
có hướng với các nhãn trên các cạnh của nó. Mỗi nhãn trên cạnh biểu diễn
cho một hành động có thể thực hiện được bởi hệ thống, mỗi đỉnh của đồ thị là
một trạng thái của mô hình, biểu diễn cho trạng thái của hệ thống.
Tập tất cả các nhãn được gọi là bảng chữ cái. Ta ký hiệu Act là tập tất
cả các hành động quan sát được,  là hành động không quan sát được trong
môi trường của thành phần phần mềm,  là trạng thái lỗi đặc biệt của hệ
thống, ta ký hiệu LTS  = <{π}, Act, , π>.
Định nghĩa 2.1: Hệ thống chuyển trạng thái được gán nhãn (Labeled
Transition System – LTS)
Một hệ chuyển trạng thái được gán nhãn [10] M là một bộ có thứ tự
gồm bốn thành phần (Q, ,  , q
0
), trong đó:
 Q là tập khác rỗng các trạng thái của M,
   Act là tập các hành động quan sát được, gọi là bảng chữ cái
của M,
   Q x   x Q là hàm chuyển trạng thái, và
 q
0
 Q là trạng thái khởi tạo.
Ta ký hiệu q
i








q
j
nếu có một hành động với nhãn là a chuyển hệ
thống từ trạng thái q
i
sang trạng thái q
j
, khi đó (q
i
, a, q
j
)  . Điều này có
nghĩa là khi hệ thống đang ở trạng thái q
i
nó có thể thực hiện một hành động
a và chuyển sang trạng thái q
j
. Tương tự, khi hệ thống đang ở trạng thái q
j

thể thực hiện một hành động a′ và chuyển sang trạng thái q
k
. Như vậy, ta có
4

một chuỗi các hành động q
i








q
j

′






q
k
. Khi đó, chúng ta có thể
ký hiệu: q
i

′







q

k
.
Một cách tổng quát, nếu chúng ta có một chuỗi các hành động q
i



















q
k
biểu diễn hệ thống thì khi nó ở trạng thái q
i
nó có thể thực
hiện một chuỗi các hành động a
1

.a
2
….a
n
và kết thúc ở trạng thái q
k
.
Xét một hệ chuyển trạng thái được gán nhãn P = (Q, ,  , q
0
) với q,
q′  Q, , 
i
  ta có:
1. q







q′  (q, , q′ )  .
2. q



















q′  q
0
, q
1
, …, q
n
: q = q
0








q
1








q
2















q
n
= q′.
Ví dụ 2.1:






Hình 2.1: Một hệ thống chuyển trạng thái được gán nhãn.
Hình 2.1 là một ví dụ về hệ chuyển trạng thái được gán nhãn L = (Q,
,  , q
0
), trong đó:
 Q = {q
0
, q
1
, q
2
} là tập các trạng thái của L,
  = {in, send, ack} là tập các hành vi của L,
  = { (q
0
, in, q
1
), (q
1
, send, q
2
), (q
2
, ack, q
0
)} là các quy tắc chuyển
trạng thái, và
 q

0
là trạng thái khởi đầu.
q
0
q
1
q
2
in
send
ack
5

Định nghĩa 2.2: Kích thước của hệ chuyển trạng thái được gán nhãn
Kích thước của hệ chuyển trạng thái được gán nhãn M = (Q, , , q
0
)
là số trạng thái của M, ký hiệu là |M|, trong đó |M| = |Q|.
Định nghĩa 2.3: Hệ chuyển trạng thái được gán nhãn đơn định và không đơn
định
Một hệ chuyển trạng thái được gán nhãn M = (Q, ,  , q
0
) là không
đơn định nếu - chuyển dịch hoặc nếu  (q, a, q) và (q, a, q")   thì q 
q". Trái lại, M là hệ chuyển trạng thái được gán nhãn đơn định.
Chú ý 2.1: Cho 2 hệ chuyển trạng thái được gán nhãn M = (Q, ,  , q
0
) và
M' = (Q', ,  , q
0

'). Ta nói M chuyển dịch thành M' với chuyển dịch a nếu
và chỉ nếu (q
0
, a, q
0
')  ,   , Q = Q' và   . Ta ký hiệu: M






M'.
Ví dụ 2.2: Một hệ thống chuyển trạng thái được gán nhãn đơn định và không
đơn định





Hình 2.2 – a: Hệ chuyển trạng thái được gán nhãn không đơn định.
Hình 2.2–a mô tả một hệ chuyển trạng thái được gán nhãn L = (Q,
,  , q
0
), trong đó: Q = {q
0
, q
1
, q
2

},  = {a, b, c}, q
0
là trạng thái khởi
đầu, và  = {(q
0
, a, q
1
), (q
0
, a, q
2
), (q
1
, b, q
2
), (q
2
, c, q
0
)}.
Khi hệ thống đang ở trạng thái q
0
, thực hiện một hành động a thì hệ
thống có thể chuyển đến trạng thái q
1
hoặc trạng thái q
2
. Như vậy, trạng thái
kế tiếp của q
0

khi thực hiện cùng một hành động a là không xác định duy nhất
q
0
q
1
q
2
a
b
a
c
6

hay không tất định. Ta gọi đó là hệ chuyển trạng thái được gán nhãn không
đơn định.





Hình 2.2 – b: Hệ chuyển trạng thái được gán nhãn đơn định.
Hệ chuyển trạng thái được gán nhãn như trên hình 2.2–b là một hệ
chuyển trạng thái được gán nhãn đơn định. Từ trạng thái q
i
bất kỳ nếu thực
hiện một hành động a
j
nào đó thì hệ thống sẽ chuyển sang một trạng thái xác
định duy nhất q
k

.
Định nghĩa 2.4: Vết của một hệ chuyển trạng thái được gán nhãn M
Một vết  của một hệ chuyển trạng thái được gán nhãn M = (Q, , ,
q
0
) là một chuỗi hữu hạn các hành động a
1
a
2
…a
n
với a
1
= q
0
, a
i
  (i =
1,…,n).
Như vậy vết  của hệ chuyển trạng thái được gán nhãn M là một chuỗi
các hành động quan sát được mà M có thể thực hiện từ trạng thái khởi tạo q
0
.
Ví dụ 2.3: Cho một hệ chuyển trạng thái được gán nhãn M = (Q, ,  , q
0
)
như trên hình 2.3





Hình 2.3: Hệ chuyển trạng thái được gán nhãn.
q
0
q
1
q
2
a
b
b
c
q
0
q
1
q
2
in
send
ack
7

Trong đó: Q = { q
0
, q
1
, q
2
},  = {in, send, ack}, q

0
là trạng thái khởi
đầu, và  = {(q
0
, in, q
1
), (q
1
, send, q
2
), (q
2
, ack, q
0
)}.
Với hệ chuyển trạng thái M được mô tả trên hình 2.3, chuỗi các hành
động in send ack là một dẫn xuất trên M. Từ trạng thái q
0
, thực hiện hành
động in hệ thống chuyển sang trạng thái q
1
, tiếp tục thực hiện hành động send
hệ thống chuyển sang trạng thái q
2
, cuối cùng thực hiện hành động ack hệ
thống trở về trạng thái q
0
. Tương tự trên một chuỗi in send ack in send cũng
là một dẫn xuất trên M.
Xét một chuỗi hành động in send in send ack trên M. Ta thấy từ trạng

thái khởi tạo q
0
thực hiện hành động in hệ thống chuyển sang trạng thái q
1
,
tiếp tục thực hiện hành động send hệ thống chuyển sang trạng thái q
2
, từ trạng
thái q
2
hệ thống không thể thực hiện được hành động in. Do đó chuỗi hành
động trên không phải là một dẫn xuất trên M.
Chú ý 2.2: Với Σ  Act ta ký hiệu ↑Σ là một dẫn xuất thu được bằng cách
loại bỏ khỏi  tất cả các hành động a mà a

Σ. Tập tất cả các vết của M
được gọi là ngôn ngữ của M, ký hiệu L(M). Một vết  = a
1
a
2
a
n
là một vết
hữu hạn trên hệ chuyển trạng thái được gán nhãn M. Ta ký hiệu hệ chuyển
trạng thái được gán nhãn M
σ
= (Q, ,  , q
0
) với Q = {q
0

, q
1
, , q
n
} và  = {
(q
i-1
, a
i
, q
i
)} với i=1, ,n. Ta nói rằng một hành động a  được chấp nhận
từ một trạng thái s  Q nếu tồn tại s  Q sao cho (s, a, s)  . Tương tự vậy
ta nói rằng một vết a
1
a
2
…a
n
được chấp nhận từ trạng thái s  Q nếu tồn tại
một dãy các trạng thái s
0
, s
1
, …, s
n
với s
0
= q
0

sao cho i=   thì (s
i-1
, a
i
, s
i
)
 .
2.2 Phép ghép nối song song
Một toán tử ghép nối song song [10], ký hiệu || là một phép toán ghép nối hai
thành phần phần mềm bằng cách đồng bộ các hành vi chung trên bảng chữ
cái và đan xem các hành động còn lại.
Giả sử có hai hệ chuyển trạng thái được gán nhãn là M
1
= (Q
1
, αM
1
, 
1
,
q
1
0
) và M
2
= (Q
2
, αM
2

, 
2
, q
2
0
), phép ghép nối song song giữa M
1
và M
2
, ký
hiệu M
1
|| M
2
được định nghĩa như sau:
8

Nếu M
1
=  hoặc M
2
=  thì M
1
|| M
2
= . Ngược lại, M
1
|| M
2
= (Q,

αM, , q
0
), trong đó:
Q= Q
1
Q
2
, αM= αM
1
 αM
2
, q
0
= (q
1
0
, q
2
0
) và hàm  được xác định
như sau:
 Với mọi (q
1
,a,q
2
)  δ
1
và (q
1
′, a, q

2
′)  δ
2
thì ( (q
1
, q
1
′), a, (q
2
, q
2
′) )  δ,
 Với (q
1
,a,q
2
)  δ
1
, a  αM
2
thì q′  Q
2
ta có ( (q
1
,q′), a, (q
2
,q′) )  δ,

 Với (q
1

′, a, q
2
′)  δ
2
, a  αM
1
thì q  Q
1
ta có ( (q, q
1
′), a, (q, q
2
′) ) 
δ.
Ví dụ 2.4: Mô hình ghép nối song song hai hệ chuyển trạng thái được gán
nhãn Input và Output như trên hình 2.4.
Hình 2.4 mô tả phép ghép nối song song hai hệ chuyển trạng thái được
gán nhãn. Trong đó, hai hành động send và ack là đồng bộ, các hành động
còn lại đan xen nhau. Theo các quy tắc trên ta xác định được hệ chuyển trạng
thái song song được gán nhãn M′ = (Q′, αM′, ′, q
0
′), trong đó :
 Q′ = Q
1
x Q
2
= {(0,a), (0,b), (0,c), (1,a), (1,b), (1,c), (2,a), (2,b), (2,c)},
 αM′ = {in, send, out, ack},
 q
0

′ = (0, a), và
 δ′ = {((0,a), in, (1,a)), ((1,a), send, (2,b)), ((2,b), out, (2,c)), ((2,c),
ack, (0,a)), ((0,b), in, (1,b)), ((0,b), out, (0,c)), ((1,b), out, (1,c)),
((0,c), in, (1,c)) }.
Chúng ta tiến hành loại bỏ tất cả các trạng thái không đến được từ
trạng thái khởi tạo (0,a) và tất cả các hành động đưa hệ thống về trạng thái đó
ta sẽ thu được một hệ thống chuyển trạng thái ghép nối song song được gán
nhãn M = (Q, αM, , q
0
) trong đó:
 Q = Q
1
x Q
2
= {(0,a), (1,a), (2,b), (2,c)},
 αM = {in, send, out, ack},
 q
0
= (0, a), và
 δ = {((0,a), in, (1,a)), ((1,a), send, (2,b)), ((2,b), out, (2,c)), ((2,c), ack,
(0,a))}.
9



Hình 2.4: Ghép nối song song hai hệ chuyển trạng thái được gán nhãn.
2.3 Hệ chuyển trạng thái được gán nhãn an toàn, thuộc
tính an toàn, tính thỏa mãn
Định nghĩa 2.5: Hệ chuyển trạng thái được gán nhãn an toàn
Hệ chuyển trạng thái được gán nhãn an toàn là một hệ chuyển trạng

thái được gán nhãn không chứa bất kỳ một trạng thái lỗi π nào.


a

b

c

send
out
ack
Output
Input
0

1

2

in
send
ack
Input || Output
0,a
1,a
2,a
2,b
2,c
0,b

1,b
1,c
0,c
in
send
out
ack
in
out
out
in
0,a
1,a
2,b
2,c
in
send
out
ack
Input || Output
10

Định nghĩa 2.6: Thuộc tính an toàn
Thuộc tính an toàn là thuộc tính đảm bảo không có lỗi xảy ra trong quá
trình thực hiện của hệ thống. Một thuộc tính an toàn p được biểu diễn dưới
dạng một hệ chuyển trạng thái được gán nhãn an toàn p = (Q
p
, αp, 
p
, q

p
0
).
Ngôn ngữ của nó L(p) là tập tất cả các hành vi được đoán nhận trên αp.
Định nghĩa 2.7: Hệ chuyển trạng thái được gán nhãn lỗi
Hệ chuyển trạng thái được gán nhãn lỗi của một thuộc tính p = (Q, αp,
, q
0
) được ký hiệu là p
err
= (Q  {π}, αp
err
, ′, q
0
), trong đó:
αp
err
= αp, ′ =   { (q, a, π) | a  αp và q′  Q sao cho (q, a, q′)   }.
Ví dụ 2.5: Xây dựng hệ chuyển trạng thái được gán nhãn lỗi từ một hệ
chuyển trạng thái ứng với thuộc tính p.
Hình 2.5: LTS của thuộc tính p và LTS lỗi tương ứng của p.
Hình 2.5 mô tả phương pháp xây dựng hệ chuyển trạng thái lỗi ứng với
thuộc tính p. Theo định nghĩa 2.7, hệ chuyển trạng thái lỗi của thuộc tính p
được xác định là p
err
= (Q  {π}, αp
err
, ′, q
0
), trong đó:

 Tập các hành vi là αp
err
= αp = {in, out},
 Tập trạng thái của p
err
là Q  {π} = {i, ii, π},
 Trạng thái khởi tạo là q
0
, và
 Tập các quy tắc chuyển trạng thái là ′ = {(i, in, ii), (ii, out, i), (ii, in,
π), (i, out, π)}.
i
ii
in
out
i
ii
in
out
π
in
out
LTS của thuộc tính p
Error LTS p
err
11

Định nghĩa 2.8: Tính thỏa mãn
Một hệ chuyển trạng thái được gán nhãn M được gọi là thỏa mãn thuộc
tính p, ký hiệu M╞ p khi và chỉ khi   L(M) sao cho: (αp)  L(p).

Để kiểm chứng một thành phần M thoả mãn một thuộc tính p, chúng ta
biểu diễn cả M và p
err
dưới dạng LTS an toàn (safety LTS), sau đó thực hiện
phép ghép nối song song M||p
err
. Nếu LTS thu được sau phép ghép nối tồn tại
một dẫn xuất có thể tới trạng thái π, khi đó ta nói thành phần M vi phạm
thuộc tính p. Ngược lại, M thoả mãn thuộc tính p.
Ví dụ 2.6: Kiểm chứng hệ chuyển trạng thái ghép nối song song được gán
nhãn thu được như trên ví dụ 2.4 có thỏa mãn thuộc tính p được đề cập trong
ví dụ 2.5. Ta xây dựng một hệ chuyển trạng thái ghép nối song song được
gán nhãn Input || Output || p
err
như trên hình 2.6.

Hình 2.6: Xây dựng LTS ghép nối song song Input || Output || p
err
.
Input || Output
0,a
1,a
2,b
2,c
in
send
out
ack
P
err

i
ii
in
out
π
in
out
Input || Output || P
err
0,a,i
1,a,i
2,b,i
2,c,i
0,a,ii
1,a,ii
2,b,ii
2,c,ii
π
in
send
out
ack
in
send
out
ack
12

Từ sơ đồ ghép nối song song được mô tả trên hình 2.6, ta dễ dàng kiểm
tra được trạng thái lỗi π không thể tới được khi bắt đầu từ trạng thái khởi đầu

(0, a, i). Do đó, hệ chuyển trạng thái ghép nối song song được gán nhãn Input
|| Output thỏa mãn thuộc tính p.
2.4 Thành phần phần mềm
Trong bối cảnh phát triển công nghệ phần mềm hướng thành phần, mỗi thành
phần phần mềm được coi như một hộp đen. Một thành phần phần mềm [10]
có thể được biểu diễn bởi một máy hữu hạn trạng thái được định nghĩa như
sau:
Định nghĩa 2.9: Thành phần phần mềm
Gọi M = (Q
M
, Σ, 
M
, q
0
M
) là mô hình mô tả hành vi của thành phần
phần mềm C. C là một máy hữu hạn trạng thái không xác định (Unknown
Finite State Machine – UFSM) (Q
C
, Σ, 
C
, q
0
C
), trong đó:
 Q
C
là tập khác rỗng các trạng thái,
 Σ  Act là tập hữu hạn các hành động được gọi là bảng chữ cái của C,
   Q

C
x   x Q
C
là hàm chuyển trạng thái, và
 q
0
C
 Q
C
là trạng thái khởi tạo.
Chú ý 2.3: C là máy hữu hạn trạng thái không xác định có nghĩa là ta không
biết được tất cả các trạng thái và các hành vi của nó bởi vì thành phần phần
mềm C như một hộp đen, ta chỉ có thể tiến hành các thử nghiệm trên C.
Định nghĩa 2.10: Mô hình chính xác (Accurate Model)
M là mô hình mô tả hành vi của một thành phần phần mềm C. Ta nói
M là mô hình chính xác [10] của C nếu   
*
,  là một thực hiện được
chính xác trên C. Khi đó  là một vết của M.
2.5 Ôtômát hữu hạn trạng thái
Định nghĩa 2.11: Ôtômát hữu hạn trạng thái (Deterministic Finite State
Automata - DFA)
13

Ôtômát hữu hạn trạng thái [1], [4] là một bộ năm có thứ tự M = (Q, , ,
q
0
, F), trong đó:
 Q là tập hữu hạn khác rỗng các trạng thái,
   Act là một tập hữu hạn khác rỗng các hành động, còn gọi là

bảng chữ cái của M,
 q
0
 Q là trạng thái khởi tạo hay trạng thái đầu,
 F  Q là tập các trạng thái kết thúc, và
  là hàm chuyển có dạng:
o Nếu hàm chuyển là ánh xạ : Q x   Q thì M được gọi là
ôtômát hữu hạn đơn định (deterministic finite automata - DFA).
o Nếu hàm chuyển là ánh xạ : Q x   2
Q
thì M được gọi là
ôtômát hữu hạn không đơn định (nondeterministic finite automata -
NDFA).
Chú ý 2.4: Một ôtômát hữu hạn trạng thái M và một chuỗi , ta ký hiệu
(q,) để chỉ trạng thái của M sau khi đọc chuỗi  bắt đầu từ trạng thái q.
Một chuỗi  được gọi là đoán nhận bởi ôtômát hữu hạn M = (Q, , , q
0
,
F) nếu (q
0
,)  F. Ngôn ngữ đoán nhận bởi ôtômát M được định nghĩa
L(M) = {  | (q
0
,)  F}.
Ta có thể mô tả hoạt động của ôtômát M khi cho một xâu vào  =
a
1
a
2
…a

n
như sau:
Khi bắt đầu làm việc, ôtômát M ở trạng thái q
0
và đầu đọc đang nhìn
vào ký hiệu a
1
, tiếp theo ôtômát sẽ chuyển từ trạng thái q
0
dưới tác động của
ký hiệu vào a
1
sang trạng thái mới (q
0
, a
1
) = q
1
 Q và đầu đọc chuyển sang
ký hiệu a
2
. Tiếp theo ôtômát sẽ chuyển từ trạng thái q
1
dưới tác động của hàm
chuyển  sang trạng thái mới (q
1
, a
2
) = q
2

 Q. Quá trình này tiếp tục cho
đến khi xảy ra một trong các tình huống sau:
 Ôtômát đọc hết xâu vào  = a
1
a
2
…a
n
và (q
n-1
, a
n
) = q
n
 F, khi đó ta
nói rằng ôtômát M đoán nhận xâu ,
 Ôtômát đọc hết xâu vào  = a
1
a
2
…a
n
và (q
n-1
, a
n
) = q
n
 F, khi đó ta
nói rằng ôtômát M không đoán nhận xâu , hoặc

 Ôtômát M đọc đến a
j
(j  n) và (q
j-1
, a
j
) không xác định, khi đó ta nói
rằng ôtômát M không đoán nhận xâu .
14

Chú ý 2.5: Biểu diễn ôtômát hữu hạn trạng thái
Phương pháp thứ nhất là biểu diễn bằng hàm chuyển trạng thái, đây là
phương pháp biểu diễn ôtômát như đã mô tả trong định nghĩa 2.11.
Phương pháp thứ hai là biểu diễn bằng đồ thị. Hàm chuyển trạng thái
được biểu diễn dưới dạng một đồ thị có hướng, trong đó mỗi trạng thái là một
đỉnh. Nếu ký hiệu vào là a   và từ trạng thái q ôtômát chuyển sang trạng
thái p (p = (q, a)) thì sẽ có một cung từ đỉnh q đến đỉnh p với nhãn là a.
Đỉnh ứng với trạng thái bắt đầu (q
0
) có mũi tên đến, đỉnh ứng với trạng thái
kết thúc được biểu diễn bằng vòng tròn kép, các đỉnh còn lại biểu diễn bởi
vòng tròn đơn.
Ví dụ 2.7 minh họa cho hai cách biểu diễn của một ôtômát M, biểu
diễn bằng hàm chuyển trạng thái  và biểu diễn bằng đồ thị có hướng như
hình 2.7.
Ví dụ 2.7: Ôtômát hữu hạn trạng thái M = (Q, , , q
0
, F), trong đó:
 Q = {q
0

, q
1
},
 q
0
là trạng thái khởi tạo,
  = { a, b},
  = { (q
0
, a, q
1
), (q
0
, b, q
1
), (q
1
, a, q
1
), (q
1
, b, q
0
)}, và
  = { q
1
}.

Hình 2.7: Minh họa ôtômát M được mô tả ở trên.
Hình 2.7 mô tả biểu diễn của ôtômát hữu hạn M dưới dạng đồ thị

chuyển trạng thái. Với ôtômát trên, ta dễ dàng kiểm tra được rằng một chuỗi
aaaa L(M), nhưng chuỗi aaaab  L(M).
q
0
q
1
b
a, b
a
15

Chú ý 2.6: Một ôtômát hữu hạn trạng thái M được gọi là tiền tố đóng nếu
ngôn ngữ được đoán nhận bởi nó L(M) là tiền tố đóng, tức là với mỗi chuỗi 
 L(M) thì mọi tiền tố của  cũng thuộc L(M).
Chú ý 2.7: Ôtômát M nhận được từ giải thuật học L
*
[6], [13] được trình bày
trong chương 3 là ôtômát tối tiểu, đầy đủ và tiền tố đóng. Do đó, nó sẽ chứa
một số trạng thái không kết. Để nhận được hệ thống chuyển trạng thái được
gán nhãn L từ ôtômát M, chúng ta loại bỏ tất cả các trạng thái không kết và
tất cả các quy tắc chuyển trạng thái đến trạng thái không kết đó. Định nghĩa
2.12 chỉ ra phương pháp biến đổi một ôtômát thành một hệ chuyển trạng thái
được gán nhãn.
Định nghĩa 2.12: Với một ôtômát M = ( Q  {nas}, , , q
0
, Q) ta xác định
được hệ thống chuyển trạng thái được gán nhãn L tương ứng như sau:
L = ( Q, ,  ( Q x  x Q ), q
0
)

Trong đó nas (non-acepting states) là các trạng thái không kết.
Ví dụ 2.8: Minh họa cách chuyển từ một ôtômát hữu hạn M thành một hệ
chuyển trạng thái được gán nhãn L

Hình 2.8: Phương pháp chuyển một ôtômát M thành LTS L.
Hình 2.8 mô tả phương pháp chuyển một ôtômát M thành một hệ
chuyển trạng thái được gán nhãn L. Dễ nhận thấy, ôtômát M có q
1
là trạng
thái kết duy nhất. Do đó, chúng ta loại bỏ trạng thái q
0
và tất cả các quy tắc
chuyển trạng thái đến trạng thái q
0
thu được một hệ chuyển trạng thái L như
trên hình 2.8.

q
0
q
1
b
a, b
a
q
1
a
16

Định nghĩa 2.13: Ôtômát tối tiểu

Ôtômát có số trạng thái ít nhất trong các ôtômát hữu hạn cùng đoán
nhận ngôn ngữ L được gọi là ôtômát tối tiểu [2], [3] của ngôn ngữ L.
Định nghĩa 2.14: Trạng thái tương đương
Hai trạng thái q
1
và q
2
được gọi là tương đương [2], ký hiệu q
1
 q
2

nếu cả hai trạng thái (q
1
, x) và (q
2
, x) đều là những trạng thái kết thúc hoặc
cả hai đều là không kết thúc với mọi x  Σ
*
.
Định nghĩa 2.15: Trạng thái k – tương đương
Hai trạng thái q
1
và q
2
được gọi là k – tương đương [2], ký hiệu q
1

k


q
2
nếu cả hai trạng thái (q
1
, x) và (q
2
, x) đều là những trạng thái kết thúc
hoặc cả hai đều là không kết thúc với mọi x  Σ
*
có độ dài nhỏ hơn k ( k  0)
Chú ý 2.8: Các quan hệ  và 
k
là các quan hệ tương đương (có tính chất
phản xạ, đối xứng, bắc cầu). Các lớp tương đương của hai quan hệ này sẽ tạo
ra các phân hoạch  và 
k
của Q. Các phần tử của 
k
là các lớp k – tương
đương.
Định nghĩa 2.16: Trạng thái (k+1) – tương đương
Hai trạng thái q
1
và q
2
được gọi là (k+1) – tương đương nếu:
 chúng là k – tương đương, và
 (q
1
, a) và (q

1
, a) cũng là k – tương đương với mọi a  Σ.
17

Chương 3: Các phương pháp sinh tự động mô hình
thành phần phần mềm
Chương 2 đã trình bày các kiến thức cơ bản về các phương pháp hình thức
cho đặc tả phần mềm, máy hữu hạn trạng thái và ôtômát hữu hạn. Trong
chương này, chúng tôi xin trình bày phương pháp xây dựng mô hình của một
thành phần phần mềm.
Công nghệ phần mềm hướng thành phần hiện là một kỹ thuật quan
trọng bậc nhất trong công nghệ phần mềm. Tuy nhiên, vấn đề lớn nhất là làm
thế nào để đảm bảo rằng các thành phần phần mềm có thể cộng tác được với
nhau để đạt được mục tiêu của hệ thống. Giải pháp phổ biến hiện nay để giải
quyết vấn đề này là áp dụng các phương pháp kiểm thử hoặc kiểm chứng mô
hình. Tuy nhiên, các kỹ thuật này hiện nay đều giả thiết rằng mô hình của
thành phần phần mềm là sẵn có và chính xác. Giả thiết này không dễ có được
trong thực tế do thành phần phần mềm thường được phát triển bởi bên thứ ba
nên không có mã nguồn và tài liệu đầy đủ và nếu có cũng rất khó hiểu. Do
đó, mỗi thành phần phần mềm luôn được nhìn nhận như một hộp đen. Bài
toán đặt ra là cần xây dựng mô hình mô tả chính xác hành vi của thành phần
phần mềm đó. Dưới đây là hai đề xuất phương pháp xây dựng mô hình thành
phần phần mềm. Phương pháp thứ nhất là phương pháp xây dựng mô hình sử
dụng thuật toán học L
*
được phát triển bởi Angluin [6] và được cải tiến bởi
Rivest và Schapire [13] và phương pháp thứ hai là phương pháp xây dựng mô
hình sử dụng thuật toán Thompson [11].
Mỗi thành phần phần mềm C được coi như một hộp đen, chúng ta hoàn
toàn không biết được tất cả các trạng thái và các hành động trên C. Giả thiết

rằng mỗi thành phần C có những thông tin sau: Với mỗi chuỗi các hành động
ta có thể kiểm tra được nó có phải là một thực hiện trên C hay không.

Hình 3.1: Mô hình giả thiết về thành phần phần mềm C.
Black box
component C
a
1
a
2
…a
n
true/false

18

Hình 3.1 mô tả mô hình giả thiết của bài toán. Với mỗi chuỗi a
1
a
2
…a
n

ta luôn kiểm tra được nó có phải là một thực hiện trên C hay không. Nếu
chuỗi a
1
a
2
…a
n

là thực hiện được trên C thì trả về giá trị true, trái lại trả về giá
trị false. Tập tất cả các chuỗi thực hiện được trên C gọi là ngôn ngữ đoán
nhận bởi C, ký hiệu L(C).
3.1 Phương pháp học sử dụng giải thuật L
*

Giải thuật học L
*
học một ngôn ngữ không biết quy tắc để đưa ra một ôtômát
hữu hạn đoán nhận nó. Ý tưởng chính của giải thuật này dựa trên định lý
“Myhill – Nerode Theorem” [5] trong lý thuyết ngôn ngữ hình thức. Với mỗi
tập có quy tắc U  Σ
*
, tồn tại duy nhất một ôtômát tối tiểu mà tập các trạng
thái của nó đẳng cấu với tập các lớp tương đương theo quan hệ sau: w ≈ w′
khi và chỉ khi u  Σ
*
: wu  U  w′u  U. Do đó, ý tưởng chính của L
*

học các lớp tương đương.
U là một ngôn ngữ không biết quy tắc trên bảng chữ cái Σ. Giải thuật
học L
*
sẽ học để thu được một ôtômát hữu hạn đơn định (DFA) M như một
ôtômát tối tiểu đoán nhận U, tức là L(M) = U. Để học được M, L
*
cần tương
tác với một đối tượng giáo viên (Teacher), Teacher phải có khả năng trả lời
hai loại câu hỏi như sau:

Loại thứ nhất là câu hỏi truy vấn thành viên, với mỗi dẫn xuất   Σ
*

thì   U không? Teacher sẽ trả lời true nếu   U, trái lại Teacher sẽ trả lời
false.
Loại thứ hai là câu hỏi kiểm tra ứng viên, với mỗi ứng viên DFA M thì
M có phải là ôtômát đoán nhận U không (tức là L(M) = U?). Nếu L(M) = U
thì Teacher trả lời true, trái lại Teacher sẽ trả về một phản ví dụ phản ảnh sự
khác biệt giữa L(M) và U.
Để làm được điều đó L
*
duy trì một bảng T mà mỗi bản ghi của nó lưu
các chuỗi s  Σ
*
, s có thuộc U hay không. Điều này được thực hiện bằng cách
tạo các câu hỏi truy vấn thành viên gửi tới Teacher để cập nhật bảng T. Ở
mỗi bước L
*
xây dựng một DFA M từ bảng T và yêu cầu Teacher trả lời câu
hỏi kiểm tra ứng viên M có phải là ôtômát đoán nhận U hay không? Nếu
Teacher trả lời true thì giải thuật sẽ dừng, trái lại L
*
sẽ sử dụng phản ví dụ
19

được trả về bởi Teacher để cập nhật lại bảng T và tiếp tục lặp lại quá trình
trên.
3.1.1 Phương pháp xây dựng mô hình sử dụng thuật toán L
*


Giải thuật học L
*
sẽ học để thu được một ôtômát tối tiểu hữu hạn M tương
đương với thành phần phần mềm C theo nghĩa M là một mô hình chính xác
mô tả hành vi của thành phần C, trong đó C như một hộp đen với những giả
thiết như đã trình bày ở trên.

Hình 3.2: Sơ đồ thuật toán L
*
.
Hình 3.2 mô tả tiến trình lặp của giải thuật L
*
để học được một mô
hình chính xác của thành phần phần mềm C. Ở mỗi bước của tiến trình lặp,
L
*
tương tác với một giáo viên (Teacher). Teacher sử dụng giải thuật
Vasilevskii – Chow (VC) để trả lời câu hỏi kiểm tra mô hình ứng viên M
i

thỏa mãn L(M
i
) = L(C) hay không? Nếu L(M
i
) ≠ L(C) thì Teacher sẽ trả về
một chuỗi d phản ảnh sự khác biệt giữa M
i
với S, ví dụ L(M
i
)\L(C) hoặc

L(C)\L(M
i
). Trái lại Teacher sẽ trả về giá trị true. Điều này có nghĩa là M
i

mô hình chính xác của C.
L
*
duy trì một bảng T để ghi nhận mỗi chuỗi s  Σ
*
thì s có thuộc L(C)
hay không bằng cách cho thực hiện chuỗi s trên C. Ở mỗi bước, L
*
tạo một
truy vấn kiểm tra ứng viên, nó sử dụng bảng T để xây dựng môt mô hình ứng
viên DFA M
i
và yêu cầu Teacher trả lời câu hỏi kiểm tra ứng viên. Nếu
Teacher trả lời true thì giải thuật sẽ dừng. Trái lại L
*
sử dụng giá trị d biểu
diễn sự khác biệt giữa M
i
và C được trả lại bởi Teacher để cập nhật lại bảng
T.
Một cách chi tiết, để học được mô hình hệ thống L
*
xây dựng một bảng
quan sát (S, E, T), trong đó:
Learning

Checking
Conformance via VC
Black-box
Component
C
M
i
Yes

No + CounterExample

M
i
and C are in
conformance
20

 S  Σ
*
là tập các tiền tố, biểu diễn các trạng thái,
 E  Σ
*
là tập các hậu tố, biểu diễn các giá trị thể hiện sự phân biệt giữa
mô hình ứng viên M
i
với thành phần C được trả về bởi Teacher, và
 T là một ánh xạ từ tập (S  S. Σ).E → {true, false}, với mỗi chuỗi s 
Σ
*
thì T(s) = true nếu s  L(C), trái lại T(s) = false.

Định nghĩa 3.1: Bảng quan sát (S, E, T) được gọi là bảng đóng nếu nếu  
S,   Σ thì ′  S,   E sao cho T() = T(′e).
Trong trường hợp này ′ biểu diễn trạng thái kế tiếp của  sau khi thực
hiện một hành động a, mọi hậu tố của ′ và  là hoàn toàn giống nhau. Trực
quan chúng ta dễ nhận thấy một bảng quan sát (S, E, T) là đóng nếu mọi dòng
  S.Σ đều tồn tại một dòng ′  S tương ứng với nó.
Với mỗi bảng đóng (S, E, T) ta luôn xây dựng được một DFA tương
ứng D = (Q, D, , q
0
, F) như sau:
 Q = S,
 D = Σ,
  được định nghĩa như sau (, a) = ′ nếu e  E thì T(e) = T(′e),
 q
0
= , và
 F = {  S sao cho T() = true}.
Ví dụ 3.1: Chuyển từ một bảng quan sát đóng (S, E, T) sang một DFA tương
ứng

Hình 3.3: Xây dựng một DFA tương ứng với bảng quan sát đóng (S, E, T).
21

Hình 3.3 mô tả phương pháp xây dựng một DFA tương ứng với bảng
quan sát đóng (S, E, T). Với bảng quan sát (S, E, T), ta dễ dàng kiểm tra được
nó có phải là bảng đóng hay không. Nó là đóng nếu mỗi dòng sa  S.Σ đều
tồn tại một dòng ′  S tương ứng. Để tránh nhầm lẫn ta sử dụng q
0
thay cho
λ, q

1
thay cho a. Ta dễ dàng xây dựng được DFA D = (Q, D, , q
0
, F), trong
đó: Q = S = { q
0
, q
1
}, D = {a, b},  = {(q
0
, a, q
1
), (q
0
, b, q
1
), (q
1
, b, q
0
), (q
1
,
b, q
1
)}, và F = {q
1
}.
Thuật toán học L
*

:
Giải thuật 3.1 trình bày tuần tự các bước của giải thuật học L
*
. Khởi
tạo, L
*
gán S và E = {ε} với ε biểu diễn một chuỗi rỗng (dòng 1). Sau đó thực
hiện cập nhật T bằng cách cho thực hiện các chuỗi hành động trên thành phần
phần mềm C, trong trường hợp này thiết lập T(a, ε) = true với mọi hành động
a  Σ có thể thực hiện được trên C sau khi thiết lập C về trạng thái ban đầu
(dòng 3). Tiếp theo kiểm tra bảng quan sát (S, E, T) có thỏa mãn tính đóng
không. Nếu (S, E, T) không đóng thì thêm sa vào S, trong đó s  S, a  Σ, là
phần tử mà không có ′  S tương ứng với nó (dòng 5). Vì sa được thêm vào
S nên T cần được cập nhật lại bằng cách cho thực hiện chuỗi các thử nghiệm
trên C (dòng 6). Các công việc trên dòng 5 và 6 được lặp đi lặp lại cho đến
khi (S, E, T) trở thành bảng quan sát đóng. Khi (S, E, T) là bảng đóng thì L
*

truy vấn đến Teacher để kiểm tra mô hình ứng viên tương ứng với bảng (S, E,
T) có phải là mô hình chính xác hay không bằng cách áp dụng giải thuật VC
(dòng 11) conform = VC(S, E, C, n) trong đó n là giới hạn cận trên kích thước
của ôtômát mô hình hóa cho thành phần C. Nếu mô hình đó là tương thích
với C (tức conform = true) thì xây dựng một mô hình ứng viên M
i
= (Q,
M
i
, , q
0
, F) từ bảng đóng (S, E, T). Khi đó L

*
sẽ trả về mô hình ứng viên
M
i
và kết thúc thuật toán. Trái lại, Teacher sẽ trả về một phản ví dụ (tức
conform = cex) biểu diễn sự khác biệt giữa hành vi của thành phần C với mô
hình M
i
của nó. Khi đó L
*
sẽ phân tích giá trị cex để tìm ra tất cả các hậu tố
của nó, đó chính là thể hiện sự khác biệt giữa L(M
i
) với L(C). Với mỗi hậu tố
′ của cex, nếu ′

E thì ′ phải được thêm vào E. Khi mọi hậu tố của cex đã
được thêm vào E thì L
*
sẽ lặp lại toàn bộ quá trình từ dòng 3.
Độ phức tạp của thuật toán L
*
: O(kn
2
+ nlog m) [6], trong đó, k là kích
thước của bảng chữ cái Σ, n là số trạng thái của ôtômát hữu hạn mô hình hóa

×