Đặ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) ≜
xy
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