Correctness Property Proof for the Banking System for Money Transfer Payments
The method for properties proof for parallel programs running multiple-instance interleaving with shared memory was applied in order to prove the correctness property of the banking system for remittances payments. The task was stated, transitional system was built for the model with simplified stat...
Збережено в:
Дата: | 2018 |
---|---|
Автори: | , , , |
Формат: | Стаття |
Мова: | Ukrainian |
Опубліковано: |
Інститут програмних систем НАН України
2018
|
Теми: | |
Онлайн доступ: | https://pp.isofts.kiev.ua/index.php/ojs1/article/view/187 |
Теги: |
Додати тег
Немає тегів, Будьте першим, хто поставить тег для цього запису!
|
Назва журналу: | Problems in programming |
Завантажити файл: |
Репозитарії
Problems in programmingid |
pp_isofts_kiev_ua-article-187 |
---|---|
record_format |
ojs |
resource_txt_mv |
ppisoftskievua/8b/9bd3c1d7018df44a369d0526f145aa8b.pdf |
spelling |
pp_isofts_kiev_ua-article-1872024-04-28T13:09:57Z Correctness Property Proof for the Banking System for Money Transfer Payments Доказательство свойства корректной работы банковской системы выплаты денежных переводов Доведення властивості коректної роботи банківської системи виплати грошових переказів Ostapovska, Yu.A. Panchenko, T.V. Polishchuk, N.V. Kartavov, M.O. software correctness; safety property proof; concurrent program; interleaving; invariant; IPCL; composition-nominative languages; formal verification UDC 004.415.52 корректность программного обеспечения; доказательство частичной корректности; параллельная программа; interleaving; инвариант; IPCL; композиционно-номинативные языки; формальная верификация УДК 004.415.52 коректність програмного забезпечення; доведення часткової коректності; паралельна програма; interleaving; інваріант; IPCL; композиційно-номінативні мови; формальна верифікація УДК 004.415.52 The method for properties proof for parallel programs running multiple-instance interleaving with shared memory was applied in order to prove the correctness property of the banking system for remittances payments. The task was stated, transitional system was built for the model with simplified state, and the program invariant was formulated and proved to keep true over the software system at any given time in this work. Conclusions about the convenience and adequacy of method application to prove the correctness of parallel systems were made.Problems in programming 2016; 2-3: 119-132 Применен метод доказательства свойств параллельных программ, которые выполняются многоэкземплярно в режиме поочередного пошагового переключения и взаимодействуют через общую память, для доказательства свойства корректности банковской системы выплаты денежных переводов. В работе поставлена задача, построена транзиционная система для модели с упрощенным состоянием, сформулирован инвариант программы и проведено доказательство истинности инварианта над программной системой в любой момент времени. Сделаны выводы о удобстве и адекватности применения метода для доказательства корректности параллельных систем.Problems in programming 2016; 2-3: 119-132 Застосовано метод доведення властивостей паралельних програм, що виконуються багатоекземплярно в режимі почергового пок-рокового переключення і взаємодіють через спільну пам’ять, для доведення властивості коректності банківської системи виплати грошових переказів. В роботі поставлено задачу, побудовано транзиційну систему для моделі зі спрощеним станом, сформульовано інваріант програми та проведено доведення істинності інваріанту над програмною системою у довільний момент часу. Зроблено висновки щодо зручності та адекватності застосування методу для доведення коректності паралельних систем.Problems in programming 2016; 2-3: 119-132 Інститут програмних систем НАН України 2018-07-06 Article Article application/pdf https://pp.isofts.kiev.ua/index.php/ojs1/article/view/187 10.15407/pp2016.02-03.119 PROBLEMS IN PROGRAMMING; No 2-3 (2016); 119-132 ПРОБЛЕМЫ ПРОГРАММИРОВАНИЯ; No 2-3 (2016); 119-132 ПРОБЛЕМИ ПРОГРАМУВАННЯ; No 2-3 (2016); 119-132 1727-4907 10.15407/pp2016.02-03 uk https://pp.isofts.kiev.ua/index.php/ojs1/article/view/187/182 Copyright (c) 2017 ПРОБЛЕМИ ПРОГРАМУВАННЯ |
institution |
Problems in programming |
baseUrl_str |
https://pp.isofts.kiev.ua/index.php/ojs1/oai |
datestamp_date |
2024-04-28T13:09:57Z |
collection |
OJS |
language |
Ukrainian |
topic |
software correctness safety property proof concurrent program interleaving invariant IPCL composition-nominative languages formal verification UDC 004.415.52 |
spellingShingle |
software correctness safety property proof concurrent program interleaving invariant IPCL composition-nominative languages formal verification UDC 004.415.52 Ostapovska, Yu.A. Panchenko, T.V. Polishchuk, N.V. Kartavov, M.O. Correctness Property Proof for the Banking System for Money Transfer Payments |
topic_facet |
software correctness safety property proof concurrent program interleaving invariant IPCL composition-nominative languages formal verification UDC 004.415.52 корректность программного обеспечения доказательство частичной корректности параллельная программа interleaving инвариант IPCL композиционно-номинативные языки формальная верификация УДК 004.415.52 коректність програмного забезпечення доведення часткової коректності паралельна програма interleaving інваріант IPCL композиційно-номінативні мови формальна верифікація УДК 004.415.52 |
format |
Article |
author |
Ostapovska, Yu.A. Panchenko, T.V. Polishchuk, N.V. Kartavov, M.O. |
author_facet |
Ostapovska, Yu.A. Panchenko, T.V. Polishchuk, N.V. Kartavov, M.O. |
author_sort |
Ostapovska, Yu.A. |
title |
Correctness Property Proof for the Banking System for Money Transfer Payments |
title_short |
Correctness Property Proof for the Banking System for Money Transfer Payments |
title_full |
Correctness Property Proof for the Banking System for Money Transfer Payments |
title_fullStr |
Correctness Property Proof for the Banking System for Money Transfer Payments |
title_full_unstemmed |
Correctness Property Proof for the Banking System for Money Transfer Payments |
title_sort |
correctness property proof for the banking system for money transfer payments |
title_alt |
Доказательство свойства корректной работы банковской системы выплаты денежных переводов Доведення властивості коректної роботи банківської системи виплати грошових переказів |
description |
The method for properties proof for parallel programs running multiple-instance interleaving with shared memory was applied in order to prove the correctness property of the banking system for remittances payments. The task was stated, transitional system was built for the model with simplified state, and the program invariant was formulated and proved to keep true over the software system at any given time in this work. Conclusions about the convenience and adequacy of method application to prove the correctness of parallel systems were made.Problems in programming 2016; 2-3: 119-132 |
publisher |
Інститут програмних систем НАН України |
publishDate |
2018 |
url |
https://pp.isofts.kiev.ua/index.php/ojs1/article/view/187 |
work_keys_str_mv |
AT ostapovskayua correctnesspropertyproofforthebankingsystemformoneytransferpayments AT panchenkotv correctnesspropertyproofforthebankingsystemformoneytransferpayments AT polishchuknv correctnesspropertyproofforthebankingsystemformoneytransferpayments AT kartavovmo correctnesspropertyproofforthebankingsystemformoneytransferpayments AT ostapovskayua dokazatelʹstvosvojstvakorrektnojrabotybankovskojsistemyvyplatydenežnyhperevodov AT panchenkotv dokazatelʹstvosvojstvakorrektnojrabotybankovskojsistemyvyplatydenežnyhperevodov AT polishchuknv dokazatelʹstvosvojstvakorrektnojrabotybankovskojsistemyvyplatydenežnyhperevodov AT kartavovmo dokazatelʹstvosvojstvakorrektnojrabotybankovskojsistemyvyplatydenežnyhperevodov AT ostapovskayua dovedennâvlastivostíkorektnoírobotibankívsʹkoísistemiviplatigrošovihperekazív AT panchenkotv dovedennâvlastivostíkorektnoírobotibankívsʹkoísistemiviplatigrošovihperekazív AT polishchuknv dovedennâvlastivostíkorektnoírobotibankívsʹkoísistemiviplatigrošovihperekazív AT kartavovmo dovedennâvlastivostíkorektnoírobotibankívsʹkoísistemiviplatigrošovihperekazív |
first_indexed |
2024-09-25T04:02:50Z |
last_indexed |
2024-09-25T04:02:50Z |
_version_ |
1818527318869540864 |
fulltext |
Паралельне програмування. Розподілені системи і мережі
© Ю.А. Остаповська, Т.В. Панченко, Н.В. Поліщук, М.О. Картавов, 2016
ISSN 1727-4907. Проблеми програмування. 2016. № 2–3. Спеціальний випуск 119
УДК 004.415.52, 681.3
ДОВЕДЕННЯ ВЛАСТИВОСТІ КОРЕКТНОЇ РОБОТИ БАНКІВСЬКОЇ
СИСТЕМИ ВИПЛАТИ ГРОШОВИХ ПЕРЕКАЗІВ
Ю.А. Остаповська, Т.В. Панченко, Н.В. Поліщук, М.О. Картавов
Застосовано метод доведення властивостей паралельних програм, що виконуються багатоекземплярно в режимі почергового пок-
рокового переключення і взаємодіють через спільну пам’ять, для доведення властивості коректності банківської системи виплати
грошових переказів. В роботі поставлено задачу, побудовано транзиційну систему для моделі зі спрощеним станом, сформульовано
інваріант програми та проведено доведення істинності інваріанту над програмною системою у довільний момент часу. Зроблено
висновки щодо зручності та адекватності застосування методу для доведення коректності паралельних систем.
Ключові слова: коректність програмного забезпечення, доведення часткової коректності, паралельна програма, interleaving, інварі-
ант, IPCL, композиційно-номінативні мови, формальна верифікація
Применен метод доказательства свойств параллельных программ, которые выполняются многоэкземплярно в режиме поочередного
пошагового переключения и взаимодействуют через общую память, для доказательства свойства корректности банковской системы
выплаты денежных переводов. В работе поставлена задача, построена транзиционная система для модели с упрощенным состояни-
ем, сформулирован инвариант программы и проведено доказательство истинности инварианта над программной системой в любой
момент времени. Сделаны выводы о удобстве и адекватности применения метода для доказательства корректности параллельных
систем.
Ключевые слова: корректность программного обеспечения, доказательство частичной корректности, параллельная программа,
interleaving, инвариант, IPCL, композиционно-номинативные языки, формальная верификация
The method for properties proof for parallel programs running multiple-instance interleaving with shared memory was applied in order to
prove the correctness property of the banking system for remittances payments. The task was stated, transitional system was built for the
model with simplified state, and the program invariant was formulated and proved to keep true over the software system at any given time in
this work. Conclusions about the convenience and adequacy of method application to prove the correctness of parallel systems were made.
Key words: software correctness, safety property proof, concurrent program, interleaving, invariant, IPCL, composition-nominative lan-
guages, formal verification
Постановка задачі та аналіз. Формулювання властивості коректності системи
Розглянемо застосування методики доведення властивостей паралельних програм у IPCL [1–3]. Задача
стосується доведення критичних властивостей системи виплати міжнародних грошових переказів Vigo Remit-
tance Corp., реалізованої в ВАТ “Державний ощадний банк України” (надалі – банк).
Сформулюємо задачу. Для виплати певного переказу одержувачу здійснюється авторизація – отримання
дозволу на виплату цього переказу даному одержувачу (точніше, в даному випадку – претенденту на одержан-
ня). Така процедура виконується в середовищі SQL, модель роботи якого – паралелізм через спільну пам’ять в
режимі почергового виконання, тобто кілька процедур виконуються “одночасно” в покроковому режимі, при-
чому кожну дискрету часу виконується тільки одна команда тільки одного процесу (із усіх, запущених у пара-
лель).
Процедура авторизації передбачає аутентифікацію та ідентифікацію претендента на одержання грошей
шляхом перевірки наданих ним даних у запиті стосовно грошового переказу. Якщо інформація надана правиль-
но, тобто співпадає з наявною у базі даних (база даних поповнюється паралельно з пересиланням грошей при
надходженні нових переказів для виплати), переказ не заблоковано (переказ блокується після кількох невдалих
авторизацій або з інших особливих обставин – анулювання, тощо – та може бути розблокований спеціальним
оператором системи) та не виплачено, одержувач є дійсно тим, за кого себе видає, то авторизація вважається
пройденою успішно і надається дозвіл на виплату переказаних грошей оператором системи (працівником бан-
ку) одержувачу. Ця процедура є необхідною (тобто попередній розподіл переказів по відділеннях банку є не-
можливим), оскільки повинна забезпечуватись можливість одержувачу отримати призначений йому грошовий
переказ (тобто переказ на своє ім’я) у будь-якій точці (в будь-якому відділенні банку) країни.
Банку необхідно гарантувати, що система працює коректно, іншими словами, що він не втрачає кошти.
Оскільки формалізувати ідентифікацію одержувача (людини) безглуздо (перевірка відповідності паспортних
даних, порівняння по вклеєній у паспорт фотокартці, перевірка автентичності фотокартки, непідробленість пас-
порту взагалі тощо), зосередимось на ідентифікації переказу та його стану і відповідних кроках процедури ав-
торизації. З цих позицій питання коректності, фактично, зводиться до питання неможливості виплати зайвих
коштів. Якщо врахувати, що авторизація передбачає, зокрема, перевірку суми переказу, то зрозуміло, що в ме-
жах одного переказу банк не може втратити “зайвих” грошей. Звідси, банку потрібно гарантувати, фактично,
що жодний переказ не може бути виплачений більше одного разу. (Певний переказ буде виплачений один раз
лише за умови відповідності інформації в базі даних переказів з наданими претендентом на його одержання
реквізитами.)
Звідси, коректність системи зводиться до необхідності довести, що один і той самий переказ не може бу-
ти виплачений двічі (і більше разів), тобто що дозвіл на його виплату (авторизація виплати) не може бути отри-
маний двічі (і більше).
Паралельне програмування. Розподілені системи і мережі
120
Проектування
Тепер розглянемо детальніше процедуру авторизації. Легко побудувати більш-менш очевидну покрокову
процедуру авторизації переказу в першому наближенні:
1) зафіксувати чергову спробу авторизації
2) якщо переказ не заблоковано то
якщо переказ не виплачено то
якщо надана коректна інформація по переказу то (*)
якщо ця інформація співпадає з даними у базі то (*)
авторизувати виплату переказу
інакше (в усіх інших випадках) відмовити в авторизації
3) якщо спроб авторизації накопичилось більше 2, то
заблокувати переказ.
Опустимо з аналізу перевірку коректності інформації (помічено *), оскільки реально це не впливає суттє-
во на результат авторизації (більш того, ці перевірки складають банківську таємницю) – так, це дуже важлива
перевірка, але, як побачимо далі, вона не є критичною для доведення властивості, яка нас цікавить (іншими
словами, цілком зрозуміло, як її робити). (Очевидно, що коли хоча б одна з умов не виконується, авторизація не
пройде, оскільки вона відбувається лише у випадку, коли всі умови повертають True під час перевірки – при-
наймні логічно так має бути.) Як було відзначено, середовище SQL є середовищем з паралелізмом із взаємодією
через спільну пам’ять. В зв’язку з цим слід також зауважити, що якщо деяка умова повернула True під час об-
числення її значення, то пізніше (при виконанні наступних кроків) вона (той самий предикат умовного операто-
ру) може потенційно прийняти значення False, отже коли виконання дійде до блоку “then” з “if-then-else”, на-
приклад, то значення предиката умови може вже бути False (хоча до виконання блоку “then” можна було прис-
тупити лише в ситуації, коли при обчислення предикату умови було отримано результат True). А отже, ми мо-
жемо отримати суперечливу ситуацію і зокрема, наприклад, авторизувати виплату одного переказу двічі.
Не зосереджуючись докладно на архітектурних рішеннях та дизайні системи, відзначимо ключові думки
та їх обґрунтування.
1. Вузьке місце. Інтуїтивно зрозуміло, що критичним місцем системи є паралельна спроба авторизації
одного й того ж переказу кілька разів (наприклад, коли дехто перехопив коректну інформацію про переказ і
намагається отримати авторизацію не будучи дійсним одержувачем переказу). Цей факт не впливає на подаль-
шу побудову системи та доведення необхідної властивості, але дозволяє краще розуміти вузькі місця і прийма-
ти правильні рішення щодо дизайну та архітектури системи.
2. Рівень ізоляції транзакцій SQL (Transaction Isolation Level). Кожна авторизація складає транзакцію
(насправді – дві транзакції: фіксація намірів авторизації та результат авторизації – власне авторизація). Рі-
вень ізоляції обирається Read Committed. Зрозуміло, що нам необхідний рівень, який гарантував би немож-
ливість одночасної роботи з одним переказом (фактично, не допускав би інтерференцію процесів), але, по -
перше, найсуворіший рівень ізоляції – Serializable – не еквівалентний послідовному виконанню процесів (то-
ді була б гарантована свобода від інтерференції), а по-друге, рівень ізоляції Serializable рекомендований до
застосування лише у випадках зі складною логікою обчислень (в даній системі логіка не є надто складною) і
має великий відсоток відкатів транзакцій (transaction roll-back), що призводить до необхідності повторних
спроб виконання транзакцій, ускладнення внутрішньої логіки виконання команд SQL-сервером (більше бло-
кувань будуть утримуватись довший час) та зменшення загальної швидкодії системи (детальніше про це мо-
жна прочитати в документації по будь-якому SQL-серверу – Microsoft SQL Server, PostgreSQL, а також в [4]).
Звичайно, останнє є неприпустимим у випадку критичних до часу банківських систем.
3. Уточнення алгоритму авторизації. Введемо перевірку на кількість паралельних (виконуваних одночас-
но) авторизацій. Це можливо, оскільки ми фіксуємо спробу авторизації в журналі, незалежно від її результату,
який з’ясується пізніше.
Таким чином, уточнений алгоритм авторизації виглядатиме наступним чином:
1) записати чергову спробу авторизації
2) якщо кількість одночасних (паралельних) спроб = 1, то
якщо переказ не заблоковано то
якщо переказ не виплачено то
якщо надана коректна інформація по переказу і ця інформація співпадає з даними у базі то (*)
авторизувати виплату переказу
інакше (в усіх інших випадках) відмовити в авторизації
3) якщо спроб авторизації накопичилось більше 2, то
заблокувати переказ.
Паралельне програмування. Розподілені системи і мережі
121
Паралельно з цим спеціальний оператор по вирішенню конфліктів може розблокувати спірні перекази,
тобто паралельно виконується процес:
розблокувати переказ
Побудова програми IPCL та моделюючої транзиційної системи
Нам знадобиться модель системи (модель реальної системи на мові SQL в мові IPCL). Отже, одним з
ключових моментів є визначення адекватного рівня деталізації системи (і, відповідно, доведення). Є різні
можливості в даному аспекті – так, можна розглядати модель як в [5,6], тобто моделювати виконання опера-
цій SQL-сервером (деталізувати до рівня операцій з таблицям), а можна абстрагуватись від представлення та
роботи безпосередньо з даними – і розглядати функціонування системи на вищому рівні абстракції. Ми бу-
демо покладатись на коректність реалізації SQL-сервера, а, отже, розглядати (точніше, використовувати) йо-
го операції без деталізації щодо їх реалізації – тобто розглядатимемо коректність програми відносно SQL.
Ще одне зауваження. В моделі ми зосередимось на роботі з одним переказом. Зрозуміло, що робота з рі-
зними переказами, хоч і виконувана в паралель, не інтерферує (немає взаємного впливу процесів авторизації
різних переказів один на інший, адже такими процесами зачіпаються рядки таблиць, перетин яких є порожнім –
оскільки вони мають принаймні різні коди переказів). Тому ми явно не будемо вказувати ні номер переказу, ні
інформацію щодо нього.
Уточнення процедури авторизації. Нехай у нас є три таблиці: інформаційна (про перекази) Inf, автори-
заційна (журнал авторизацій та спроб) Auth та таблиця з інформацією щодо блокувань Block. Авторизаційна
таблиця містить кортежі зі станом спроб авторизації – “виплачено” (тобто авторизована виплата), “спроба
авторизації” (зараз відбувається, in progress) та “відмова” (із зазначенням причини). Розглянемо ситуацію
роботи з деяким переказом з кодом Invoice. Позначимо кількості рядків в цих таблицях наступним чином:
A – кількість виплат переказу Invoice, тобто кількість рядків таблиці Auth, які відносяться до Invoice та
мають статус “виплачено”,
P – кількість паралельних (одночасних) спроб авторизації (виплати) переказу, тобто кількість рядків таб-
лиці Auth, які відносяться до Invoice та мають статус “спроба авторизації”,
T – накопичувальна кількість всіх спроб виплати переказу, тобто загальна кількість рядків таблиці Auth,
які відносяться до Invoice,
B – блокування переказу (0 = немає, 1 = є), тобто останній стан блокування Invoice, згідно таблиці Block,
якщо такі записи є (1 – заблоковано або 0 – розблоковано), або 0, якщо немає відповідних записів в таблиці
Block.
Зрозуміло, що значення всіх змінних завжди є невід’ємними цілими числами (це – кількості рядків в таб-
лицях, окрім B, що приймає значення 0 або 1).
Тепер можна виписати процедуру авторизації у вигляді IPCL-програми над станом зі змінними A, P, T, B:
Auth_Prog =
(T, P) := (T +1, P +1); // фіксація спроби авторизації
if ( P = 1 ) then
if ( B = 0 ) then
if ( A = 0 ) then
if ( data_provided_correct() ) then
(A, P) := (A +1, P –1) // фіксація успішної авторизації
else P := P –1 // завершення авторизації відмовою
else P := P –1
else P := P –1
else P := P –1;
if ( T > 2 ) then B := 1 else Id;
де data_provided_correct() – предикат, що повертає True, коли передані дані щодо переказу є коректними згідно
бази даних переказів (таблиця Inf) та False у протилежному випадку.
Паралельно може виконуватись процес “розблокувати переказ”:
Unblock =
B := 0;
Семантика відповідних функцій алгебри IPCLA буде визначена природним чином:
sem (T, P) := (T +1, P +1) (d) d [ T (T(d) + 1), P (P(d) + 1) ],
sem P = 1 (d) IF ( P(d) = 1, True, False ),
Паралельне програмування. Розподілені системи і мережі
122
sem B = 0 (d) IF ( B(d) = 0, True, False ),
sem A = 0 (d) IF ( A(d) = 0, True, False ),
sem data_provided_correct() (d) choice (True, False),
sem (A, P) := (A +1, P –1) (d) d [ A (A(d) + 1), P (P(d) – 1) ],
sem P := P –1 (d) d [ P (P(d) – 1) ],
sem T > 2 (d) IF ( T(d) > 2, True, False ),
sem B := 1 (d) d [ B 1 ],
sem Id (d) d (identity, дане не змінюється),
sem B := 0 (d) d [ B 0 ],
де choice (A, B) – недетермінований вибір між значеннями A та B. Дане d має загальний вигляд
d = [ P p, T t, A a, B b ].
Таким чином, маємо програму в IPCL (точніше, в підкласі – SeqILProgs):
Program = Auth_Progn || Unblockm .
Оскільки у нас немає локальних даних (точніше, для спрощення ми від них відмовились – зокрема, в
data_provided_correct()), побудуємо спрощену модель (зі спрощеними станами) [7]. Після виконання алгоритму
розстановки міток отримаємо:
Auth_Prog =
[M1:] (T, P) := (T +1, P +1);
if [M2:] ( P = 1 ) then
if [M3:] ( B = 0 ) then
if [M4:] ( A = 0 ) then
if [M5:] ( data_provided_correct() ) then
[M6:] (A, P) := (A +1, P –1)
else [M7:] P := P –1
else [M8:] P := P –1
else [M9:] P := P –1
else [M10:] P := P –1;
if [M11:] ( T > 2 ) then [M12:] B := 1 else [M13:] Id;
[M14:]
Unblock =
[M15:] B := 0;
[M16:]
Множина SStates буде представляти собою підмножину N16D, згідно спрощеного варіанту методу,
де D = ND(V, W) – спільні глобальні дані для всіх процесів, причому {A, P, T, B}V та N{0}W.
Функція SStep (виконання програми Program) буде визначена за цим алгоритмом наступним чином:
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1–1, s2+1, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13,
s14, s15, s16, sem (T, P) := (T +1, P +1) (d)) ) | s1>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2–1, s3+1, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13,
s14, s15, s16, d) ) | s2>0 & iN16 siN & sem P = 1 (d)=True }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2–1, s3, s4, s5, s6, s7, s8, s9, s10+1, s11, s12, s13,
s14, s15, s16, d) ) | s2>0 & iN16 siN & sem P = 1 (d)=False }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3–1, s4+1, s5, s6, s7, s8, s9, s10, s11, s12, s13,
s14, s15, s16, d) ) | s3>0 & iN16 siN & sem B = 0 (d)=True }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3–1, s4, s5, s6, s7, s8, s9+1, s10, s11, s12, s13,
s14, s15, s16, d) ) | s3>0 & iN16 siN & sem B = 0 (d)=False }
Паралельне програмування. Розподілені системи і мережі
123
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4–1, s5+1, s6, s7, s8, s9, s10, s11, s12, s13,
s14, s15, s16, d) ) | s4>0 & iN16 siN & sem A = 0 (d)=True }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4–1, s5, s6, s7, s8+1, s9, s10, s11, s12, s13,
s14, s15, s16, d) ) | s4>0 & iN16 siN & sem A = 0 (d)=False }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5–1, s6+1, s7, s8, s9, s10, s11, s12, s13,
s14, s15, s16, d) ) | s5>0 & iN16 siN & sem data_provided_correct() (d)=True }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5–1, s6, s7+1, s8, s9, s10, s11, s12, s13,
s14, s15, s16, d) ) | s5>0 & iN16 siN & sem data_provided_correct() (d)=False }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6–1, s7, s8, s9, s10, s11+1, s12, s13,
s14, s15, s16, sem (A, P) := (A +1, P –1) (d)) ) | s6>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7–1, s8, s9, s10, s11+1, s12, s13,
s14, s15, s16, sem P := P –1 (d)) ) | s7>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8–1, s9, s10, s11+1, s12, s13,
s14, s15, s16, sem P := P –1 (d)) ) | s8>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9–1, s10, s11+1, s12, s13,
s14, s15, s16, sem P := P –1 (d)) ) | s9>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10–1, s11+1, s12, s13,
s14, s15, s16, sem P := P –1 (d)) ) | s10>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11–1, s12+1, s13,
s14, s15, s16, d) ) | s11>0 & iN16 siN & sem T > 2 (d)=True }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11–1, s12, s13+1,
s14, s15, s16, d) ) | s11>0 & iN16 siN & sem T > 2 (d)=False }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12–1, s13,
s14+1, s15, s16, sem B := 1 (d)) ) | s12>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13–1,
s14+1, s15, s16, sem Id (d)) ) | s13>0 & iN16 siN }
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14,
s15–1, s16+1, sem B := 0 (d)) ) | s15>0 & iN16 siN },
де si – кількість процесів, що знаходяться в позиції (на мітці) [Mi:] в даний момент часу.
Візьмемо
SStartStates = { (n, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, m, 0, d) | nN, mN, [ P 0, T 0, A 0, B 0 ] d }
та
SStopStates = { s | s=(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, n, 0, m, d’) & nN & mN & s1, s2, …, sl
(s1SStartStates & sl=s & (iNl-1 (si, si+1)SStep) ) }.
В даній постановці модель можна розглядати як таку, що описує повний шлях існування (“життєвий
цикл”) певного переказу (його спроби авторизації – вдалі та невдалі, блокування та розблокування спеціаль-
ним оператором). Оскільки n та m (ступені підпрограм) можуть бути довільними цілими невід’ємними чис-
лами, то, дійсно, модель задає довільний можливий шлях роботи з будь-яким одним переказом (іншими сло-
вами, сімейство програм). Обробка різних переказів не перетинається – такі процеси обробки переказів не
інтерферують. До речі, програма P, зокрема, може перетворитись на послідовне виконання її підпрограм (в
довільному ступені), згідно заданої семантики мови IPCL та алгоритму побудови моделі – така ситуація, ма-
буть, найчастіше виникає на практиці. Але разом з тим програма (і модель) передбачає можливість перетина-
тись довільним чином операторам (окремим діям) паралельних процесів (згідно заданої семантики – та прин-
ципів паралелізму з почерговим виконанням, interleaving concurrency). Отже, модель передбачає і описує всі
можливі траси виконання програми Program та системи (авторизації виплати переказів), що моделюється.
Паралельне програмування. Розподілені системи і мережі
124
Доведення коректності
Таким чином, необхідно довести властивість A1, якщо на початку роботи A1, тобто {A1} Program
{A1}.
Якщо
PreCond(S) = (A(d)1), PostCond(S) = (A(d)1),
де
S = (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то необхідно показати, що
SSStartStates S’SStopStates (PreCond(S) & (S, S’)SStep PostCond(S)).
Розглянемо
Inv(S) (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ),
де
S = (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d).
Цей інваріант, насправді, досить легко утворити, розуміючи логіку програми та описані вище критичні
місця. Так, він вказує, що кількість паралельних (конкуруючих) процесів, які намагаються безпосередньо авто-
ризувати даний переказ, не може бути більше одного (s3+s4+s5+s61) – умова (P=1) відсікає інші можливості,
при цьому значення A може бути лише 0 або 1. Якщо ж значення є вже 1 (переказ авторизовано і виплачено), то
жоден процес не потрапить в “зону безпосередньої авторизації” ( (A(d)=1) & (s5=0) & (s6=0) ). Ще додається
одна умова “цілісності” – оператори виконуються у відповідній послідовності, “фантомні” (нові по ходу вико-
нання) програми (підпрограми авторизації) не виникають, а кількість програм в точках перевірки (s2, s3, s4, s5, s6,
s7, s8, s9, s10) дорівнює кількості паралельних спроб авторизації даного переказу (P). Більш того, в інваріанті не
фігурує змінна B, тобто блокування несуттєво впливають на хід авторизації (з точки зору інтерференції та пара-
лелізму), що зрозуміло з логіки програми. (Отже, оператори, пов’язані з блокуванням, можна було б взагалі
опустити з моделі та аналізу.)
Згідно методики доведемо, що
InvCond(Inv, PreCond, PostCond) = True,
де
InvCond(Inv, PreCond, PostCond) = SSStartStates ( PreCond(S) Inv(S) ) &
SSStopStates ( Inv(S) PostCond(S) ) & (S, S’)SStep ( Inv(S) Inv(S’) ),
а також перевіримо, що SSStartStates PreCond(S). Тоді будемо мати SSStopStates PostCond(S).
Оскільки для кожного
SSStartStates, де S = (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
маємо
s2=s3=s4=s5=s6=s7=s8=s9=s10=0, P(d)=0 та A(d)=0 A(d)=1,
що випливає з (A(d)1), тобто PreCond(S), то SSStartStates ( PreCond(S) Inv(S) ).
Покажемо, що
SSStates ( Inv(S) PostCond(S) ).
Очевидно,
{ (A(d)=0) A(d)1, (A(d)=1) A(d)1 ( (A(d)=1) & (s5=0) & (s6=0) ) A(d)1 }
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) A(d)1 (s3+s4+s5+s61) &
(s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) )
A(d)1 = Inv(S) PostCond(S).
Отже, зокрема,
SSStopStates ( Inv(S) PostCond(S) ).
Залишається довести, що
(S, S’)SStep ( Inv(S) Inv(S’) ).
Розглянемо всі пари (S, S’)SStep і покажемо, що для кожної такої пари спрощених станів якщо Inv(S), то
і Inv(S’). Дослідимо множини пар станів (S, S’)SStep “по частинах” (множини “однотипних” перетворень).
Паралельне програмування. Розподілені системи і мережі
125
1. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1–1, s2+1, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15,
s16, sem (T, P) := (T +1, P +1) (d)) ) | s1>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) &
(s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & ((s2+1)+s3+s4+s5+s6+s7+s8+s9+s10=P(d’))
& ( (A(d’)=0) ( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де
d’ = sem (T, P) := (T +1, P +1) (d) = d [ T (T(d) + 1), P (P(d) + 1) ].
Таким чином,
P(d’) = P(d) + 1, а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & ((s2+1)+s3+s4+s5+s6+s7+s8+s9+s10=P(d)+1) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
2. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2–1, s3+1, s4, s5, s6, s7, s8, s9, s10, s11, s12,
s13, s14, s15, s16, d) ) | s2>0 & iN16 siN & sem P = 1 (d)=True }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem P = 1 (d) = (P(d) = 1) = True, тобто P(d) = 1,
то з
(s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)), P(d) = 1 та s2>0
випливає, що
s2=1 та s3=s4=s5=s6=s7=s8=s9=s10=0,
тоді, враховуючи
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = True, Inv(S’) = ((s3+1)+s4+s5+s61) &
((s2–1)+(s3+1)+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = True.
3. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2–1, s3, s4, s5, s6, s7, s8, s9, s10+1, s11, s12,
s13, s14, s15, s16, d) ) | s2>0 & iN16 siN & sem P = 1 (d)=False }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem P = 1 (d) = (P(d) = 1) = False,
то
Inv(S’) = (s3+s4+s5+s61) & ((s2–1)+s3+s4+s5+s6+s7+s8+s9+(s10+1)=P(d)) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
4. Розглянемо (S, S’)SStep :
Паралельне програмування. Розподілені системи і мережі
126
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3–1, s4+1, s5, s6, s7, s8, s9, s10, s11, s12,
s13, s14, s15, s16, d) ) | s3>0 & iN16 siN & sem B = 0 (d)=True }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) )
= True, де S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem B = 0 (d) = (B(d) = 0) = True,
то
Inv(S’) = ((s3–1)+(s4+1)+s5+s61) & (s2+(s3–1)+(s4+1)+s5+s6+s7+s8+s9+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
5. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3–1, s4, s5, s6, s7, s8, s9+1, s10, s11, s12, s13,
s14, s15, s16, d) ) | s3>0 & iN16 siN & sem B = 0 (d)=False }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) &
(s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem B = 0 (d) = (B(d) = 0) = False,
то легко побачити, що
Inv(S’) = ((s3–1)+s4+s5+s61) & (s2+(s3–1)+s4+s5+s6+s7+s8+(s9+1)+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
адже з Inv(S) логічно випливає Inv(S’).
6. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4–1, s5+1, s6, s7, s8, s9, s10, s11, s12,
s13, s14, s15, s16, d) ) | s4>0 & iN16 siN & sem A = 0 (d)=True }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) &
(s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem A = 0 (d) = (A(d) = 0) = True, тобто A(d) = 0, то
Inv(S’) = (s3+(s4–1)+(s5+1)+s61) & (s2+s3+(s4–1)+(s5+1)+s6+s7+s8+s9+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & ((s5+1)=0) & (s6=0) ) ) = True,
адже перші два кон’юнкти – істинні з передумови (Inv(S) = True), а третій – оскільки A(d) = 0.
7. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4–1, s5, s6, s7, s8+1, s9, s10, s11, s12,
s13, s14, s15, s16, d) ) | s4>0 & iN16 siN & sem A = 0 (d)=False }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) &
(s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem A = 0 (d) = (A(d) = 0) = False,
то
Паралельне програмування. Розподілені системи і мережі
127
Inv(S’) = (s3+(s4–1)+s5+s61) & (s2+s3+(s4–1)+s5+s6+s7+(s8+1)+s9+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = True (з Inv(S)
логічно випливає Inv(S’)).
8. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5–1, s6+1, s7, s8, s9, s10, s11, s12,
s13, s14, s15, s16, d) ) | s5>0 & iN16 siN & sem data_provided_correct() (d)=True }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) &
(s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem data_provided_correct() (d) = (choice (True, False)) = True,
звідси, враховуючи s5>0, маємо s5=1 та s3=s4=s6=0 (випливає з істинності першого кон’юнкта Inv(S)), звідси
( (A(d)=1) & (s5=0) & (s6=0) ) = False, тому (A(d)=0) = True,
щоб
( (A(d)=0) ( (A(d)=1) & (s5=0) &(s6=0) ) ) = True,
тоді, очевидно,
Inv(S’) = (s3+s4+(s5–1)+(s6+1)1) & (s2+s3+s4+(s5–1)+(s6+1)+s7+s8+s9+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & ((s5–1)=0) & ((s6+1)=0) ) ) = True.
9. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5–1, s6, s7+1, s8, s9, s10, s11, s12,
s13, s14, s15, s16, d) ) | s5>0 & iN16 siN & sem data_provided_correct() (d)=False }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) &
(s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також
sem data_provided_correct() (d) = (choice (True, False)) = False,
звідси, враховуючи s5>0, маємо s5=1 та s3=s4=s6=0 (випливає з істинності першого кон’юнкта Inv(S)), звідси
( (A(d)=1) & (s5=0) & (s6=0) ) = False, тому (A(d)=0) = True,
щоб третій кон’юнкт ( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
тоді
Inv(S’) = (s3+s4+(s5–1)+s61) & (s2+s3+s4+(s5–1)+s6+(s7+1)+s8+s9+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & ((s5–1)=0) & (s6=0) ) ) = True
(перший і другий кон’юнкти випливають з Inv(S), а третій є істинним за рахунок (A(d)=0) = True).
10. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6–1, s7, s8, s9, s10, s11+1, s12,
s13, s14, s15, s16, sem (A, P) := (A +1, P –1) (d)) ) | s6>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), а також s6>0,
то
Inv(S’) = (s3+s4+s5+(s6–1)1) & (s2+s3+s4+s5+(s6–1)+s7+s8+s9+s10=P(d’)) & ( (A(d’)=0)
( (A(d’)=1) & (s5=0) & ((s6–1)=0) ) ),
де
Паралельне програмування. Розподілені системи і мережі
128
d’ = sem (A, P) := (A +1, P –1) (d) = d [ A (A(d) + 1), P (P(d) – 1) ].
Таким чином, P(d’) = P(d) – 1, а A(d’) = A(d) + 1.
Тепер, з Inv(S) = True випливає, що
s3+s4+s5+s61, s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d) та (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) = True.
Оскільки s6>0, то
True = ( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) & (s6>0) = (A(d)=0) & (s6>0) (A(d)=1) &
(s5=0) & (s6=0) & (s6>0) = (A(d)=0) & (s6>0) False = (A(d)=0) & True = (A(d)=0).
Далі, за визначенням спрощеного стану, перші 16 компонент є невід’ємними цілими числами, а отже, з
s3+s4+s5+s61 та s6>0 випливає, що s6=1 та s3=s4=s5=0.
Звідси,
Inv(S’) = (s3+s4+s5+(s6–1)1) & (s2+s3+s4+s5+(s6–1)+s7+s8+s9+s10=P(d)–1) &
( (A(d)+1=0) ( (A(d)+1=1) & (s5=0) & ((s6–1)=0) ) ).
Перші два кон’юнкти мають значення True (очевидно, випливає з Inv(S) = True). Далі, з A(d)=0, s5=0 та s6=1
випливає, що
(A(d)+1=1) & (s5=0) & ((s6–1)=0) = True,
тобто і третій кон’юнкт має значення True. Таким чином, Inv(S’) = True.
11. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7–1, s8, s9, s10, s11+1, s12,
s13, s14, s15, s16, sem P := P –1 (d)) ) | s7>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+(s7–1)+s8+s9+s10=P(d’)) &
( (A(d’)=0) ( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де d’ = sem P := P –1 (d) = d [ P (P(d) – 1) ].
Таким чином, P(d’) = P(d) – 1, а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+(s7–1)+s8+s9+s10=P(d)–1) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
12. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8–1, s9, s10, s11+1, s12,
s13, s14, s15, s16, sem P := P –1 (d)) ) | s8>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0) ( (A(d)=1) & (s5=0) &
(s6=0) ) ) = True, де S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+(s8–1)+s9+s10=P(d’)) & ( (A(d’)=0)
( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де d’ = sem P := P –1 (d) = d [ P (P(d) – 1) ].
Таким чином, P(d’) = P(d) – 1, а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+(s8–1)+s9+s10=P(d)–1) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
13. Розглянемо (S, S’)SStep :
Паралельне програмування. Розподілені системи і мережі
129
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9–1, s10, s11+1, s12,
s13, s14, s15, s16, sem P := P –1 (d)) ) | s9>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+(s9–1)+s10=P(d’)) & ( (A(d’)=0)
( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де d’ = sem P := P –1 (d) = d [ P (P(d) – 1) ].
Таким чином, P(d’) = P(d) – 1, а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+(s9–1)+s10=P(d)–1) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
14. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10–1, s11+1, s12,
s13, s14, s15, s16, sem P := P –1 (d)) ) | s10>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+(s10–1)=P(d’)) &
( (A(d’)=0) ( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де d’ = sem P := P –1 (d) = d [ P (P(d) – 1) ].
Таким чином, P(d’) = P(d) – 1, а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+(s10–1)=P(d)–1) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
15. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11–1, s12+1,
s13, s14, s15, s16, d) ) | s11>0 & iN16 siN & sem T > 2 (d)=True }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem T > 2 (d) = (T(d) > 2) = True,
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
16. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11–1, s12,
s13+1, s14, s15, s16, d) ) | s11>0 & iN16 siN & sem T > 2 (d)=False }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
Паралельне програмування. Розподілені системи і мережі
130
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
а також sem T > 2 (d) = (T(d) > 2) = False,
то
Inv(S’) = (s3+s4+s5+s61) & (s2+ s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
17. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11,
s12–1, s13, s14+1, s15, s16, sem B := 1 (d)) ) | s12>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d’)) & ( (A(d’)=0)
( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де d’ = sem B := 1 (d) = d [ B 1 ].
Таким чином, P(d’) = P(d), а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
18. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10,
s11, s12, s13–1, s14+1, s15, s16, sem Id (d)) ) | s13>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d’)) &
( (A(d’)=0) ( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де d’ = sem Id (d) = d.
Таким чином, P(d’) = P(d), а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
19. Розглянемо (S, S’)SStep :
{ ( (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d), (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11,
s12, s13, s14, s15–1, s16+1, sem B := 0 (d)) ) | s15>0 & iN16 siN }
якщо
Inv(S) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) & ( (A(d)=0)
( (A(d)=1) & (s5=0) & (s6=0) ) ) = True,
де
S=(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, d),
то
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d’)) &
( (A(d’)=0) ( (A(d’)=1) & (s5=0) & (s6=0) ) ),
де d’ = sem B := 0 (d) = d [ B 0 ].
Паралельне програмування. Розподілені системи і мережі
131
Таким чином, P(d’) = P(d), а A(d’) = A(d).
Звідси,
Inv(S’) = (s3+s4+s5+s61) & (s2+s3+s4+s5+s6+s7+s8+s9+s10=P(d)) &
( (A(d)=0) ( (A(d)=1) & (s5=0) & (s6=0) ) ) = Inv(S) = True.
Доведення завершене.
Маємо:
- SSStartStates ( PreCond(S) Inv(S) ),
- SSStates ( Inv(S) PostCond(S) ),
- (S, S’)SStep ( Inv(S) Inv(S’) ).
Тобто,
InvCond(Inv, PreCond, PostCond) = True.
Звідси {A1} Program {A1}.
Очевидно, що
SSStartStates PreCond(S),
адже на початку роботи Program записів в таблиці Auth немає і [ A 0 ]. Тоді автоматично отримаємо
SSStopStates PostCond(S)
як наслідок щойно доведеного
InvCond(Inv, PreCond, PostCond) = True.
Але
SSStates ( Inv(S) PostCond(S) ),
звідси необхідна умова (PostCond(S)) виконується на кожному досяжному кроці виконання програми Program.
Тобто, фактично, було доведено більш сильне твердження – а саме, що програма є коректною і не порушує за-
дану умову (A1) не лише на початку і в кінці, а і на протязі всього часу виконання, тобто на кожному кроці.
Тотальна коректність
Оскільки програма не має циклів, ані блокувань, ані інших затримуючих або непередбачуваних факторів,
які можуть «зациклити», або зупинити, або якимось чином затримати виконання – вона обов’язково завершить
роботу за скінчену кількість кроків. Очевидне обмеження на кількість кроків – n * 9 + m, де 9 – діаметр графу
переходів між мітками програми Auth_Prog.
Висновки
Застосовано спрощений метод [7] доведення властивостей interleaving concurrency програм у IPCL [1–3]
для доведення властивості коректної роботи банківської системи виплати міжнародних грошових переказів. Це
доведення є черговим підтвердженням [8–10] та демонстрацією зручності та адекватності застосування методу
для доведення властивостей програмних систем, що виконуються у режимі паралелізму з переключенням та
взаємодіють через спільну пам’ять – наприклад, серверних компонент клієнт-серверних комплексів, програм у
архітектурі SMP та паралельних середовищ на кшталт суперкомп’ютерів.
1. Панченко Т.В. Метод доведення властивостей програм в композиційно-номінативних мовах IPCL // Проблеми програмування. – 2008.
– №1. – С. 3–16.
2. Панченко Т.В. Методологія доведення властивостей програм в композиційних мовах IPCL // Доповіді Міжнародної конференції “Тео-
ретичні та прикладні аспекти побудови програмних систем” (TAAPSD’2004). – К., 2004. – С. 62–67.
3. Панченко Т.В. Композиційні методи специфікації та верифікації програмних систем. – Автореферат дис. … канд. фіз.-мат. наук. – К.,
2006. – 17 с.
4. Беренсон Х., Бернштейн Ф., Грэй Д. и др. Критика уровней изолированности в стандарте ANSI SQL // СУБД. – 1996. – № 2. –
С. 45–60.
5. Редько В.Н., Брона Ю.Й., Буй Д.Б., Поляков С.А. Реляційні бази даних: табличні алгебри та SQL-подібні мови. – К.: Видавничий дім
“Академперіодика”, 2001. – 198 с.
6. Басараб И.А., Никитченко Н.С., Редько В.Н. Композиционные базы данных. – К.: Либідь, 1992. – 191 с.
7. Панченко Т.В. Модель спрощеного стану для методу доведення властивостей в мовах IPCL та її застосування і переваги // Доповіді
міжнародної наукової конференції TAAPSD`2007. – Berdyansk, 2007. – С. 319–322.
8. Polishchuk N.V., Kartavov M.O. and Panchenko T.V. Safety Property Proof using Correctness Proof Methodology in IPCL // Proceedings of the
5th International Scientific Conference “Theoretical and Applied Aspects of Cybernetics”. – Kyiv: Bukrek, 2015. – P. 37–44.
Паралельне програмування. Розподілені системи і мережі
132
9. Картавов М.О., Панченко Т.В., Поліщук Н.В. Доведення тотальної коректності системи Infosoft e-Detailing у IPCL // Вісник Київського
національного університету імені Тараса Шевченка. Серія: фіз.-мат. науки. – 2015. – Вип. 3. – С. 80–83.
10. Kartavov M. Properties Proof Method in IPCL Application To Real-World System Correctness Proof / M. Kartavov, T. Panchenko, N.
Polishchuk // International Journal "Information Models and Analyses". – Sofia, Bulgaria: ITHEA. – 2015. – Vol. 4, N 2. – P. 142–155.
References
1. PANCHENKO, T. (2008) The Method for Program Properties Proof in Compositional Nominative Languages IPCL [in Ukrainian]. Problems
of Programming. 1. pp. 3–16.
2. PANCHENKO, T. (2004) The Methodology for Program Properties Proof in Compositional Languages IPCL [in Ukrainian]. In Proceedings of
the International Conference "Theoretical and Applied Aspects of Program Systems Development" (TAAPSD'2004). Kyiv. pp. 62–67.
3. PANCHENKO, T. (2006) Compositional Methods for Software Systems Specification and Verification (PhD Thesis Synopsis) [in Ukrainian].
Kyiv. 17 p.
4. BERENSON, Kh., BERNSTEIN, F. And GREY, D. (1996) Critique of Isolation Levels in ANSI SQL Standard [in Russian]. DBMS, no. 2,
pp. 45–60.
5. REDKO, V., BRONA, Yu., BUY, D. and POLYAKOV, S. (2001) Relational Databases: Table Algebras and SQL-like Languages [in
Ukrainian]. Kyiv, “Akademperiodika”, 198 p.
6. BASARAB, I., NIKITCHENKO, M. and REDKO, V. (1992) Compositional Databases [in Russian]. Kyiv, “Lybid”, 191 p.
7. PANCHENKO, T. (2007) The Simplified State Model for Properties Proof Method in IPCL Languages and its use and advantages [in
Ukrainian]. In Proceedings of the International Conference "Theoretical and Applied Aspects of Program Systems Development"
(TAAPSD'2007). Berdyansk. pp. 319–322.
8. POLISHCHUK, N.V., KARTAVOV, M.O. and PANCHENKO, T.V. (2015) Safety Property Proof using Correctness Proof Methodology in
IPCL. In Proceedings of the 5th International Scientific Conference “Theoretical and Applied Aspects of Cybernetics”, Kyiv, Bukrek, pp.37-44.
9. KARTAVOV, M.O., PANCHENKO, T.V. and POLISHCHUK, N.V. (2015) Infosoft e-Detailing System Total Correctness Proof in IPCL [in
Ukrainian], Bulletin of Taras Shevchenko National University of Kyiv. Series: Physical and Mathematical Sciences, no. 3, pp. 80–83.
10. KARTAVOV, M., PANCHENKO, T. and POLISHCHUK, N. (2015) Properties Proof Method in IPCL Application To Real-World System
Correctness Proof. International Journal "Information Models and Analyses", Sofia, Bulgaria, ITHEA, Vol. 4, no. 2, pp. 142–155.
Про авторів:
Остаповська Юлія Аркадіївна,
студентка 4 курсу кафедри Теорії та технології програмування факультету кібернетики.
Кількість наукових публікацій в українських виданнях – 1.
http://orcid.org/0000-0002-8865-2139,
Панченко Тарас Володимирович,
кандидат фізико-математичних наук, доцент,
доцент кафедри Теорії та технології програмування факультету кібернетики.
Кількість наукових публікацій в українських виданнях – 27.
Кількість наукових публікацій в іноземних виданнях – 2.
http://orcid.org/0000-0003-0412-1945,
Поліщук Наталія Володимирівна,
студентка 4 курсу кафедри Теорії та технології програмування факультету кібернетики.
Кількість наукових публікацій в українських виданнях – 3.
Кількість наукових публікацій в іноземних виданнях – 1.
http://orcid.org/0000-0001-6936-0053,
Картавов Микита Олексійович,
студент 4 курсу кафедри Теорії та технології програмування факультету кібернетики.
Кількість наукових публікацій в українських виданнях – 3.
Кількість наукових публікацій в іноземних виданнях – 1.
http://orcid.org/0000-0002-2020-3468.
Місце роботи авторів:
Київський національний університет імені Тараса Шевченка,
03680, Київ, проспект Академіка Глушкова, 4Д.
Тел.: 259 0519.
E-mail: tp@infosoft.ua
|