- •21.11.12 Лекция 10
- •7. Технология предикатного программирования 7.6. Разработка и верификация программ стандартных функций
- •Иллюстрация методов разработки и верификации
- •Разработка программы вычисления целочисленного квадратного корня
- •Построение (синтез) программы для предиката isqrt
- •Построение программы для предиката sq0
- •Более эффективная версия программы isqrt
- •Алгоритм вычисления целочисленного квадратного корня через двоичное разложение
- •Спецификация обобщающей задачи:
- •Оптимизации программы предиката sq2
- •Синтез программы sq3
- •Трансформация программы isqrt1
- •Трансформация программы isqrt1 (прод1.)
- •Трансформация программы isqrt1 (прод2.)
- •Преобразования императивной программы
- •Доказательство формул корректности на PVS
- •Доказательство формул корректности (пр1)
- •Доказательство формул корректности (пр2)
- •Доказательство формул корректности (пр3)
- •Теория bit_nat
- •Итоги
- •Алгоритм вычисления целой части плавающего числа
- •Представим теорию main для определения предиката floor.
- •floor_val: THEORY BEGIN
- •В соответствии с правилом FC1 для первой альтернативы условного оператора генерируется цель:
- •В программе, находящейся в файле fast_floor.cpp обнаружено две ошибки:
- •8.Язык, технология
- •8.1. Класс объектно-ориентированных программ.
- •class D { invariant ID(s);
- •3. Класс простых процессов.
- •Языковые средства описания процесса
- •Декомпозиция процессов
- •Декомпозиция с одним внутренним состоянием:
- •stop
- •Декомпозиция без внутренних состояний:
- •Пример 1. Гадание на кофейных зернах
- •2.Электронные часы с будильником
- •class Часы { nat hours; nat minutes;
Пример 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