Ngữ nghĩa tiên đề (Axiomatic semantics):

Một phần của tài liệu Cú pháp và ngữ nghĩa trong ngôn ngữ lập trình (Trang 25 - 30)

I. CÚ PHÁP VÀ NGỮ NGHĨA

5.3. Ngữ nghĩa tiên đề (Axiomatic semantics):

Ngữ nghĩa của phát biểu:

Ngữ nghĩa của phát biểu S được đặc tả bởi công thức sau: {P} S {Q}

Trong đó:

P là điều kiện về trị của các biến trước khi thực thi S, gọi là tiền điều kiện

(precondition) của S

Q là điều kiện về vị trí các biến sau khi thực thi S, gọi là hậu điều kiện

(Postcondition) của S – S là phát biểu

Diễn dịch đặc tả trên là nếu P đúng thì sau khi S thực hiện xong ta có Q đúng

Ví dụ:

{x = A} x := x + 1 { x = A + 1} {y ≠ 0} x := 1 / y { x = 1 / y }

Nếu với hậu điều kiện bất kỳ của S, ta biết được những tiền điều kiện sao cho khi S được thực hiện xong hậu điều kiện trên được thỏa mãn, thì ta biết được ngữ nghĩa của S

Điều kiện P2 gọi là yếu hơn P1 nếu P1=> P2. Tiền điều kiện ở đặc tả của phát biểu càng yếu, ngữ nghĩa của phát biểu càng rõ.

Trang 25

{ y > 0 } x := 1 / y { x = 1 / y} y>0⇒y≠0

Với hậu điều kiện Q của S, chúng ta ký hiệu ϖp(S,Q) Trong đó: Q là biến số, có thể xem là ngữ nghĩa chính xác của S

Ví dụ:

wp(x := 1 / y, x = 1 / y) ≡ y ≠ 0 wp(n := n + 1, n > 0) ≡ n ≥ 0

Ví dụ: ϖp(n:=n+1,n>0) (n nguyên)

Với mọi tiền điều kiện P về n thỏa mãn đặc tả: {P} n:=n+1 {n>0}

Ta đều có

Ví dụ:

a = b + 1 {a > 1}

Một tiền điều kiện có thể: {b > 10} Tiền điều kiện yếu: {b > 0}

Hệ luật HOARE

Hệ luật Hoare gồm các tiên đề và luật suy dẫn về ngữ nghĩa của phát biểu theo đặc tả vừa trình bày trên.

Các kí hiệu “^, ” được sử dụng trong hệ luật lần lượt tương ứng với các toán tử luận lý NOT,AND và OR. Kí hiệu “=” được sử dụng làm ký hiệu định nghĩa, để phân biệt với các toán tử luận lý “=”

Luật 1: Nếu ({P} S {Q}) (Q R) thì {P} S {R} Luật 2: Nếu ({P} S {Q}) (R P) thì {R} S {Q} Luật 3: (Tiên đề về phép gán) {Px→E} x:= E {P},

với E là biểu thức và Px→E là P trong đó x được thay bằng E

Ví dụ: chứng minh {f = i!} i := i + 1 {f * i = i!}

P ↔ f * i = i!E↔i+1

Pi→E ↔ f *(i+1) = (i+1)!

Theo L3: {f *(i+1) = (i+1)!} i := i + 1 {f * i = i!}

Vì f = i! ⇒ f *(i+1) = (i+1)! nên theo L2 ta có điều cần chứng minh Luật 4: (Luật về phát biểu ghép)

Nếu ({P} S1 {Q}) ∧ ({Q} S2 {R})

thì {P} S1; S2 {R}

Trang 26

Ta chứng minh {f * i = i!} f := f * i {f = i!} (2) P ↔ f = i!E↔f*i

Pi→E ↔ f *i = i! Theo L3, (2) được chứng minh

Theo L4 và (1),(2) ta có điều phải chứng minh Luật 5: (Luật về pháp biểu IF)

Nếu ({P ∧ B} S1 {Q}) ∧ ({P ∧ ¬B} S2 {Q})

thì {P} if B then S1 else S2 {Q}

Luật 6: (Luật về phát biểu IF không có thành phần ELSE)

Nếu ({P ∧ B} S1 {Q}) ∧ ((P ∧ ¬B) ⇒ Q)

thì {P} if B then S1 {Q}

Ví dụ: {xy < 0} if x > y then max := x else max :=y {max > 0}

Theo L3, ta có {x > 0} max := x {max > 0} Vì (xy < 0) ∧ (x > y) ⇒ (x > 0) nên theo L2 ta có {(xy < 0) ∧ (x > y)} max := x {max > 0} Tương tự{(xy < 0) ∧ (x ≤ y)} max := y {max > 0} Áp dụng L5 ta có điều cần chứng minh

Luật 7: (Luật về phát biểu WHILE)

Nếu {P ∧ B} S {P}

thì {P} while B do S {P ∧ ¬B}

Ví dụ: {f =i!} while i≠n do begin i := i +1; f := f * i end {f=n!}

Theo ví dụ trước ta đã chứng minh

{f =i!} i := i + 1; f := f * i {f = i!} Vì (f = i!) ∧ (i≠n) ⇒ f = i! nên theo L2

{(f = i!) ∧ (i≠n)} i := i + 1; f := f * i {f = i!} Với P ↔ f = i! ↔ i≠n S ↔ i := i + 1; f := f * i theo L7:

{f =i!} while i≠n do begin i := i +1; f := f * i end {(f=i!) ∧ (i=n)} mà (f=i!) ∧ (i=n) ⇒ f = n! nên theo L1 ta có điều cần phải chứng minh

Luật 8: Đúng đắn toàn phần

if {P ∧ B ∧ 0 ≤ E = E0} C {P ∧ 0 ≤ E < E0} then {P ∧ 0 ≤ E }while B do C {P ∧ ¬B}

Trang 27

Đánh giá ngôn ngữ tiền đề (Evaluation of Axiomatic Semantics)

– Rất khó để phát triển các tiên đề hoặc các qui tắc suy luận cho tất cả các phát biểu trong một ngôn ngữ

– Ngôn ngữ tiên đề là một công cụ tốt để chứng minh tính đúng đắn, và trong 1 framework cho lập luận về chương trình, Nhưng nó thì không hữu ích cho người sử dụng ngôn ngữ

– Ngôn ngữ tiên đề hữu dụng trong việc mô tả ý nghĩa của một ngôn ngữ lập trình được giới hạn cho người sử dụng ngôn ngữ hoặc compiler writers

IV.ỨNG DỤNG CỦA NGỮ NGHĨA HÌNH THỨC 1.Chứng minh chương trình

Cho đặc tả của chương trình Prog là: {P} Prog {Q}

Với P và Q theo thứ tự là tiền điều kiện và hậu điều kiện của chương trình.

Chương trình Prog gọi là đúng đắn bộ phần khi: Nếu P đúng thì sau khi thực hiện xogn Q đúng. Tính đúng đắn bộ phận không đề cập đến vấn đề dừng của Prog

Chương trình Prog gọi là đúng đắn toàn phần khi nó đúng đắn bộ phận và nếu P đúng thì Prog sẽ dừng (không chạy vô tận)

Ví dụ: Chứng minh tính đúng đắn bộ phận của chương trình tính giai thừa với đặc tả sau:

Chứng minh * + i:=0;f:=1; While do Begin i:=i+1; f:=f*i; End {f!=n!} Ta đã chứng minh {f = i!} while i ≠ n do begin i:= i +1; f := f * i end {f = n!} Áp dụng L3 với P ↔ f = i!E↔ 1 Pf →E ↔ 1 = i! ta được {1 = i!} f := 1 {f = i!} Áp dụng L3 với P ↔ 1 = i!E↔ 0 Pi→E↔ 1 = 0! ta được {1 = 0!} i := 0 {1 = i!} Vì 1 = 0! luôn luôn đúng nên n ≥ 0 ⇒ 1 = 0!.

Trang 28

2.Cú pháp cảm ngữ cảnh

Cách mô tả hình thức ngữ nghĩa như ở ngữ nghĩa biểu thị có thể được sử dụng để mô tả các ràng buộc về ngữ cảnh. Các ràng buộc được xác định một cách hình thức bằng việc định nghĩa các hàm kiểm tra sự hợp lệ của các cấu trúc cú pháp đối với ngữ cảnh của cấu trúc đó

3.Hiện thực và thiết kế ngôn ngữ

Một phạm vi ứng dụng quan trọng của ngữ nghĩa hình thức là hiện thực ngôn ngữ. Cũng như cú pháp hình thức đã được sử dụng để tạo bộ phân tích cú pháp của ngôn ngữ lập trình một cách tự động, ngữ nghĩa hình thức cũng có thể giúp cho quá trình sinh tự động các trình thông dịch hoặc biên dịch.

Trong việc thiết kế ngôn ngữ, ngữ nghĩa hình thức cho phép các nhà thiết kế mô tả rõ ràng và chính xác ngữ nghĩa cũng như các đặc tính của ngôn ngữ mà họ đưa ra.Ngoài ra nó còn là cơ sở chính xác và chi tiết hóa cho việc so sánh các phương hướng thiết kế khác nhau.

Trang 29

VI, TÀI LIU THAM KHO VÀ CHÚ THÍCH Những tài liệu tham khảo

Một phần của tài liệu Cú pháp và ngữ nghĩa trong ngôn ngữ lập trình (Trang 25 - 30)

Tải bản đầy đủ (PDF)

(30 trang)