Ві́денський ме́тод розро́бки (англ. Vienna Development Method, VDM) — набір технологій для моделювання комп'ютерних систем, аналізу створених моделей і переходу до деталізованого проектування та програмування. Один з найстаріших формальних методів, вплинув на розвиток багатьох інших, як Z, , та B. За його спиною стоять інструменти промислової якості, та стандарт ISO. Метод з'явився в результаті роботи віденської лабораторії IBM в середині 70-тих. Нотація та допоміжні інструменти з того часу постійно розвивались, і сьогодні метод застосовується до широкого кола задач.
Має розширення VDM++, для об'єктно-орієнтованих систем.
Філософія
Обчислювальні системи можуть бути змодельованими через мову VDM-SL на вищому рівні абстракції ніж той, що може бути досягнутий використанням мов програмування. Це дозволить аналізувати проектування та означення ключових властивостей, враховуючи також дефекти на ранніх стадіях розробки. Моделі, які були проаналізовані, можуть бути переведені в детальний проект системи через процес вдосконалення та фільтрації. Мова має формальну семантику, що дозволяє доводити властивості моделей з високим ступенем впевненості. Також мова має виконувану підмножину, тому моделі можна аналізувати через тестування. Виконуються моделі через графічний інтерфейс, тому можуть бути оціненими експертами, яким не обов'язково знайомитись із самою мовою моделювання.
Можливості VDM
Синтаксис та семантика VDM-SL і VDM++ детально описуються в інструкціях до VDMTools. Стандарт ISO містить формальний опис семантики мови. В решті цієї статті використовується описаний ISO синтаксис для обміну (ASCII). Деякі тексти потребують точнішого математичного запису.
Модель VDM-SL — це опис системи, що дається в термінах функцій, які виконуються над даними. Він складається з описів типів даних і функцій та операцій, що застосовуються до цих типів.
Базові типи: числові, символьні, лексеми, посилання
VDM-SL включає наступні типи, що моделюють числа та символи:
Базові типи | ||
---|---|---|
Тип | Пояснення | Значення |
bool | Булевий тип | false, true |
nat | Натуральне число (включно з нулем) | 0, 1, 2, 3, … |
nat1 | Натуральне число (без нуля) | 1, 2, 3, 4, … |
int | Ціле число | …, −3, −2, −1, 0, 1, 2, 3, … |
rat | Раціональне число | a/b, де a та b цілі, b не 0 |
real | Дійсне число | … |
char | Символи | A, B, C, … |
token | Неструктуровані лексеми | … |
<A> | тип quote, що містить значення <A> | … |
Типи даних описуються для представлення основних даних системи, що моделюється. Опис кожного типу представляє нове ім'я типу, і дає представлення в термінах базових типів, або типів, що вже були описані. Наприклад тип, що моделює ідентифікатор користувача в системі керування аккаунтами, може бути описаний так:
types UserId = nat
Для маніпулювання значеннями які належать типам, описуються оператори. Цілочисельне додавання, віднімання і інше даються вже готовими, так як і булеві оператори такі як рівність та нерівність. Мова не фіксує мінімальне чи максимальне можливе число, чи точність для дійсних чисел. Такі обмеження описуються в міру необхідності для кожної моделі, за допомогою інваріантів типів даних — булевих виразів, які описують вимоги, яких мають притримуватись всі елементи описуваного типу. Наприклад вимога того що ідентифікатор користувача має бути не більшим за 9999 може бути описаний так (де <=
означає булевий оператор «менше чи рівне» для натуральних чисел):
UserId = nat inv uid == uid <= 9999
Так як інваріанти можуть бути доволі складними логічними виразами, і входження в описуваний тип обмежується тільки значеннями що задовольняють інваріант, то коректність типів в VDM-SL перевіряється автоматично не у всіх ситуаціях.
Інші базові типи включають char
для символів. В деяких випадках представлення типу не стосується цілей моделі і тільки додає складності. В таких випадках члени типу представляються як безструктурні токени. Значення на типах токенів можуть тільки перевірятись на рівність — і не описано ніяких інших операцій. Де потрібні особливі, іменовані значення вводиться тип quote. Кожен такий тип складається з однієї змінної що однойменна типу. Значення типу quote (також відомі як quote literals) можуть тільки перевірятись на рівність.
Наприклад, в моделюванні світлофора, зручно описати значення, що представляють кольори сигналів, як quote types:
<Red>, <Amber>, <FlashingAmber>, <Green>
Конструктори типів: Об'єднання, Добуток та композитні типи
Базові типи дуже обмежені. Зате можна створювати більш структуровані типи за допомогою конструкторів.
Конструктори базових типів | |
---|---|
T1 T2 … Tn | Об'єднання типів T1,...,Tn |
T1*T2*...*Tn | Декартовий добуток типів T1,...,Tn |
T :: f1:T1 ... fn:Tn | Композитний (Структурний) тип |
Найпростіший конструктор — об'єднання базових типів. Тип A | B
містить всі елементи типу A
і всі елементи типу B
. В прикладі зі світлофором, тип що моделює колір сигналу може бути записаний так:
SignalColour = <Red> | <Amber> | <FlashingAmber> | <Green>
Всі зазначені типи в VDM-SL описуються аналогічно тому, як показано вище, за допомогою об'єднання quoute types.
Декартів добуток також описується в VDM-SL. Тип (A1*…*An)
є типом що включає всі кортежі значень, перший елемент якого належить типу A1
другий типу A2
і так далі. Композитний тип аналогічний декартовому добутку, тільки має ще ідентифікатори полів. Тип
T :: f1:A1 f2:A2 ... fn:An
є декартовим добутком з полями позначеними f1,…,fn
. Елемент типу T
може бути сконструйованим з його складових частин конструктором, який записується як mk_T
. І навпаки, якщо даний елемент типу T
, то імена полів можна використати для доступу до компонентів. Наприклад тип:
Date :: day:nat1 month:nat1 year:nat inv mk_Date(d,m,y) == day <=31 and month<=12
моделює простий тип дати. Значення mk_Date(1,4,2001)
відповідає 1 квітня 2001. Якщо дана дата d
, то вираз d.month
є натуральним числом, що представляє місяць. Обмеження на кількість днів в місяці і високосні роки можуть бути включені в інваріант.
Колекції: Множини, Відображення та Послідовності
Типи колекцій моделюють групи значень. Множини є скінченними невпорядкованими колекціями, в яких не дозволяється зберігати дублікати значень. Послідовності є скінченними впорядкованими колекціями (списками), в яких можна зберігати дублікати, і відображення представляють скінченні відповідності між двома множинами значень.
Конструктор типу «множина» (пишеться set of T
де T
це попередньо описаний тип) створює тип, в який входять всі скінченні множини значень що беруться з типу T
. Наприклад, опис типу
UGroup = set of UserId
описує тип UGroup
що складається з усіх скінченних множин зі значень UserId
. Над множинами описуються різні оператори, для конструювання їх об'єднання, перетину, визначення строгого та нестрогого включення і т. д.
Основні оператори на множинах (s, s1, s2 — множини) | |
---|---|
{a, b, c} | Перечислення множини : множина з елементів a , b і c |
x x:T & P(x) | Включення множини: множина елементів x з типу T для яких виконується P(x) |
{i, ..., j} | Множина цілих від i до j |
e in set s | e є елементом множини s |
e not in set s | e не є елементом множини s |
s1 union s2 | Об'єднання множин s1 та s2 |
s1 inter s2 | Перетин множин s1 та s2 |
s1 \ s2 | Теоретико-множинна різниця s1 та s2 |
dunion s | Об'єднання множин що входять до множини s |
s1 psubset s2 | s1 входить (строго) в s2 |
s1 subset s2 | s1 підмножина s2 |
card s | Потужність (cardinality) множини s |
Конструктор скінченної послідовності (пишеться seq of T
де T
тип визначений раніше) утворює тип, в який входять всі скінченні списки значень взятих з типу T
. Наприклад, означення типу
String = seq of char
Описує тип String
що утворений з усіх скінченних рядків символів. Задаються оператори для конструювання конкатенацій, вибору елементів та підпослідовностей і т.і. Багато з цих операцій є частковими, тобто можуть використовуватись не у всіх випадках. Наприклад, операція вибору п'ятого елементу послідовності що містить тільки три елементи є невизначеною.
Порядок та повторення елементів в послідовності є важливими, тому [a, b]
не дорівнює [b, a]
, і [a]
не дорівнює [a, a]
.
Основні оператори на послідовностях (s, s1,s2 — послідовності) | |
---|---|
[a, b, c] | Перелічення послідовності: послідовність елементів a , b та c |
[f(x) x:T & P(x)] | Включення послідовності: послідовність виразів f(x) для кожного x з (числового) типу T , для якого винонується P(x) (x значення x беруться в порядку зростання) |
hd s | Голова (перший елемент) s |
tl s | Хвіст (все що залишилось від s після того як відірвали голову) |
len s | Довжина s |
elems s | Множина елементів s |
s(i) | i -тий елемент s |
s1^s2 | послідовність утворена за допомогою конкатенації послідовностей s1 та s2 |
Скінченне відношення є відповідністю між двома множинами, множиною визначення (доменом) та множиною значень, в якій домен індексує значення. Це аналогічно до скінченної функції. Конструктор типу відношення в VDM-SL (пишеться як map T1 to T2
, де T1
та T2
є попередньо визначеними типами) конструює тип, що містить усі скінченні відношення з множин типу T1
на множини з T2
. Наприклад, визначення типу
Birthdays = map String to Date
Задає тип Birthdays
який відображає рядки символів в дати. Знову ж таки, описуються оператори для відношень.
Основні оператори на відношеннях | |
---|---|
{a -> r, b -> s} | Перелічення відношеня: a відображається в r , b відображається в s |
{x -> f(x) x:T & P(x)} | Задання відношення: x відображається в f(x) для всіх x з типу T для яких виконується P(x) |
dom m | Множина визначення (домен) m |
rng m | Множина значень (range) m |
m(x) | m застосоване до x |
m1 munion m2 | Об'єднання відношень m1 та m2 (m1 , m2 мають бути сумісними там де вони накладаються) |
m1 ++ m2 | m2 накласти на m1 . |
Структурування
Основна відмінність між VDM-SL та VDM++ полягає в тому, як вони справляються з структуризацією. В VDM-SL є консервативне модульне розширення, а VDM++ має традиційно об'єктно-орієнтований механізм структуризації.
Структуризація в VDM-SL
Стандарт ISO для VDM-SL є інформативним додатком, що містить різні принципи структуризації. Існують такі традиційні принципи приховування інформації з модулями:
- Іменування модулів: Кожен модуль синтаксично починається ключовим словом
module
після якого пишуть ім'я модуля. В кінці модуля пишуть ключове словоend
після якого також стоїть ім'я модуля. - Імпорт: Можливо імпортувати описи які експортуються в інші модулі. Це робиться в розділі імпорту який почитається з слова
imports
і продовжується послідовністю імпортів з різних модулів. Кожен з цих імпортів починається з словаfrom
, потім ім'я модуля, і підписів модуля. Підписами модуля може бути як просто словоall
, що вказує на імпорт всіх описів які експортуються з того модуля, або послідовністю конктретно вказаних описів. Підписи імпорту окремі для типів, значень, функцій та операцій і кожен з таких підписів починається з відповідного ключового слова. На додаток, ці підписи імпорту іменують конструкції до яких хочуть отримати доступ. Також може бути присутня додаткова інформація типу, і наостанок є можливість перейменувати кожну конструкцію що імпортується. Також, якщо потрібна можливість доступу до складових типу, при його імпорті потрібно вживати ключове словоstruct
- Експорт:Якщо модуль хоче дати іншим модулям доступ до своїх описів, він має експортувати їх ключовим словом
exports
після якого пишуть підписи що експортуються з нього. Підписи що експортуються можуть бути як ключовим словомall
так і послідовністю конкретних підписів. Такі підписи задаються окремо для типів, значень, функцій і операцій кожна з яких починається з відповідного ключового слова. В випадку коли хтось хоче експортувати внутрішню структуру типу, треба використати ключове словоstruct
. - Особливіші можливості: В попередніх версіях VDM-SL tools також була підтримка модулів з параметрами, та реалізації таких модулів. Тим не менш, такі можливості були видалені з VDMTools близько 2000-го бо майже ніколи не використовувались в промислових програмах та не було значної кількості інструментів з такими можливостями.
Структуризація VDM++
В VDM++ структуризація проводиться з використанням класів та множинного наслідування. Ключовими концептами є:
- Клас: Кожен клас синтаксично починається з ключового слова
class
за яким слідує ім'я класу. В кінці класу стоїть словоend
за яким також слідує ім'я класу. - Наслідування: Якщо клас наслідує конструкції з інших класів, після імені класу може стояти ключове слово
is subclass of
за яким іде список імен предків, розділених комами. - Модифікатори доступу: Приховування інформації в VDM++ робиться як і в більшості об'єктно-орієнтованих мов, з використанням модифікаторів доступу. В VDM++ описи є за замовчуванням приватними, але можна використати одне з ключових слів, для зміни доступу:
private
,public
чиprotected
.
Моделювання функціональності
Функціональне моделювання
В VDM-SL, функції описуються над типами даних описаними в моделі. Підтримка абстрагування вимагає щоб можна було характеризувати результат який має давати функція без потреби казати як саме вона має бути обчислена. Основним механізмом для здійснення цього є неявний опис функції в якому замість формули яка обчислює результат дають логічний предикат над вхідною та вихідною змінною, названий постумовою, що дає нам властивості результату. Наприклад функція SQRT
для обчислення квадратного кореня натурального числа може описуватись так:
SQRT(x:nat)r:real post r*r = n
Тут постумова не описує метод для обчислення результату r
, але вказує які властивості він має мати. Зауважте, що це описує функцію, яка повертає правильний квадратний корінь; немає вимоги, щоб це був додатний чи від'ємний корінь. Наприклад можна задати функцію що повертає від'ємний корінь з 4 але додатній з усіх інших вводів. Також варто зауважити, що функції в VDM-SL мають бути детерміновані тобто функція завжди має повертати одні і ті самі результати на одних і тих самих даних.
Строгіша специфікація функції досягається посиленням постумови. Наприклад наступний опис змушує функцію повертати «правильний» корінь.
SQRT(x:nat)r:real post r*r = n and r>=0
Всі специфікації функцій можуть бути обмежені преумовами які є логічними предикатами тільки над вхідними змінними і які описують обмеження що мають бути задоволенні коли виконується функція. Наприклад, функція що обчислює квадратний корінь що працює тільки для додатних дійсних чисел може бути задана так:
SQRTP(x:real)r:real pre x >=0 post r*r = n and r>=0
Преумова та постумова разом формують контракт який має виконувати кожна програма про яку кажуть що вона реалізує функцію. Преумова задає припущення при яких функція гарантовано дасть результат, що задовольняє постумову. Якщо функція викликається на вхідних даних, що не задовольняють її преумову, вихід неозначений (насправді, навіть не гарантується завершення обчислень).
VDM-SL також підтримує опис виконуваних функцій як у функціональних мовах програмування. В явному описі функцій результат описується як вираз над вхідними даними. Наприклад функція яка повертає список квадратів з списку чисел може бути описана так:
SqList: seq of nat -> seq of nat SqList(s) == if s = [] then [] else [(hd s)**2] ^ SqList(tl s)
Цей рекурсивний опис складається з підпису функції що задає тип вхідних даних, результату та тіла. Неявний опис такої ж функції міг би бути таким:
SqListImp(s:seq of nat)r:seq of nat post len r = len s and forall i in set inds s & r(i) = s(i)**2
Явний опис можна трактувати як реалізацію неявно заданої функції. Коректність явного опису функції відносно неявного задання може бути описаний як нижче.
Дано неявний опис:
f(p:T_p)r:T_r pre pre-f(p) post post-f(p, r)
і явну функцію:
f:T_p -> T_r
ми кажемо, що вона задовольняє специфікацію тоді і тільки тоді:
forall p in set T_p & pre-f(p) => f(p):T_r and post-f(p, f(p))
Тому, «f
є корректною реалізацією» має інтерпретуватись як «f
задовольняє специфікацію».
Моделювання станів
В VDM-SL, функції не мають побічних ефектів таких як зміни стану постійної глобальної змінної. Це корисна здатність багатьох мов програмування, тому подібна концепція існує; тільки замість функцій для зміни змінних стану (глобальних) використовуються операції.
Наприклад, якщо ми маємо стан, що складається з одної змінної someStateRegister : nat
, ми можемо описати це в VDM-SL як:
state Register of someStateRegister : nat end
А в VDM++ це описують трохи інакше:
instance variables someStateRegister : nat
Операція для завантаження значення в цю змінну має бути описана як:
LOAD(i:nat) ext wr someStateRegister:nat post someStateRegister = i
Пункт зовнішнє (ext
) описує до яких частин стану операція має доступ; rd
вказує доступ тільки для читання а wr
доступ для читання та запису.
Іноді важливо послатись на значення змінної до її модифікації; наприклад операція що додає значення до змінної може бути описана так:
ADD(i:nat) ext wr someStateRegister : nat post someStateRegister = someStateRegister~ + i
Де символ ~
біля змінної стану вказує на значення змінної до виконання операції.
Приклади
Функція max
Це приклад неявного опису функції. Функція повертає елемент з множини додатних цілих:
max(s:set of nat)r:nat pre true post r in set s and forall r' in set s & r' <= r
Множення натуральних чисел
multp(i,j:nat)r:nat pre true post r = i*j
Застосуємо доведення forall p:T_p & pre-f(p) => f(p):T_r and post-f(p, f(p))
до явного опису multp
:
multp(i,j) == if i=0 then 0 else if is-even(i) then 2*multp(i/2,j) else j+multp(i-1,j)
Тоді доведення приймає вигляд:
forall i, j : nat & multp(i,j):nat and multp(i, j) = i*j
Можна довести коректність цього через:
- Доведення того що рекурсія завершиться (це вимагає доведення того, що числа стають меншими з кожним кроком)
- Математичну індукцію
Абстрактний тип — черга
Це класичний приклад що ілюструє використання неявних специфікацій операцій в моделі відомої структури даних, що базується на станах. Черга моделюється як послідовність що складається з елементів типу Qelt
. Представлення типу Qelt
є неважливим, тому задається як token
.
types Qelt = token; Queue = seq of Qelt; state TheQueue of q : Queue end operations ENQUEUE(e:Qelt) ext wr q:Queue post q = q~ ^ [e]; DEQUEUE()e:Qelt ext wr q:Queue pre q <> [] post q~ = [e]^q; IS-EMPTY()r:bool ext rd q:Queue post r <=> (len q = 0)
Приклад банківської системи
Як дуже простий приклад моделі VDM-SL візьмемо систему для обслуговування деталей рахунків клієнтів банку. Клієнти моделюються номерами (CustNum), рахунки теж (AccNum). Представлення номерів не має значення, тому теж моделюється неструктурованими лексемами. Баланси і перевищення кредиту теж моделюються числовими типами.
AccNum = token; CustNum = token; Balance = int; Overdraft = nat; AccData :: owner : CustNum balance : Balance state Bank of accountMap : map AccNum to AccData overdraftMap : map CustNum to Overdraft inv mk_Bank(accountMap,overdraftMap) == for all a in set rng accountMap & a.owner in set dom overdraftMap and a.balance >= -overdraftMap(a.owner)
З операціями: NEWC додає новий номер клієнта:
operations NEWC(od : Overdraft)r : CustNum ext wr overdraftMap : map CustNum to Overdraft post r not in set dom ~overdraftMap and overdraftMap = ~overdraftMap ++ { r |-> od};
NEWAC додає новий рахунок і обнуляє баланс:
NEWAC(cu : CustNum)r : AccNum ext wr accountMap : map AccNum to AccData rd overdraftMap map CustNum to Overdraft pre cu in set dom overdraftMap post r not in set dom accountMap~ and accountMap = accountMap~ ++ {r|-> mk_AccData(cu,0)}
ACINF повертає всі баланси всіх рахунків клієнта, як відображення з номера рахунку на баланс:
ACINF(cu : CustNum)r : map AccNum to Balance ext rd accountMap : map AccNum to AccData post r = {an |-> accountMap(an).balance | an in set dom accountMap & accountMap(an).owner = cu}
Підтримка інструментів
Для VDM існує багато різних інструментів:
- VDMTools [ 24 серпня 2010 у Wayback Machine.] найкращий комерційний інструмент для VDM та VDM++, створений, розповсюджується, розробляється та підтримується CSK Systems [ 13 січня 2010 у Wayback Machine.], на основі ранніх розробок Danish Company IFAD. Інструкція [ 28 травня 2009 у Wayback Machine.]) і знаходяться в вільному доступі. Доступні всі ліцензії доступні, безплатні для повної версії інструменту. Повна версія включає автоматичну генерацію коду для мов Java і C++, підтримку динамічних бібліотек та CORBA.
- Overture [ 31 серпня 2010 у Wayback Machine.] програма з відкритим кодом що розробляється спільнотою. Метою є надати безплатний інструмент для VDM++ на основі платформи Eclipse.
- : від Adelard надає перевірку синтаксису, деяку просту перевірку семантики, та файл LaTeX що дозволяє отримати специфікацію в математичному записі. Це безплатний інструмент, проте він більше не підтримується.
- Макроси LaTeX та LaTeX2e, що підтримують запис моделей VDM в математичному синтаксисі стандарту ISO. Розробляються та підтримуються Національною фізичною лаболаторією Об'єднаного Королівства. Документація та макроси доступні онлайн.
Промисловий досвід
VDM широко застовосувався в різних прикладних областях. Найвідомішими з цих застосувань є:
- Компілятори Ada та : Перший в Європі підтверджений компілятор мови Ada був розроблений в DDC-International з використанням VDM. Подібно, семантику Chill та описували з використанням VDM.
- ConForm: Експеримент в British Aerospace з порівняння їх звичайного методу розробки захищеного шлюзу з розробкою з використанням VDM.
- Dust-Expert: Проект Adelard в Об'єднаному Королівстві для програм що визначають достатній рівень безпеки в планах заводів.
- Розробка VDMTools: Більшість компонент набору інструментів VDMTools й самі були розроблені з використанням VDM. Ця розробка була проведена на IFAD [ 28 липня 2010 у Wayback Machine.] в Данії та CSK [ 4 лютого 2010 у Wayback Machine.] в Японії..
- TradeOne: Деякі ключові компоненти офісної системи TradeOne що розроблялась y CSK [ 4 лютого 2010 у Wayback Machine.] systems для Японської фондової біржі використовували VDM.
Примітки
- Peter Gorm Larsen, "Ten Years of Historical Development "Bootstrapping" VDMTools" [ 23 січня 2021 у Wayback Machine.], In Journal of Universal Computer Science, volume 7(8), 2001
Посилання
- VDM Portal [ 28 серпня 2008 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Vi denskij me tod rozro bki angl Vienna Development Method VDM nabir tehnologij dlya modelyuvannya komp yuternih sistem analizu stvorenih modelej i perehodu do detalizovanogo proektuvannya ta programuvannya Odin z najstarishih formalnih metodiv vplinuv na rozvitok bagatoh inshih yak Z ta B Za jogo spinoyu stoyat instrumenti promislovoyi yakosti ta standart ISO Metod z yavivsya v rezultati roboti videnskoyi laboratoriyi IBM v seredini 70 tih Notaciya ta dopomizhni instrumenti z togo chasu postijno rozvivalis i sogodni metod zastosovuyetsya do shirokogo kola zadach Maye rozshirennya VDM dlya ob yektno oriyentovanih sistem FilosofiyaObchislyuvalni sistemi mozhut buti zmodelovanimi cherez movu VDM SL na vishomu rivni abstrakciyi nizh toj sho mozhe buti dosyagnutij vikoristannyam mov programuvannya Ce dozvolit analizuvati proektuvannya ta oznachennya klyuchovih vlastivostej vrahovuyuchi takozh defekti na rannih stadiyah rozrobki Modeli yaki buli proanalizovani mozhut buti perevedeni v detalnij proekt sistemi cherez proces vdoskonalennya ta filtraciyi Mova maye formalnu semantiku sho dozvolyaye dovoditi vlastivosti modelej z visokim stupenem vpevnenosti Takozh mova maye vikonuvanu pidmnozhinu tomu modeli mozhna analizuvati cherez testuvannya Vikonuyutsya modeli cherez grafichnij interfejs tomu mozhut buti ocinenimi ekspertami yakim ne obov yazkovo znajomitis iz samoyu movoyu modelyuvannya Mozhlivosti VDMSintaksis ta semantika VDM SL i VDM detalno opisuyutsya v instrukciyah do VDMTools Standart ISO mistit formalnij opis semantiki movi V reshti ciyeyi statti vikoristovuyetsya opisanij ISO sintaksis dlya obminu ASCII Deyaki teksti potrebuyut tochnishogo matematichnogo zapisu Model VDM SL ce opis sistemi sho dayetsya v terminah funkcij yaki vikonuyutsya nad danimi Vin skladayetsya z opisiv tipiv danih i funkcij ta operacij sho zastosovuyutsya do cih tipiv Bazovi tipi chislovi simvolni leksemi posilannya VDM SL vklyuchaye nastupni tipi sho modelyuyut chisla ta simvoli Bazovi tipi Tip Poyasnennya Znachennya bool Bulevij tip false true nat Naturalne chislo vklyuchno z nulem 0 1 2 3 nat1 Naturalne chislo bez nulya 1 2 3 4 int Cile chislo 3 2 1 0 1 2 3 rat Racionalne chislo a b de a ta b cili b ne 0 real Dijsne chislo char Simvoli A B C token Nestrukturovani leksemi lt A gt tip quote sho mistit znachennya lt A gt Tipi danih opisuyutsya dlya predstavlennya osnovnih danih sistemi sho modelyuyetsya Opis kozhnogo tipu predstavlyaye nove im ya tipu i daye predstavlennya v terminah bazovih tipiv abo tipiv sho vzhe buli opisani Napriklad tip sho modelyuye identifikator koristuvacha v sistemi keruvannya akkauntami mozhe buti opisanij tak types UserId nat Dlya manipulyuvannya znachennyami yaki nalezhat tipam opisuyutsya operatori Cilochiselne dodavannya vidnimannya i inshe dayutsya vzhe gotovimi tak yak i bulevi operatori taki yak rivnist ta nerivnist Mova ne fiksuye minimalne chi maksimalne mozhlive chislo chi tochnist dlya dijsnih chisel Taki obmezhennya opisuyutsya v miru neobhidnosti dlya kozhnoyi modeli za dopomogoyu invariantiv tipiv danih bulevih viraziv yaki opisuyut vimogi yakih mayut pritrimuvatis vsi elementi opisuvanogo tipu Napriklad vimoga togo sho identifikator koristuvacha maye buti ne bilshim za 9999 mozhe buti opisanij tak de lt oznachaye bulevij operator menshe chi rivne dlya naturalnih chisel UserId nat inv uid uid lt 9999 Tak yak invarianti mozhut buti dovoli skladnimi logichnimi virazami i vhodzhennya v opisuvanij tip obmezhuyetsya tilki znachennyami sho zadovolnyayut invariant to korektnist tipiv v VDM SL pereviryayetsya avtomatichno ne u vsih situaciyah Inshi bazovi tipi vklyuchayut char dlya simvoliv V deyakih vipadkah predstavlennya tipu ne stosuyetsya cilej modeli i tilki dodaye skladnosti V takih vipadkah chleni tipu predstavlyayutsya yak bezstrukturni tokeni Znachennya na tipah tokeniv mozhut tilki pereviryatis na rivnist i ne opisano niyakih inshih operacij De potribni osoblivi imenovani znachennya vvoditsya tip quote Kozhen takij tip skladayetsya z odniyeyi zminnoyi sho odnojmenna tipu Znachennya tipu quote takozh vidomi yak quote literals mozhut tilki pereviryatis na rivnist Napriklad v modelyuvanni svitlofora zruchno opisati znachennya sho predstavlyayut kolori signaliv yak quote types lt Red gt lt Amber gt lt FlashingAmber gt lt Green gt Konstruktori tipiv Ob yednannya Dobutok ta kompozitni tipi Bazovi tipi duzhe obmezheni Zate mozhna stvoryuvati bilsh strukturovani tipi za dopomogoyu konstruktoriv Konstruktori bazovih tipiv T1 displaystyle T2 displaystyle displaystyle Tn Ob yednannya tipiv T1 Tn T1 T2 Tn Dekartovij dobutok tipiv T1 Tn T f1 T1 fn Tn Kompozitnij Strukturnij tip Najprostishij konstruktor ob yednannya bazovih tipiv Tip A B mistit vsi elementi tipu A i vsi elementi tipu B V prikladi zi svitloforom tip sho modelyuye kolir signalu mozhe buti zapisanij tak SignalColour lt Red gt lt Amber gt lt FlashingAmber gt lt Green gt Vsi zaznacheni tipi v VDM SL opisuyutsya analogichno tomu yak pokazano vishe za dopomogoyu ob yednannya quoute types Dekartiv dobutok takozh opisuyetsya v VDM SL Tip A1 An ye tipom sho vklyuchaye vsi kortezhi znachen pershij element yakogo nalezhit tipu A1 drugij tipu A2 i tak dali Kompozitnij tip analogichnij dekartovomu dobutku tilki maye she identifikatori poliv Tip T f1 A1 f2 A2 fn An ye dekartovim dobutkom z polyami poznachenimi f1 fn Element tipu T mozhe buti skonstrujovanim z jogo skladovih chastin konstruktorom yakij zapisuyetsya yak mk T I navpaki yaksho danij element tipu T to imena poliv mozhna vikoristati dlya dostupu do komponentiv Napriklad tip Date day nat1 month nat1 year nat inv mk Date d m y day lt 31 and month lt 12 modelyuye prostij tip dati Znachennya mk Date 1 4 2001 vidpovidaye 1 kvitnya 2001 Yaksho dana data d to viraz d month ye naturalnim chislom sho predstavlyaye misyac Obmezhennya na kilkist dniv v misyaci i visokosni roki mozhut buti vklyucheni v invariant Kolekciyi Mnozhini Vidobrazhennya ta Poslidovnosti Tipi kolekcij modelyuyut grupi znachen Mnozhini ye skinchennimi nevporyadkovanimi kolekciyami v yakih ne dozvolyayetsya zberigati dublikati znachen Poslidovnosti ye skinchennimi vporyadkovanimi kolekciyami spiskami v yakih mozhna zberigati dublikati i vidobrazhennya predstavlyayut skinchenni vidpovidnosti mizh dvoma mnozhinami znachen Konstruktor tipu mnozhina pishetsya set of T de T ce poperedno opisanij tip stvoryuye tip v yakij vhodyat vsi skinchenni mnozhini znachen sho berutsya z tipu T Napriklad opis tipu UGroup set of UserId opisuye tip UGroup sho skladayetsya z usih skinchennih mnozhin zi znachen UserId Nad mnozhinami opisuyutsya rizni operatori dlya konstruyuvannya yih ob yednannya peretinu viznachennya strogogo ta nestrogogo vklyuchennya i t d Osnovni operatori na mnozhinah s s1 s2 mnozhini a b c Perechislennya mnozhini mnozhina z elementiv a b i c displaystyle x displaystyle x T amp P x displaystyle Vklyuchennya mnozhini mnozhina elementiv x z tipu T dlya yakih vikonuyetsya P x i j Mnozhina cilih vid i do j e in set s e ye elementom mnozhini s e not in set s e ne ye elementom mnozhini s s1 union s2 Ob yednannya mnozhin s1 ta s2 s1 inter s2 Peretin mnozhin s1 ta s2 s1 s2 Teoretiko mnozhinna riznicya s1 ta s2 dunion s Ob yednannya mnozhin sho vhodyat do mnozhini s s1 psubset s2 s1 vhodit strogo v s2 s1 subset s2 s1 pidmnozhina s2 card s Potuzhnist cardinality mnozhini s Konstruktor skinchennoyi poslidovnosti pishetsya seq of T de T tip viznachenij ranishe utvoryuye tip v yakij vhodyat vsi skinchenni spiski znachen vzyatih z tipu T Napriklad oznachennya tipu String seq of char Opisuye tip String sho utvorenij z usih skinchennih ryadkiv simvoliv Zadayutsya operatori dlya konstruyuvannya konkatenacij viboru elementiv ta pidposlidovnostej i t i Bagato z cih operacij ye chastkovimi tobto mozhut vikoristovuvatis ne u vsih vipadkah Napriklad operaciya viboru p yatogo elementu poslidovnosti sho mistit tilki tri elementi ye neviznachenoyu Poryadok ta povtorennya elementiv v poslidovnosti ye vazhlivimi tomu a b ne dorivnyuye b a i a ne dorivnyuye a a Osnovni operatori na poslidovnostyah s s1 s2 poslidovnosti a b c Perelichennya poslidovnosti poslidovnist elementiv a b ta c f x displaystyle x T amp P x Vklyuchennya poslidovnosti poslidovnist viraziv f x dlya kozhnogo x z chislovogo tipu T dlya yakogo vinonuyetsya P x x znachennya x berutsya v poryadku zrostannya hd s Golova pershij element s tl s Hvist vse sho zalishilos vid s pislya togo yak vidirvali golovu len s Dovzhina s elems s Mnozhina elementiv s s i i tij element s s1 s2 poslidovnist utvorena za dopomogoyu konkatenaciyi poslidovnostej s1 ta s2 Skinchenne vidnoshennya ye vidpovidnistyu mizh dvoma mnozhinami mnozhinoyu viznachennya domenom ta mnozhinoyu znachen v yakij domen indeksuye znachennya Ce analogichno do skinchennoyi funkciyi Konstruktor tipu vidnoshennya v VDM SL pishetsya yak map T1 to T2 de T1 ta T2 ye poperedno viznachenimi tipami konstruyuye tip sho mistit usi skinchenni vidnoshennya z mnozhin tipu T1 na mnozhini z T2 Napriklad viznachennya tipu Birthdays map String to Date Zadaye tip Birthdays yakij vidobrazhaye ryadki simvoliv v dati Znovu zh taki opisuyutsya operatori dlya vidnoshen Osnovni operatori na vidnoshennyah a span class mwe math element span class mwe math mathml inline mwe math mathml a11y style display none math xmlns http www w3 org 1998 Math MathML alttext displaystyle semantics mrow class MJX TeXAtom ORD mstyle displaystyle true scriptlevel 0 mrow class MJX TeXAtom ORD mo stretchy false mo mrow mstyle mrow annotation encoding application x tex displaystyle annotation semantics math span noscript img src https www wikidata uk ua nina az image aHR0cHM6Ly93aWtpbWVkaWEub3JnL2FwaS9yZXN0X3YxL21lZGlhL21hdGgvcmVuZGVyL3N2Zy9kZGNjMmUwYjYzNTIyYTcwNWMzYzY5MTc3N2M5ZjM0MjgwNmIxOWQw svg class mwe math fallback image inline mw invert skin invert aria hidden true style vertical align 0 838ex width 0 647ex height 2 843ex alt displaystyle noscript img alt image class img layz bg lazy style width 0 647ex height 2 843ex vertical align 0 838ex data src https www wikidata uk ua nina az image aHR0cHM6Ly93aWtpbWVkaWEub3JnL2FwaS9yZXN0X3YxL21lZGlhL21hdGgvcmVuZGVyL3N2Zy9kZGNjMmUwYjYzNTIyYTcwNWMzYzY5MTc3N2M5ZjM0MjgwNmIxOWQw svg data alt displaystyle data class mwe math fallback image inline mw invert skin invert span gt r b span class mwe math element span class mwe math mathml inline mwe math mathml a11y style display none math xmlns http www w3 org 1998 Math MathML alttext displaystyle semantics mrow class MJX TeXAtom ORD mstyle displaystyle true scriptlevel 0 mrow class MJX TeXAtom ORD mo stretchy false mo mrow mstyle mrow annotation encoding application x tex displaystyle annotation semantics math span noscript img src https www wikidata uk ua nina az image aHR0cHM6Ly93aWtpbWVkaWEub3JnL2FwaS9yZXN0X3YxL21lZGlhL21hdGgvcmVuZGVyL3N2Zy9kZGNjMmUwYjYzNTIyYTcwNWMzYzY5MTc3N2M5ZjM0MjgwNmIxOWQw svg class mwe math fallback image inline mw invert skin invert aria hidden true style vertical align 0 838ex width 0 647ex height 2 843ex alt displaystyle noscript img alt image class img layz bg lazy style width 0 647ex height 2 843ex vertical align 0 838ex data src https www wikidata uk ua nina az image aHR0cHM6Ly93aWtpbWVkaWEub3JnL2FwaS9yZXN0X3YxL21lZGlhL21hdGgvcmVuZGVyL3N2Zy9kZGNjMmUwYjYzNTIyYTcwNWMzYzY5MTc3N2M5ZjM0MjgwNmIxOWQw svg data alt displaystyle data class mwe math fallback image inline mw invert skin invert span gt s Perelichennya vidnoshenya a vidobrazhayetsya v r b vidobrazhayetsya v s x span class mwe math element span class mwe math mathml inline mwe math mathml a11y style display none math xmlns http www w3 org 1998 Math MathML alttext displaystyle semantics mrow class MJX TeXAtom ORD mstyle displaystyle true scriptlevel 0 mrow class MJX TeXAtom ORD mo stretchy false mo mrow mstyle mrow annotation encoding application x tex displaystyle annotation semantics math span noscript img src https www wikidata uk ua nina az image aHR0cHM6Ly93aWtpbWVkaWEub3JnL2FwaS9yZXN0X3YxL21lZGlhL21hdGgvcmVuZGVyL3N2Zy9kZGNjMmUwYjYzNTIyYTcwNWMzYzY5MTc3N2M5ZjM0MjgwNmIxOWQw svg class mwe math fallback image inline mw invert skin invert aria hidden true style vertical align 0 838ex width 0 647ex height 2 843ex alt displaystyle noscript img alt image class img layz bg lazy style width 0 647ex height 2 843ex vertical align 0 838ex data src https www wikidata uk ua nina az image aHR0cHM6Ly93aWtpbWVkaWEub3JnL2FwaS9yZXN0X3YxL21lZGlhL21hdGgvcmVuZGVyL3N2Zy9kZGNjMmUwYjYzNTIyYTcwNWMzYzY5MTc3N2M5ZjM0MjgwNmIxOWQw svg data alt displaystyle data class mwe math fallback image inline mw invert skin invert span gt f x displaystyle x T amp P x Zadannya vidnoshennya x vidobrazhayetsya v f x dlya vsih x z tipu T dlya yakih vikonuyetsya P x dom m Mnozhina viznachennya domen m rng m Mnozhina znachen range m m x m zastosovane do x m1 munion m2 Ob yednannya vidnoshen m1 ta m2 m1 m2 mayut buti sumisnimi tam de voni nakladayutsya m1 m2 m2 naklasti na m1 Strukturuvannya Osnovna vidminnist mizh VDM SL ta VDM polyagaye v tomu yak voni spravlyayutsya z strukturizaciyeyu V VDM SL ye konservativne modulne rozshirennya a VDM maye tradicijno ob yektno oriyentovanij mehanizm strukturizaciyi Strukturizaciya v VDM SL Standart ISO dlya VDM SL ye informativnim dodatkom sho mistit rizni principi strukturizaciyi Isnuyut taki tradicijni principi prihovuvannya informaciyi z modulyami Imenuvannya moduliv Kozhen modul sintaksichno pochinayetsya klyuchovim slovom module pislya yakogo pishut im ya modulya V kinci modulya pishut klyuchove slovo end pislya yakogo takozh stoyit im ya modulya Import Mozhlivo importuvati opisi yaki eksportuyutsya v inshi moduli Ce robitsya v rozdili importu yakij pochitayetsya z slova imports i prodovzhuyetsya poslidovnistyu importiv z riznih moduliv Kozhen z cih importiv pochinayetsya z slova from potim im ya modulya i pidpisiv modulya Pidpisami modulya mozhe buti yak prosto slovo all sho vkazuye na import vsih opisiv yaki eksportuyutsya z togo modulya abo poslidovnistyu konktretno vkazanih opisiv Pidpisi importu okremi dlya tipiv znachen funkcij ta operacij i kozhen z takih pidpisiv pochinayetsya z vidpovidnogo klyuchovogo slova Na dodatok ci pidpisi importu imenuyut konstrukciyi do yakih hochut otrimati dostup Takozh mozhe buti prisutnya dodatkova informaciya tipu i naostanok ye mozhlivist perejmenuvati kozhnu konstrukciyu sho importuyetsya Takozh yaksho potribna mozhlivist dostupu do skladovih tipu pri jogo importi potribno vzhivati klyuchove slovostruct Eksport Yaksho modul hoche dati inshim modulyam dostup do svoyih opisiv vin maye eksportuvati yih klyuchovim slovom exports pislya yakogo pishut pidpisi sho eksportuyutsya z nogo Pidpisi sho eksportuyutsya mozhut buti yak klyuchovim slovom all tak i poslidovnistyu konkretnih pidpisiv Taki pidpisi zadayutsya okremo dlya tipiv znachen funkcij i operacij kozhna z yakih pochinayetsya z vidpovidnogo klyuchovogo slova V vipadku koli htos hoche eksportuvati vnutrishnyu strukturu tipu treba vikoristati klyuchove slovo struct Osoblivishi mozhlivosti V poperednih versiyah VDM SL tools takozh bula pidtrimka moduliv z parametrami ta realizaciyi takih moduliv Tim ne mensh taki mozhlivosti buli vidaleni z VDMTools blizko 2000 go bo majzhe nikoli ne vikoristovuvalis v promislovih programah ta ne bulo znachnoyi kilkosti instrumentiv z takimi mozhlivostyami Strukturizaciya VDM V VDM strukturizaciya provoditsya z vikoristannyam klasiv ta mnozhinnogo nasliduvannya Klyuchovimi konceptami ye Klas Kozhen klas sintaksichno pochinayetsya z klyuchovogo slova class za yakim sliduye im ya klasu V kinci klasu stoyit slovo end za yakim takozh sliduye im ya klasu Nasliduvannya Yaksho klas nasliduye konstrukciyi z inshih klasiv pislya imeni klasu mozhe stoyati klyuchove slovo is subclass of za yakim ide spisok imen predkiv rozdilenih komami Modifikatori dostupu Prihovuvannya informaciyi v VDM robitsya yak i v bilshosti ob yektno oriyentovanih mov z vikoristannyam modifikatoriv dostupu V VDM opisi ye za zamovchuvannyam privatnimi ale mozhna vikoristati odne z klyuchovih sliv dlya zmini dostupu private public chi protected Modelyuvannya funkcionalnostiFunkcionalne modelyuvannya V VDM SL funkciyi opisuyutsya nad tipami danih opisanimi v modeli Pidtrimka abstraguvannya vimagaye shob mozhna bulo harakterizuvati rezultat yakij maye davati funkciya bez potrebi kazati yak same vona maye buti obchislena Osnovnim mehanizmom dlya zdijsnennya cogo ye neyavnij opis funkciyi v yakomu zamist formuli yaka obchislyuye rezultat dayut logichnij predikat nad vhidnoyu ta vihidnoyu zminnoyu nazvanij postumovoyu sho daye nam vlastivosti rezultatu Napriklad funkciya SQRT dlya obchislennya kvadratnogo korenya naturalnogo chisla mozhe opisuvatis tak SQRT x nat r real post r r n Tut postumova ne opisuye metod dlya obchislennya rezultatu r ale vkazuye yaki vlastivosti vin maye mati Zauvazhte sho ce opisuye funkciyu yaka povertaye pravilnij kvadratnij korin nemaye vimogi shob ce buv dodatnij chi vid yemnij korin Napriklad mozhna zadati funkciyu sho povertaye vid yemnij korin z 4 ale dodatnij z usih inshih vvodiv Takozh varto zauvazhiti sho funkciyi v VDM SL mayut buti determinovani tobto funkciya zavzhdi maye povertati odni i ti sami rezultati na odnih i tih samih danih Strogisha specifikaciya funkciyi dosyagayetsya posilennyam postumovi Napriklad nastupnij opis zmushuye funkciyu povertati pravilnij korin SQRT x nat r real post r r n and r gt 0 Vsi specifikaciyi funkcij mozhut buti obmezheni preumovami yaki ye logichnimi predikatami tilki nad vhidnimi zminnimi i yaki opisuyut obmezhennya sho mayut buti zadovolenni koli vikonuyetsya funkciya Napriklad funkciya sho obchislyuye kvadratnij korin sho pracyuye tilki dlya dodatnih dijsnih chisel mozhe buti zadana tak SQRTP x real r real pre x gt 0 post r r n and r gt 0 Preumova ta postumova razom formuyut kontrakt yakij maye vikonuvati kozhna programa pro yaku kazhut sho vona realizuye funkciyu Preumova zadaye pripushennya pri yakih funkciya garantovano dast rezultat sho zadovolnyaye postumovu Yaksho funkciya viklikayetsya na vhidnih danih sho ne zadovolnyayut yiyi preumovu vihid neoznachenij naspravdi navit ne garantuyetsya zavershennya obchislen VDM SL takozh pidtrimuye opis vikonuvanih funkcij yak u funkcionalnih movah programuvannya V yavnomu opisi funkcij rezultat opisuyetsya yak viraz nad vhidnimi danimi Napriklad funkciya yaka povertaye spisok kvadrativ z spisku chisel mozhe buti opisana tak SqList seq of nat gt seq of nat SqList s if s then else hd s 2 SqList tl s Cej rekursivnij opis skladayetsya z pidpisu funkciyi sho zadaye tip vhidnih danih rezultatu ta tila Neyavnij opis takoyi zh funkciyi mig bi buti takim SqListImp s seq of nat r seq of nat post len r len s and forall i in set inds s amp r i s i 2 Yavnij opis mozhna traktuvati yak realizaciyu neyavno zadanoyi funkciyi Korektnist yavnogo opisu funkciyi vidnosno neyavnogo zadannya mozhe buti opisanij yak nizhche Dano neyavnij opis f p T p r T r pre pre f p post post f p r i yavnu funkciyu f T p gt T r mi kazhemo sho vona zadovolnyaye specifikaciyu todi i tilki todi forall p in set T p amp pre f p gt f p T r and post f p f p Tomu f ye korrektnoyu realizaciyeyu maye interpretuvatis yak f zadovolnyaye specifikaciyu Modelyuvannya staniv V VDM SL funkciyi ne mayut pobichnih efektiv takih yak zmini stanu postijnoyi globalnoyi zminnoyi Ce korisna zdatnist bagatoh mov programuvannya tomu podibna koncepciya isnuye tilki zamist funkcij dlya zmini zminnih stanu globalnih vikoristovuyutsya operaciyi Napriklad yaksho mi mayemo stan sho skladayetsya z odnoyi zminnoyi someStateRegister nat mi mozhemo opisati ce v VDM SL yak state Register of someStateRegister nat end A v VDM ce opisuyut trohi inakshe instance variables someStateRegister nat Operaciya dlya zavantazhennya znachennya v cyu zminnu maye buti opisana yak LOAD i nat ext wr someStateRegister nat post someStateRegister i Punkt zovnishnye ext opisuye do yakih chastin stanu operaciya maye dostup rd vkazuye dostup tilki dlya chitannya a wr dostup dlya chitannya ta zapisu Inodi vazhlivo poslatis na znachennya zminnoyi do yiyi modifikaciyi napriklad operaciya sho dodaye znachennya do zminnoyi mozhe buti opisana tak ADD i nat ext wr someStateRegister nat post someStateRegister someStateRegister i De simvol bilya zminnoyi stanu vkazuye na znachennya zminnoyi do vikonannya operaciyi PrikladiFunkciya max Ce priklad neyavnogo opisu funkciyi Funkciya povertaye element z mnozhini dodatnih cilih max s set of nat r nat pre true post r in set s and forall r in set s amp r lt r Mnozhennya naturalnih chisel multp i j nat r nat pre true post r i j Zastosuyemo dovedennya forall p T p amp pre f p gt f p T r and post f p f p do yavnogo opisu multp multp i j if i 0 then 0 else if is even i then 2 multp i 2 j else j multp i 1 j Todi dovedennya prijmaye viglyad forall i j nat amp multp i j nat and multp i j i j Mozhna dovesti korektnist cogo cherez Dovedennya togo sho rekursiya zavershitsya ce vimagaye dovedennya togo sho chisla stayut menshimi z kozhnim krokom Matematichnu indukciyu Abstraktnij tip cherga Ce klasichnij priklad sho ilyustruye vikoristannya neyavnih specifikacij operacij v modeli vidomoyi strukturi danih sho bazuyetsya na stanah Cherga modelyuyetsya yak poslidovnist sho skladayetsya z elementiv tipu Qelt Predstavlennya tipu Qelt ye nevazhlivim tomu zadayetsya yak token types Qelt token Queue seq of Qelt state TheQueue of q Queue end operations ENQUEUE e Qelt ext wr q Queue post q q e DEQUEUE e Qelt ext wr q Queue pre q lt gt post q e q IS EMPTY r bool ext rd q Queue post r lt gt len q 0 Priklad bankivskoyi sistemi Yak duzhe prostij priklad modeli VDM SL vizmemo sistemu dlya obslugovuvannya detalej rahunkiv kliyentiv banku Kliyenti modelyuyutsya nomerami CustNum rahunki tezh AccNum Predstavlennya nomeriv ne maye znachennya tomu tezh modelyuyetsya nestrukturovanimi leksemami Balansi i perevishennya kreditu tezh modelyuyutsya chislovimi tipami AccNum token CustNum token Balance int Overdraft nat AccData owner CustNum balance Balance state Bank of accountMap map AccNum to AccData overdraftMap map CustNum to Overdraft inv mk Bank accountMap overdraftMap for all a in set rng accountMap amp a owner in set dom overdraftMap and a balance gt overdraftMap a owner Z operaciyami NEWC dodaye novij nomer kliyenta operations NEWC od Overdraft r CustNum ext wr overdraftMap map CustNum to Overdraft post r not in set dom overdraftMap and overdraftMap overdraftMap r gt od NEWAC dodaye novij rahunok i obnulyaye balans NEWAC cu CustNum r AccNum ext wr accountMap map AccNum to AccData rd overdraftMap map CustNum to Overdraft pre cu in set dom overdraftMap post r not in set dom accountMap and accountMap accountMap r gt mk AccData cu 0 ACINF povertaye vsi balansi vsih rahunkiv kliyenta yak vidobrazhennya z nomera rahunku na balans ACINF cu CustNum r map AccNum to Balance ext rd accountMap map AccNum to AccData post r an gt accountMap an balance an in set dom accountMap amp accountMap an owner cu Pidtrimka instrumentivDlya VDM isnuye bagato riznih instrumentiv VDMTools 24 serpnya 2010 u Wayback Machine najkrashij komercijnij instrument dlya VDM ta VDM stvorenij rozpovsyudzhuyetsya rozroblyayetsya ta pidtrimuyetsya CSK Systems 13 sichnya 2010 u Wayback Machine na osnovi rannih rozrobok Danish Company IFAD Instrukciya 28 travnya 2009 u Wayback Machine i znahodyatsya v vilnomu dostupi Dostupni vsi licenziyi dostupni bezplatni dlya povnoyi versiyi instrumentu Povna versiya vklyuchaye avtomatichnu generaciyu kodu dlya mov Java i C pidtrimku dinamichnih bibliotek ta CORBA Overture 31 serpnya 2010 u Wayback Machine programa z vidkritim kodom sho rozroblyayetsya spilnotoyu Metoyu ye nadati bezplatnij instrument dlya VDM na osnovi platformi Eclipse vid Adelard nadaye perevirku sintaksisu deyaku prostu perevirku semantiki ta fajl LaTeX sho dozvolyaye otrimati specifikaciyu v matematichnomu zapisi Ce bezplatnij instrument prote vin bilshe ne pidtrimuyetsya Makrosi LaTeX ta LaTeX2e sho pidtrimuyut zapis modelej VDM v matematichnomu sintaksisi standartu ISO Rozroblyayutsya ta pidtrimuyutsya Nacionalnoyu fizichnoyu labolatoriyeyu Ob yednanogo Korolivstva Dokumentaciya ta makrosi dostupni onlajn Promislovij dosvidVDM shiroko zastovosuvavsya v riznih prikladnih oblastyah Najvidomishimi z cih zastosuvan ye Kompilyatori Ada ta Pershij v Yevropi pidtverdzhenij kompilyator movi Ada buv rozroblenij v DDC International z vikoristannyam VDM Podibno semantiku Chill ta opisuvali z vikoristannyam VDM ConForm Eksperiment v British Aerospace z porivnyannya yih zvichajnogo metodu rozrobki zahishenogo shlyuzu z rozrobkoyu z vikoristannyam VDM Dust Expert Proekt Adelard v Ob yednanomu Korolivstvi dlya program sho viznachayut dostatnij riven bezpeki v planah zavodiv Rozrobka VDMTools Bilshist komponent naboru instrumentiv VDMTools j sami buli rozrobleni z vikoristannyam VDM Cya rozrobka bula provedena na IFAD 28 lipnya 2010 u Wayback Machine v Daniyi ta CSK 4 lyutogo 2010 u Wayback Machine v Yaponiyi TradeOne Deyaki klyuchovi komponenti ofisnoyi sistemi TradeOne sho rozroblyalas y CSK 4 lyutogo 2010 u Wayback Machine systems dlya Yaponskoyi fondovoyi birzhi vikoristovuvali VDM PrimitkiPeter Gorm Larsen Ten Years of Historical Development Bootstrapping VDMTools 23 sichnya 2021 u Wayback Machine In Journal of Universal Computer Science volume 7 8 2001PosilannyaVDM Portal 28 serpnya 2008 u Wayback Machine