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

Tối ưu việc sinh giả thiết bằng giải thuật học L cho kiểm chứng từng phần phần mềm dựa trên thành phầ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 (1.3 MB, 58 trang )




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

TỐI ƯU VIỆC SINH GIẢ THIẾT BẰNG GIẢI
THUẬT HỌC L
*
CHO KIỂM CHỨNG TỪNG PHẦN
PHẦN MỀM DỰA TRÊN THÀNH PHẦN
LUẬN VĂN THẠC SĨ

HÀ NỘI - 2014



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

TỐI ƯU VIỆC SINH GIẢ THIẾT BẰNG GIẢI
THUẬT HỌC L
*
CHO KIỂM CHỨNG TỪNG PHẦN
PHẦN MỀM DỰA TRÊN THÀNH PHẦN
Ngành: Công nghệ thông tin
Chuyên ngành: Khoa học máy tính
Mã số: 60480101


LUẬN VĂN THẠC SĨ

NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS. TS NGUYỄN VIỆT HÀ

HÀ NỘI - 2014
i



LỜI CẢM ƠN
Lời đầu tiên, tôi muốn gửi lời cảm ơn chân thành nhất tới PGS. TS Nguyễn Việt
Hà, người thầy đã tận tình hướng dẫn, chỉ bảo và giúp đỡ tôi trong quá trình làm luận
văn.
Tôi xin bày tỏ lòng biết ơn sâu sắc tới TS Phạm Ngọc Hùng, thầy đã đóng góp
những định hướng, ý kiến quý báu, cũng như đã tạo ra những động lực để tôi hoàn
thành tốt luận văn này.
Tôi xin gửi lời cảm ơn tới các thầy cô giáo đã giảng dạy tôi trong suốt những
năm học qua, các thầy cô đã rất quan tâm tới lớp, giúp tôi và các bạn cùng lớp có được
kết quả học tập như hiện tại.
Trân trọng cảm ơn đề tài mã số QGTD.13.01 đã trợ giúp tôi trong quá trình
thực hiện luận văn này.
Cuối cùng, tôi xin cảm ơn gia đình và đồng nghiệp những người luôn ở bên
động viên cổ vũ tôi trong suốt quá trình học tập, những người đã ủng hộ và khuyến
khích tôi rất nhiều trong tất cả các năm học. Họ là nguồn động viên vô tận của tôi
trong cuộc sống.
Hà Nội, tháng 6 năm 2014
Đào Anh Hiển
ii




LỜI CAM ĐOAN

Tôi xin cam đoan rằng, đây là kết quả nghiên cứu của tôi trong đó có sự giúp đỡ
rất lớn của thầy hướng dẫn và sự nỗ lực của bản thân. Các nội dung nghiên cứu và kết
quả trong đề tài này hoàn toàn trung thực.
Trong luận văn, tôi có tham khảo đến một số tài liệu của một số tác giả đã được
liệt kê tại phần tài liệu tham khảo ở cuối luận văn.
Hà Nội, tháng 6 năm 2014
Học viên thực hiện
Đào Anh Hiển
iii



MỤC LỤC
LỜI CẢM ƠN i
LỜI CAM ĐOAN ii
MỤC LỤC iii
DANH MỤC TỪ VIẾT TẮT iv
DANH MỤC BẢNG v
DANH MỤC HÌNH VẼ vi
CHƯƠNG 1. GIỚI THIỆU 1
CHƯƠNG 2. CÁC KIẾN THỨC CƠ BẢN 4
2.1. Labeled Transition Systems (LTSs) 4

2.2. Dẫn xuất (Traces) 4

2.3. Ghép nối song song (Parallel Compostion) 5


2.4. LTS an toàn và thuộc tính an toàn 5

2.5. Sự thỏa mãn (Satisfiability) 6

2.6. Ôtomat đơn định hữu hạn trạng thái 6

2.7. Đảm bảo giả thiết (Assume-Guarantee Reasoning) 7

CHƯƠNG 3. PHƯƠNG PHÁP SINH GIẢ THIẾT TỐI THIỂU BẰNG GIẢI THUẬT
HỌC L* 10
3.1. Giải thuật học L* 10

3.2. Phương pháp sinh giả thiết bằng giải thuật học L* 13

3.3. Ví dụ tạo giả thiết 16

CHƯƠNG 4. TỐI ƯU VIỆC SINH GIẢ THIẾT BẰNG GIẢI THUẬT HỌC L* 20
4.1. Giới thiệu 20

4.2. Định nghĩa giả thiết tối thiểu 20

4.3. Phương pháp sinh giả thiết tối thiểu 20

4.3.1. Kỹ thuật cải tiến cho việc trả lời các câu hỏi kiểm tra thành viên 22

4.3.2. Giải thuật sinh giả thiết tối thiểu 23

4.4. Tối ưu phương pháp sinh giả thiết tối thiểu 25

4.4.1. Tư tưởng của giải thuật 25


4.4.2. Giải thuật cải tiến tạo giả thiết tối thiểu 25

4.4.3. Đặc điểm không gian tìm kiếm 29

4.4.4. Tính dừng và tính đúng đắn của giải thuật 30

4.5. Ví dụ tạo giả thiết tối thiểu 31

CHƯƠNG 5. THỰC NGHIỆM 39

5.1. Mô tả công cụ 39

5.2. Kết quả thực nghiệm 40

CHƯƠNG 6. KẾT LUẬN 43
DANH MỤC CÔNG TRÌNH KHOA HỌC ĐÃ CÔNG BỐ 44
TÀI LIỆU THAM KHẢO 45
PHỤ LỤC 47
iv



DANH MỤC TỪ VIẾT TẮT
AGM Asumption Generation Method
AGR Assume-Guarantee Reasoning
AGV
Assume-Guarantee Verification
CBS
Component-Based Software

CBSD Component-Based Software Development
DFA Deterministic Finite State Automata
FSP Finite State Processes
DLS
Depth-Limited Search
LTSA
Labelled Transition Systems Analyser
MAGM Minimized Asumption Generation Method
MC
Model Checking
MMC Modular Model Checking
MV
Modular Verification
IDDFS
Iterative Deepening Depth – First Search
v



DANH MỤC BẢNG
Bảng 4.1: Bảng quan sát ban đầu 32

Bảng 4.2: Bảng sau khi cập nhật T1 32

Bảng 4.3: Bảng T1.1 33

Bảng 4.4: Bảng T1.1 33

Bảng 4.5: Bảng T1.2 33


Bảng 4.6: Bảng T1.3 33

Bảng 4.7: Bảng T1.2.1 34

Bảng 4.8: Bảng T1.2.1 sau khi cập nhật 36

Bảng 4.9: Bảng quan sát T1.2.1.1 sau khi thêm send vào S 37

Bảng 4.10: Bảng quan sát T1.2.1.1.1 37

Bảng 5.1. Kết quả thực nghiệm 42

vi



DANH MỤC HÌNH VẼ
Hình 2.1: Ví dụ về LTSs 4

Hình 2.2: LTS của Input || Output 5

Hình 2.3. LTS của thuộc tính an toàn 6

Hình 2.4: Tính ghép nối Input || Output || p
err
. 7

Hình 2.5: Minh hoạ tạo LTS an toàn từ một DFA. 7

Hình 3.1: Minh hoạ mối quan hệ giữa Teacher và L* learner. 11


Hình 3.2: Một sơ đồ khối để tạo giả thiết sử dụng giải thuật L* [4]. 13

Hình 3.3 Các thành phần và thuộc tính yêu cầu của hệ thống minh họa 16

Hình 3.4 Bảng quan sát rỗng và bảng quan sát sau khi cập nhật 17

Hình 3.5: Bảng sau khi thêm out vào S, bảng đó sau khi cập nhật và giả thiết ứng cử
viên A
1
17

Hình 3.6: Bảng quan sát sau khi thêm ack và S và bảng sau khi cập nhật 18

Hình 3.7: Bảng sau khi thêm send vào S, bảng sau khi cập nhật và giả thiết ứng cử
viên A
2
. 19

Hình 4.1: Các thành phần của hệ thống trong ví dụ được xét. 21

Hình 4.2: Giả thiết được tạo ra sau khi sử dụng giải thuật L*. 21

Hình 4.3: Giả thiết được tạo ra bởi giải thuật tạo giả thiết tối thiểu. 21

Hình 4.4: Lý do chỉ ra tại sao giả thiết được sinh ra trong [4] không tối thiểu 22

Hình 4.5: Biểu diễn LTSs của các thành phần. 31

Hình 4.6: Mô hình cây tìm kiếm của các bảng quan sát. 34


Hình 4.7: Giả thiết A
1.2.1
35

Hình 4.8: Cây tìm kiếm sau khi duyệt đến bảng quan sát T1.2.1 36

Hình 4.9: Giả thiết kết quả. 38

Hình 5.1 Công cụ IMAG và một ví dụ 39

Hình 5.2 Một ví dụ kiểm tra tính đúng đắn của công cụ IMAG trên LTSA 40


1



CHƯƠNG 1. GIỚI THIỆU
Quá trình phát triển phần mềm hướng thành phần được biết đến là sự phát triển
phần mềm bằng cách ghép nối các phần độc lập. Đây là một trong những kỹ thuật
quan trọng nhất trong kỹ nghệ phần mềm. Cách tiếp cận này vẫn đang thu hút sự chú ý
trong cộng đồng kỹ nghệ phần mềm và được xem là một cách tiếp cận mở, hiệu quả,
giảm thời gian và chi phí phát triển đồng thời tăng chất lượng của phần mềm. Đã có rất
nhiều khái niệm, kỹ thuật đề xuất nhằm phát triển cho ý tưởng này.
Tuy nhiên, một trong những hạn chế của phát triển phần mềm hướng thành
phần là vấn đề đảm bảo tính đúng đắn của hệ thống khi ghép nối các thành phần với
nhau vì các thành phần có thể được phát triển một cách độc lập hoặc được đặt mua từ
các công ty thứ 3 (third parties). Hiện tại, các công nghệ hỗ trợ phát triển phần mềm
hướng thành phần như CORBA (OMG), COM/DCOM or .NET (Microsoft), Java and

JavaBeans (Sun), … vv chỉ hỗ trợ việc ghép nối các thành phần (component plugging).
Chúng không có cơ chế kiểm tra liệu các thành phần có thể bị lỗi khi cộng tác với
nhau hay không. Điều này có nghĩa là cơ chế “plug-and-play” không được đảm bảo.
Một giải pháp phổ biến hiện nay để giải quyết cho vấn đề trên là áp dụng kiểm chứng
mô hình (Model Checking - MC) [5]. Kiểm chứng mô hình là một cách tiếp cận quan
trọng để giải quyết bài toán chứng minh độ tin cậy của phần mềm. Nó cũng tạo ra một
không gian trạng thái chi tiết có thể bao phủ được các hệ thống đang được kiểm tra
đồng thời đạt được hiệu quả đặc biệt trong quá trình dò các lỗi tổng hợp khá phức tạp
mà nguyên nhân chủ yếu do quá trình ghép nối các thành phần gây nên. Tuy nhiên,
một trong những hạn chế lớn nhất của kiểm chứng mô hình là “vấn đề bùng nổ không
gian trạng thái” khi kiểm chứng các phần mềm có kích thước lớn. Một trong những
cách tiếp cận tiềm năng để giải quyết vấn đề này là áp dụng kiểm chứng từng phần
(Modular Model Checking - MMC) [11, 12]. Thay vì tiến hành kiểm chứng trên toàn
bộ hệ thống gồm các thành phần được ghép nối với nhau, cách tiếp cận này tiến hành
kiểm chứng trên từng thành phần riêng biệt. Với cách tiếp cận này, vấn đề bùng nổ
không gian trạng thái hứa hẹn sẽ được giải quyết. Một trong những phương pháp kiểm
chứng hỗ trợ ý tưởng này là phương pháp kiểm chứng đảm bảo giả thiết (Assume-
Guarantee Verification - AGV) [2, 4, 6, 7] . Sử dụng tư tưởng của chiến lược “chia để
trị”, AGV phân chia bài toán kiểm chứng thành các bài toán con cùng dạng nhưng
kích thước nhỏ hơn sao cho chúng ta có thể kiểm chứng các bài toán con một cách
riêng biệt. AGV được đánh giá là một phương pháp hứa hẹn để kiểm chứng phần mềm
hướng thành phần thông qua phương pháp kiểm chứng mô hình. AGV không những
thích hợp cho phần mềm hướng thành phần mà còn có khả năng giải quyết vấn đề
bùng nổ không gian trạng thái trong kiểm chứng mô hình. Trong phương pháp này,
các giả thiết (assumptions) (có vai trò như là môi trường của các thành phần) sẽ được
tạo lập. Việc tạo lập các giả thiết chính là bài toán quan trọng nhất trong phương pháp
2




này. Mục tiêu chính của cách tiếp cận này là nhằm kết hợp tốt nhất giữa lợi thế của hai
phần: kiểm chứng mô hình và phát triển hướng thành phần.
Hiện nay, đã có nhiều nghiên cứu về kiểm chứng mô hình từng phần cho phần
mềm hướng thành phần [2, 4, 6, 7, 11, 12, 16]. Mỗi khi thêm một thành phần nào đó
vào hệ thống, thì toàn bộ hệ thống gồm các thành phần đang tồn tại và thành phần mới
phải được kiểm chứng lại. Vì thế, đối với những phần mềm phức tạp, vấn đề “bùng nổ
không gian trạng thái” có thể xảy ra khi áp dụng các phương pháp trong các nghiên
cứu này. Cách tiếp cận trong [2, 4, 6, 7] đề xuất phương pháp kiểm chứng đảm bảo giả
thiết như đã trình bày ở trên. Xét một hệ thống đơn giản gồm hai thành phần M
1

M
2
. Mục đích của cách tiếp cận này là kiểm chứng hệ thống này thoả mãn một thuộc
tính p mà không cần đến việc ghép nối giữa các thành phần với nhau. Dựa trên tư
tưởng này, AGV tìm ra một giả thiết A sao cho nó đủ mạnh cho M
1
thoả mãn p và đủ
yếu để nó được thỏa mãn bởi M
2
(tức là A M
1
p và true M
2
A gọi là các luật
đảm bảo giả thiết - AGR). Nếu tìm được một giả thiết A thỏa mãn các điều kiện trên
thì hệ thống khi ghép nối M
1
|| M
2

sẽ thoả mãn thuộc tính p.
Như chúng ta đã biết, vấn đề quan trọng và cũng hết sức khó khăn của cách tiếp
cận đảm bảo giả thiết là làm sao để xác định được giả thiết A. Bên cạnh đó, kích thước
của giả thiết cũng đóng vai trò quyết định đến chi phí cho quá trình kiểm chứng hệ
thống hướng thành phần. Phương pháp đề xuất trong [4] tạo giả thiết bằng cách sử
dụng giải thuật học có tên là L*. Giải thuật này gồm nhiều bước lặp, bắt đầu từ giả
thiết rỗng để đạt được giả thiết thoả mãn yêu cầu của AGR. Tại mỗi bước lặp, giải
thuật sẽ sinh ra một giả thiết ứng cử viên. Sau đó, giải thuật sẽ kiểm tra xem ứng cử
viên đó có thoả mãn các yêu cầu của AGR hay không? Nếu thoả mãn, giải thuật sẽ
dừng và ứng cử viên đó chính là giả thiết cần tìm. Nếu yêu cầu của AGR không được
thoả mãn, quá trình kiểm tra sẽ đưa ra một phản ví dụ giúp cho giải thuật sẽ xác định
các ứng cử viên tiếp theo tốt hơn. Quá trình trên sẽ được lặp đi lặp lại cho đến khi tìm
được giả thiết hoặc chỉ ra một phản ví dụ chứng tỏ hệ thống không thỏa mãn thuộc tính
p. Tuy nhiên phương pháp này chỉ tập trung vào việc sinh giả thiết thỏa mãn các luật
đảo bảo giả thiết và kích thước của giả thiết không được đề cập tới trong phương pháp
này. Một cách tiếp cận để tối ưu cho việc kiểm chứng bảo bảo giả thiết sử dụng giải
thuật học L* được Chaki và đồng nghiệp đề xuất trong [3]. Các tác giả đề xuất 3 cách
tối ưu cho phương pháp sinh giả thiết dựa trên giải thuật học L* nhưng cũng không đề
cập tới việc tối ưu kích thước của giả thiết được sinh ra. Phương pháp sinh giả thiết tối
thiểu cho kiểm chứng phần mềm dựa trên thành phần đề xuất trong [9, 10] tập trung
vào việc sinh giả thiết có kích thước nhỏ nhất nhưng độ phức tạp của phương pháp này
là rất lớn bởi phương pháp này tìm giả thiết tối thiểu trên cây tìm kiếm bao gồm tất cả
các giả thiết ứng cử viên có thể bằng chiến lược tìm kiếm theo chiều rộng. Để lưu trữ
các bảng quan sát sinh giả thiết ứng cử viên phương pháp sử dụng cấu trúc dữ liệu
hàng đợi và kích thước hằng đợi này có thể sẽ tăng theo hàm số mũ bảng quan sát.
3



Điều này có nghĩa là chúng ta phải trả một chi phí cao cho việc sinh giả thiết tối thiểu.

Kết quả là phương pháp khó được áp dụng vào trong thực tế. Hơn nữa phương pháp
kiểm chứng đảo bảo giả thiết chỉ hiệu quả khi kích thước của giả thiết A luôn nhỏ hơn
hoặc bằng kích thước của thành phần M
2.
Vì lý do này, trong luận văn này chúng tôi đề
xuất một phương pháp cải tiến cho việc tối ưu phương pháp sinh giả thiết tổi thiểu
nhằm giảm độ phức tạp của phương pháp. Trong phương pháp cải tiến này thay vì việc
sử dụng chiến lược tìm kiếm theo chiều rộng trên toàn bộ không gian tìm kiếm là cây
chứa toàn bộ các giả thiết ứng cử viên bằng việc sử dụng chiến lược tìm kiếm theo
chiều sâu lặp (Iterative Deepening Depth-First Search - IDDFS) để tìm kiếm giả thiết
tối thiểu trên cây con của cây tìm kiếm bao gồm các gia thiết với kích thước nhỏ hơn
hoặc bằng kích thước của thành phần M
2.

Phần còn lại của luận văn được tổ chức như sau: Chương 2 trình bày các kiến
thức cơ bản được sử dụng trong luận văn gồm: Hệ thống chuyển trạng thái có gán
nhãn (LTSs), dẫn xuất, phép toán ghép nối song song, LTS an toàn, thuộc tính an toán,
sự thảo mãn, automat đơn định hữu hạn trạng thái, vấn đề đảm bảo giả thiết. Giải thuật
học L* và phương pháp sinh giả thiết bằng giải thuật học L* sẽ được trình bày trong
chương 3. Chương 4 trình bày phương pháp sinh giả thiết tối thiểu cho việc kiểm
chứng phần mềm hướng thành phần. Trong chương này cũng sẽ trình bày chi tiết một
cải tiến cho phương pháp sinh giải thiết tối thiểu. Phương pháp này giúp giảm thời
gian và cả chi phí cho việc sinh giả thiết bằng cách áp dụng giải thuật tìm kiếm theo
chiều sâu lặp. Việc xây dựng một công cụ hỗ trợ được trình bày trong chương 5. Trong
chương này cũng trình bày kết quả thực nghiệm chứng minh cho tính đúng đắn và hiệu
quả của phương pháp cải tiến. Cuối cùng chúng tôi trình bày kết luận của luận văn,
thảo luận các nghiên cứu liên quan và những cải tiến trong tương lai trong chương 6.
4




CHƯƠNG 2. CÁC KIẾN THỨC CƠ BẢN
2.1. Labeled Transition Systems (LTSs)
Trong luận văn chúng tôi sử dụng LTSs[13] để đặc tả các hành vi của các thành
phần của hệ thống và thuộc tính cần kiểm chứng. Một LTS được xem như là một đồ
thị định hướng với các cạnh được gán nhãn. Thêm vào đó, tập trạng thái, các phép biến
đổi và tập các nhãn được kết hợp với nhau tạo nên một hệ thống. Đặt Act là tập các
hành động có thể quan sát được, và τ là hành động đại diện cho tất cả các hành động
bên trong của hệ thống.
Một LTS M là mộ bộ bốn
0
,,, qMQ

, trong đó:
 Q là một tập các trạng thái không rỗng,
 αM

Act là tập các hành động có thể quan sát được gọi là bảng chữ cái của M,

 
Q M Q
  
   
là hàm chuyển, và
 q
0


Q là trạng thái ban đầu.
Một LTS M=

0
,,, qMQ

được gọi là LTS không đơn định nếu nó có phép
biến đổi τ hoặc tồn tại (q, a, q

), (q, a, q
’’
)

δ trong đó q

≠ q
’’
. Ngược lại M được gọi
là đơn định (deterministic).
Giả sử có hai LTS:
0
,,, qMQM



'
0
,',','' qMQM


. Chúng ta nói LTS
M biến đổi thành M


qua hành động a, ký hiệu
'
a
M M

nếu và chỉ nếu (q
0
, a, q

0
)

δ
và αM = αM

và δ = δ

. Chúng ta sử dụng π để ký hiệu một trạng thái lỗi cụ thể, để thể
hiện sự vi phạm trong hệ thống ghép nối. Chúng ta sử dụng  để ký hiệu cho LTS
{}, Act, , . Hình 2.1 biểu diễn cho 2 LTS Input và Output.
Hình 2.1: Ví dụ về LTSs
2.2. Dẫn xuất (Traces)
Một dẫn xuất [2, 4] t của một LTS
0
, , ,
M Q M q
 
 
là một chuỗi hữu hạn
các hành động

1

i n
a a a
sao cho tồn tại một chuỗi các trạng thái
0
, , , ,
i n
q q q
thỏa
mãn điều kiện
1
( , , )
i i i
q a q



với i=1 n. Giả sử
,Act 

ký hiệu t↑Σ, biểu diễn một
dẫn xuất thu được bằng cách loại bỏ khỏi t tất cả các hành động
a

a

. Tập tất
cả các dẫn xuất của M được gọi là ngôn ngữ đoán nhận M, ký hiệu L(M). Với LTS
Input:


in
ack

send


0
1
2


Output:
send
ack

out


a
b
c

5



Input được mô tả trong Hình 2.1 thì in, in send, in send ack là các dẫn xuất. Còn in in,
in send send không phải là các dẫn xuất.


2.3. Ghép nối song song (Parallel Compostion)
Ghép nối song song (ký hiệu là ||) [13] là phép toán giao hoán và kết hợp. Nó
kết hợp hành vi của hai thành phần phần mềm bằng cách đồng bộ hoá các hành động
chung tương ứng với bảng chữ cái, và chèn thêm các hành động còn lại. Xét hai LTS,
),,,(
1
01111
qMQM



),,,(
2
02222
qMQM


. Quá trình 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:
 Nếu M
1
=


hoặc M
2
=

, khi đó M
1
|| M
2
=

.
 M
1
|| M
2
là một LTS
),,,(
0
qMQM


trong đó, Q = Q
1
x Q
2
, αM = αM
1

 αM

2
,
1 2
0 0 0
q q q 
, và phép biến đổi quan hệ δ được xác định như sau:
i)
   
    




',',,,
',,,',,,
2121
qpqp
qqppMM
(2.1)
ii)
 
    




qpqp
ppMM
,',,,
',,,\

121
(2.2)
iii)
 
    




',,,,
',,,\
212
qpqp
qqMM
(2.3)
Ví dụ 2.1: Khi ta ghép nối hai mô hình được thể hiện bằng hai LTS Input và
Output trong Hình 2.1. Các hành động send và ack được đồng bộ trong khi các hành
động khác được xen kẽ. Các trạng thái không tới được từ trạng thái ban đầu (0,0) sẽ
bị loại bỏ. Kết quả của phép ghép nối song song LTS Input || Output được thể hiện
trong Hình 2.2.
Hình 2.2: LTS của Input || Output
2.4. LTS an toàn và thuộc tính an toàn
Một LTS an toàn (Safety LTS) là một LTS hữu hạn không chứa bất kỳ một
trạng thái lỗi π nào. Thuộc tính an toàn (Safte Property) [14] là thuộc tính đảm bảo
không 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 được
biểu diễn như là một LTS an toàn p trong đó ngôn ngữ L(p) xác định tập tất cả các

Input || Output



in
ack
send
0,a

0,b
0,c
1,a

1,b
1,c
2,a

2,b 2,c

in
in
out
out
out

Input || Output


in
ack

send
0,a


1,a

2,b
2,c
out
6



thuộc tính chấp nhận được. Một LTS lỗi (error LTS), ký hiệu p
err
phát sinh trong quá
trình kiểm chứng LTS M thoả mãn thuộc tính p. Về cơ bản, error LTS của một thuộc
tính
0
,,, qpQp



 
0
,',, qpQp
errerr


, trong đó αp
err
= αp

 

'
, , | and q a a p
   
   
 
' '
q :( , , )Q q a q

 
. Hình 2.3 biểu diễn LTS của thuộc
tính an toàn p và LTS lỗi p
err
được tạo từ LTS p.
Hình 2.3. LTS của thuộc tính an toàn
2.5. Sự thỏa mãn (Satisfiability)
Cho một LTS M, ta nói M thoả mãn thuộc tính p, ký hiệu M╞ p, nếu và chỉ nếu
)()(:)( pLpML 

. Để kiểm chứng một thành phần M thoả mãn một thuộc
tính p, khi đó cả M và p
err
phải được biểu diễn dưới dạng của LTS an toàn (Safety
LTS), sau đó thực hiện phép toán 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.2: Để kiểm tra hệ thống ghép nối Input ||Output có thỏa mãn thuộc tính
p, hệ thống ghép nối song song Input||Output || p
err

được tính như trong hình 2.4. Dễ
dàng kiểm tra được rằng trạng thái lỗi π không đạt tới được trong hệ thống ghép nối
này. Vì vậy, chúng ta kết luận hệ thống ghép nối Input ||Output thỏa mãn thuộc tính p.
2.6. Ôtomat đơn định hữu hạn trạng thái
Chúng tôi sử dụng thuật toán học có tên L* [1, 17] để tạo giả thiết từ hai thành
phần phần mềm. Trong thuật toán này, tại mỗi bước lặp, một ôtomat đơn định hữu hạn
trạng thái (Deterministic Finite State Automata - DFA) M
i
được tạo ra. M
i
sau đó sẽ
được biến đổi thành giả thiết ứng cử viên A
i
, trong đó A
i
được thể hiện như là một
LTS an toàn. DFA được định nghĩa như sau:
Ôtomat hữu hạn có thể xem như “máy trừu tượng” để đoán nhận ngôn ngữ.
Ôtomat hữu hạn là bộ M = <Q, αM, δ, q
o
, F>, trong đó:
 Q, αM, δ, q
o
được định nghĩa như trong định nghĩa của các LTS hữu hạn.
 F

Q là tập các trạng thái kết thúc.
LTS lỗi p
err


out


in



in


out



ii
i

in

out



ii
i
LTS của thuộc tính p

7




Cho một DFA M và một chuỗi σ, ký hiệu δ(q, σ) là trạng thái kết quả sau khi M
đọc chuỗi σ bắt đầu tại trạng thái q. Ta nói DFA M đoán nhận chuỗi σ hay chuỗi σ
được đoán nhận bởi ôtomat hữu hạn M nếu δ(q
0
, σ)

F. Tập L(M) = {σ | δ(q
0
, σ)


F} được gọi là ngôn ngữ được đoán nhận bởi Ôtomat M.
Hình 2.4: Tính ghép nối Input || Output || p
err
.
Cho một DFA M, chúng ta cũng dễ dàng thu được một LTS an toàn A từ M
bằng cách loại bỏ tất cả các trạng thái không phải là trạng thái kết thúc và các biến đổi
liên quan đến trạng thái này bên trong M. Hình 2.4 mô tả một ví dụ để biến đổi một
DFA thành một LTS an toàn:

Hình 2.5: Minh hoạ tạo LTS an toàn từ một DFA.
2.7. Đảm bảo giả thiết (Assume-Guarantee Reasoning)
Xác minh đảm bảo giả thiết các phần mềm hướng thành phần là một cách tiếp
cận được đưa ra bởi D.Giannakopoulou [2, 4, 6, 7]. Cách tiếp cận này dựa trên tư
tưởng của kiểm chứng mô hình giả thiết. Nó đưa ra một cách tiếp cận đầy hứa hẹn để
giải quyết vấn đề xác minh đối với những hệ thống lớn. Cách tiếp cận này dựa trên tư
tưởng của chiến lược “Chia để trị”, thuộc tính của hệ thống được biến đổi thành các

out


in

in
out



ii
i


p
err

in
0,a,i

1,a,i

2,b,i 2,c,i
0,a,ii

1,a,ii

2,b,ii

2,c,ii

π




Input || Output || p
err

π unreachable!
in
ack
ack
send
send
out
out
Input || Output

ack
send
0,a

1,a

2,b 2,c
out

in
8




thuộc tính của các thành phần sau đó thay vì kiểm tra trên toàn hệ thống chúng ta sẽ
chỉ cần kiểm tra độc lập trên từng thành phần.
Xét một hệ thống đơn giản gồm hai thành phần độc lập M
1
và M
2
. Bài toán
quan trọng, cũng là xuyên suốt quá trình nghiên cứu của chúng ta là cần xác minh
xem, một hệ thống M
1
|| M
2
có thoả mãn một thuộc tính p nào đó hay không? Nếu
chúng ta xác minh trên toàn bộ hệ thống M
1
|| M
2
, giải pháp này sẽ dẫn tới vấn đề
“bùng nổ không gian trạng thái”. Đảm bảo giả thiết nhằm đưa ra giải pháp để kiểm tra
hệ thống M
1
|| M
2
có thoả thuộc tính p hay không mà không cần thực hiện phép ghép
nối song song giữa M
1
và M
2
.
Đảm bảo giả thiết sử dụng tư tưởng của chiến lược “Chia để trị”, phân chia bài

toán kiểm chứng thành các bài toán con cùng dạng nhưng kích thước nhỏ hơn. Nếu M
1

thoả mãn p với một điều kiện nào đó, và M
2
cũng thoả mãn điều kiện đó, khi đó hệ
thống M gồm M
1
và M
2
cũng thoả mãn điều kiện p. Điều kiện ở đây được thể hiện bởi
các giả thiết (Assumptions). Như vậy để kiểm chứng hệ thống sử dụng phương pháp
này, đòi hỏi chúng ta phải xác định được giả thiết, bài toán này chúng ta sẽ xem xét
sau. Ở đây chúng ta giả thiết có một giả thiết A đã được xác định và thuật toán trên của
chúng ta đã được chứng minh là đúng đắn. Giả thiết A được đưa ra, yêu cầu phải trừu
tượng hơn M
2
nhưng vẫn thể hiện được các đặc tính của M
2
. Hơn nữa, giả thiết phải đủ
mạnh để M
1
thoả mãn p (Hình 2.6 minh hoạ tổng quan về mục tiêu và giải pháp cho
cách tiếp cận xác minh đảm bảo giả thiết). Như vậy, bài toán kiểm chứng hệ thống M
= M
1
|| M
2
có thoả mãn thuộc tính p hay không? Ta đã đưa được về việc giải quyết hai
bài toán con:


1
A M P


2
true M A
.
Để kiểm chứng công thức
1
A M P
ta thực hiện phép ghép nối song song
A||M
1
||p
err
. Trong đó, A, M
1
, p, p
err
được biểu diễn bởi các LTS. Nếu không có dẫn
xuất đến trạng thái lỗi xảy ra trong A||M
1
||p
err
thì công thức
1
A M P
thỏa mãn. Hay
nói cách khác là A||M

1
thỏa p. Ngược lại, A||M
1
không thỏa p.

Hình 2.6: Bài toán và tư tưởng chính của cách tiếp cận xác minh đảm bảo giả thiết.
9



Với công thức
2
true M A
, kiểm tra xem M
2
có thoả mãn thuộc tính A hay
không với bất kỳ điều kiện gì của môi trường. Để kiểm chứng công thức này ta chỉ cần
thực hiện phép ghép nối M
2
||A, nếu LTS kết quả không tồn tại một dẫn xuất nào dẫn
tới trạng thái lỗi khi đó M
2
thoả A, ngược lại M
2
không thoả A.
Từ giải pháp trên, vấn đề chính trong cách tiếp cận này là làm thế nào để tìm ra
giả thiết A. Hiện tại, có hai phương pháp tạo giả thiết A một cách tự động như sau:
i. Phương pháp thứ nhất được đưa ra trong [6]. Cho trước thành phần M
1
, thuộc

tính p và phần giao diện của M
1
với môi trường của nó, tạo giả thiết môi trường yếu
nhất A
W
sao cho M
1
╞ p. Giả thiết yếu nhất A
W
tức là nó ràng buộc môi trường không
nhiều hơn cũng không ít hơn những gì nó cần, cụ thể như sau: với mọi môi trường E
khi đó E || M
1
╞ p khi và chỉ khi E ╞ A
W
. Giả thiết yếu nhất A
W
chứa tất cả các dẫn
xuất trên bảng chữ cái
1 2
( )
M p M
  
 
không chứa trạng thái lỗi trong hệ thống
M
1
||p. Trong trường hợp này, M
2
là không biết và được xem như là môi trường của M

1
.
ii. Phương pháp thứ hai được đưa ra trong [2, 4, 8] . Kỹ thuật này sử dụng thuật
toán học L* để thực hiện tạo giả thiết A đảm bảo rằng A là đủ yếu để được thoả mãn
bởi M
2
và đủ mạnh để M
1
thoả mãn thuộc tính p. Giả thiết A được tạo ra bởi phương
pháp này là mạnh hơn so với giả thiết yếu nhất A
W
.
10



CHƯƠNG 3. PHƯƠNG PHÁP SINH GIẢ THIẾT TỐI THIỂU BẰNG GIẢI
THUẬT HỌC L*
Chương 2 đã trình bày một cách tổng quan cách tiếp cận đưa ra nhằm xác minh
phần mềm hướng thành phần. Một bài toán quan trọng trong kỹ thuật này là làm thế
nào để tạo ra được một giả thiết. Chương này sẽ giới thiệu một cách để tạo ra một giả
thiết giữa hai thành phần M
1
và M
2
. Thông tin chi tiết về giải thuật học L* cũng được
trình bày trong chương này.
3.1. Giải thuật học L*
Giả sử có một tập ký tự ∑ cho trước. Với mỗi ngôn ngữ chính quy U có bảng
chữ cái là tập con của ∑*. Chúng ta cần tìm một Ôtomat đơn định tối thiểu hữu hạn

trạng thái (DFA) M đoán nhận ngôn ngữ U, tức là L(M) = U.
Tư tưởng chính của giải thuật này dựa trên định lý: “Myhill – Nerode Theorem”
[15]: Giả sử có một tập ký tự ∑. Với mỗi ngôn ngữ chính quy U, có bảng chữ cái là tập
con của ∑* cho trước, khi đó tồn tại duy nhất một DFA đoán nhận nó.
Giải thuật học L* được phát triển bởi [1] và sau đó được cải tiến bởi Rivest và
Schapire [17]. Trong luận văn này, chúng tôi sẽ trình bày giải thuật đã được cải tiến
với cùng tên L*. Dựa trên tư tưởng học, giải thuật L* sẽ thực hiện xây dựng dần dần
từng bước nghiệm của bài toán. Để huấn luyện U, L
*
cần thiết phải kết hợp với
Minimally Adequate Teacher, từ bây giờ chúng ta sẽ gọi là Teacher (người huấn
luyện). Teacher sẽ phải trả lời chính xác hai loại câu hỏi từ L
*
:
 Kiểm tra thành viên (Membership query), với một chuỗi
*


, câu trả
lời là true nếu
U


và false nếu ngược lại.
 Loại câu hỏi thứ hai: kiểm tra sự phỏng đoán. Với mỗi ứng cử viên DFA
M, khi đó, ngôn ngữ của nó có đồng nhất với U hay không? Tức là L(M) = U? Câu trả
lời là true nếu L(M) = U, ngược lại, Teacher sẽ đưa ra một phản ví dụ để minh chứng
cho sự khác nhau giữa L(M) và U.
Mối liên hệ giữa bộ huấn luyện L
*

và nhà huấn luyện Teacher được minh họa
như Hình 3.1.
Chi tiết hơn, L
*
sử dụng một bảng T để ghi lại kết quả kiểm tra một chuỗi
*
s

có thuộc vào U hay không? Bảng quan sát T được cập nhật mỗi khi có sự thay
đổi bởi các thao tác kiểm tra thành viên. Ôtomat hữu hạn M
i
được xây dựng dựa trên
bảng T, và khi đó với mỗi M
i
, các nhà huấn luyện sẽ quyết định xem sự phỏng đoán đó
có đúng hay không? Nếu phỏng đoán là chính xác, thuật toán sẽ dừng ở đây, ngược lại,
L
*
sử dụng phản ví dụ mà nhà huấn luyện trả lại để cập nhật lại bảng T.
Giải thuật L* xây dựng một bảng quan sát (S, E, T), trong đó:
11




*
S
 
là tập tiền tố. Nó thể hiện các lớp tương đương hay các trạng thái.


*
E  
là tập hậu tố. Nó thể hiện sự khác nhau giữa U và L(M
i
).

   
: . ,
T S S true false
  
, trong đó toán tử “.” thực hiện ghép nối hai
xâu được định nghĩa như sau:
 
. | ,
P Q pq p P q Q
  
. Như vậy, bảng T được sử dụng
để kiểm tra xem với mỗi chuỗi
*
s

, s có thuộc vào tập U hay không. Tức là, T(s) =
true nếu
s U
, ngược T(s) = false nếu
s U
.
Hình 3.1: Minh hoạ mối quan hệ giữa Teacher và L* learner.
Bảng quan sát (S, E, T) được gọi là đóng nếu:
)'()(:,',, esTsaeTEeSsaSs


. Trong trường hợp này, s

là trạng thái tiếp
theo từ trạng thái s sau khi đi qua a. Bảng quan sát (S, E, T) là đóng, khi đó mỗi hàng
sa trong S.∑ sẽ tương ứng với một hàng s’ trong S.
Giải thuật L
*
được trình bày chi tiết từng bước như trong Giải thuật 1.
Giải thuật 1 Giải thuật học L*
Input: U, : một ngôn ngữ chính quy chưa biết U trên bộ chữ cái 
Output: M: một DFA M sao cho M là một Ôtomat hữu đơn định cực tiểu tương ứng
với U và L(M) = U.
1: Khởi tạo, S = {}, E = {}
2: loop
3: cập nhật bảng T sử dụng truy vấn thành viên
4: while (S, E, T) chưa là bảng đóng do
5: thêm sa vào S để tạo S đóng với s  S và a  
6: cập nhật bảng T sử dụng truy vấn thành viên
7: end while
8: xây dựng một DFA ứng cử viên M từ bảng đóng (S, E, T)
9: thể hiện một truy vấn tương đương: L(M) = U?
10: if M là đúng then
12



11: return M
12: else
13 thêm hậu tố e 

*
của phản ví dụ cex vào E
14: end if
15: end loop
Đầu tiên, giải thuật L* khởi gán các tập S và E là tập rỗng {λ} (dòng 1) với λ
thể hiện cho chuỗi rỗng. Tiếp theo, giải thuật thực hiện cập nhật bảng quan sát (S, E,
T) bằng cách thực hiện các thao tác kiểm tra thành viên để có sự liên kết giữa các
chuỗi trong tập
 
. .S S E
 
(dòng 3). Giải thuật sau đó sẽ kiểm tra xem bảng quan sát
có đóng hay không (dòng 4). Nếu bảng quan sát là không đóng, khi đó sa được thêm
vào tập S, trong đó s

S và a

∑ là các hàng mà không tồn tại s’

S sao cho T(sae)
= T(s’e) (dòng 5). Vì sa được thêm vào tập S, khi đó T phải được cập nhật lại sử dụng
các hành động kiểm tra thành viên (dòng 6). Dòng 5 và dòng 6 được lặp đi lặp lại cho
đến khi bảng quan sát (S, E, T) là bảng đóng.
Khi bảng quan sát (S, E, T) là bảng đóng, một DFA M sẽ được xây dựng (dòng
8) từ bảng đóng (S, E, T) như sau:
Một DFA M = <Q, αM, δ, q
0
, F> được xây dựng từ một bảng đóng (S, E, T),
trong đó:
 Q = S,

 αM = ∑, trong đó ∑ là bảng chữ cái của ngôn ngữ U,
 Biến đổi δ được định nghĩa như sau: δ(s, a) = s’ và e

E: T(sae) =
T(s’e),
 Trạng thái ban đầu q
0
= λ,
 F = {s

S | T(s) = true}.
Một ứng cử viên DFA M được thể hiện như là một phỏng đoán tới Teacher
(dòng 9). Nếu Teacher trả lại kết quả true (tức là, L(M) = U) (dòng 10), L* trả lại M là
chính xác (dòng 11), ngược lại nó sẽ nhận được một phản ví dụ cex

∑* từ Teacher.
Phản ví dụ cex được phân tích bởi L* để tìm ra một hậu tố e của cex để minh chứng
cho sự khác nhau giữa L(M) và U. Sau đó, e phải được thêm vào tập E (dòng 13). Sau
khi e được thêm vào tập E, giải thuật L* sẽ lặp lại toàn bộ quá trình bằng cách quay
lại dòng 3.
Mỗi ứng cử viên DFA M
i
được đưa ra bởi giải thuật L* là nhỏ nhất. Nó có
nghĩa là, với mỗi DFA bước i +1 tiếp theo luôn có số trạng thái luôn nhiều hơn hoặc ít
nhất cũng bằng với số trạng thái của M
i
. Giả sử M
1
, M
2

, , M
n
là các ứng cử viên
được đưa ra bởi giải thuật L* theo từng bước, dễ dàng kiểm tra được rằng |M
1
| ≤ |M
2
|
≤ ≤ |M
n
|, trong đó |M
i
| kí hiệu cho số trạng thái của DFA M
i
. Giả sử M là giả thiết
13



cuối cùng sau khi kết thúc giải thuật. Giải thuật L* tạo ra các ứng cử viên DFA có kích
thước tăng dần, mỗi DFA ở bước này luôn nhỏ hơn DFA ở bước tiếp theo, và tất cả
các DFA không chính xác luôn có kích thước nhỏ hơn M. Vì vậy, nếu M có n trạng
thái, khi đó sẽ có nhiều nhất n -1 DFA không chính xác. Do đó, số lần thực hiện kiểm
tra thành viên được thực hiện bởi L* là O(kn
2
+ nlogm)[1], trong đó k là kích thước
của bảng chữ cái của U, n là số trạng thái của DFA tối thiểu đoán nhận ngôn ngữ U, m
là chiều dài của phản ví dụ dài nhất.
3.2. Phương pháp sinh giả thiết bằng giải thuật học L*
Xét hệ thống gồm 2 thành phần M

1
, M
2
, và một thuộc tính p. Nhiệm vụ của
chúng ta cần phải xác định công thức sau: M
1
|| M
2
╞ p có được thoả mãn hay không
mà không cần thực hiện phép ghép nối M
1
|| M
2
. Để thực hiện được điều này, giải
thuật đưa ra yêu cầu tạo một giả thiết A(p) đủ mạnh để M
1
thoả mãn p nhưng đủ yếu
để vẫn được đảm bảo bởi M
2
. Tức là cả hai biểu thức sau được thoả mãn:

1
( )
A p M p
,

2
( )true M A p
.
Để thu được các giả thiết thích hợp, phương pháp đề xuất trong [4] áp dụng luật

ghép nối vào một thuật toán lặp được minh hoạ trong Hình 3.3.

Hình 3.2: Một sơ đồ khối để tạo giả thiết sử dụng giải thuật L* [4].
14



Tại mỗi bước lặp, mỗi giả thiết được kiểm tra A
i
sẽ được sinh ra dựa trên những
thông tin về hệ thống và kết quả của bước lặp trước. Hai bước của luật ghép nối sẽ
được áp dụng. Bước 1 kiểm tra M
1
thỏa mãn p trong môi trường đảm bảo A
i
bằng cách
tính công thức A
i
 M
1
p. Nếu kết quả là false, điều đó chứng tỏ giả thiết ứng cử viên
này quá yếu (tức là A
i
không giới hạn đủ môi trường để cho p được thỏa mãn). Vì vậy
giả thiết ứng cử viên A
i
phải được làm mạnh thêm tương ứng với việc loại bỏ một vài
hành vi từ nó với sự trợ giúp của phản ví dụ cex được sinh ra bởi bước này. Trong ngữ
cảnh của giả thiết ứng cử viên tiếp theo A
i+1

, thành phần M
1
nên ít nhất không thể hiện
các hành vi vi phạm được phản ánh bởi phản ví dụ này. Ngược lại, kết quả là true, điều
này có nghĩa là A
i
đủ mạnh cho M
1
thỏa mãn thuộc tính p. Bước 2 sau đó được áp
dụng để kiểm tra nếu thành phần M
2
thỏa mãn A
i
bằng cách tính công thức true M
2

A
i
. Nếu bước này trả ra kết quả true, hệ thống M
1
|| M
2
thỏa mãn thuộc tính p (M
1
||
M
2
╞ p) và giải thuật kết thúc. Ngược lại bước này trả kết quả false, cần phân tích thêm
xem thuộc tính p có thực sự bị vi phạm bởi hệ thống M
1

|| M
2
hoặc giả thiết ứng cử
viên A
i
là quá mạnh để được thỏa mãn bởi M
2
. Việc phân tích này dựa trên phản ví dụ
cex được trả ra bởi bước này. Tức là phải kiểm tra xem phản ví dụ cex có thuộc về
ngôn ngữ chưa biết U = L(Aw) (cex  L(Aw) ?). Để thực hiện việc này, quá trình
phân tích phải kiểm tra xem p có bị vi phạm bởi M
1
trong ngữ cảnh của phản ví dụ cex
bằng cách kiểm tra công thức [cex] || M
1
| p, với [cex] là một LTS được định nghĩa
như sau:
Giả sử một LTS [cex] =

Q, α[cex], δ, q
0

và phản ví dụ cex = a
1
a
2
a
k
. LTS
[cex] được tạo ra từ phản ví dụ cex như sau:

 Q = {q
0
, q
1
, , q
k
},
 α[cex] = {a
1
, a
2
, , a
k
},
 δ = {(q
i-1
, a
i
, q
i
) | 1≤ i ≤ k }, và
 q
0
= q
0
.
Nếu thuộc tính p không được thỏa mãn trong hệ thống ghép nối [cex] || M
1

([cex] || M

1
| p), điều này có nghĩa hệ thống ghép nối M
1
|| M
2
không thỏa mãn thuộc
tính p (M
1
|| M
2
| p). Ngược lại, A
i
là quá mạnh để được thỏa mãn bởi M
2
. Giả thiết
ứng cử viên A
i
vì vậy phải được làm yếu đi (tức là các hành vi phải được thêm vào)
trong bước lặp i + 1. Kết quả của quá trình làm yếu đi này là ít nhất các hành vi mà
phản ví dụ cex chỉ ra sẽ được cho phép bởi giả thiết ứng cử viên A
i+1
. Giả thiết ứng cử
viên mới lúc này là quá yếu và vì vậy quá trình phải được lặp lại.
Đầu tiên chúng ta sẽ tìm hiểu giải thuật học L* xác định A
i
như thế nào? Giải
thuật tạo giả thiết sử dụng tư tưởng của thuật toán học L*, huấn luyện giả thiết yếu
nhất A
W
. Điều này cũng có nghĩa là, L* huấn luyện ngôn ngữ chính quy U = L(A

W
) có
15



bảng chữ cái
 
1 2
M p M
  
   
. Để đưa ra mỗi ứng cử viên giả thiết A
i
, đầu tiên
giải thuật L* xác định một DFA M
i
dựa trên bảng quan sát (S, E, T), sau đó dựa vào
định nghĩa 2.6 biến đổi DFA M
i
thành một LTS an toàn A
i
. Để huấn luyện được A
W
,
giải thuật L* sử dụng một người huấn luyện Teacher để trả lời hai câu hỏi:
Câu hỏi đầu tiên, xác nhận thành viên, với một chuỗi
*



, câu trả lời là true
nếu
U


và false nếu ngược lại. Để xác định xem σ có thuộc vào ∑ hay không, đầu
tiên L* xây dựng LTS an toàn A
σ
=
0
, , ,Q A q

 
, trong đó Q = {q
0
, q
1
,…, q
n
}, αA
σ
=
∑, δ = {(q
i
, a
i+1
, q
i+1
)| 1 ≤ i < n}, và q
0

= q
0
. Việc kiểm tra
*


? được đưa về kiểm
tra biểu thức A
σ
 M
1
p. Để kiểm tra biểu thức trên, chúng ta xây dựng hệ thống ghép
nối A
σ
|| M
1
|| p
err
. Nếu hệ thống ghép nối không tồn tại một dẫn xuất tới trạng thái lỗi
π, hay nói cách khác, trạng thái lỗi không xuất hiện trong hệ thống ghép nối, khi đó ta
nói
U


. Vì M
1
không vi phạm thuộc tính trong ngữ cảnh của σ, khi đó Teacher sẽ
trả lại true. Ngược lại, kết quả của câu hỏi xác nhận thành viên là false.
Câu hỏi thứ hai, với mỗi DFA M
i

được tạo ra bởi thuật toán học L* dựa trên
bảng quan sát (S, E, T) tại vòng lặp i, Teacher sẽ phải kiểm tra xem ngôn ngữ được
đoán nhận bởi M
i
có đồng nhất với U hay không? Tức là kiểm tra biểu thức L(M
i
) =
L(A
W
)? Nếu kết quả là true, giải thuật L* thực hiện biến đổi DFA M
i
thành một LTS
an toàn A
i
. Khi đó, LTS A
i
được xem như một ứng cử viên đầu vào cho giải thuật
trong Hình 3.2. Nhiệm vụ tiếp theo của giải thuật cần phải xác định xem, A
i
có phải là
giả thiết cần tìm hay không? Tức là cần phải kiểm tra xem A
i
có thoả mãn các điều
kiện của AGR hay không? Teacher sẽ phải thực hiện hai bước: luật ghép nối và phân
tích phản ví dụ để trả lời câu hỏi trên như sau:
 Bước 1: Kiểm tra công thức sau
1i
A M p
bằng cách xây dựng hệ
thống ghép nối A

i
|| M
1
|| p
err
. Nếu trạng thái lỗi π xuất hiện trong hệ thống ghép nối,
khi đó biểu thức trên là sai, tức là giả thiết A
i
là quá yếu để M
1
thoả mãn p. Vì vậy, giả
thiết A
i
sẽ phải được làm mạnh hơn (loại bỏ một vài đặc tính của A
i
) cùng với đó giải
thuật sẽ trả lại một phản ví dụ cex. Dựa trên phản ví dụ này giúp chúng ta đưa ra giả
thiết A
i+1
tại bước tiếp theo tốt hơn. Nếu kết quả là true, tức là giả thiết A
i
đủ mạnh để
M
1
thoả mãn p. Giải thuật sẽ chuyển sang bước 2.
 Bước 2: Kiểm tra công thức:
2
i
true M A
: Nếu kết quả là true, khi đó

M
1
|| M
2
╞ p.  giải thuật kết thúc. Nếu kết quả là false, Teacher sẽ đưa ra một phản
ví dụ cex. Tuy nhiên, đến thời điểm này, chúng ta chưa thể khẳng định hệ thống M
1
||
M
2
không thoả mãn thuộc tính, vì có thể giả thiết A
i
quá mạnh để M
2
thoả mãn. Như
vậy, Teacher phải phân tích để xác định xem có phải hệ thống M
1
|| M
2
không thoả mãn
thuộc tính p hay là giả thiết A
i
quá mạnh để M
2
thoả mãn.
16



 Phân tích phản ví dụ: Để thực hiện nhiệm vụ này, Teacher sẽ sử dụng

phản ví dụ cex được trả lại tại bước 2. Khi đó, nó sẽ phải kiểm tra xem
W
ex (A )
c L

?
Đầu tiên, Teacher xây dựng một LTS an toàn
exc
A

từ phản ví dụ cex. Sau đó, Teacher
kiểm tra biểu thức
1
cex
A M p

bằng cách xây dựng hệ thống ghép nối
exc
A

|| M
1
||
p
err
. Nếu trạng thái lỗi π xuất hiện trong hệ thống ghép nối, tức là hệ thống
exc
A

|| M

1

không thoả mãn thuộc tính p, nó cũng có nghĩa là hệ thống M
1
|| M
2
cũng không thoả
mãn thuộc tính p. Ngược lại, trạng thái lỗi π không xuất hiện trong hệ thống ghép nối,
tức là biểu thức trên là đúng, khi đó ta khẳng định giả thiết A
i
là quá mạnh để M
1
thoả
mãn trong ngữ cảnh của cex. Và sau đó, giả thiết A
i
sẽ được làm yếu bớt đi.
3.3. Ví dụ tạo giả thiết
Một ví dụ phần mềm dựa trên thành phần bao gồm thành phần M
1
và phần mở
rộng M
2
được thể hiện trọng Hình 3.4. Trong phần mềm dựa trên thành phần (CBS)
này LTS của M
1
là Input LTS, và LTS của M
2
là Output LTS. Trạng thái khởi tạo của
Input LTS trong ví dụ này là trạng thái 0. Trạng thái khởi tạo của Output LTS là trạng
thái a. phần mở rộng M

2
được ghép vào M
1
bằng phép toán ghép nối song song. Hệ
thống này có nghĩa là Input LTS sẽ nhận đầu vào khi hành động in xảy ra và sau đó
gửi nó tới Output LTS với hành động send. Sau khi một số dữ liệu được gửi tới nó,
Output LTS sản xuất đầu ra sử dụng hành động out và phản hồi báo nó đã kết thúc
bằng cách sử dụng hành động ack. Ở thời điểm này cả 2 LTS quay về trạng thái khởi
tạo ban đầu của chúng và tiến trình có thể được lặp lại. Thuộc tính yêu cầu p có nghĩa
là hành động in phải xảy ra trước hành động out
Hình 3.3 Các thành phần và thuộc tính yêu cầu của hệ thống minh họa
Để sinh ra một giả thiết giữa 2 thành phần M
1
và M
2
là đủ mạnh để M
1
thỏa
mãn p nhưng đủ yếu để M
2
được thỏa mãn. L* học giả thiết yếu A
w
. Điều này có nghĩa
rằng L* học ngôn ngữ chưa biết U = L(A
w
) trên bảng chữ cái  =

A
w
= (


M
1


p 

M
2
= {send, out, ack}.
Bắt đầu, L* thiết lập bảng quan sát S, E, T và bảng rỗng được minh họa trong
Hình 3.4 bằng cách thiết lập tập S và E là tập rỗng {}, với  thể hiện chuỗi rỗng.
Bảng quan sát S, E, T được cập nhật bằng cách tạo truy vấn thành viên đến bộ
huấn luyện Teacher, nghĩa là   L(A
w
)?, ack

L(A
w
)?, và send

L(A
w
)?.
in


out



ii
i
Input LTS as M
1


in

ack

send


0
1
2

send
ack

out


a
b
c

Output LTS as

M

2

p LTS as the property

17



Bảng quan sát sau khi cập nhật được thể hiện trong Hình 3.4 chưa phải là bảng
đóng bởi dòng out trong S. không khớp với dòng nào trong S. Để tạo ra bảng đóng,
out phải được thêm vào S. Bảng quan sát S, E, T sau khi thêm out vào S được minh
họa trong Hình 3.5 Bảng quan sát lại tiếp tục được cập nhật bằng cách tạo truy vấn
thành viên tới Teacher, nghĩa là out ack

L(A
w
)?, out out

L(A
w
)?, và out send


L(A
w
)?.

Hình 3.4 Bảng quan sát rỗng và bảng quan sát sau khi cập nhật

Hình 3.5: Bảng sau khi thêm out vào S, bảng đó sau khi cập nhật và giả thiết ứng cử

viên A
1
Bộ huấn luyện Teacher sử dụng LTS an toàn A
1
như một ứng giả thuyết cử viên
cho luật ghép nối. Teacher áp dụng hai bước của luật ghép nối và phân tích phản ví dụ
để trả lời cho dự đoán từ giải thuật học L*
Bước 1 đầu tiên được áp dụng để kiểm tra công thức A
1
 Input p bằng cách
tính toán hệ thống ghép nối A
1
|| Input || p
err
. Dễ dàng kiểm tra được rằng trạng thái lỗi
 tới được trong hệ thống ghép nối này, nên Teacher sẽ trả giá trị false và một phản ví
dụ cex= in send ack in. Teacher cho biết rằng giải thuật học L* trả lời A
1
là không
chính xác và cung cấp cex

= send ack để chứng minh cho câu trả lời.
Phản ví dụ cex= in send ack in được phân tích bởi L* để tìm hậu tố e của cex
để chứng minh cho sự khác nhau giữa L(A
1
) và U = L(A
w
). Trong trường hợp này L*
phân tích và gán e = ack. Để sinh ra một giả thiết ứng cử viên tiếp theo, bảng đóng S,
E, T được thể hiện trong hình 3.6 được cập nhật bằng cách thêm hậu tố e= ack vào tập

×