Kiểu mtype

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 25)

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

2.1.3.3.Kiểu mtype

Giả sử ta muốn dùng một kí hiệu cho một số, ta có thể sử dụng macro define khai báo tại đầu chương trình – tương tự như ngôn ngữ C:

#define N 10

mtype là một kiểu được sử dụng với chức năng tương tự define. Ví dụ 2.12:

mtype light = green; active proctype P(){ do

::if

:: light == red -> light = green :: light == yellow -> light = red :: light == green -> light = yellow fi;

printf("The light is now %e\n", light) od

}

Một vài kết quả của lệnh printf là: The light is now yellow The light is now red The light is now green

2.1.4. Định danh, hằng, và biểu thức

Định danh có thể là một chữ cái, một ký tự, một dấu chấm hay dấu gạch dưới.

Hằng số là một chuỗi ký tự đại diện cho số nguyên, số thập phân,… Ví dụ 2.13: định nghĩa hằng Max có giá trị 999

# define Max 999

Biểu thức: Một biểu thức được xây dựng từ các biến, hằng số và sử dụng các toán tử được liệt kê trong bảng 2.2.

Bảng 2.2: Các toán tử trong Promela [1]

Toán tử Tên

! phủ định

++, -- Tăng, giảm

*, /, % Nhân, chia, modul

+, - Cộng, trừ

<<, >> phép dịch trái bit, dịch phải bit <, <=, >, >= Toán tử quan hệ

==, != Bẳng, khác

& Bitwise và

&& Và

|| hoặc

^ Bitwise xor

( -> : ) biểu thức có điều kiện

= phép gán

[ ] chỉ số mảng

2.1.5. Tiến trình

2.1.5.1. Tiến trình process (adsbygoogle = window.adsbygoogle || []).push({});

Một tiến trình process được khai báo bắt đầu bởi từ khóa proctype và chứa:  Tên tiến trình.

 Danh sách tham số hình thức.  Khai báo biến cục bộ.

 Thân tiến trình.

Cú pháp khai báo tiến trình:

proctype name_process (/*danh sách tham số hình thức*/) {

/* Khai báo cục bộ và các câu lệnh*/ }

2.1.5.2. Tiến trình init

Bất kỳ một chương trình Promela nào đều phải có một tiến trình init, nó giống như hàm main() trong C. Việc thực hiện chương trình Promela bắt đầu từ tiến trình init.

Một tiến trình init có dạng:

init {/* Các khai báo biến cục bộ và các câu lệnh*/}

Ví dụ 2.14: chương trình Promela đơn giản nhất

init {skip;}

/*Trong tiến trình trên không có biểu thức nào*/

Một tiến trình process được khai báo qua từ khóa proctype, việc cài đặt và thực thi tiến trình được thực hiện qua tiến trình init.

Ví dụ 2.15: proctype hello() { printf(“Hello”); } proctype word() { printf(“Word”);

} init {

run hello(); run word(); }

Trong ví dụ 2.15, ban đầu tạo hai tiến trinh hello()word(), hai tiến trình này được thực hiện sau khi tiến trình init được thực hiện. Toán tử run chỉ có thể hoạt động khi các tiến trình có thể được thực hiện. Một tiến trình có thể bị khóa nếu có quá nhiều tiến trình cùng thực hiện.

2.1.5.3. Active proctype

Ta có thể định nghĩa lại hai tiến trình hello()word() trong ví dụ 2.15 qua ví dụ 2.16.

Ví dụ 2.16:

active proctype hello() {

printf(“Hello”); }

active proctype word {

printf(“Word”); }

Từ khóa active có thể là tiền tố của bất kỳ khai báo tiến trình tiến trình nào. Tác dụng của active là tạo sự kết hợp của tiến trình (được khai báo bởi từ khóa proctype) với việc khởi tạo.

Nhiều trường hợp việc khai báo tiến trình sử dụng từ khóa active giống như khai báo proctye bằng cách dùng mảng có hậu tố tùy chọn theo sau từ khóa

active.

Ví dụ 2.17:

active[4] proctype hello() { (adsbygoogle = window.adsbygoogle || []).push({});

printf(“Hello”); }

active[6] proctype word() {

printf(“Word”); }

Trong ví dụ 2.17 sẽ tạo ra 4 trường hợp của tiến trình hello và 6 trường hợp của tiến trình word.

2.1.6. Run và atomic

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 25)