5 Thực nghiệm
4.2 Cấu trúc thành phần chuyển đổi từ FSP sang LF
FSP Compiler. Các thành phần trong dữ liệu đầu vào sẽ được chuyển đổi từ danh
sách các hàm chuyển trạng thái sang kiểu dữ liệu LF bởi Thuật toán 4.1.
Danh sách list_transitions gồm các phần tử có định dạng là (start_state,
list_sub_trans). Trong đó, start_state là trạng thái ban đầu, list_sub_trans là danh sách các tiến trình con. Tiến trình con này được định nghĩa bởi một nhãn và một trạng thái kết thúc –stop_state. Tương ứng với mỗi tiến trình con, ta thu
được một phần tử gồm ba thành phần: (start_state, label, stop_state). Phần tử
này chính là một hàm chuyển trạng thái. Phần tử khởi tạo là trạng thái bắt đầu
của hàm dịch chuyển đầu tiên trong danh sách list_transitions. Danh sách các
trạng tháil_statesđược xác định tại các dòng 3, 4 và 8, 9 của thuật toán. Tại các bước này, một trạng thái xuất hiện sẽ được kiểm tra. Nếu trạng thái này là trạng
thái mới thì nó được thêm vào danh sách l_states. Các hàm chuyển trạng thái
được thêm vào danh sáchl_transtại dịng 7 trong Thuật tốn 4.1.
FSP M biểu diễn một kênh truyền tin được đặc tả như Hình 4.3.
S0 = (ack2,ack1→ S0 | snd1→ S1 | snd2→ S2), S1 = (snd2,snd1,out1,ack2→S0), S2 = (snd2,snd1,out2,ack1→S0). Hình 4.3: FSP M.
Dựa vào việc phân tích từ vựng và phân tích cú pháp của M ta thu được list_transitions chứa các phần tử có kiểu là (start_state, list_sub_trans).
Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS
Thuật toán 4.1Thuật toán chuyển đổi FSP sang LF.
Đầu vào: list_transitions là danh sách các tiến trình con.
Đầu ra: listing_form là kiểu dữ liệu LF.
1: Khởi tạo l_states = empty, l_trans = empty, init_state = null {l_ states là danh sách rỗng chứa các trạng thái, l_ trans là danh sách rỗng chứa các hàm chuyển trạng thái, init_state là trạng thái khởi tạo}
2: for all(start_state, list_sub_trans) in list_transitionsdo
3: ifl_states.exists(start_state) = falsethen
4: l_states.add(start_state) {thêm phần tử start_state vào danh sách l_states}
5: end if
6: for all(label, stop _state) in list_sub_transdo
7: l_trans.add((start_state, label, stop_state)) {thêm phần tử (start_state, la- bel, stop_state) vào danh sách l_trans}
8: ifl_states.exists(stop_state) = falsethen
9: l_states.add(stop_state) {thêm phần tử stop_state vào danh sách
l_states}
10: end if
11: end for
12: end for
13: (init, tail) = list_transitions.head() {lấy phần tử đầu danh sách
list_transitions}
14: init_state = init {gán init_state bằng init}
15: return new listing_form(init_state, l_states, l_trans) {trả về một đối tượng listing_form}
Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS Đầu vào: Danh sách list_transitions có các phần tử: [ (S0, [("ack2, ack1", S0), ("sdn1", S1), ("sdn2", S2)]), (S1, [("sdn2, sdn1, out1, ack2", S0)]), (S2, [("sdn2, sdn1, out2, ack1", S0)]) ] Các bước thực hiện: 1: Bước 1:
2: Khởi tạo các biến:
3: l_states = empty: là danh sách rỗng chứa các trạng thái
4: l_trans = empty: là danh sách rỗng chứa các hàm dịch chuyển
5: init_state = null: là trạng thái khởi tạo 6: Bước 2:
7: Duyệt danh sách list_transitions
8: Phần tử (S0, [("ack2, ack1", S0), ("sdn1", S1), ("sdn2", S2)]): 9: Thêm S0 và l_states
10: Gán list_sub_trans = [("ack2, ack1", S0), ("sdn1", S1), ("sdn2", S2)] 11: Duyệt danh sách list_sub_trans
12: Phần tử ("ack2, ack1", S0)
13: Thêm phần tử (S0, "ack2, ack1", S0) và l_trans
14: Tương tự đối với 2 phần tử ("sdn1", S1) và ("sdn2", S2) 15: Tương tự với 2 phần tử (S1, [("sdn2, sdn1, out1, ack2", S0)])
và (S2, [("sdn2, sdn1, out2, ack1", S0)]) 16: Bước 3:
17: Gán (init, tail) = List.hd (list_transitions)⇒init = S0 18: Gán init_state = S0
19: Bước 4:
Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS
4.1.2 Thiết kế
Mơ hìnhFSP Compiler được mơ tả bởi Hình 4.4. Trong mơ hình 4.4 có 3 thành
phần chính là:Lexical Analyzer,ParservàTransitions Generator.FSP Compilersẽ có chức năng xử lý dữ liệu FSP đầu vào qua các bước phân tích từ vựng, phân tích cú pháp và sinh các chuyển trạng thái để đưa ra một danh sách cáctransitions.
Hình 4.4: Mơ hình FSP Compiler.
Bước phân tích từ vựng được thực hiện bởi thành phần Lexical Analyzer
dưới sự hỗ trợ của Ocamllex. Lexical Analyzer cho kết quả đầu ra là các tokens.
Các tokens là dữ liệu đầu vào của thành phần Parser. Bước phân tích cú pháp
được thực hiện bởi thành phầnParser.Parsersử dụngOcamlyaccđể hỗ trợ công
việc này. Parser sinh ra cây cú pháp tương ứng với dữ liệu FSP đầu vào. Cây
cú pháp được xử lý bởi thành phần Transitions Generator để sinh ra danh sách
chuyển trạng tháitransitions. Thành phần Transitions Generatorđược cài đặt dựa trên Thuật toán 4.1.
4.1.3 Phân tích đánh giá
Thuật tốn 4.1 có tính dừng. Tham số đầu vào của Thuật tốn 4.1 là một danh sáchlist_transitions. FSP là một máy hữu hạn trạng thái nên list_transitions là một danh sách hữu hạn phần tử. Thuật tốn 4.1 sẽ kết thúc khi tồn bộ phần tử củalist_transitionsđược duyệt.
Phương pháp chuyển đổi từ FSP sang LF đã đặc tả và xử lý hồn chỉnh đặc tả của ngơn ngữ FSP. Tuy nhiên, phương pháp này chưa được kiểm thử để đánh
giá lỗi. Nhưng với sự hỗ trợ của công cụLTSA, chúng ta có thể so sánh được kết
Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS
4.2 Chuyển đổi LF sang FSP
4.2.1 Ý tưởng
Hệ thống sẽ cài đặt một thành phần được gọi là LF2FSP. Thành phần này có
chức năng chuyển đổi dữ liệu từ LF sang FSP. Bài toán chuyển đổi từ LF sang FSP được mơ tả như Hình 4.5.
Hình 4.5: Cấu trúc thành phần chuyển đổi từ LF sang FSP.
AGTool sinh ra giả định dưới dạng LF và được thành phần LF2FSPxử lý.
Kết quả đầu ra của thành phầnLF2FSPlà dữ liệu FSP. Thành phần LF2FSPcài
Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS
Thuật toán 4.2Thuật toán chuyển đổi LF sang FSP.
Đầu vào: list_transitions là danh sách các hàm chuyển trạng thái, list_states là danh sách các trạng thái.
Đầu ra: fsp_str là chuỗi kí tự biểu diễn một FSP.
1: Khởi tạo fsp_str = null, count = 0, i = 0, tmp = empty
2: {khởi tạo xâu fsp_str rỗng, khởi tạo biến đếm count và i bằng 0, khởi tạo xâu tmp rỗng}
3: for allstate in list_statesdo
4: count := 0
5: tmp := null
6: for all(start_state, transition_label, stop_state) in list_transitionsdo
7: {Phương thức ReplaceCharInString dùng để thay thế một kí tự trong một
xâu bằng kí tự khác}
8: {Phương thức GetStopState dùng để kiểm tra xem một trạng thái có phải
là trạng thái kết thúc hay không?}
9: ifstart_state = state then
10: ifcount = 0then
11: tmp := tmp + (String.Uppercase start_state) + " = ({" + ReplaceCharIn- String transition_label ’=’ ’_’) + "} -> " + (GetStopState list_transitions stop_state)
12: else
13: tmp := tmp + "\n | {" + ReplaceCharInString transition_label ’=’ ’_’) + "} -> " + (GetStopState list_transitions stop_state)
14: end if 15: count++ 16: end if 17: end for 18: ifcount > 0then 19: i++ 20: ifi > 1then 21: fsp_str := fsp_str + ",\n" + tmp + ")" 22: else 23: fsp_str := fsp_str + tmp + ")" 24: end if 25: end if 26: end for 27: fsp_str fsp_str + ".\n"; 28: return fsp_str
Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS
Danh sáchlist_transitionsbao gồm các phần tử có định dạng là (start_state, transition_label, stop_state). Tại dịng 11 của Thuật tốn 4.2 sẽ tìm ra các hàm
chuyển có cùng trạng thái bắt đầu startstates. Nếu biến đếm count = 0 thì tạo
mới một tiến trình con cho FSP. Ngược lại, tiến trình con sẽ được thêm vào FSP trước đó. Tại các dịng từ 20 đến 27, Thuật toán 4.2 xác định một tiến trình có phải là tiến trình bắt đầu của FSP hay khơng? Và FSP sẽ được thêm kí hiệu kết thúc vào cuối tại dòng 29.
Đầu vào:
Danh sách list_transitions: [(S0, "in", S1), (S1, "send", S2), (S2, "ack", S0)] Danh sách list_states: [S0, S1, S2]
Các bước thực hiện: 1: Bước 1:
2: Khởi tạo các biến:
3: fsp_str = null: là xâu rỗng
4: tmp = empty: là xâu rỗng
5: count = 0, i = 0: là các biến đếm 6: Bước 2:
7: Duyệt danh sách list_states 8: Gán count = 0, tmp = null 9: Phần tử S0:
10: Duyệt danh sách list_transitions 11: Phần tử (S0, in, S1): 12: count = 0 13: tmp = "S0 = (in -> S1" 14: count = 1 15: Phần tử (S1, send, S2): 16: S0 != S1 -> bỏ qua 17: Phần tử (S2, ack, S0): 18: S0 != S1 -> bỏ qua 19: (count = 1) > 0 -> i = 1
Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS
20: fsp_tmp = "S0 = ({in} -> S1)"
21: Tương tự đối với 2 phần tử S1 và S2, ta được:
22: fsp_tmp = "S0 = ({in} -> S1), S1 = ({send} -> S2),S2 = ({ack} -> S0)" 23: Bước 3:
24: Trả về chuỗi fsp_tmp biểu diễn một FSP
4.2.2 Phân tích đánh giá
Thuật tốn 4.2 có tính dừng. Điều này có nghĩa là thuật tốn kết thúc sau một khoảng hữu hạn thời gian thực thi. Tham số đầu vào của Thuật toán 4.2 là hai
danh sách list_transitions và list_states. Trong Thuật tốn 4.2, chương trình sẽ
dừng khi duyệt hết tồn bộlist_transitionsvàlist_states. Các danh sách này đều là danh sách hữu hạn phần tử.
Luận văn đã trình bày phương pháp chuyển từ LF sang FSP. Tuy nhiên, kết quả thu được chưa được tối ưu hóa và phương pháp này chỉ mới được sinh ra FSP ở dưới dạng đơn giản nhất. Để giải quyết được bài toán này, cần phải dựa vào đặc tả và cú pháp của FSP. Sau đó cải tiến Thuật tốn 4.2 để thu được xâu biểu diễn FSP được tối ưu hóa tốt hơn.
Chương 5
Thực nghiệm
5.1 Cài đặt chương trình
Chương trình được cài đặt dựa trên phần nhân của AGTool. Dựa vào đó, luận văn sẽ cài đặt các thành phần có chức năng chuyển đổi giữa các phương pháp biểu diễn của LTS. Trong quá trình nghiên cứu và phát triển chương trình, các thành phần này được kết hợp với cơng trình khóa luận tốt nghiệp của sinh viên Vũ Hồng Long [9] để cài đặt một chương trình GUI-AGTool có giao diện người dùng trên Ubuntu. Luận văn cũng đã tích hợp với LTSA thơng qua một cầu nối để hỗ trợ chuyển đổi từ FSP sang LF. GUI-AGTool được cài đặt bằng ngôn ngữ
OCaml và các thành phần mới sử dụng công cụocamllex và ocamlyacc để đọc,
phân tích tập tin dữ liệu đầu vào. Ocamllex là bộ sinh dùng để sinh ra chương trình phân tích đốn nhận các mẫu từ vựng trong tập tin đầu vào. Các biểu thức chính quy và các luật được đặc tả trong tập tin từ vựng.Ocamllexsẽ sinh ra tập tin mã nguồn OCaml dựa vào tập tin đặc tả này. Tập tin mã nguồn được sinh ra
sẽ định nghĩa các hàm xử lý từ vựng [15].Ocamlyacc là bộ sinh dùng để sinh ra
chương trình phân tích cú pháp của tập tin đầu vào [16]. Chương trình OCaml sẽ có chức năng phân tích cú pháp cho tập tin dữ liệu đầu vào.
5.2 Giới thiệu về chương trình
Chương trình GUI-AGTool đã được cài đặt và cung cấp miễn phí tại địa chỉ 1.
Chương trình u cầu cài đặt các gói thư viện sau: • OCaml 3.12 được cung cấp tại địa chỉ2.
1http://uet.vnu.edu.vn/~hungpn/GUI-AGTool/
Chương 5.Thực nghiệm
• LablGTK dành cho mơi trường OCaml được cung cấp tại địa chỉ3.
• Cairo-Ocaml được cung cấp tại địa chỉ4.
Chương trình có các chức năng hỗ trợ người dùng nhập/xuất dữ liệu và hiển thị dưới dạng biểu đồ trực quan. Hình 5.1 là giao diện chính của chương trình GUI-AGTool.
Hình 5.1: Giao diện chính của GUI-AGTool.
Các chức năng được cài đặt ở trong cơng cụ GUI-AGTool như sau:
• OpenFSPcó chức năng mở một tập tin đặc tả bằng ngôn ngữ FSP.OpenListing cho phép mở một tập tin đặc tả dưới dạng liệt kê. Sau khi mở tập tin thành công, GUI-AGTool tự động vẽ ra các thành phần được đặc tả trong tập tin dưới dạng biểu đồ trực quan.
• SaveWorking có chức năng lưu lại công việc đang thực hiện. Thông tin về các thành phần sẽ được đặc tả bằng ngôn ngữ FSP và được lưu lại vào tập tin để có thể sử dụng lâu dài.
3http://www.math.nagoya-u.ac.jp/~garrigue/soft/olabl/lablgtk.html
Chương 5.Thực nghiệm
• GenerateAssumption có chức sinh ra giả định của hệ thống đã được đặc tả. Phần xử lý bên dưới đã được cài đặt bởi [7]. Chức năng này sẽ hiển thị kết quả dưới dạng biểu đồ trực quan. Giả định sinh ra bởi GUI-AGTool được
hiển thị bởi biểu đồ trực quan đặt trong thẻ Assumption. Hình 5.2 là một ví
dụ cho giả định được sinh ra bởi GUI-AGTool.
Hình 5.2: Giao diện thể hiện giả định sinh ra bởi GUI-AGTool.
• Chức năng Save ở trong thẻ Assumption cho phép lưu giả định dưới dạng
tập tin được đặc tả bởi ngôn ngữ FSP.
5.3 Thực nghiệm
Luận văn đã tiến hành thực nghiệm với chín mẫu đầu vào đặc trưng. Kết quả thu được thõa mãn yêu cầu khi so sánh với cơng cụ LTSA. Các ví dụ đầu vào và kết quả có thể tải tại địa chỉ5. Thơng tin của chín mẫu thử nghiệm được mơ tả ở Bảng 5.1.M1,M2 là các thành phần của hệ thống.Plà thuộc tính của hệ thống.
Chương 5.Thực nghiệm
Luận văn trình bày một ví dụ minh họa về khả năng sử dụng ngôn ngữ FSP làm dữ liệu đầu vào của GUI-AGTool mà luận văn đã tiến hành thực nghiệm.
Ví dụ này có chứa các phép tốnif .. then, whencủa FSP. Các thành phần đầu
vào được biểu diễn bằng FSP như trong Hình 5.3. Chương trình GUI-AGTool xử
lý dữ liệu FSP và biểu diễn các thành phần của M1, M2, P dưới dạng các biểu
đồ trực quan. Hình 5.4 tương ứng với thành phần M1. Hình 5.5 tương ứng với
thành phần M2. Hình 5.6 tương ứng với thành phần thuộc tính P. Luận văn đã
sử dụng công cụ LTSA để kiểm chứng lại kết quả của GUI-AGTool và thu được kết quả tương ứng. Kết quả giữa 2 cơng cụ GUI-AGTool và LTSA hồn tồn khớp với nhau và đáp ứng được yêu cầu của luận văn. Hình 5.7 tương ứng với thành
phần M1 sinh ra bởi LTSA. Hình 5.8 tương ứng với thành phần M2 sinh ra bởi
LTSA. Hình 5.9 tương ứng với thành phần thuộc tínhPsinh ra bởi LTSA.
Bảng 5.1: Bảng kích cỡ số trạng thái các mẫu đầu vào
Tên tập tin đầu vào M1 M2 P
AP1_INPUT_P 1 3 3 AP2_INPUT_P 2 3 3 AP3_INPUT_P 3 3 3 AP4_INPUT_P 5 5 3 INPUT_OUTPUT_P 4 3 3 Mod_1_two_channel/A_INPUT_P 3 3 3 Mod_1_two_channel/Input_Output_p 6 5 4 Mod_2_two_channel/A_INPUT_P 5 5 4 complex_test 6 5 4
M1 = (a[i:1..3] ->ifi==1thenSTOPelseM1). M2 = M2[0],
M2[i:0..2] = (wheni<3 a -> M2[i+1]), M2[3] = STOP.
P = (a[i:0..3] -> (wheni==0 x -> STOP |wheni!=0 y -> P)). ||CS = (M1 || M2 || P).
Chương 5.Thực nghiệm
Hình 5.4: LTS của thành phầnM1.
Hình 5.5: LTS của thành phầnM2.
Chương 5.Thực nghiệm
Hình 5.7: LTS của thành phầnM1sinh ra bởi LTSA.
Hình 5.8: LTS của thành phầnM2sinh ra bởi LTSA.
Chương 5.Thực nghiệm
5.4 Đánh giá thực nghiệm
Luận văn đã sử dụng công cụ AGTool, LTSA để kiểm tra và so sánh kết quả của GUI-AGTool khi tiến hành thực nghiệm với các mẫu dữ liệu ở Bảng 5.1. Thực nghiệm đã thu được kết quả đúng như mong đợi. Xét về mặt ngữ nghĩa của LTS, các FSP được sinh ra đều khớp với dữ liệu dạng liệt kê tương ứng của nó. Giả định thu được ở dạng FSP tương ứng với kết quả thu được bởi cơng cụ AGTool. Kết quả này có ý nghĩa trong việc chứng minh rằng phương pháp mà luận văn đưa ra là đúng đắn. FSP được sinh ra bởi GUI-AGTool được sử dụng lại bởi LTSA có ý nghĩa quan trọng. Đặc tả của hệ thống và giả định sinh ra bởi GUI-AGTool có thể được kiểm chứng bởi cơng cụ LTSA thông qua việc sử dụng lại đặc tả của nhau.
Chương 6 Kết luận
Luận văn tập trung nghiên cứu công cụ AGTool hỗ trợ kiểm chứng dựa thành phần. Bằng phương pháp kiểm chứng dựa thành phần, thay vì kiểm chứng trên tồn bộ hệ thống thì các thành phần của hệ thống sẽ được kiểm chứng một các riêng biệt. Để thực hiện được phương pháp này, cơng cụ AGTool có nhiệm vụ hỗ trợ sinh ra giả định của hệ thống. Dựa trên những hiểu biết về cơng cụ này, luận văn nhận ra rằng AGTool cịn có nhiều hạn chế cần được cải tiến. Nhằm