Đặc tả hàm không tường minh
Download
Report
Transcript Đặc tả hàm không tường minh
Đại học Khoa học Tự nhiên, ĐHQG-HCM
Khoa Công Nghệ Thông Tin
Chương 5 Đặc tả hàm
ThS. Trần Minh Triết
1
36
Soluongnamnhuan (A: N, B: N) kq: N
Pre A>= 0 /\ B >= 0 /\ A <= B
Post
((kq=0) /\ (LaNamNhuan(A)) /\ (A=B))
\/ ((kq=1) /\ (LaNamNhuan(A)) /\ (A=B))
\/ ((kq=1+Soluongnamnhuan(A, B-1)) /\ (LaNamNhuan(B)) /\
(A<B))
\/ ((kq=Soluongnamnhuan(A, B-1)) /\ (LaNamNhuan(B)) /\
(A<B))
2
37
SoluongSNT (A: N, B: N) kq: N
Pre A> 0 /\ B > 0 /\ B > A
Post
((kq=len (X)) /\ (kq < B-A)
/\ ( i (1, …, len(X)) . (X(i) >=A) /\ (X(i) <= B) /\ LaSNT(X(i))
/\ ( y (A, …, B). (y X) => LaSNT(y))
3
40
SoLanXuatHien(X: R, A: R*) kq: N
Pre
Post ((kq=0) /\ (len A =0))
\/ ((kq = SoLanXuatHien(x, tl A) + 1) /\ (hd A = x))
\/ ((kq = SoLanXuatHien(x, tl A)) /\ (hd A x))
SapTang(A: R*) kq: R*
Pre
Post ((card (elems kq) = card (elems A))
/\ ( k elems kq . SoLanXuatHien(k, kq) = SoLanXuatHien(k, A)
/\ (I, j inds kq . I < j => kq(i) < kq (j))
4
TapHop (A: R*) kq: R*
Pre
Post ((kq = [] /\ (len A = 0))
\/ ((kq = kq ⃕ [hd A] ⃕ TapHop (tl A) ) /\ (len A >= 1) /\
Len (kq = 0) \/ ( I inds kq. hd A kq(i))))
\/ ((kq = kq ⃕ TapHop(tlA) /\ (len A >= 1) /\
Len (kq >= 01 \/ ( I inds kq. hd A kq(i))))
5
Nội dung
Đặc tả hàm không tường minh
Đặc tả hàm tường minh
Đặc tả đệ quy và sử dụng hàm phụ
Một số cấu trúc điều khiển
6
Đặc tả hàm không tường minh
Đặc tả hàm không tường minh (implicit definition):
Phát biểu trạng thái hệ thống trước và sau khi thực hiện
hàm
Không cần nêu ra các bước để thực hiện xử lý trong hàm
tên_hàm (thamsố1: Kiểu1, thamsố2: Kiểu2…) kq: Kiểukq
pre
Vị từ pre-condition
post Vị từ post-condition
7
Đặc tả hàm không tường minh
Định nghĩa tên hàm, tên và kiểu của các tham số đầu vào, tên
và kiểu của kết quả trả về
Xác định Vị từ Pre-condition để phát biểu điều kiện về giá trị
của các tham số đầu vào
Xác định Vị từ Post-condition để phát biểu mối quan hệ giữa
các tham số đầu vào với kết quả trả về của hàm
8
Đặc tả hàm không tường minh
Theo cấu trúc chuẩn của đặc tả hàm không tường minh:
Mỗi hàm có tối đa 1 kết quả trả về
Các tham số đầu vào đều là dạng read-only (tham trị)
Vấn đề: Làm cách nào đặc tả hàm cần trả về nhiều nội dung
thông tin?
Giải pháp: Định nghĩa kiểu cấu trúc để chứa tất cả các thành phần
thông tin sẽ trả về (Chương 6)
Giải pháp khác???
9
Đặc tả hàm không tường minh
Ví dụ:
max_of_set (s: ℕ-set)
r: ℕ
pre
s {}
post (r s) (n s n r)
Ví dụ:
abs
(z: ℤ) r: ℕ
pre
true
post ((r = z) (z 0))
((r = -z) (z < 0))
10
Đặc tả hàm không tường minh
Ví dụ: Hàm trả về vị trí xuất hiện đầu tiên của chuỗi pt trong
chuỗi cx, hoặc trả về 0 nếu chuỗi pt không xuất hiện trong cx ?
Thảo luận:?
11
Đặc tả hàm không tường minh
Ví dụ: Hàm kiểm tra s có là chuỗi con của t hay không?
Phiên bản 1:
issubstr (s: String, t: String) r: B
pre
post ( (r = true)
( p, f String t = p ⃕ s ⃕ f ) )
( (r = false) ( p, f String t = p ⃕ s ⃕ f ) )
Phiên bản 1’:
issubstr (s: String, t: String) r: B
pre
post
r = ( p, f String t = p ⃕ s ⃕ f )
12
Đặc tả hàm không tường minh
Ví dụ: Hàm kiểm tra chuỗi p có phải là prefix của chuỗi s
trong chuỗi t hay không?
is-prefix (p: String, s: String, t: String) r: B
pre
post r = ( f String t = p ⃕ s ⃕ f )
Ví dụ: Hàm kiểm tra chuỗi p có phải là prefix ngắn nhất của
chuỗi s trong chuỗi t hay không?
is-shortest-prefix (p: String, s: String, t: String) r: B
pre
post is-prefix (p, s, t)
q String ( is-prefix (q, s, t) len q len p)
13
Đặc tả hàm không tường minh
Ví dụ: Hàm trả về vị trí xuất hiện đầu tiên của chuỗi pt trong
chuỗi cx, hoặc trả về 0 nếu chuỗi pt không xuất hiện trong cx
location (pt: String, cx: String) r: ℕ
pre pt [] cx []
post ( p String is-shortes-prefix(p, pt, cx) r = (1 + len p))
(r = 0)
14
Đặc tả hàm tường minh
Đặc tả hàm tường minh (explicit definition)
Đặc tả có sử dụng các cấu trúc điều khiển
Thể hiện cách cài đặt hàm
Lưu ý:
Trong đặc tả không tường minh, mọi giá trị thỏa Vị từ Postcondition đều có thể được chấp nhận là kết quả phù hợp
của hàm.
Trong đặc tả tường minh xác định một giá trị cụ thể phù
hợp với yêu cầu của hàm
tên-hàm : Tập-nguồn1 Tập-nguồn2 … Tập-đích
tên-hàm (tham-số1, tham-số2, …) ≜
đặc-tả-dạng-giải-thuật
15
Đặc tả hàm tường minh
Lưu ý:
Trong đặc tả dạng tường minh không đặt tên cho biến kết
quả trả về.
Giá trị của kết quả trả về là giá trị được xác định thông qua
đặc tả dạng giải thuật
Các tham số đầu vào (ở dòng 2 của đặc tả) có kiểu tương
ứng với các tập nguồn ở dòng 1
Ví dụ:
add : ℝ ℝ ℝ
add (x, y) ≜
xy
16
Cấu trúc điều khiển if-then-else
Cú pháp:
if
Biểu-thức-điều-kiện
then giá-trị1
else giá-trị2
Cấu trúc if-then-else có thể lồng nhau
17
Cấu trúc điều khiển if-then-else
Ví dụ:
Đặc tả dạng không tường minh
abs
(z: ℤ) r: ℕ
pre
post ((r = z) (z 0))
((r = -z) (z < 0))
max (a: ℤ, b: ℤ) r: ℤ
pre
post ((r = a) (a b))
((r = b) (a < b))
Đặc tả dạng tường minh
abs : ℤ ℕ
abs (z) ≜
if (z<0) then –z else
z
max : ℤ ℤ ℤ
max (a, b) ≜
if (a b) then a else
b
18
Cấu trúc cases
Cú pháp:
cases index:
(
value1, value2
result1,
value3, value4, value5 result2,
…
valuen
resultm
)
19
Cấu trúc cases
Ví dụ: Hàm tính số ngày của 1 tháng trong năm không nhuận
số-ngày-trong-tháng: ℕ ℕ
số-ngày-trong-tháng (th) ≜
cases index:
(
1, 3, 5, 7, 8, 10, 12
31,
4, 6, 9, 11
30,
2
28
)
20
Sử dụng hàm phụ
Ví dụ: Hàm tính số ngày của 1 tháng trong năm bất kỳ
số-ngày-trong-tháng: ℕ ℕ ℕ
số-ngày-trong-tháng (th, nm) ≜
cases index:
(
1, 3, 5, 7, 8, 10, 12
31,
4, 6, 9, 11
30,
2
if là-năm-nhuận(nm)
then 29
else 28
)
21
Sử dụng hàm phụ
Ví dụ: Hàm tính USCLN của 2 số nguyên dương
uscln (x : ℕ1, y : ℕ1) r : ℕ1
pre
post là-usc (r, x, y) n ℕ1 ( là-usc (n, x, y) n r )
là-usc ( z: ℕ1, x : ℕ1, y : ℕ1) r : B
pre
post r = ( chia-hết (x, z) chia-hết (y, z) )
chia-hết (x : ℕ1, y : ℕ1) r : B
pre
post r = k ℕ1 x = y*k
22
Sử dụng hàm phụ
Ví dụ: Hàm tính USCLN của 2 số nguyên dương
uscln (x : ℕ1, y : ℕ1) r : ℕ1
pre
post là-usc (r, x, y) n ℕ1 ( là-usc (n, x, y) n r )
là-usc : ℕ1 ℕ1 ℕ1 B
là-usc (z, x, y) ≜
chia-hết (x, z) chia-hết (y, z)
chia-hết : ℕ1 ℕ1 B
chia-hết ( x, y) ≜
k ℕ1 x = y * k
23
Đặc tả đệ quy
Ví dụ: Đặc tả hàm tính độ dài mảng
Đặc tả dạng không tường minh
Đặc tả dạng tường minh
len
(s: T*)
r: ℕ
len: T * ℕ
len (s) ≜
pre
if s = []
post ((r = 0) (s =[]))
then 0
((r = 1+len( tl s)) (s
[]))
else 1 + len (tl s)
24
Đặc tả đệ quy
Ví dụ: Đặc tả hàm trả về giá trị của phần tử lớn nhất trong
mảng
maxnum (s: ℤ *)
r: ℤ
pre
s []
post ( r elems s ) (x elems s x r )
maxnum (s: ℤ *)
r: ℤ
pre
s []
post ( ( r = hd s) (len s = 1) )
( ( r = hd s) ( r maxnum (tl s)) )
( ( r > hd s) ( r = maxnum (tl s)) )
25
Đặc tả đệ quy
Ví dụ: Đặc tả hàm trả về giá trị của phần tử lớn nhất trong
mảng
maxnum : ℤ* ℤ
maxnum (s) ≜
if len s = 1
then hd s
else
if hd s maxnum (tl s)
then hd s
else maxnum (tl s)
26
Khai báo biến tạm bằng let-in
Cú pháp 1:
let identifier = Biểu-thức1 in Biểu-thức2
Ý nghĩa:
Xác định giá trị của Biểu-thức1 và gán vào “biến tạm”
identifier
Thay thế những vị trí xuất hiện của identifier trong Biểuthức2 bằng giá trị của biến tạm identifier
Ví dụ:
Cho biểu thức
cos (sin(x) – 1) / (sin(x) – 1)
Ta có thể đặt biến tạm y và viết lại như sau:
let y = sin(x) – 1 in cos (y) / y
27
Ký pháp let-in
Ví dụ: Đặc tả hàm trả về giá trị của phần tử lớn nhất trong
mảng
maxnum : ℤ* ℤ
maxnum (s) ≜
if len s = 1
then hd s
else
let max-in-tail = maxnum (tl s) in
if hd s max-in-tail
then hd s
else max-in-tail
28
Khai báo biến tạm bằng let-in
Cú pháp 2a:
let identifier Biểu-thức-tập-hợp in Biểu-thức
Cú pháp 2b:
let identifier Biểu-thức-tập-hợp s.t. Điều-kiện in Biểu-thức
Ý nghĩa:
Biến tạm identifier nhận giá trị của MỘT phần tử (thỏa Điềukiện) trong Biểu-thức-tập-hợp
Thay thế những vị trí xuất hiện của identifier trong Biểu-thức
bằng giá trị của biến tạm identifier
29
Khai báo biến tạm bằng let-in
Ví dụ: Đặc tả hàm tính tổng các phần tử trong 1 tập hợp
sumset : ℝ-set ℝ
sumset (s) ≜
if s = {}
then 0
else
let x s in
x + sum-set ( s – {x} )
30