Формальное определение вызова процедуры
Формальное определение вызова процедуры
,
:=
,
; B ;
,
:=
,
.
Wp(“p()”,R)=wp(“
,
:=
,
; B;
,
:=
,
. ”,R)
Теорема 1 (о вызове процедуры)
Proc P(value, value result
, result
)
{P} B {Q} //B: ,
:=
,
сокращено тело
{PR: P Ù ("
,
:Q
Þ R
)}
P(,
,
)
Рекомендуемые материалы
{R}
PRÞwp(p(,
,
),R)
PR можно использовать в качестве предусловия.
Пример: ,
=
,
Proc swap (value result y1, y2);
{P: y1=X Ù y2=Y}
B
{Q: y1=Y Ù y2=X }
Доказать, что если {a=X Ù b=Y} то после вызова процедуры swap (a,b) будет
{a=Y, b=X}
Доказательство:
PR = (a=X Ù b=Y Ù (" u1,u2: Q: u1=Y Ù u2=X Þ u1=Y Ù u2=X)) = a=X Ù b=Y
Пример:
{a=A Ù b=B} – предусловие, та же процедура swap(a,b)
{a=B Ù b=A}
{y1=X Ù y2=Y} B {y1=Y Ù y2=X} = {y1=A Ù y2=B} B {y1=B Ù y2=A}
Пример:
{i=I Ù(" k: b[k]=B[k])}
swap(i, b[i])
{i:=B[I] Ù B[I]=I Ù "k : I¹k : b[k]=B[k]}
Перепишем процедуру
Вам также может быть полезна лекция "Введение в вычислительные сети".
{P: y1=I Ù y2=B[I]} y1,y2:=u1,u2 {Q: y1=B[I] Ù y2=I}
PR=PÙ(" u1,u2 Q
Þ R
) =
= i=I Ù b[i]=B[I] Ù (" u1,u2 u1=B[I] Ù u2=I Þ
Þ u1=B[I] Ù (b:i:u2)[I]=I Ù "k¹(b:i:u2)[k]=B[k])= //раскроем квантор всеобщности
= i=I Ù b[i]=B[I] Ù (B[I]=B[I] Ù I=I Þ B[I]=B[I] Ù
Ù (b:i:I)[I]=I Ù "k:k¹I:(b:i:I)[k]= B[k])Þ( i=I Ù b[i]=B[I] Ù I=I Ù "k: k¹I:b[k]B[k])=i=I Ù ("k: b[k]=B[k])