Cấu trúc Never claim

Một phần của tài liệu Kiểm chứng tính đúng đắn hệ thống tính toán của chương trình bằng kiểm duyệt mô hình (Trang 44)

4. Cấu trúc luận văn

2.2.4.Cấu trúc Never claim

Có những tính chất mà ta mong muốn nó không bao giờ được xuất hiện trong hệ thống. Trong Promela nó được biểu diễn bởi never claim.

Ví dụ 2.30

#define A (divisor > 0) never { /* !([] a) */ T0_init:

if

:: (! ((A))) -> goto accept_all :: (1) -> goto T0_init

fi;

accept_all: skip }

Ở ví dụ 2.30 hệ thống cần thỏa mãn rằng biến divisor luôn phải lớn hơn 0, do vậy trường hợp ngược lại không bao giờ được xảy ra hay !(a) luôn phải nhận giá trị false.

Nhãn T0_init đảm bảo trong khi chương trình được chạy (và sinh ra các trạng thái), cho đến khi nào A còn đúng, lệnh goto thứ hai luôn luôn được chọn và Spin sẽ liên tục kiểm tra A.

Khi thuật toán của chúng ta là đúng và chương trình không chứa lỗi, Spin sẽ kết thúc sau khi sinh ra tất cả các trạng thái và thông báo không có trạng thái nào vi phạm được tìm thấy.

Nhưng nếu chương trình tính toán đến một trạng thái mà ở đó A sai (divisor

nhỏ hơn hoặc bằng 0) lệnh goto thứ nhất sẽ được thực hiện, Spin nhảy tới nhãn

accept_all và kết thúc chương trình.

Trong Spin ta chỉ cần biểu diễn tính chất của hệ thống dưới dạng một biểu thức LTL sau đó đưa vào Spin, Spin sẽ tự động chuyển biểu thức LTL sang cấu trúc never claim của Promela dùng vào việc kiểm chứng.

Biểu thức LTL được lưu lại trong tệp .prp có tên trùng với tên chương trình. Đoạn mã never claim được Spin lưu lại trong tệp .ltl.

CHƯƠNG 3: ỨNG DỤNG

Trong chương này sẽ xây dựng biến và tiến trình đồng hồ để thiết lập và đo thời gian, mô tả hệ thống báo động, báo cháy, mô hình hóa hệ thống đó bằng ngôn ngữ Promela sau đó sử dụng kỹ thuật kiểm duyệt mô hình kết hợp với tiến trình đồng hồ xây dựng được để kiểm chứng tính đúng đắn hệ thống báo động, báo cháy qua công cụ kiểm chứng Spin.

Một phần của tài liệu Kiểm chứng tính đúng đắn hệ thống tính toán của chương trình bằng kiểm duyệt mô hình (Trang 44)