Питання досить широке. Щоб відповісти на це в розумному просторі, я зроблю багато спрощень.
Давайте погодимось з термінологією. Програма є правильною, коли вона передбачає її специфікацію. Це розпливчасте твердження багато в чому робиться точним, уточнюючи, що саме є програмою, а що саме є специфікацією. Наприклад, при перевірці моделей програма є структурою Kripke, а специфікація часто є формулою LTL . Або програма може бути переліком інструкцій PowerPC, а специфікація може бути набором тверджень Хоара-Флойда, написаних, скажімо, логікою першого порядку. Можливих варіацій дуже багато. Заманливо зробити висновок, що в одному випадку (структура Kripke) ми не перевіряємо фактичну програму, тоді як у другому випадку (перелік інструкцій PowerPC) ми робимо. Однак важливо усвідомити, що ми дійсно дивимось на математичні моделі в обох випадках, і це цілком чудово. (Ситуація досить схожа на фізику, де, наприклад, класична механіка є математичною моделлю реальності.)
Більшість формалізацій розрізняють синтаксис і семантику програми; тобто як вона представлена і що це означає. Семантика програми - це те, що враховується з точки зору перевірки програми. Але, звичайно, важливо мати чіткий спосіб присвоєння значень (синтаксичним уявленням) програм. Два популярні способи:
- (невеликий крок) оперативна семантика : Це дуже схоже на визначення мови програмування, написавши для неї перекладача. Для цього вам потрібно сказати, що таке стан , і на це впливає кожне твердження мовою. (Ви можете задуматися, якою мовою ви пишете перекладача, але я буду робити вигляд, що ви цього не зробите.)
- аксіоматична семантика : Тут кожен тип висловлювань має схему аксіоми. Отже, приблизно, щоразу, коли використовується певна заява цього типу, це означає, що можна використовувати певні аксіоми. Наприклад, призначення поставляється зі схемою { P [ x / e ] }х : = е ; конкретне завдання x : = x + 1 поставляється з аксіомою { x + 1 = 1 }{ P[ x / e ] }х : = е{ P}x : = x + 1 якщо ми інстанціюємо схему з P = ( x = 1 ) .{ x + 1 = 1 }x : = x + 1{ x = 1 }П= ( х = 1 )
(Є й інші. Я відчуваю себе особливо погано, якщо опускати денотаційну семантику, але ця відповідь вже тривала.) Машинний код плюс оперативна семантика є досить близьким до того, що більшість людей називають «реальною програмою». Ось настільний документ, в якому використовується оперативна семантика для підмножини машинного коду DEC Alpha:
Чому б ви коли-небудь використовували семантику вищого рівня, як аксіоматичну? Коли ви не хочете, щоб ваше підтвердження правильності залежало від обладнання, на якому ви працюєте. Тоді підхід полягає в тому, щоб довести правильність алгоритму відносно зручної семантики високого рівня, а потім довести, що семантика звучить стосовно семантики нижнього рівня, яка наближається до реальних машин.
Підсумовуючи, я міг би придумати три причини, які спричинили ваше запитання:
- Ви бачили лише семантику високого рівня, яка не схожа на те, що ви використовуєте для виклику програми, і вам цікаво, чи є такі низького рівня. Відповідь - так.
- Вам цікаво, як ви доводите, що модель відповідає дійсності. Як і у фізиці, ви цього не робите. Ви просто придумуєте кращі моделі та перевіряєте їх на реальність.
- Ви не бачили різниці між синтаксисом та семантикою та різними способами присвоєння значень програмам. У двох попередніх питаннях перераховано деякі книги.
Ця відповідь просто намагається визначити три різні способи, якими я зрозумів питання. Заглиблюючись у будь-яку з цих точок, потрібно багато місця.