Будь-яка форма рекурсії чи ітерації в програмуванні насправді є фіксованою точкою. Наприклад, while
цикл характеризується рівнянням
while b do c done ≡ if b then (c ; while b do c done)
що означає while b do c done
рішення W
рівняння
W ≡ Φ(W)
де Φ(x) ≡ if b then (c ; x)
. Але що робити, якщо Φ
є багато фіксованих точок? Яка відповідає while
петлі? Одним із основних розумінь семантики програмування є те, що вона є найменш фіксованою точкою.
Візьмемо простий приклад, на цей раз рекурсія. Я буду використовувати Haskell. Рекурсивна функція, f
визначена
f :: a -> a
f x = f x
є скрізь невизначеною функцією, бо вона просто працює вічно. Ми можемо переписати це визначення більш незвичним чином (але воно все ще працює в Haskell) як
f :: a -> a
f = f
Отже, f
є фіксованою точкою функції ідентичності:
f ≡ id f
Але кожна функція є фіксованою точкою id
. За звичайного доменно-теоретичного впорядкування "невизначений" є найменшим елементом. І справді, наша функція f
- це всюди невизначена функція.
Додано на запит: у коментарях ОП запитували про частковий порядок while
циклів семантики (ви припускали, що це решітка, але вона не повинна бути). Більш загальним питанням є те, що доменно-теоретична інтерпретація процедурної мови, яка може маніпулювати змінними та має основні структури управління (умовні умови та петлі). Існує кілька способів зробити це, залежно від того, що саме ви хочете зробити, але щоб зробити простішими речі, припустимо, що у нас є фіксоване число глобальних зміннихx 1 , … , x n V V n → V n ∪ { ⊥ } ( v 1 , … , v n ) ∈ V n ⊥ V n V n → V n ∪ { ⊥ }нх1, … , Хнщо програма може читати та оновлювати, і більше нічого (ніяких вводу-виводу або винятків, або виділення нових змінних). У цьому випадку програма може розглядатися як перетворення початкового стану змінних у кінцевий стан, або невизначене значення, якщо програма цикли. Отже, якщо кожна змінна містить елемент множини , програма відповідатиме відображенню : для кожної початкової конфігурації змінних програма буде або розходитись і виходити , або вона припиняється і створює кінцевий стан, який є елементом . Набір усіх карт - це домен:VVн→ Vн∪ { ⊥ }( v1, … , Vн) ∈ Vн⊥VнVн→ Vн∪ { ⊥ }
- ми використовуємо плоский упорядкування на який має внизу, і всі елементи "плоскі" над ним, а потім впорядковано точково,⊥ V n V n → V n ∪ { ⊥ }Vн∪ { ⊥ }⊥VнVн→ Vн∪ { ⊥ }
- найменший елемент - це функція, яка завжди відображає , відповідну програмі (та багатьом іншим),⊥
while true do skip done
- кожна послідовність, що збільшується, має надпремію
Просто для того, щоб дати вам уявлення про те, як це працює, семантика програми
x_1 := e
буде функцією, яка приймає як вхід , обчислює значення виразу у стані і повертає .( v1, … , Vн) ∈ Vнvеe
( v1, … , Vн)( vе, v2, … , Vн)