Próbuję uzyskać ogólny obraz znaczenia najmniej ustalonego punktu (LFP) w analizie programu. Na przykład abstrakcyjna interpretacja wydaje się wykorzystywać istnienie LFP. Wiele prac badawczych na temat analizy programów również koncentruje się w dużej mierze na znalezieniu najmniej ustalonego punktu.
Mówiąc dokładniej, ten artykuł w wikipedii: Twierdzenie Knaster-Tarski wspomina, że LFP są używane do definiowania semantyki programu.
Dlaczego to jest ważne? Każdy prosty przykład pomaga mi. (Próbuję uzyskać duży obraz).
EDYTOWAĆ
Myślę, że moje sformułowanie jest niepoprawne. Nie kwestionuję znaczenia LFP. Moje dokładne pytanie (początkujący) brzmi: w jaki sposób informatyka pomaga w analizie programu? Na przykład, dlaczego / jak abstrakcyjna interpretacja używa LFP? co się stanie, jeśli nie ma LFP w domenie abstrakcyjnej?
Mam nadzieję, że moje pytanie jest teraz bardziej konkretne.
Odpowiedzi:
Każda forma rekurencji lub iteracji w programowaniu jest w rzeczywistości stałym punktem. Na przykład
while
pętla charakteryzuje się równaniemco oznacza, że
while b do c done
jest to rozwiązanieW
równaniagdzie
Φ(x) ≡ if b then (c ; x)
. Ale co, jeśliΦ
ma wiele stałych punktów? Który odpowiadawhile
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 przezjest 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
Więc
f
jest stałym punktem funkcji tożsamości: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 funkcjaf
jest wszędzie niezdefiniowaną funkcją.Dodano na żądanie: w komentarzach OP zapytał o częściową kolejność dlan x1,…,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:V Vn→Vn∪{⊥} (v1,…,vn)∈Vn ⊥ Vn Vn→Vn∪{⊥}
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 globalnychwhile true do skip done
Aby dać ci wyobrażenie o tym, jak to działa, semantykę programu
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)∈Vn ve (v1,…,vn) (ve,v2,…,vn)
e
źródło
But what if Φ has many fixed points?
Chociaż rozumiem równanie punktu stałego, w tym kontekście, czy W \ w L? Jak tutaj definiujemy sieć? Doceniam twoje dalsze opracowanie na ten temat.Oto intuicja: najmniej ustalone punkty pomagają analizować pętle.
Analiza programu obejmuje wykonanie programu - ale wyodrębnienie niektórych szczegółów danych. To wszystko dobrze. Abstrakcja pomaga analizie przebiegać szybciej niż faktyczne uruchomienie programu, ponieważ pozwala zignorować aspekty, na których ci nie zależy. Na przykład tak działa interpretacja abstrakcyjna: w zasadzie symuluje wykonanie programu, ale śledzi tylko częściowe informacje o stanie programu.
Trudne jest, gdy dojdziesz do pętli. Pętla może być wykonywana wiele, wiele razy. Zazwyczaj nie chcesz, aby analiza programu musiała wykonywać wszystkie te iteracje pętli, ponieważ wtedy analiza programu zajmie dużo czasu ... a nawet może się nie skończyć. Więc tam używasz najmniej ustalonego punktu. Najmniej ustalony punkt zasadniczo charakteryzuje to, co można powiedzieć na pewno będzie prawdziwe po zakończeniu pętli, jeśli nie wiesz, ile razy pętla będzie się powtarzać.
Do tego służy najmniej ustalony punkt. Ponieważ w programach występują pętle, podczas analizy programu używane są najmniej ustalone punkty. Najmniej ustalonych punktów są ważne, ponieważ pętle są wszędzie i ważna jest możliwość analizowania pętli.
Nawiasem mówiąc, rekurencja i wzajemna rekurencja są po prostu kolejną formą pętli - więc one również mają tendencję do obsługi z najmniej ustalonym punktem.
źródło