lời gọi hàm increase sẽ làm cho trạng thái counter tăng thêm môt' đơn VỊ, và cho ra giá trị của biến counter đó.. Như vậy hàm nay có đoi là thuộc Unit {nghĩa là không có đối s ố nào thực
Trang 1Chương III BIẾN, TUẦN TỤ VÀ ĐẶC TẢ LỆNH
Bài mỏt Biến
Đinh nghĩa b iến : Một dính nĩ^hĩa hiến có dạng sau:
ininh-chứng-biến : biểu-thức-kiếu
hoặc
m inh-chứ ng-biến : biểu-thức-kiểu := biểu-thức-trị
{biếii-rhức-rrị p hải có kiểu là hiêìi-thức-kiểu)
Khai báo b iến : Khai háo hiến có dạng sau:
variable danh-sách-các-định-nghĩa-biến
♦ Tâp hợp tấp ca các giá trị của tập hợp tất cả các biến-tạo thành một irạns; thái của hệ Ihòng
♦ Một thí dụ:
schem e C O U N T E R -
class
variable counter : Nat 0
value
Mc:'c;;.sc ; Ỉ,Hit - write ctiumer Nat
incrcascỉ ) is c o u n ic r ’■Diinici' I ; jo u n te r
Trang 2Trong thí dụ này trạng thá dược xác định bòi giá In cua biến counter
lời gọi hàm increase sẽ làm cho trạng thái counter tăng thêm môt' đơn VỊ, và cho ra giá trị của biến counter đó Như vậy hàm nay có đoi là
thuộc Unit {nghĩa là không có đối s ố nào thực sự), có trị là môl số nguyên (có kiểu Nat) và có một hiệu ứng phụ; làm cho biến c o u n te /ta n a
Bài hai Truy cập biến
khoa nay cho phép ta truy cập biến counter trong phần biểu thức w rite counter RAISE cho phép hai kiểu truy cập biến nhờ ỏ’ hai từ khóa w rite
và read Sau mỗi từ khóa đó là một dãy các biến, từ khóa read cho phép đọc các biến đi sau nó, nghĩa là cho phep lấy ra các giá trị cu^a các bieiì đi sau nó mà không cho phép thay đổi các b iá i đó, từ khóa w rite cho phép
các biến đó đồng thời cho phép thay đổi các giá trị của các bien đo, n d iia
là cho phép gây ra các hiệu ứng phụ
V
ta sẽ xét các hàm có truy cập biến Định nghĩa tonầ
biểu-thức-kiểu-1 ->
mô-tả-truy-cập-biến-1 mô-tả-truy-cập-biến-k biểu-thức-kiểu-2
thức-kiểu-1 là kiểu của miền xác định của hàm
biểu-thức-kiêu-2 là kiểu của m iền giá trị của hàm, phần sau dấu còn cá^c m
ô-tá-truy-cập-biến là các biểu thức có dạng read hoặc write theo sau là môt
dãy các biến ■ ' '
Trang 3Bleu thức <zán: Bieu ỉluíc »ứ/? có daní: lonc quai la;
minh-chứníi-biến ;= biếu-thức-trị
{hiểu thức ĩrị này p h ả i có kiểu n h ư kiểu của hiến tươiĩ^ ứn^)
Kiểu của biểu thức sán bao giờ cũns là Unit
Trong thí dụ trên chúng ta có biểu thức gán counter := counter + 1
biểu thức không có phép gán và không có từ khóa write thì được gọi là
h iểu thức c h ỉ đọc.
không có gì đáng nói nữa Đối với các biểu thức chỉ đọc chúng ta vẫn có những ý nghĩa thông thuờng Đối với các biểu thức có biểu thức gán Ibì
có hiệu ứng phụ chỉ bởi biểu thức gán đó Việc định giá cho các biểu thức được tiến hành từ trái qua phải và từ trong ra ngoài Như vậy là trong khi định giá một biểu thức tliì trạng thái (lập các giá trị của các biến) đã bị thay đổi, sự thay đổi đó được gọi là hiệu ứng phụ khi đánh giá biểu thức
đó Thí dụ trong lược đồ COUNTER thì đánh giá biểu thức counter :=
counter -t- 1 ihì giá trị của biểu thức đó ỉà 0 {phản tử duy nhất có kiểu
Unit), nhưng nó có hiệu ứng phụ là biến counter đã bị tăng lên một đơn
vị Các biểu thức gán đều như vậy tức là đều có trị là 0 và đều tạo ra một hiệu ứng phụ, hiệu ứng phụ này được xác định bởi biểu thức gán đó
Bài ba Tuần tự
Kết nối tuần tự của hai biểu thức được biểu thị bởi dấu ; cụ thể là
chúng có dạng tổng quát là:
biểu-thức-trị-1 ; biểu-thức-trị-2
Trang 4{à đ á y h ieu -íỉiư c -írị-/ p h a i có trị U nit, kiêu của hiếu thức kết hợp nủ\'
là kiêu cùa hiéu-thức-trị-2 )
♦ Đ á n h giá biểu thứ c báng: Dấu = được xác định như nói ở trèn cho
các biểu thức, nghĩa là đối với biểu thức
biéu-thức-1 = biếu-thức-2
thì ta dịnh íiiá cho biéu-thức-1 trước (tronc đó có cá việc định íziá trị cua biểu thức va việc dinh tĩiá trị hiệu ứnc phụ), sau đó dịnh tiếp g:á trị cúa biếu-thức-2 trên trạnc thái mới (do hiệu ứnc phụ) và các hiệu ứnc phu của chúng, và sau đó so đọ hai giá trị của biếu-thức-1 và biếu-thức-2
hoán
(x := x + ỉ;x ) = ( x ; = x + l ; 4 )
Biếu thức này có giá tọ tru e tai các trạng thái hệ thôns mà ở đó biến X
chứa giá 3, và có giá trị false nếu khác đi Hiệu ứng phụ của nó là làm
cho giá trị được chứa trong biến X tăng lên 2
Tlií dụ;
( x : = x , + l;x) = X
Biêu thức này luỏn iuôn có giá trị là tru e, hiệu ứng phụ là 2Ìá trị trong biến X tăn s lên 1
(x := x + l;x ) = ( \;:= x -l;x + l)
Biêu ihức này luỏn có giá Irị tru e và nó khôno: có hiệu ứntz phu, lức là
nó khỏiig làm [hay đói Irang thái cua hệ (sau khi dánh iZiá biểu thức)
liựp is (dâu lương dương) Định giá cho hiếii ihức này hoàn loàn kliac việc định giá cho biếu thức với dâu =
Vứi bi cu ihức
lìicu-lliức-1 is lìicii-lhức-I
Trang 5■ỈUIIILI la phai co iiiol liiin sao ỈIC ihong tic đinh gia biéu-thức-1 và inòt
ao ỉie ihong dè dinh ‘iia bieu-ilurc-2 Sau đó phai so sánh ca giá tri
Ki l l s :
V i_l c é
iìav c
nieu ưníi pỉiLi
a lneu ứn<j phu mơi xác dinh dược biéu thức kct hợp co giá tri true
co ựui iri false hay có ‘iiá iri chaos Biéu ilìức hơp thành khong co
♦ (.liLing ra xem lai ihi du ơ bài mòt tren
counter := counter - 1 ; counter
inot no là kicLi Nat) Đê dinh iziá cho biẻu ihức nay, trước het la dịnh gui
ciio t:>ieu thưc iián ơ bén tnii Khi dó trị cua nó là 0 và liiẹu ứng phụ là
lain cho biến counter bi tãne thêm 1 Sau đó tiếp tuc định giá biếu thức kế
Iiep ơ bén phai (tronc ihí du nàv nó à bèn phải dấu ;) Biêu thức nay cho
ra izia tri cua biến (trong còng-tên-nơ) counter và khòng có hiệu ưng phụ Vày ihì toàn bộ bièu thức ớ trên khi được định giá có hiệu ứng phụ là biến counter bị tãnc lên 1 và cho ra siá trị là giá trị ban dầu cua biẽn
c; o L i n t e r công thêm
ix:=x+l;x) i s ( x ; - x + ỉ ; 4 ) Biếu thức nàv là true nếu nẹav trước khi đánh d á biếu thức thì biến X
chứa íziá tri 3, còn trái lai nó có giá trị false
♦ Xét b i ế u thức
(x;=x+l;x) isx+1
Bièu thức này luòn luòn có 2iá trị false vì hiệu ứng phụ cua hai vế là
((x:=x 4-l;x) = (x+l)) is true
Cá hai biểu ihức ứ hai vế dề có iiiá iri true, tuy vây hièu ứng phu của
chúng khác nỉiaư LÌC) tló bicLi lliưc iươníỊ dươniz này co uiá Iri false
♦ Xcl Iiioi ihi liu kliac
Trang 6scheme COUNTER =
class
variable counter ; N at ~ 0
value
increase : Unit -> write counter Nat
increaseO is counter ~ counter +1; counter
end
COUNTER
scheme RETURNE_COUNTER =
extend COUNTER with
class
variable counterl : Nat := 0
value
save_counter: Unit -> read counter write counter! Unit
save_counter() is counter] ;= counter
end
Nếu như trong lược đổ này chúng ta xét biểu thức
save_counter() ; counter := counter + 1 ; counter
thì chúng ta thấy rằng khi định giá biểu thức thứ nhất thì chỉ có hiệu
ứng phụ là counter 1 bị thay đổi, sau đó đến biểu thức thứ hai thì chỉ có hiệu ứng phụ là counter bị thay đổi và sau đó định giá là giá tn của counter 1
Với biểu thức
counter := counter + 1 ; sa v e_ co u n te r(); counter
Trang 7ihì nói chung cách thức đmh giá vẫn như vây nhưne kết quả là khác nhau, chúng la có thể dẽ dàng thử lại ràns giá Irị của hai biểu thức đó là như nhau (cùng bằng giá trị ban đầu của biến counter công thêm 1) nhưng hiệu ứng phụ là khác nhau
Bài bòn Thí dụ
Trong đoạn này chúng tôi đưa ra một thí dụ về một hệ cơ sở dữ liệu quan hệ dạng ánh xạ
scheme I_DATABASE =
class
tvpe Key, Data
variable db ; Key -m-> Data
value
empty : Unit -> write db Unit
em pty0 is db ;= [],
i n s e r t : Key >< Data -> write db Unit
insert(k,d) is db := db !! [k +> d],
Trang 8remove ; Key -> write db Unit
defined ; Key -> read db Bool
defined(k) is k isin dom db
lookup ; Kev — > read db Data
lookup(k) is db(k) pre defmed(k)
end
Trong RAISE tools lược đồ này phải ghi vào một file có tên là
I DATABASE.rsl
Bài năm Vài biểu thức khác
♦ Biếu thức if có claĩig (đày dú ) là
i f b i ế u - t h ứ c - b o o l t h e n b i ế u - t h ứ c - u - Ị - 1 e l s e b i è u - i h ư c - t r Ị - 2 e n d
tronụ bicu ihức này hai biếu-thức-irị-1 và biểu-thức-tn-2 phái có cùng
inột kieu biếu-thức-trị-bool phái có kièu Bool hoác kiếu có kièii cưc dai
là k i c u B o o l i.xeni R S L ) , n ó c ó i hỏ c ó I r u y c á p b i è n
♦ Bièu thức while Các biòLi thưc có đang lõng quát;
w h i l e b i ẽ u - i h ứ c - t r i - b o o l d u b i é u - i h ứ c - i r i - U n i t e n d
Trang 9l i i i cỉ u m o l I u o ' l ' t l ỏ s a i l
sc lie me
F R A C ' T I ( ) N _ S U M =
class
variable
counter : Nat,
result : Real
value
fraction_siim ; Nat —r> write counter, result Unit
fraction_sum(n) is
counter := n ị
while counter > 0 do
result := result -r 1.0/(real counter);
counter := counter - 1
end
pre n>0
end
Lưọc đổ này phải được ghi vào file có tên là FRACTION_SUM.rsl
♦ Biêu thức until Dane tone quát của biểu thức until là:
Chãns hạn cliúng ta có lược đo sau đâv:
scheme
FRACTION_SUM =
Trang 10variable
counter: Nat,
result; Real
value
fraction_sum : Nat -—> write counter, result Unit
fraction_sum(n) is
counter ;= n ; result := 0.0 ; do
result := result + 1.0/(real counter);
counter := counter - ]
until counter = 0 end
pre n>0
end
Lược đồ này phải được ghi vào file có tên là FRACTION_SUM.rsl
♦ Biểu thức for Dạng tổng quát của biểu thức for là :
for bó-minh-chứng in biểu-thức-trị-danh-sách
do biểu-thức-trị-Unit end scheme
FRACTION_SUM =
class
variable
Trang 11resuit : Real
value
i r a c n o n _ s u m : Nat — > write result Unit
axiom torall n : Nat
fraction_sum (n) is
result — 0.0 ;
for 1in < 1 n > do
re su lt := result - 1 0 / i r e a l i)
end
p r e n > 0
end
Lược đồ nàv phải được slìi vào file có tên là FRACTION_SUM.rsl