C T NGÔN NG L P TRÌNH
TS Nguy n H a Phùng
Trang 2NG NGH A TIÊN
{P} S {Q}
– P : ti n đi u ki n – S : phát bi u
– Q : h u đi u ki n
N u P đúng thì sau khi S đ c th c thi thì Q
s đúng {x = A} x := x + 1 { x = A + 1}
{y ≠ 0} x := 1 / y { x = 1 / y }
Trang 3NG NGH A TIÊN (tt)
S, Q → P : ng ngh a c a S
N u P1 ⇒ P2 thì P2 y u h n P1
{ y > 0 } x := 1 / y { x = 1 / y}
y > 0 ⇒ y ≠ 0
wp(S,Q): ti n đi u ki n y u nh t
– wp(x := 1 / y, x = 1 / y) ≡ y ≠ 0
– wp(n := n + 1, n > 0) ≡ n ≥ 0
Trang 4H LU T HOARE
L1: N u ({P} S {Q}) ∧ (Q ⇒ R) thì {P} S {R}
L2: N u ({P} S {Q}) ∧ (R ⇒ P) thì {R} S {Q}
L3: {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!}
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 cm
Trang 5H LU T HOARE (tt)
L4: N u ({P} S1 {Q}) ∧ ({Q} S2 {R}) thì
{P} S1; S2 {R}
Ví d : Ch ng minh {f =i!} i := i + 1; f := f * i {f = i!}
Theo ví d tr c, ta có {f = i!} i := i + 1 {f * i = i!} (1)
Ta ch ng minh {f * i = i!} f := f * i {f = i!} (2)
Pi→E f *i = i!
Theo L3, (2) đ c ch ng minh
đi u ph i ch ng minh
Trang 6H LU T HOARE (tt)
L5: N u ({P ∧ B} S1 {Q}) ∧ ({P ∧ ¬B} S2 {Q})
thì {P} if B then S1 else S2 {Q}
L6: 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
Trang 7H LU T HOARE (tt)
L7: 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! B 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)}
∧ (i=n) ⇒ f = n! nên theo L1 ta có đi u c n ph i ch ng minh
Trang 8CH NG MINH CH NG TRÌNH
{P} Prog {Q}
úng đ n b ph n: n u P đúng, sau khi th c
hi n Prog thì Q đúng úng đ n toàn ph n: thì Prog đúng đ n b
ph n và n u P đúng thì Prog d ng
Trang 9VÍ D
Ch ng minh
{n ≥ 0}
i := 0; f := 1;
while i ≠ n 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 10VÍ D
Ch ng minh:
{n ≥ 0}
i := n; f := 1;
while i > 0 do
begin
f := f * i ;
i := i -1;
end
{f = n!}
Trang 11(2) Ta ch ng minh {f = i* *n ∧ i -1 ≥ 0}
i := i – 1;
{f = (i+1)* *n ∧ i ≥ 0}
Áp d ng L3 ta d dàng cm (2) (3) Ta ch ng minh
{f = (i+1)* *n ∧ i -1 ≥ 0}
f := f * i;
{f = i* *n ∧ i -1 ≥ 0}
f := f * i là
f * i = i * * n ∧ i -1 ≥ 0 ≡
f = (i+1)* * n ∧ i -1 ≥ 0
(1) Ta ch ng minh:
{f = (i+1)* n ∧ i ≥ 0}
while i > 0 do
begin
f := f * i;
i := i – 1;
end
Trang 12Áp d ng L4 cho (2) và (3) ta đ c:
{f = (i+1)* *n ∧ i -1 ≥ 0} f := f*i; i := i-1 {f = (i+1)* *n ∧ i ≥ 0}
G i P = {f = (i+1)* n ∧ i ≥ 0} và B = i > 0, ta có
P ∧ B → {f = (i+1)* *n ∧ i -1 ≥ 0}, do đó theo L2 ta đ c
{P ∧ B} f := f*i; i := i-1 {P}
Áp d ng L7 cho phát bi u while, ta có
{P} while B do begin end {P ∧ ¬B}
Mà P ∧ ¬B = (f = (i+1)* *n ∧ i ≥ 0) ∧ i ≤ 0
→ f = (i+1)* *n ∧ i = 0 đa
→ f = n!
Áp d ng L1, ta đã cm (1)
Trang 13Áp d ng L3 cho f := 1 ta d dàng ch ng minh
{1 = (i+1)* * n ∧ i ≥ 0} f := 1 {f = (i+1)* * n ∧ i ≥ 0} (4)
Áp d ng L3 cho i := n ta c ng cm đ c
{1 = 1 ∧ n ≥ 0} i := n {1 = (i+1)* * n ∧ i ≥ 0}
Vì 1 = 1 là true nên {n ≥ 0} → {1 = 1 ∧ n ≥ 0}
V y theo L2 ta có
{n ≥ 0} i := n {1 = (i+1)* * n ∧ i ≥ 0} (5)
Áp d ng L4 cho (4), (5) và (1) ta có đi u c n ch ng minh
Trang 14ÚNG N TOÀN PH N
L8: if {P ∧ B ∧ 0 ≤ E = E0} C {P ∧ 0 ≤ E < E0} then {P ∧ 0 ≤ E }while B do C {P ∧ ¬B}
E: an integer expression called variant
Trang 15Ví d
{ n ≥ 0}
f := 1;
i := 0;
while (n ≠ i) {
i := i + 1;
f := f * i;
}
{ f = n!}
cm (1), ta cm (2):
{f = i! ∧ n ≠ i ∧ 0 ≤ n – i = E0}
i := i + 1;
f := f * i;
{ f = i! ∧ 0 ≤ n – i < E0}
Ta cm (1):
{f = i! ∧ 0 ≤ n – i}
while (n ≠ i) {
i := i + 1;
f := f * i;
} { f = n!} Mà theo L3, ta có
{f = i! ∧ 0 ≤ n – i – 1 < E0}
i := i + 1;
{f*i = i! ∧ 0 ≤ n – i < E0}
f = i! ∧ n ≠ i ∧ 0 ≤ n – i = E0
Trang 16KI M CH NG KHI TH C THI
#include <assert.h>
assert(n >= 0);
i := n; f := 1;
while i > 0 do
begin
f := f * i ;
i := i -1;
end
if (n < 0) throw Exception;
i := n; f := 1;
while i > 0 do begin
f := f * i ;
i := i -1;
end