Każda forma rekurencji lub iteracji w programowaniu jest w rzeczywistości stałym punktem. Na przykład while
pętla charakteryzuje się równaniem
while b do c done ≡ if b then (c ; while b do c done)
co oznacza, że while b do c done
jest to rozwiązanie W
równania
W ≡ Φ(W)
gdzie Φ(x) ≡ if b then (c ; x)
. Ale co, jeśli Φ
ma wiele stałych punktów? Który odpowiada while
pętli? Jednym z podstawowych wniosków dotyczących semantyki programowania jest to, że jest to najmniej ustalony punkt.
Weźmy prosty przykład, tym razem rekurencyjny. Użyję Haskell. Funkcja rekurencyjna f
zdefiniowana przez
f :: a -> a
f x = f x
jest wszędzie niezdefiniowaną funkcją, ponieważ działa po prostu na zawsze. Możemy przepisać tę definicję w bardziej nietypowy sposób (ale nadal działa w Haskell) as
f :: a -> a
f = f
Więc f
jest stałym punktem funkcji tożsamości:
f ≡ id f
Ale każda funkcja jest stałym punktem id
. Zgodnie ze zwykłym uporządkowaniem teoretycznym domenowym „niezdefiniowany” jest najmniejszym elementem. I rzeczywiście, nasza funkcja f
jest wszędzie niezdefiniowaną funkcją.
Dodano na żądanie: w komentarzach OP zapytał o częściową kolejność dla while
pętli semantyki (zakładałeś, że to była sieć, ale nie musi). Bardziej ogólne pytanie brzmi: jaka jest teoretyczna interpretacja języka proceduralnego, który może manipulować zmiennymi i ma podstawowe struktury kontrolne (warunkowe i pętle). Można to zrobić na kilka sposobów, w zależności od tego, co dokładnie chcesz uchwycić, ale dla uproszczenia załóżmy, że mamy stałą liczbę zmiennych globalnychnx1,…,xnże program może czytać i aktualizować oraz nic więcej (żadnych operacji we / wy lub wyjątków lub przydzielania nowych zmiennych). W takim przypadku program może być postrzegany jako transformacja stanu początkowego zmiennych do stanu końcowego lub wartość nieokreślona, jeśli program się zmienia. Tak więc, jeśli każda zmienna zawiera element zestawu , program będzie odpowiadał odwzorowaniu : dla każdej początkowej konfiguracji zmiennych program albo się rozejdzie i wyda , albo zakończy i wytworzy stan końcowy, który jest elementem . Zestaw wszystkich map to domena:VVn→Vn∪{⊥}(v1,…,vn)∈Vn⊥VnVn→Vn∪{⊥}
- używamy płaskiego porządku na który ma na dole i wszystkie elementy „płaskiego” nad nim, a następnie jest uporządkowany punktowo,Vn∪{⊥}⊥VnVn→Vn∪{⊥}
- najmniejszym elementem jest funkcja, która zawsze mapuje na , odpowiadający programowi (i wielu innym),⊥
while true do skip done
- każda rosnąca sekwencja ma supremum
Aby dać ci wyobrażenie o tym, jak to działa, semantykę programu
x_1 := e
będzie funkcją, która przyjmuje jako dane wejściowe , oblicza wartość wyrażenia w stanie i zwraca .v e ( v 1 , … , v n ) ( v e , v 2 , … , v n )(v1,…,vn)∈Vnvee
(v1,…,vn)(ve,v2,…,vn)