Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures / lecture10.ppt
Скачиваний:
10
Добавлен:
06.06.2015
Размер:
402.94 Кб
Скачать

Пример 1. Гадание на кофейных зернах

Зерна: черные и белые

b — число черных зерен, w — число белых зерен

process Гадание(nat b, w: #black : #white) pre b + w 0; post black: b’=1 & w’=0 post white: b’=0 & w’=1;

type CHOICE = enum (black_black, white_white, black_white); ВзятьПаруЗерен(nat b, w: CHOICE c)

pre b + w > 1; post (b < 2 c black_black) & (w < 2 c white_white) &

недетерминированность (b = 0 w = 0 c black_white);

process Гадание(nat b, w: #black : #white) pre b + w 0

{ step: invariant b+ w 1;

 

if

(b = 1 & w = 0)

#black

else if (b = 0 & w = 1)

#white

else

Шаг(b, w: nat b’, w’); #step

} post black: b’=1 & w’=0 post white: b’=0 & w’=1;

black

step

white

Задача верификации: инвариант остается истинным после прохождения очередного витка.

pre b + w 1 & (b = 1 & w = 0) & (b = 0 & w = 1)

Шаг(b, w: nat b’, w’) post b’ + w’ 1;

process Шаг(nat b, w: nat b’, w’) pre b + w > 1

{

switch (ВзятьПаруЗерен(b, w)) { case black_black: b’ = b - 1 || w’ = w

case white_white: b’ = b + 1 || w’ = w – 2 case black_white: b’ = b - 1 || w’ = w

}

}

post b’ >= 0 & w’ >= 0 & b’ + w’ >= 1;

Дополнительное свойство на переменных состояния процесса:

(b‘ = b - 1 or b‘ = b + 1) & (w‘ = w or w‘ = w – 2) Процесс всегда завершается.

Мера на состоянии процесса: nat m(nat b, w) = b + w;

m(b’, w’) = m(b, w) -1;

process Гадание(nat b, w: #black : #white) pre b + w 0

pre black: even(w); pre white: even(w);

2.Электронные часы с будильником

H – увеличивает на единицу число часов

M – увеличивает на единицу число минут

A – включает и выключает настройку «будильник»

Три внутренних состояния часов: без будильника, включение будильника, включенный будильник

class Часы { nat hours; nat minutes;

nat alarm_hours; nat alarm_minutes; inc_h(); {...} inc_m(); {...} inc_alarm_h(); {...} inc_alarm_m(); {...}

tick() {...} // работа часов bell_on() {...} // Включить звонок bell_off() {...} // Выключить звонок

bool bell_limit() {...}; // звонок звонит уже минуту

}

process Работа_часов_с_будильником { Часы t = Часы();

off: case h: t.inc_h() #off case m: t.inc_m() #off case a: #set

else t.tick() #off

set:

 

case h:

t.inc_alarm_h() #set

case m:

t.inc_alarm_m() #set

case a:

t.bell_on() #on

else

t.tick() #set

on:

 

case h:

t.inc_h() #on

case m:

t.inc_m() #on

case a:

t.bell_off() #off

else

t.tick(); if (t.bell_limit()) { t.bell_off()

}

#off } else #on

Соседние файлы в папке lectures