Ta mô tả cho việc chứng minh inv1(S,I,J) = true với mọi trạng thái S và tiến trình I, J nhƣ sau: nhận thấy rằng A implies B = (A and B) xor (A xor true), do vậy A implies B = false chỉ khi A=true va B=false
- Đầu tiên là kiểm chứng cho trạng thái init
= ( ( l1=cs and l2=cs ) implies i=j) = (false implies i=j)
= true
Mô tả trong CafeOBJ nhƣ sau: --> init
open INV
red inv1(init,i,j) . -->
close
- Tiếp theo ta giả sử inv1(s,i,j)= true
- Ta chứng minh cho inv1(s', i, j) = true với s' là trạng thái đạt đƣợc với 3 hành động: want, try, exit
a) s'=want(s,k)
pc(s',i) = pc (want(s,k),i); pc(s',j) = pc (want(s,k),j) Từ trên ta thấy sẽ phân rã thành các trƣờng hợp:
o Trƣờng hợp c - want (s,k), k = i, k = j (1) o Trƣờng hợp c - want (s,k), k = i, k# j (2) o Trƣờng hợp c - want (s,k), k # i, k=j (3) o Trƣờng hợp c - want (s,k), k # i, k # j (4) o Trƣờng hợp ~ c - want (s,k) (5) Với trƣờng hợp (1) ta thấy
inv1(s',i,j) = (pc(s',i) = cs and pc(s',j) = cs implies i=j) inv1(s',i,j) = (l2=cs and l2=cs implies i=j )
= false implies i=j = true
Hình 4.1. Kiểm chứng inv1 với trƣờng hợp (1).
Sau khi thực hiện nhƣ trên (hình 4.1) kết quả trả về là true, vậy trƣờng hợp này thỏa mãn.
Với trƣờng hợp (2), (3), (4) tham chiếu trong phần phụ lục 1 Với trƣờng hợp (5) (~c-want(s,k)) chúng ta nhận thấy inv1(s',i,j) = (pc(s',i) = cs and pc(s',j) = cs implies i=j) = (pc(s,i) = cs and pc(s,j) = cs implies i=j)
= inv1(s,i,j) = true.
Viết dƣới ngôn ngữ CafeOBJ nhƣ hình 4.2 sau:
Hình 4.2. Kiểm chứng inv1 với trƣờng hợp (5). -> ~c-want(s,k) open ISTEP -- arbitrary objects op k : -> Pid . -- assumptions eq c-want(s,k) = false . -- successor state eq s' = want(s,k) .
-- check if the predicate is true. red istep1(i,j) . close --> c-want(s,k), i = k, j = k open ISTEP -- arbitrary objects op k : -> Pid . -- assumptions -- eq c-want(s,k) = true . eq pc(s,k) = l1 . -- eq i = k . eq j = k . -- successor state eq s' = want(s,k) .
-- check if the predicate is true. red istep1(i,j) .
Sau khi thực hiện nhƣ trên (hình 4.2) kết quả trả về là true, vậy trƣờng hợp này thỏa mãn.
b) s'=try(s,k)
Cũng tƣơng tự nhƣ want phân rã thành các trƣờng hợp nhƣng chúng ta sẽ chỉ quan tâm đến các trƣờng hợp làm cho inv1(s',i,j) không đạt đƣợc true ngay, còn các trƣờng hợp đạt true tham chiếu trong phụ lục 1
Trƣờng hợp c-try(s,k), i = k, ~(j = k) (*) -- inv2(s,j)
inv1(s',i,j) = (true and pc(s,j) = cs implies i=j) = (pc(s,j) = cs) implies false
Nhận thấy inv1(s',i,j) = false nếu pc(s,j) = cs là true, do vậy ta phải tìm bổ đề để chỉ ra pc(s,j)=cs là false dƣới các giả thiết (*):
c- try(s,k) có nghĩa là pc(s,k) = l2 và top(queue(s)) = some(k); i = k; ~(j =k) Nhận thấy một bổ đề đúng đắn: eq inv2(s,j) = pc(s,j) = cs implies top (queue(s))= some(j). Mà giả thiết top(queue(s)) = some(k), k<>j nên top (queue(s)) =some(j) là false; do vậy pc(s,j) = cs là false. Viết dƣới ngôn ngữ CafeOBJ nhƣ hình 4.3 sau:
Hình 4.3. Kiểm chứng inv1 với trƣờng hợp (*). c) s'=exit(s,k)
Chứng minh tƣơng tự nhƣ trƣờng hợp want. --> c-try(s,k), i = k, ~(j = k) open ISTEP -- arbitrary objects op k : -> Pid . -- assumptions -- eq c-try(s,k) = true . eq pc(s,k) = l2 . eq top(queue(s)) = some(k) . -- eq i = k . eq (j = k) = false . -- successor state eq s' = try(s,k) .
-- check if the predicate is true. red inv2(s,j) implies istep1(i,j) . close
4.2.2 Chứng minh inv2(S,I)
Ta mô tả cho việc chứng minh inv2(S,I) = true với mọi trạng thái S và tiến trình I nhƣ sau:
- Đầu tiên là kiểm chứng cho trạng thái init
inv2(init,i) = ( pc(init,i) = cs implies top (queue(init)) = some(i) ) = ( ( l1=cs implies none =some(i))
= (false implies false) = true
Mô tả trong CafeOBJ nhƣ sau: --> init
open INV
red inv2(init,i) . -->
Close
- Tiếp theo ta giả sử inv2(s,i)= true
- Ta chứng minh cho inv2(s', i) = true với s' là trạng thái đạt đƣợc với 3 hành động: want, try, exit
a) s' = want(s,k)
inv2(s',i) = (pc(s',i) = cs implies top (queue(s')) = some(i) ) Nhận xét: pc(s',i) = pc (want(s,k),i);
top ( queue(want(s,k))) = some(k) nếu queue(s) = empty = some (k2) nếu queue(s)= k2,q
Do vậy sẽ phân rã thành các trƣờng hợp nhƣ sau: --> c-want(s,k), i = k
--> c-want(s,k), ~(i = k), queue(s) = empty --> c-want(s,k), ~(i = k), queue(s) = k2,q --> ~c-want(s,k)
Chi tiết chứng minh trong phụ lục 2 b) s' = try(s,k)
--> c-try(s,k), i = k --> c-try(s,k), ~(i = k) --> ~c-try(s,k)
c) s' = exit(s,k)
Chỉ xét trƣờng hợp không đạt đƣợc true ngay mà phải thêm bổ đề
--> c-exit(s,k), ~(i = k) -- inv1(s,i,k)
c-exit(s,k) có nghĩa là pc(s,k) = cs
inv2 (s',i) = (pc(s',i) = cs implies top(queue(s')) = some(i)) pc(s', i) = pc (exit(s,k),i) = pc(s,i) do k<>i
top (queue (s')) = top (queue (exit (s,k))) = top (get (queue(s)))
Do vậy inv2 (s',i) = ( pc(s,i) = cs implies top(get(queue(s))) = some(i)).
inv2(s',i) = false nếu pc(s,i) = cs là true và top(get(queue(s))) = some(i)) là false với giả thiết là pc(s,k) = cs và ~(i = k). Từ đây nếu chỉ ra đƣợc pc(s,i) = cs là false thì không cần quan tâm đến top(get(queue(s))) = some(i)) nữa. Ta sử dụng bổ đề
eq inv1(s,i,k) = (pc(s,i) = cs and pc (s,k) = cs implies i=k ).
Do giả thiết pc(s,k) = cs là true và i<>k nên inv1(s,i,k) = (pc (s,i) = cs implies false ) nên pc (s,i) = cs phải là false. Viết dƣới ngôn ngữ CafeOBJ nhƣ hình 4.4 sau:
Hình 4.4. Kiểm chứng inv2 với trƣờng hợp c-exit, ~(i = k). --> c-exit(s,k), ~(i = k) open ISTEP -- arbitrary objects op k : -> Pid . -- assumptions -- eq c-exit(s,k) = true . eq pc(s,k) = cs . -- eq (i = k) = false . -- successor state eq s' = exit(s,k) .
-- check if the predicate is true. red inv1(s,i,k) implies istep2(i) . close
4.2.3 Chứng minh inv3(S,I)
Ta mô tả cho việc chứng minh inv3(S,I) = true với mọi trạng thái S và tiến trình I nhƣ sau:
- Đầu tiên là kiểm chứng cho trạng thái init
inv3(init,i) = ( i \in queue(init) implies (pc(init,i) = l2 or pc(init,i) = cs ) ) = ( i \in empty implies (l1 = l2 or l1 = cs ) )
= (false implies (false or false) ) = true.
Mô tả trong CafeOBJ nhƣ sau: --> init
open INV
red inv3(init,i) . -->
close
- Tiếp theo ta giả sử inv3(s,i)= true
- Ta chứng minh cho inv3(s', i) = true với s' là trạng thái đạt đƣợc với 3 hành động: want, try, exit
a) s' = want(s,k) phân rã thành các trƣờng hợp nhƣ sau: --> c-want(s,k), i = k
--> c-want(s,k), ~(i = k), i \in queue(s)
--> c-want(s,k), ~(i = k), ~(i \in queue(s))
-- queue-lemma1(queue(s),i,k)
c-want(s,k) có nghĩa là pc(s,k) = l1
inv3(s',i) = (i \in queue(s') implies ( pc (s',i) = l2 or pc (s',i) = cs)) i \in queue(s') = i \in queue(want(s,k)) = i \in put(queue(s),k)
pc(s',i) = pc(want(s,k),i) = pc(s,i) do i<>k
Do vậy inv3(s',i) = (i \in put(queue(s),k) implies ( pc (s,i) = l2 or pc (s, i) = cs))
Sử dụng bổ đề
Và giả thiết i<>k, ~(i \in queue(s)) ta đƣợc i \in put(queue(s),k) là false. Từ đó inv3(s',i) = ( false implies ( pc (s,i) = l2 or pc (s, i) = cs)) = true.
Viết dƣới dạng ngôn ngữ CafeOBJ nhƣ hình 4.5 sau:
Hình 4.5. Kiểm chứng inv3 với trƣờng hợp c-want(s,k), ~(i = k), ~(i \in queue(s)).
--> ~c-want(s,k)
b) s' = try(s,k) phân rã thành các trƣờng hợp nhƣ sau: --> c-try(s,k), i = k
--> c-try(s,k), ~(i = k) --> ~c-try(s,k)
c) s' = exit(s,k) phân rã thành các trƣờng hợp nhƣ sau:
--> c-exit(s,k), i = k
-- inv2(s,i) and inv4(s,i)
inv3(s',i) = (i \in queue(s') implies ( pc (s',i) = l2 or pc (s',i) = cs)) i \in queue(s') = i \in queue(exit(s,k)) = i \in get(queue(s))
pc(s',i) = pc(exit(s,k),i) = l1 do i=k
inv3(s',i) = i \in get(queue(s)) implies false
Công việc là phải chỉ ra i \in get(queue(s),k) là false với giả thiết c-exit(s,k) có open ISTEP -- arbitrary objects op k : -> Pid . -- assumptions -- eq c-want(s,k) = true . eq pc(s,k) = l1 . -- eq (i = k) = false .
eq i \in queue(s) = false . -- successor state
eq s' = want(s,k) .
-- check if the predicate is true.
red queue-lemma1(queue(s),i,k) implies istep3(i) . close
nghĩa là pc(s,k) = cs và i=k. Sử dụng hai bổ đề
eq inv2(s,i)= pc(s,i) = cs implies top(queue(s)) = some(i) .
eq inv4(s,i) = (top(queue(s)) = some(i) implies not (i \in get(queue(s)))) . Và giả thiết ở trên pc(s,k) = cs và i=k cho ta pc(s,i) = cs,
vì vậy top(queue(s)) = some(i) là true, suy ra not (i \in get(queue(s))) là true, suy ra i \in get(queue(s)) là false. Viết dƣới dạng ngôn ngữ CafeOBJ
nhƣ hình 4.6 sau:
Hình 4.6. Kiểm chứng inv3 với c-exit(s,k), i=k.
--> c-exit(s,k), ~(i = k), i \in queue(s)
--> c-exit(s,k), ~(i = k), ~(i \in queue(s)) -- queue-lemma2(queue(s),i)
inv3(s',i) = (i \in queue(s') implies ( pc (s',i) = l2 or pc (s',i) = cs)) i \in queue(s') = i \in queue(exit(s,k)) = i \in get(queue(s))
pc(s',i) = pc(exit(s,k),i) = pc(s,i) do i<> k
inv3(s',i) = (i \in get(queue(s)) implies pc(s,i) = l2 or pc(s,i) = cs ) Sử dụng bổ đề
eq queue-lemma2(queue(s),i) = (i \in get(queue(s)) implies i \in queue(s)) . Và giả thiết ~(i \in queue(s)) ta suy ra ~ (i \in get(queue(s)).
--> c-exit(s,k), i = k open ISTEP -- arbitrary objects op k : -> Pid . -- assumptions -- eq c-exit(s,k) = true . eq pc(s,k) = cs . -- eq i = k . -- successor state eq s' = exit(s,k) .
-- check if the predicate is true.
red (inv2(s,i) and inv4(s,i)) implies istep3(i) . close
Vậy suy ra inv3(s',i,j) = (false implies pc(s,i) = l2 or pc(s,i) = cs ) = true. Viết dƣới dạng ngôn ngữ CafeOBJ nhƣ hình 4.7 sau:
Hình 4.7. Kiểm chứng inv3 với c-exit(s,k), ~(i = k), ~(i \in queue(s)). --> ~c-exit(s,k)
4.2.4 Chứng minh inv4(S,I)
Ta mô tả cho việc chứng minh inv4(S,I) = true với mọi trạng thái S và tiến trình I nhƣ sau:
inv4(s,i) = (top(queue(s)) = some(i) implies not (i \in get (queue(s)))) - queue(s) = empty
top(queue(s)) = top(empty) = none; get(queue(s)) = get(empty) = empty Do vậy inv4(s,i) = ( none=some(i) implies not(i \in empty))
= false implies true = true
- queue(s) = x,q
inv4(s,i)=(top(queue(s)) = some(i) implies not (i \in get (queue(s)))) top(queue(s)) = top(x,q) = some(x)
get(queue(s)) = get(x,q) = q
--> c-exit(s,k), ~(i = k), ~(i \in queue(s)) open ISTEP -- arbitrary objects op k : -> Pid . -- assumptions -- eq c-exit(s,k) = true . eq pc(s,k) = cs . -- eq (i = k) = false .
eq i \in queue(s) = false . -- successor state
eq s' = exit(s,k) .
-- check if the predicate is true.
red queue-lemma2(queue(s),i) implies istep3(i) . close
Do vậy inv4(s,i) = (some(x) = some(i) implies not ( i \in q))
Phân rã tiếp thành 2 trƣờng hợp là ~(i = x)và (i = x)
+ ~(i = x)
some(x) = some(i) là false. Do vậy inv4(s,i) = true.
+ (i = x)
Khi đó some(x) = some(i) là true, nếu not(i \in get (queue(s))) = true thì trƣờng hợp này không thỏa mãn. Do get(queue(s)) = q nên i \in get(queue(s)) = i \in q
Xét bổ đề eq inv5(s,i) = not (i \in del(queue(s),i)).
Nhận thấy del(queue(s),i)=del((x,q),i)= q (do i = x), nên inv5(s,i) = not ( i \in q) mô tả trong CafeOBJ nhƣ hình 4.8 sau:
Hình 4.8. Chứng minh inv4 với trƣờng hợp queue(s) = x,q, i = x.
4.2.5 Chứng minh inv5(S,I)
Ta mô tả cho việc chứng minh inv5(S,I) = true với mọi trạng thái S và tiến trình I nhƣ sau:
- Đầu tiên là kiểm chứng cho trạng thái init
inv5(init,i) = not (i \in del(queue(init),i)) = not ( i \in del (empty,i)) = not (i \in empty) = true --> queue(s) = x,q, i = x open INV -- arbitrary objects op s : -> Sys . op x : -> Pid . op q : -> Queue . -- assumptions eq queue(s) = x,q . eq i = x . -- check
red inv5(s,i) implies inv4(s,i) . close
Mô tả trong CafeOBJ nhƣ sau: --> init open INV red inv5(init,i) . --> close
- Tiếp theo ta giả sử inv5(s,i)= true
- Ta chứng minh cho inv5(s', i) = true với s' là trạng thái đạt đƣợc với 3 hành động: want, try, exit
a) s' = want(s,k) phân rã thành các trƣờng hợp nhƣ sau: --> c-want(s,k), queue(s) = empty, i = k
--> c-want(s,k), queue(s) = empty, ~(i = k)
--> c-want(s,k), queue(s) = x,q, i = k
-- inv3(s,i) and queue-lemma3(queue(s),i)
inv5(s',i) = ((k \in (if (x = k) then put(q,k) else (x, del(put(q,k),k)) fi)) xor true)
inv3(s,i) = (i \in queue(s) implies (pc(s,i) = l2 or pc(s,i) = cs))
queue-lemma3(queue(s),i) = i \in del (put(queue(s),i),i) iff i \in queue(s) Do c-want(s,k) và k=i nên pc(s,i)=l1, từ inv3 ta thấy vế phải của inv3=false, nên
i\in queue(s) = false
từ queue-lemma3 ta suy ra i \in del(put(queue(s),i),i)=false
Nhận thấy:
i \in del (put(queue(s),i),i)= (k \in (if (x= k) then put(q,k) else (x ,del(put(q,k),k)fi))
Cho nên
inv5(s',i) = ((k \in (if (x = k) then put(q,k) else (x, del(put(q,k),k)) fi)) xor true) = false xor true
= true
Hình 4.9. Chứng minh inv5 với trƣờng hợp c-want(s,k), queue(s) = x,q, i = k.
--> c-want(s,k), queue(s) = x,q, ~(i = k), x = i, i \in q
--> c-want(s,k), queue(s) = x,q, ~(i = k), x = i, ~(i \in q)
--queue-lemma1(q,i,k)
inv5(s',i) = ((i \in put(q,k)) xor true)
Từ bổ đề : eq queue-lemma1(Q,X,Y) = (X \in put(Q,Y) iff (X = Y or X \in Q)) . Ta suy ra queue-lemma1(q,i,k) = i \in put (q,k) iff (i=k or i \in q)
Do cả hai điều kiện i=k và i \in q đều false nên i \in put(q,k) = false Do vậy inv5(s',i) = false xor true = true .
Mô tả trong CafeOBJ nhƣ hình 4.10 sau: --> c-want(s,k), queue(s) = x,q, i = k open ISTEP -- arbitrary objects op k : -> Pid . op x : -> Pid . op q : -> Queue . -- assumptions -- eq c-want(s,k) = true . eq pc(s,k) = l1 . -- eq queue(s) = x,q . eq i = k . -- successor state eq s' = want(s,k) .
-- check if the predicate is true.
red (inv3(s,i)and queue-lemma3(queue(s),i)) implies inv5(s',i) . close
Hình 4.10. Chứng minh inv5 với trƣờng hợp c-want(s,k), queue(s) = x,q, ~(i = k), x = i, ~(i \in q).
--> ~c-want(s,k)
b) s' = try(s,k) phân rã thành các trƣờng hợp nhƣ sau: --> c-try(s,k)
--> ~c-try(s,k)
c) s' = exit(s,k) phân rã thành các trƣờng hợp nhƣ sau: --> c-exit(s,k), i = k, queue(s) = empty
--> c-exit(s,k), i = k, queue(s) = x,q, x = k, k \in q
--> c-exit(s,k), i = k, queue(s) = x,q, x = k, ~(k \in q)
-- queue-lemma5(q,i)
inv5(s',i) = ((k \in del(q,k)) xor true)
Từ bổ đề: eq queue-lemma5(Q,X) = not (X \in del(Q,X) .
Ta suy ra: queue-lemma5(q,i) = not (i \in del(q,i)) =not (k \in del(q,k)) Mô tả trong CafeOBJ nhƣ hình 4.11 sau:
--> c-want(s,k), queue(s) = x,q, ~(i = k), x = i, ~(i \in q) open ISTEP -- arbitrary objects op k : -> Pid . op x : -> Pid . op q : -> Queue . -- assumptions -- eq c-want(s,k) = true . eq pc(s,k) = l1 . -- eq queue(s) = x,q . eq (i = k) = false . eq x = i . eq i \in q = false . -- successor state eq s' = want(s,k) .
-- check if the predicate is true. red inv5(s',i) .
red queue-lemma1(q,i,k) implies istep5(i) . close
Hình 4.11. Chứng minh inv5 với trƣờng hợp c-exit(s,k), i = k, queue(s) = x,q, x = k, ~(k \in q).
--> c-exit(s,k), i = k, queue(s) = x,q, ~(x = k) --> c-exit(s,k), ~(i = k), queue(s) = empty
--> c-exit(s,k), ~(i = k), queue(s) = x,q, x = i
-- queue-lemma5(q,i)
Nhận xét: inv5(s',i) = ((i \in del(q,i)) xor true)
Từ bổ đề: eq queue-lemma5(Q,X) = not (X \in del(Q,X) Ta suy ra: queue-lemma5(q,i) = not (i \in del(q,i)).
Mô tả trong CafeOBJ nhƣ hình 4.12 sau:
--> c-exit(s,k), i = k, queue(s) = x,q, x = k, ~(k \in q) open ISTEP -- arbitrary objects op k : -> Pid . op x : -> Pid . op q : -> Queue . -- assumptions -- eq c-exit(s,k) = true . eq pc(s,k) = cs . -- eq i = k . eq queue(s) = x,q . eq x = k . eq k \in q = false . -- successor state eq s' = exit(s,k) .
-- check if the predicate is true.
red queue-lemma5(q,i) implies istep5(i) . close
Hình 4.12. Chứng minh inv5 với trƣờng hợp c-exit(s,k), ~(i = k), queue(s) = x,q, x = i.
--> c-exit(s,k), ~(i = k), queue(s) = x,q, ~(x = i) --> ~c-exit(s,k)
--> c-exit(s,k), ~(i = k), queue(s) = x,q, x = i open ISTEP -- arbitrary objects op k : -> Pid . op x : -> Pid . op q : -> Queue . -- assumptions -- eq c-exit(s,k) = true . eq pc(s,k) = cs . -- eq (i = k) = false . eq queue(s) = x,q . eq x = i . -- successor state eq s' = exit(s,k) .
-- check if the predicate is true.
red queue-lemma5(q,i) implies istep5(i) . close
CHƢƠNG5 KẾTLUẬN
Từ quá trình tìm hiểu luận văn nhận thấy đặc tả và kiểm chứng một hệ thống là một công việc rất khó và quan trọng, có 2 kĩ thuật để kiểm chứng phần mềm là chứng minh tự động (Theorem Proving) và kiểm chứng mô hình (Model Checking), khác với kiểm chứng mô hình, chứng minh tự động có thể kiểm chứng các hệ thống với mô hình là vô hạn trạng thái; cafeOBJ là một ngôn ngữ hỗ trợ đặc tả và kiểm chứng theo tƣ tƣởng của chứng minh tự động, là ngôn ngữ bán tự động có sự tham gia của con ngƣời trong quá trình kiểm thử. Ƣu điểm của kiểm chứng bán tự động là có thể kiểm chứng với không gian trạng thái là vô hạn.
Luận văn đã trình bày tổng quan về phƣơng pháp đặc tả phần mềm sử dụng ngôn ngữ đại số CafeOBJ bao gồm: cấu trúc các thành phần của mô đun trong ba phần chính. Phần thứ nhất, imports chỉ rõ các mô đun phải đƣợc khai báo trong mô đun hiện thời, hay là sự thừa kế các mô đun đã triển khai đƣợc khai báo trong mô đun hiện thời. Có ba dạng của việc thừa kế các mô đun:
protecting (thừa kế các mô đun nhƣng không thể thay đổi chúng), extending
(thừa kế các mô đun có thể mở rộng chúng, nhƣng những mô tả ban đầu còn lại không đƣợc thay đổi) và using (thừa kế các mô đun có thể mở rộng hoặc thay đổi sự mô tả ban đầu). Phần thứ hai, signature, khai báo các kiểu (sorts), các kiểu con (subsorts), và các toán tử (operators) đƣợc sử dụng trông mô đun. Và cuối cùng, axioms bao gồm sự khai báo của các biến, các phƣơng trình (equations), các sự dịch chuyển (transitions), và các biểu thức thể hiện hành vi của mô đun.
Tiếp theo luận văn trình bày về phƣơng pháp chứng minh tự động sử dụng tƣ tƣởng qui nạp toán học để kiểm chứng các thuộc tính bất biến (invariant property). Với phƣơng pháp này, để chứng minh một thuộc tính bất biến, chúng ta cần chứng minh nó đúng tại trạng thái khởi tạo của hệ thống. Giả sử thuộc tính đúng tại một trạng thái bất kỳ s, chúng ta phải chứng minh nó đúng với mọi trạng thái tiếp theo của s.
Sau đó áp dụng những kiến thức đã tìm hiểu để kiểm chứng 04 thuộc tính của hệ thống đa tác tử. Trong hệ thống này, các tác tử chia sẻ một tài nguyên dùng
chung. Số lƣợng tác tử trong hệ thống là vô hạn vì vậy không gian trang thái là vô hạn. Với hệ thống này, chúng ta không thể áp dụng các phƣơng pháp kiểm chứng mô hình, việc xử lý kiểm chứng bằng cách quy nạp là hiệu quả. Kết quả kiểm chứng cho thấy hệ thống đa tác tử thỏa mãn các thuộc tính cần kiểm tra tại mọi trạng thái của hệ thống.
Cho một mô hình hệ thống vô hạn trạng thái, sẽ có rất nhiều trƣờng hợp cho ra kết quả với giá trị không phải là “true”. Những trƣờng hợp này sẽ trả về giá trị “true” với một vài bổ đề (lemmas). Việc tìm kiếm các bổ đề và chứng minh chúng là rất khó và cũng là việc thú vị.
Để đảm bảo tính đúng đắn của mô hình cafeOBJ sử dụng kiểm chứng bằng phƣơng pháp tìm kiếm (searching) trạng thái, cố gắng tìm ra một trạng thái mà hệ thống đạt giá trị false và một ý tƣởng khác áp dụng phƣơng pháp đã đƣợc đề xuất trong [10].
TÀILIỆUTHAMKHẢO Tiếng Việt
[1] Phạm Ngọc Thắng (2010), Đặc tả và kiểm chứng phần mềm sử dụng