INSTRUCTIUNEA REPEAT
Aceasta instructiune reproduce structura repeat until si are forma generala:
REPEAT
i1;
i2;
. . .
in
UNTIL expresie logica
Aici , i1, . ,in reprezinta instructiuni.
Principiul de executare este urmatorul:
Se executa secventa de instructiuni;
Se evalueaza expresia logica;
Daca aceasta ia valoarea FALSE se executa din nou secventa de instructiuni, contrar se trece mai departe.
Iata cum arata instructiunea REPEAT prezentata cu ajutorul diagramei de sintaxa:
INSTRUCTIUNE
INSTRUCTIUNEA
REPEAT
Observatie: secventa se executa cel putin odata, dupa care se pune problema daca sa se repete sau nu (prin evaluarea expresiei logice).
Regula instructiunii REPEAT
Are forma:
{P} A {Q}, (Q and not b) <= P
{P} repeat A until b {Q and b}
Formula P se numeste specificatie invarianta.
Pentru simplitate, aplicarea acestor reguli in demonstratii se va nota prin:
repeat repeat
{P} {P}
A sau A
{Q} {Q}
until b until b
{Q and b}
Observatie: din prezentarea neformalizata a semanticii, se stie ca instructiumea:
repeat A until b
este echivalenta cu instructiunea compusa:
begin A;
while not b do
A
End
Se poate arata acum, in termenii semanticii axiomantice, ca regula instructiunii repeat poate fi dedusa din regula instructiunii while, regula consecintelor si regula instructiunii compuse. Intr- adevar, in ipostazele {P} A {Q} si (Q and not b) <= P poate fi construita urmatoarea demonstratie:
{P}
begin A;
{Q}
while not b do
{Q}
A
end
{Q and b}.
Regula consecintelor a fost aplicata pentru a demonstra ca specificatia Q este invarianta pentru instructiunea while:
{Q and not b}
{P}
A
{Q}.
Exemplu. Notatia:
Program R1;
Type natural =0..maxint;
Var x, y, z, u : natural
{(x = a) and (y = b) and (a >= 0) and (b >= 0)}
{(x * y = x * y) and (x > 0)}
begin
z := 0;
{(z + x * y = x * y) and (x > 0)}
u := x;
repeat
{(z + u * y = x * y) and (x > 0)}
z := z + y;
{(z + (u - 1) * y = x * y) and (u >= 1)}
u := u - 1
{(z + u * y = x * y) and (u >= 0)}
until u = 0
{(z + u * y = x * y) and (u >= 0) and (u = 0)}
end.
{{(z = a * b)}
este o demonstratie a corectitudinii partiale a unui algoritm de inmultire a doua numere naturale prin adunare repetata.
Pentru instructiunea repeat . until u=0, specificatia invarianta este (z+u*y=x*y) and (u>0).
Exemplu. Notatia:
{Program R2}
type natural = 0..maxinit;
var x, y : natural;
{(a > 0) and (b > 0) and (x = a) and (y = b)}
begin
repeat
{(x > 0) and (b > 0) and (x > a) and (y > b)}
while x > y do
{(x > 0) and (y > 0) and ((a, b) = (x, y))}
x := x - y;
while y > x do
{(x > 0) and (y > 0) and ((x, y) and (a, b))}
y := y - x;
{(0 < y <= x) and ((a, b) = (x, y))}
until x = y
{(0 < y <= x) and ((a, b) = (x, y)) and (x = y)}
end.
{x = (a, b)}