Yêu cầu an toàn của bếp gas: tỉ lệ của tổng thời gian rò gas không vượt quá một phần hai mươi của một đoạn thời gian quan sát bất kỳ không ngắn hơn một phút.
Yêu cầu an toàn của bếp gas được đặc tả bằng công thức LDI như sau:
1) Gọi l là độ dài đoạn thời gian quan sát, ta có l 60 và l = Leak + NLeak. 2) Theo yêu cầu an toàn thì Leak (1/20) x l.
Từ (1) và (2) ta có công thức LDI đặc tả yêu cầu an toàn của bếp gas: l 60 19 x Leak - NLeak 0.
Chương 3. PHÂN TÍCH, THIẾT KẾ BỘ CÔNG CỤ KIỂM CHỨNG MÔ HÌNH
Mục tiêu của chương này là phân tích, thiết kế và cài đặt một bộ công cụ phần mềm để thực hiện kiểm chứng mô hình hệ thống thời gian thực được đặc tả bằng ôtômat thời gian có thỏa mãn các tính chất mong muốn của hệ thống được đặc tả bằng công thức LDP, LDI hay không.
Một thuật toán kiểm chứng được đưa ra trong [2] gồm các bước:
Từ input đầu vào là lưới các ôtômat, xây dựng ôtômat hợp song song
Từ ôtômat hợp xây dựng đồ thị phân miền.
Từ đồ thị phân miền xây dựng ôtômat trọng số.
Duyệt đồ thị trọng số và trả lời câu hỏi của bài toán
Các phần tiếp theo dưới đây sẽ mô tả cách thức trong chương trình này xây dựng thuật toán cho các bước nói trên.
3.1. Các thuật toán
3.1.1. Thuật toán xây dựng ôtômat hợp song song
Bài toán: Cho một hệ các ôtômat Ai = (Li, l0i, i, Xi, Ii, Ei), i = 1,2,3,… Hãy xây dựng ôtômat hợp song song đạt được từ các ôtômat thành phần Ai.
Ý tưởng thuật toán: thuật toán được xây dựng theo kỹ thuật duyệt đồ thị theo
chiều sâu. Thuật toán gồm 2 hàm, hàm 1 createOtomatParallelFrom2Otomat(A1, A2)
xây dựng ôtômat hợp song song đạt được từ 2 ôtômat bất kỳ, hàm 2
createOtomatParallel() sẽ gọi hàm createOtomatParallelFrom2Otomat(A1, A2) để tạo
ra một ôtômat hợp song song đạt được từ n > 1 ôtômat thành phần.
Hàm createOtomatParallelFrom2Otomat(A1, A2) xây dựng ôtômat hợp song
song đạt được từ 2 ôtômat bất kỳ A1, A2 được xây dựng theo kỹ thuật duyệt đồ thị theo chiều sâu đồng thời đối với 2 ôtômat như sau:
Bước 1: Ban đầu khởi tạo các thành phần của ôtômat hợp song song A = (L, l0,
, X, I, E) như sau: L = , E = , I = , = , X = X1 X2, l0 = {l01, l02}.
Bước 2: Xuất phát từ tập các đỉnh xuất phát của ôtômat thành phần A1, A2: l0 = {l01, l02}, và khi đó ta có L = { l0}.
Bước 3: Với mỗi đỉnh li = {li1, li2} L, nếu tồn tại phép chuyển ei= < li,i,ai,λi, li’>. Nếu ei là phép chuyển đồng bộ (tức ei E1 và ei E2) thì li’ = {li’1, li’2} thỏa mãn 2 điều kiện I(li’) = I(li’1) I(li’2) ≠ và i= i1∩ i2 ≠ . Nếu ei là phép chuyển cục bộ (tức hoặc ei E1 hoặc ei E2) thì li’ = {li’1, li2} (hoặc li’ = {li1, li’2}), I(li’) = I(li’1) (hoặc I(li’) = I(li’2)) và i= i1(hoặc i= i2).
Khi đó nếu li’ L thì thêm li’ vào L, nếu phép chuyển ei E thì thêm ei vào E. và ưu tiên phép chuyển đồng bộ trước. Tức là nếu ailà nhãn (hành động) đồng bộ thì phải thực hiện phép chuyển đồng bộ.
Bước 4: Thuật toán dừng khi không còn đỉnh mới để di chuyển nữa.
Để cài đặt thuật toán này ta sử dụng một ngăn xếp S để lưu lại đường đi, mỗi phần tử S gồm 2 thành phần:
1) Thành phần 1: Tên vị trí x và tập Ax các đỉnh kề của đỉnh x trong của ôtômat A1 chưa được thăm bởi đỉnh {x, y} của ôtômat A.
2) Thành phần 2: Tên vị trí y và tập Ay các đỉnh kề của đỉnh y trong của ôtômat A2 chưa được thăm bởi đỉnh {x, y} của ôtômat A.
Ví dụ: Ngăn xếp S được thể hiện bằng cấu trúc mảng trong ngôn ngữ lập trình PHP như sau:
$S = array(
i => array( //thông tin đỉnh thứ i+1 trong đường đi x => array(vx1,v x2,…,v xk), //đỉnh x và các đỉnh kề với x y => array(vy1,v y2,…,v yk) //đỉnh y và các đỉnh kề với y ),
);
Các biến toàn cục được sử dụng trong thuật toán gồm có: <x, y> chỉ đỉnh cuối cùng của S, <xnext1, ynext2> chỉ đỉnh tiếp theo sẽ bổ sung vào S, Syschr lưu tập các nhãn đồng bộ của 2 ôtômat A1, A2. Hàm Adj(x, Ai) trả về tập các đỉnh kề của đỉnh x trong ôtômat Ai. Hàm getSyschr(A1, A2) trả về tập các nhãn chuyển đồng bộ. Hàm Push(<x, y>, Adj(x, A1), Adj(y, A2), S) thêm đỉnh <x, y> và tập Ax = Adj(x, A1), Ay = Adj(y, A2) vào cuối S. Hàm getSucc(x, y, xnext1, ynext2, S, Syschr) tìm và trả về đỉnh <x, y> đỉnh cuối trong S và đỉnh tiếp theo <xnext1, ynext2> thêm vào S (lưu ý: mỗi đỉnh <xnext1, ynext2> chỉ xuất hiện 1 lần trong S) đồng thời loại xnext1 khỏi tập Ax
và loại ynext2 khỏi Ay. Hàm pop(S) loại phần tử cuối ra khỏi S. Cuối cùng thuật toán trả về ôtômat hợp song song A của 2 ôtômat A1, A2. Sơ đồ các thuật toán
createOtomatParallelFrom2Otomat(A1, A2) và createOtomatParallel được cho trong
{Input: A1 = (L1, l01, 1, X1, I1, E1), A2 = (L2, l02, 2, X2, I2, E2) {Output: Ôtômat hợp song : A = (L,l0, ,X,I,E)}
Function createOtomatParallelFrom2Otomat(A1, A2): Otomat; begin
//Khởi tạo otomat hợp song song A
L = ; l0 = {l01,l02}; = ; X = X1 X2; I = ; E = ; S = ;
Syschr = getSyschr(A1, A2);
push(<l01,l02>, Adj(l01, A1), Adj(l02, A2), S);
Thêm mới đỉnh < l01,l02> với hệ số LDI là tổng các hệ số LDI của 2 đỉnh l01,l02 và bất biến I(l01) I(l01) vào L;
while S ≠ do begin
getSucc(l1, l2,lnext1,lnext2, S, Syschr); if lnext1 = null hoặc lnext2 = null then begin
pop(S); loop; {quay lui} end;
if I(lnext1) I(lnext2) ≠ then begin
Bổ sung <lnext1,lnext2> với hệ số LDI là tổng các hệ số LDI của 2 đỉnh lnext1,lnext2 và bất biến I(lnext1) I(lnext2) vào L;
end;
if {e = (<l1, l2>, , a, λ, <lnext1,lnext2>) có ≠ } then begin
Bổ sung cung (<l1, l2>,<lnext1,lnext2>) có nhãn a, ràng buộc
và tập các đồng hồ reset λ vào E; end;
if (<lnext1,lnext2> S) then begin
push(<lnext1,lnext2>, Adj(lnext1, A1), Adj(lnext2, A2), S); end;
end; return A; end;
{Input: Ai = (Li, l0i, i, Xi, Ii, Ei), i = 1,2,…, n} {Output: Ôtômat hợp song : A = (L,l0,,X,I,E)} Function createOtomatParallel: Otomat; begin for i = 1 to n do begin if (i == 1) then begin A = createOtomatParallelFrom2Otomat(Ai, Ai+1); end; if (i > 1) then begin A = createOtomatParallelFrom2Otomat(A, Ai+1); end; end; return A; end;
Bảng 3.2: Thuật toán xây dựng ôtômat hợp song song tổng quát 3.1.2. Thuật toán xây dựng đồ thị vùng đạt được nguyên 3.1.2. Thuật toán xây dựng đồ thị vùng đạt được nguyên
Thuật toán xây dựng đồ thị vùng đạt được nguyên được mô tả trong bảng 4.1 ở trang 65 trong Luận án tiến sĩ Toán học của TS. Phạm Hồng Thái như sau.
{input: ôtômat thời gian A}
{output: đồ thị vùng đạt được nguyên RG =(V,E)} Function Integral-Reachability-Graph;
Begin
V = {<s0,π0>}; E = ; while (true) do begin
if mọi đỉnh trong V đã được thăm then exit; lấy v = <s,π> V là đỉnh chưa được thăm; for với mỗi phép chuyển e = (s, φ ,a,λ,s’) do begin
for d =0 to K do begin
if (π + d)[λ := 0] |= I(s’) then loop; π’ =(π + d)[λ := 0];
if <s’,π’> V then bổ sung <s’,π’> vào V; if (<s,π>,<s’,π’>) E then begin
bổ sung e = (<s,π>,<s’,π’>) vào E; if π + d = πK then l(e)=u(e)=d; else begin l(e)=d; u(e)=; end; end ;
end; end;
đánh dấu <s,π> đã được thăm; end ;
End.
Bảng 3.3: Thuật toán xây dựng đồ thị vùng đạt được nguyên
3.1.3. Thuật toán xây dựng đồ thị trọng số G phục vụ kiểm chứng LDI
Ý tưởng: Tư tưởng cơ bản trong xây dựng đồ thị trọng số G là “rời rạc hóa” đồ thị đạt được nguyên RG bằng cách xây dựng mỗi cung (vi,vj,[l,u]) sẽ được thay bằng một họ các đường đi nối vi, vj sao cho độ dài (trọng số) của các đường đi lần lượt là các số nguyên l, l+1, … , u. Tức cung (vi,vj,[l,u]) được cụ thể hóa thành u-l-1 đường đi nối vi, vj thể hiện tính rời rạc hóa được của LDI. Điều này được thực hiện trên giả thiết RG không chứa cung vô hạn.
Thuật toán xây dựng đồ thị trọng số G = (V,E,) từ RG = (V1,E1) (không chứa cung vô hạn) được thực hiện theo các bước sau:
Bước 1: V = V1, E = E1.
Bước 2: Đối với mỗi cung e = (vi,vj,[lij,uij]) tập đỉnh V, cung E và hàm trọng số
: V E R của G được mở rộng thành: 1. V = V { 1, 2,..., uij1 ij ij ij v v v } và (vijk ) = cvi , với k = 0,1,2,…, uij-1 (với qui ước vij0 cho vi và uij
ij
v cho vj),
3. E = E {(vijk,vijk1)|k=0..uij-1}, và (vijk,vijk1) = 1, k = 0..uij-1, 4. E = E {(vijk,vj)|k = lij..uij-1}, và (vijk,vj) = 0, k = lij..uij-1. Chú ý: Trường hợp lij uij đồ thị sẽ có 2 cung từ uij1
ij
v đến vj, một cung có trọng số 1 và cung còn lại có trọng số 0 (xem hình bên dưới). Để đảm bảo G là đồ thị đơn ta sẽ “chia đôi” cung có trọng số 0 thành 2 cung bằng cách thêm đỉnh uij
ij
v và cung này
được thay bằng 2 cung ( uij1
ij
v , uij
ij
v ) và ( uij
ij
v ,vj). Thuật toán này sẽ được cụ thể hóa trong phần cài đặt, xem cài đặt này trong phần Phụ lục A.
Hình sau đây minh họa cho việc xây dựng G từ một đồ thị RG đơn giản với 2 cung.