Bài giảng Kiểm chứng tính đúng đắn của chương trình
• Cĩ thể p dụng kiểm chứng hình thức đối với:
– Cc cấu trc trình tự
– Cc cấu trc điều kiện
– Cc cấu trc vịng lặp
• Mỗi pht biểu cĩ:
– Một tiền điều kiện
– Một hậu điều kiện
• Mỗi thủ tục cĩ:
– Một tiền điều kiện
– Một hậu điều kiện
38 trang |
Chia sẻ: huongthu9 | Lượt xem: 528 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Kiểm chứng tính đúng đắn của chương trình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nguyên lý và phương pháp lập trình
Kiểm chứng tính đúng đắn của
chương trình
TS. Nguyễn Tuấn ðăng
1
Nội dung
• Lập trình cĩ cấu trúc
• Các phương pháp hình thức
• Lập trình cĩ cấu trúc theo tiếp cận top-down
• Cách tiếp cận kết hợp
• Các cấu trúc trình tự (sequences)
– Các cấu trúc trình tự – hình thức hĩa
– Các cấu trúc trình tự – kiểm chứng
– Các cấu trúc trình tự – sơ đồ kiểm chứng
• Các cấu trúc điều kiện
– Các cấu trúc điều kiện – hình thức hĩa
– Các cấu trúc điều kiện – kiểm chứng
– Các cấu trúc điều kiện – sơ đồ kiểm chứng
2
Nội dung (tt)
• Các cấu trúc vịng lặp
– Các cấu trúc vịng lặp – ví dụ
– Các cấu trúc vịng lặp – chương trình dẫn xuất
– Các cấu trúc vịng lặp – kết quả
– Các cấu trúc vịng lặp – sơ đồ kiểm chứng
– Các cấu trúc vịng lặp – các lỗi trong kiểm chứng
• Tĩm lược
3
Lập trình cĩ cấu trúc
• Chương trình sử dụng các cấu trúc điều khiển căn
bản theo nguyên tắc 1-in, 1-out :
– Cấu trúc trình tự : begin S1 S2 end
– Cấu trúc chọn lựa : if E then S1 else S2 end
– Cấu trúc vịng lặp : while E loop S1 end
– Các cấu trúc điều khiển trên cịn bao gồm thêm : if với
elseif, case, for, etc.
• Boehm và Jacopini, 1966
– Chứng minh rằng cấu trúc điều khiển của bất kỳ một
lược đồ chương trình nào cũng cĩ thể được biểu đạt mà
khơng cần dùng các phát biểu gotos, chỉ cần dùng các
cấu trúc: trình tự, chọn lựa và vịng lặp.
4
Lập trình cĩ cấu trúc
• Edsger Dijkstra, 1970
– Lý luận rằng các phát biểu goto là cĩ hại trong chương
trình, đồng thời đưa ra ý tưởng về việc kiểm chứng tính
đúng đắn của chương trình bằng các phương pháp hình
thức.
5
Các phương pháp hình thức
• Dựa trên ý tưởng rằng các chương trình là những
đối tượng tốn học
– Một chương trình “hữu hạn” (ie. cĩ tính dừng) là biểu
diễn của một hàm, hàm này ánh xạ các trạng thái nào
đĩ của bộ nhớ (các trạng thái bắt đầu) đến các trạng thái
khác của bộ nhớ (các trạng thái kết thúc).
– Một chương trình “vơ hạn” (ie. khơng dừng) cĩ thể
được diễn đạt như một module “hữu hạn” (ie. cĩ tính
dừng) trong một vịng lặp vơ hạn.
6
Các phương pháp hình thức (tt)
• Tony Hoare, 1969
– Viết một bài báo tựa đề: “An Axiomatic Basis for
Computer Programming”. Bài báo này mơ tả sự dẫn
xuất của mã chương trình từ các tiên đề, theo cách đĩ
thì tính đúng đắn của chương trình cĩ thể chứng minh
một cách hình thức.
• Harlan Mills, 1987
– Phát triển kỹ thuật “Cleanroom Software Engineering”
dựa trên các phương pháp hình thức để kiểm tra tính
đúng đắn của chương trình.
7
Các phương pháp hình thức (tt)
• Ưu điểm:
– Cung cấp một phương pháp cĩ thể kiểm chứng được để
khai triển các đặc tả thành chương trình
– Dựa trên các kỹ thuật tốn học hình thức
– Cách hiệu quả để kiểm chứng tính đúng đắn của
chương trình
– ðược hỗ trợ bằng một số ngơn ngữ hình thức (Z, VDM-
SL, REFINE), các hệ thống kiểm tra-kiểm chứng.
• Nhược điểm:
– Một số các khái niệm của phương pháp này đơi khi cịn
chưa rõ
–
8
Lập trình cĩ cấu trúc theo tiếp cận
top-down
• Phương pháp
– Lập trình bằng cách mịn hĩa từng bước
– Dùng các cấu trúc điều khiển dạng 1-in/1-out
– Các kỹ thuật kiểm chứng
• Bắt đầu với:
– Một phát biểu chưa được mịn hĩa
– Một đặc tả hình thức của phát biểu
9
Lập trình cĩ cấu trúc theo
tiếp cận top-down (tt)
• Mịn hĩa từng bước các phát biểu để đạt được kết
quả là thay thế chúng (nếu cĩ) bằng:
– Các cấu trúc trình tự
– Các cấu trúc điều kiện
– Các cấu trúc lặp
– Các phát biểu thực thi (gán, gọi hàm)
• Kiểm tra tính đúng đắn ở mỗi bước
10
Hướng tiếp cận kết hợp
• Xây dựng chương trình bằng lập trình cĩ cấu trúc
theo cách tiếp cận top-down
• Mịn hĩa chương trình bằng cách sử dụng các biến
đổi bảo tồn ngữ nghĩa (Semantics-Preserving
Transformations - SPTs)
11
Hướng tiếp cận kết hợp
P P P is a function defined by
(a) an informal comment
(b) a formal specification
X and Y are functions
top-down refinement
continues until only
begin
X
Y
end
begin
X Y
executable code remains if Q
then R
else S
end
while B
loop M
end
end
Q R S B M
SPT
executable code (use
compiler, interpreter,
or prototyping tool)
optimized code in
target language
12
Các cấu trúc trình tự
1. Vấn đề: làm mịn phát biểu sau
[ F: let x = y * | z | ]
2. Bước 1: Thay F bằng các phát biểu
sau
[ G: let k = | z | ]
F
[ H: let x = y * k ]
3. Phương pháp thay F bằng cấu trúc
trình tự:
– Chọn G
G
H
13
Các cấu trúc trình tự (tt)
– Chọn H sao cho
(a) H được xây dựng trên cơ sở G và
H phải tương đương với F
– Kiểm tra (a)
F
14
G
H
Các cấu trúc trình tự – Hình thức hĩa
4. Hình thức hĩa: thay thế mỗi phát biểu bằng một
đặc tả hình thức với các tiên đề P, Q, và R:
formal spec PDL
[ F: let x = y * | z | ]{P} F {R}
[ G: let k = | z | ]
[ H: let x = y * k ]
{P} G {Q}
{Q} H {R}
where P = (x, y, z are integers)
Q = (P and K is integer and k = |z|)
R = (P and x = y * |z|)
15
Các cấu trúc trình tự – Hình thức hĩa
(tt)
• {P}F{R} cĩ nghĩa:
“Nếu P đúng trước khi F được thực hiện, thì R
sẽ đúng sau khi F được thực hiện.”
• P được gọi là tiền điều kiện (precondition) của
F
• R được gọi là hậu điều kiện (postcondition) của
F
16
Các cấu trúc trình tự – Kiểm chứng
5. Giả sử G và H đã được kiểm chứng đúng, nghĩa
là:
{P} G {Q} and {Q} H {R}
6. Thì F đúng, vì
{P} F {R}
7. Bước (6) được suy ra từ bước (5) bằng qui tắc
kiểm chứng:
{P} G {Q}, {Q} H {R}
{P} G H {R}
17
Các cấu trúc trình tự – Sơ đồ kiểm
chứng
G
P
Q
H
R
Proof rule for sequences
{P} G {Q}, {Q} H {R}
{P} G H {R}
18
GT F
Các cấu trúc điều kiện
1. Vấn đề: mịn hĩa phát biểu
sau
[ G: let k = | z | ]
2. Bước 2: Thay thế G với cấu
trúc điều kiện
DC
B
G: if z < 0 [test B]
then [ C: let k = -z ]
else [ D: let k = z ]
end
19
GT F
Các cấu trúc điều kiện
3. Phương pháp thay thế G
bằng một cấu trúc điều kiện:
– Chọn điều kiện B
– Chọn C và D sao cho
(a) C thực hiện G khi B đúng
DC
B
(b) D thực hiện G khi B sai
– Kiểm tra (a) và (b)
20
Các cấu trúc điều kiện – Hình thức
hĩa
4. Các đặc tả hình thức cho G, C, D:
formal spec PDL
[ G: let k = | z | ]
G: if z < 0 [test b]{P} G {Q}
{P and B} C {Q}
{P and not B} D {Q}
where P = (x, y, z are integers)
B = (z < 0)
Q = (P and k is integer and k = |z|)
then [C: let k = -z]
else [D: let k = z]
end
21
Các cấu trúc điều kiện – Hình thức
hĩa (tt)
5. Nếu C và D đúng, G được kiểm chứng bằng qui
tắc:
{P and B} C {Q}, {P and not B} D {Q}
{P} if B then C else D end {Q}
22
Các cấu trúc điều kiện – Kiểm chứng
6. Bước mịn hĩa cuối cùng: thay C, D, và H bằng
các phát biểu (của ngơn ngữ lập trình) thỏa mãn
đặc tả:
G: if z < 0 [kiểm tra B]
then C: k := -z
else D: k := z
end
H: x := y * k
23
Các cấu trúc điều kiện – Kiểm chứng
(tt)
7. Kiểm chứng tính đúng đắn:
{P and B} C {Q} [định nghĩa phát biểu gán]
{P and not B}D{Q} [định nghĩa phát biểu gán]
{P} G {Q} [Qui tắc kiểm chứng cho
các cấu trúc điều kiện]
{Q} H {R} [định nghĩa phát biểu gán]
{P} F {R} [Qui tắc kiểm chứng cho
các cấu trúc trình tự]
24
Các cấu trúc điều kiện – Kiểm chứng
(tt)
8. Áp dụng các biến đổi bảo tồn ngữ nghĩa, nhận
được:
if z < 0 then z := -z end
x := y * z
25
Các cấu trúc điều kiện – Sơ đồ kiểm
chứng
DC
B
false
P
true
P and not B
Qui tắc kiểm chứng cho các điều kiện:
{P and B} C {Q}, {P and not B} D {Q}
{P} if B then C else D end {Q}
Q
26
Các cấu trúc vịng lặp
1. Dạng tổng quát cho vịng lặp while :
formal spec PDL
{P} F {R}
{P} G {Q}
{Q and B} H {Q}
[F: ... function]
[G: ... initialization]
while B
loop [H: ... body]
end
27
Các cấu trúc vịng lặp (tiếp theo)
2. Qui tắc kiểm chứng cho vịng lặp while:
{P} G {Q}, {Q and B} H {Q}
{P} G; while B loop H end {Q and not B}
3. Phương pháp thay thế F bằng cấu trúc vịng lặp
while:
– Chọn Q (bất biến vịng lặp) và B (điều kiện vịng lặp)
sao cho (Q and not B) bao hàm R
– Chọn G và H sao cho
(a) G làm cho Q đúng
(b) B cĩ thể sai (để vịng lặp kết thúc)
(c) thực hiện H khi B và Q đúng
– Kiểm tra (a), (b), và (c)
28
Các cấu trúc vịng lặp – Ví dụ
4. Vấn đề: mịn hĩa phát biểu
[F: Tìm phần tử nhỏ nhất a(j) trong dãy các phần tử
a(i..n) của mảng a]
5. ðặc tả hình thức: {P} F {R} trong đĩ
P=(a ∈ integer array and i, n ∈ integer and 1 ≤ i ≤ n ≤
size(a))
R=(P and j ∈ integer and i≤j≤n and a(j)=min(a(i..n)))
6. Giải pháp:
Q=(P and j, k ∈ integer and i≤j≤k≤n and
a(j)=min(a(i..k)))
B=(k<n)
29
a
i
j
k
n
min
of
Các cấu trúc vịng lặp – Ví dụ
7. Kiểm tra:
(Q and not B) bao hàm k=n
∴ (Q and not B) bao hàm R
a
i
j
k
n
min
of
30
Các cấu trúc vịng lặp – Chương trình
dẫn xuất
[ P: 1 ≤ i ≤ n ≤ size(a) ]
G: j := i
k := i
[ Q: P and i ≤ j ≤ k ≤ n
and a(j)=min(a(i..k)) ]
while k < n [test B]
loop [ L1: Q and B ]
H: k := k + 1 [để B cĩ thể sai]
[ L2: P and a(j)=min(a(i..k-1)) ] [để Q đúng]
if a(j) > a(k)
then [ T1: L2 and a(k) < a(j) ]
31
Các cấu trúc vịng lặp – Chương trình
dẫn xuất (tt)
j := k
[ T2: a(j)=min(a(i..k)) ]
else [ F1: a(j) ≤ a(k) ]
end
end
[ R: Q and not B ]
32
Các cấu trúc vịng lặp – Kết quả
proc f (a [array], i, n [integers] )
descr [f(a, i, n) = j where a(j) = min(a(i..n))]
local j, k [integers]
pre [1 ≤ i ≤ n ≤ size(a) ]
post [1 ≤ i ≤ j ≤ n ≤ size(a) and
a(j)=min(a(i..n)) ]
begin if not (1<=i and i<=n and n<= size(a))
then write("input error") return nil
end
j := i
k := i
while k < n
33
Các cấu trúc vịng lặp – Kết quả (tt)
loop [loop invariant: a(j)=min(a(i..k))
and 1 ≤ i ≤ j ≤ k ≤ n ≤ size(a) ]
k := k + 1
if a(j) > a(k)
then j := k
end
end
return j
end
34
Các cấu trúc vịng lặp – Sơ đồ kiểm
chứng
G
B false
Q
Q and not B
P
Q
Qui tắc kiểm tra cho vịng lặp while là :
{P} G {Q}, {Q and B} H {Q}
{P} G; while B loop H end {Q and not B}
H
true
R
Q and B
35
Các cấu trúc vịng lặp – Các lỗi trong
kiểm chứng
• Các lỗi phổ biến trong việc kiểm chứng tính đúng
đắn của chương trình:
– Khơng xác định đúng bất biến vịng lặp Q. Một
bất biến vịng lặp là một khẳng định khơng thay
đổi, chẳng hạn như Q đúng:
• Trước khi thực hiện vịng lặp
• Sau mỗi bước của vịng lặp
• Sau khi kết thúc vịng lặp
– Khơng kiểm tra xem vịng lặp cĩ kết thúc hay
khơng – trường hợp các vịng lặp vơ hạn
36
Tĩm lược
• Cĩ thể áp dụng kiểm chứng hình thức đối với:
– Các cấu trúc trình tự
– Các cấu trúc điều kiện
– Các cấu trúc vịng lặp
• Mỗi phát biểu cĩ:
– Một tiền điều kiện
– Một hậu điều kiện
• Mỗi thủ tục cĩ:
– Một tiền điều kiện
– Một hậu điều kiện
37
Tĩm lược (tt)
• Mỗi cấu trúc vịng lặp cĩ:
– Một tiền điều kiện
– Một hậu điều kiện
– Một bất biến vịng lặp
38
Các file đính kèm theo tài liệu này:
- bai_giang_kiem_chung_tinh_dung_dan_cua_chuong_trinh.pdf