- •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;
В программе, находящейся в файле fast_floor.cpp обнаружено две ошибки:
1.При E – bias >= m – 2 (или d >= w) сдвигаемое влево значение выходит за пределы m – 1 битов. В частности, при d = w старшая единица попадает в позицию знака в представлении целого числа, в результате чего результат floor становится отрицательным. В реализации следовало бы запретить использовать функцию floor при d > 0, т.е. при E – bias – p + 1 > 0 из-за экспоненциально растущей погрешности.
2.Ненормализованное сверхмалое число обрабатывается также, как нормализованное (с добавление 1 в разряд p). Тем не менее, это не меняет значение функции floor из-за малости числа. Однако при вычислении других функций результат был бы ошибочным.
8.Язык, технология
иметоды верификации других классов программ
8.1. Класс объектно-ориентированных программ.
Язык. База – язык невзаимодействующих программ. Дополнительно - классы, инкапсуляция, наследование.
class C(x) implements D(y) { invariant <инвариант класса>
|
<поля и методы> < приватные поля и методы > |
} |
x и y – внешние параметры (типы, переменные) |
Объект – структура из доступных и приватных полей класса
c.field |
A(x, s: y, s’) s. A(x: y) |
Вызов метода: |
Определение метода:
A(x: y) pre P(x, s) {…} post Q(x, s, y, s’)
class D { invariant ID(s);
A(x: y) pre PD(x, s) {…} post QD(x, s, y, s’) … } class C implements D { invariant IC(s);
A(x: y) pre PC(x, s) {…} post QC(x, s, y, s’)}
IC(s) ID(s) PD(x, s) PC(x, s)
QC(x, s, y, s’) QD(x, s, y, s’)
Спецификация в виде предусловия и постусловия для методов, инвариант класса.
Условия корректности. Формула тотальной корректности для методов. Выполнимость инварианта после вызова любого метода класса. Условия корректности, проверяющие для наследуемых методов ослабление предусловий и усиление постусловий. Проверка усиления инварианта наследуемого класса.
3. Класс простых процессов.
Язык. База – язык объектно-ориентированных программ.
Дополнительно: loop {A(s, x: s’, y)}, |
break. |
s – переменные, модифицируемые в цикле. |
|
Спецификация. Инвариант цикла. |
Темпоральные свойства. |
class C { invariant I(s); A(x: y) pre P(x, s) post Q(x, s, y, s’)} loop { s.A(x: y) }
Пример. Система автоматического управления
Представление программы процесса в форме автомата. Спецификация: инвариант в каждой вершине автомата.
Языковые средства описания процесса
Процесс: машина конечных состояний (автомат) в виде гиперграфа состояний
process <имя процесса>(<аргументы и порты>: <результаты>)
<предусловие> { <тело процесса> } <постусловия на завершающиеся ветви>
Инварианты
Состояния: входное, выходные, внутренние.
Имя состояния
Секция результатов:
<описание результатов> #<имя выходного состояния> |
Фрагмент тела процесса:
<имя входного или внутреннего состояния>: <оператор>
Оператор перехода: |
#<имя состояния> |
Декомпозиция процессов
Утверждение. Любой алгоритм можно декомпозировать введением всего лишь одного внутреннего состояния
Декомпозиция бесконечного процесса с одним внутренним состоянием:
start A
next B
process A(X x: Y y);
process B(X x, Y y: Y y’);
//предварительное определение процесса A
//предварительное определение процесса B
process C(X x: )
{ start: A(x: Y y) #next next: B(x, y: Y y’) #next
}
Декомпозиция с одним внутренним состоянием:
start
start
A
A
next
next
B
B
stop
stop |
А |
B |
|
start |
|||
|
|
||
|
|
next |
stop
stop |
А |
|
|
start |
B |
||
|
|||
|
|
next |
stop
start |
А |
B |
|
||
|
|
next |
process A(X x: Y y #next : Z z #stop);
// предварительное определение процесса A
process B(X x, Y y: Y y’ #next : Z z #stop);
// предварительное определение процесса B
process G(X x: Z z #stop)
{ start: A(x: Y y #next : z #stop); next: B(x, y: Y y’ #next : z #stop)
}
Декомпозиция без внутренних состояний:
stop
next
B
process B(X x, Y y: Y y’ #next : Z z #stop); |
|
||
|
|
// предварительное определение процесса B |
|
process H(X x, Y y: Z z #stop); |
|
||
{ |
next: |
B(x, y: Y y’ #next : Z z #stop) |
} |