Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Part7.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
144.38 Кб
Скачать

7 ВЕРИФІКАЦІЯ ПРОГРАМ

7.1 Семантики мов програмування

Наука семіотика вивчає загальну теорію знакових систем, до яких належить і теорія програмування. У цій теорії прийнято виділяти три складові частини: синтаксис, який трактує правила побудови текстів мови, семантику, що вивчає зв’язки між текстом і його значенням, та прагматику, яка вивчає відношення між знаковими системами і користувачами.

У теорії програмування семантика – це інтерпретація (смислове значення) абстрактного синтаксису, виражена у термінах математично строгої формальної моделі. Іншими словами, це інтерпретація множини припустимих конструкцій мови програмування.

Точний опис семантики необхідний для доведення правильності (верифікації) програм, тобто доведення, що ця програма видає результат у відповідності з постановкою задачі. На практиці замість верифікації найчастіше застосовують тестування, але ніяке тестування не може довести правильність програми. Воно може тільки виявити помилки.

Точний опис семантики необхідний також для створення компіляторів з даної мови програмування.

Існує три основних підходи до формального опису семантики мов програмування.

Операційна семантика. Семантика описується в термінах деякої машини, реальної або віртуальної, наприклад, машини Тьюринга.

Смислове значення програми описується чітко описаною множиною операторів, які можуть бути реалізовані на цій машині. У результаті виконання операторів мови змінюється стан програми – сукупність значень її змінних. Результат виконання програми – це стан, при якому машина завершує роботу з даної програми, який, як правило, залежить від початкового стану.

Аксіоматична (дериваційна семантика). Семантику кожної синтаксичної конструкції мови задають у вигляді аксіом, яким повинні задовольняти вихідні дані, і правил виведення, за допомогою яких може бути отриманий результат (як теорема, що випливає з аксіом за допомогою правил виведення), тобто ця семантика є розширенням математичної теорії вирахування предикатів.

Нагадаємо деякі відомості з теорії предикатів.

Кожному n-відношенню на множинах А1, …, Аn можна зіставити n-місну логічну функцію

Р: А1×…×Аn → {true, falseл} ,

що набуває значення true тоді і тільки тоді, коли виконується дане відношення.

Така функція називається предикатом.

Приклади предикатів:

Isreal (X) – “X є дійсне число” ;

less (x, y) – “x менше y” ;

div (x, y) – “ у ділиться на z;

sum (z, x, b) – “ z є сума х і b”.

Якщо замінити змінні, що входять у предикат, їх конкретними значеннями, одержимо висловлення, наприклад: “3,12 є дійсне число”, “6 менше 7”.

Одномісні предикати, як правило, виражають властивості елементів.

Для зручності вводять також 0-місні предикати, що просто є висловленнями.

Метою роботи програми є досягнення завершального стану, що задовольняє якусь (бажану) умову. Цю умову називають постумовою і представляють предикатом Q.

Щоб коректно використовувати програму, нам потрібно знати початковий стан або множину початкових станів, при яких запуск програми обов'язково приведе до завершалього стану, що задовольняє постумову Q. Умову, яку задовольняють ці початкові стани, називають передумовою і представляють предикатом Р.

Нехай S – програма або оператор, або послідовність операторів.

Аксіоматична семантика оператора або деякого фрагмента програми задається у вигляді “трійки Хоара” {P}S{Q}. Запис {P}S{Q} означає: якщо виконання S почалося в стані, який задовольняє Р, то є гарантія, що воно завершиться через скінченний час у стані, що задовольняє умову Q.

Умову, яка характеризує множину усіх станів, для яких виконання S, що почалося у такому стані, обов'язково закінчиться через скінченний час у стані, що задовольняє умову Q, називають найслабшою передумовою.

Для найслабшої передумови використовують позначення wp (S,Q) – weakest pre-condition.

П риклад 7.1 Алгоритм Евкліда знаходження найбільшого спільного дільника НСД (a , b)

Постумова x=HСД (a,b).

Найслабша передумова

(HСД(x,y)=HСД(a,b)) and (x>0) and (y>0).

Фрагмент відповідної програми на Pascal має вигляд:

х:=a; y:=b;

while x <> y do

if x>y then x:=x-y else y:=y-x;

Приклад 7.2

S: i:=i+1; Q: i <= 1;

wp (S, Q): i<=0 .

Найслабша умова означає найменш обмежуючу умову.

Наприклад: Р1: (х >3) слабше, ніж Р2: (х >5).

Денотаційна (математична) семантика. Назва методу походить від слова denote – “означати”. Як і в операційному підході, в основу покладена інтерпретація програми, але вона описується не у термінах машини, а більш традиційними для математики засобами – у термінах деякої сукупності множин, відношень і відображень. Для кожної сутності програми визначаються деякий математичний об’єкт і функція, яка відображає екземпляри цієї сутності в екземпляри цього математичного об’єкта.

Наведемо найпростіший приклад:

<число> ::= 0 | … | 9 | < число >0 | | < число >9 .

Денотаційне зображення для цих правил:

Mnum(‘0’) = 0; …; Mnum(‘9’) = 9;

Mnum(<число> ‘0’) = 10* Mnum(<число >);

Mnum(<число>‘1’) = 10* Mnum(<число>)+1;

. . .

Mnum(<число>‘9’) = 10* Mnum(<число>)+9 .

Визначимо VARMAP(i, s) – функцію від імені змінної і і стану програми, яка повертає значення змінної i у стані s.

Вираз для суми:

<вираз>::=<число>|<змінна>|<вираз>’+’<вираз>

Денотаційне зображення цього правила:

Me(<вираз>, s> =

= case <вираз> of

<число>: Mnum(<число>);

<змінна>: if VARMAP(<змінна >, s)=undef

then error

else VARMAP(<змінна >, s);

<вираз1>’+’<вираз2>:

if Me(<вираз1>, s))=undef OR

Me(<вираз2>, s))=undef

then error

else Me(<вираз1>,s) + Me(<вираз1>,s).

Основи денотаційної семантики були закладені Скоттом. Теорія обчислень Скотта ґрунтується на понятті домена. Домен неформально можна розуміти як деякий аналог множини, який адекватно реалізує рекурсивно визначені функції і множини.

Наведемо способи конструювання нових доменів на основі існуючих.

Функціональний простір. Під функціональним простором з домену D1 у домен D2 будемо розуміти домен [D1→D2], який містить всі можливі функції з областю визначення D1 і областю значень D2 :

[D1→D2] = {f | f : D1→D2}.

Декартів добуток – це домен всіх можливих n-к вигляду

[D1 D2 … Dn] =

={( d1 d2 … dn) | d1 D1; d2 D2; …; dn Dn}.

Послідовність. Під послідовністю D* будемо розуміти домен всіх можливих скінченних послідовностей вигляду d = (d1,d2, ..., dn) з елементів d1,d2, ..., dn домену D, де n>0.

Дизюнктна сума. Під диз’юнктною сумою будемо розуміти домен з визначенням

[ D1 + D2+...+Dn ] ={ (di, i) | di, Di, 1 <i n },

де належність елементів di компонентам Di однозначно установлюється спеціальними функціями належності.

Денотаційний підхід найбільш ефективний для функціональних мов програмування.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]