Dlaczego najmniej ważny punkt (LFP) jest ważny w analizie programu?

11

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.

Baran
źródło
@DW To pytanie dla początkujących w analizie programu. Kilka razy zastanawiałem się, zanim zadałem pytanie, czy wydaje się zbyt niejasne. To, czego szukam to: Jaką rolę odgrywa LFP w analizie programu (to na pewno ważne, ale jak?). Szukam odpowiedzi, która nie zagłębia się w wiele szczegółów matematycznych. Myślę, że sformułowanie w moim pytaniu również nie jest jasne. Zmienię pytanie.
Ram
@DW Zgadzam się, że to może nie być dobrze zbadane pytanie. Jednak za każdym razem, gdy czytam artykuły, wiele szczegółów matematycznych i szybko tracę duży obraz. Na przykład bardziej konkretnie, ten artykuł [Widening for Control-Flow] ( berkeleychurchill.com/research/papers/vmcai14.pdf ) wydaje mi się bardzo abstrakcyjny. Odwołuje się bezpośrednio do obliczania punktu najmniejszej poprawki. Większość artykułów w analizie programu wydaje się dotyczyć tego pytania w podobnych liniach. Straciłem duży obraz. Z przyjemnością dowiem się, dlaczego przetwarzanie LFP jest ważne.
Ram

Odpowiedzi:

13

Każda forma rekurencji lub iteracji w programowaniu jest w rzeczywistości stałym punktem. Na przykład whilepę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 donejest to rozwiązanie Wrównania

W  ≡  Φ(W)

gdzie Φ(x) ≡ if b then (c ; x). Ale co, jeśli Φma wiele stałych punktów? Który odpowiada whilepę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 fzdefiniowana 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 fjest 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 fjest wszędzie niezdefiniowaną funkcją.

Dodano na żądanie: w komentarzach OP zapytał o częściową kolejność dla whilepę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:VVnVn{}(v1,,vn)VnVnVnVn{}

  • 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{}VnVnVn{}
  • 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)

Andrej Bauer
źródło
1
+1 dla przykładu while. Jestem jednak trochę zdezorientowany. 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.
Ram
W powyższym komentarzu używam „L” do oznaczenia kraty (lub zestawu)
Ram
Poprawiłem odpowiedź.
Andrej Bauer,
Dziękuję za aktualizację. Szczególnie to doceniam, ponieważ dało mi to inne spojrzenie na programy. Czytam teraz „Teorię punktu stałego” z „Semantyki z aplikacjami: formalne wprowadzenie” Nielsona, która dopełniła poglądu na temat budowy sieci z funkcji częściowych dla języka IMP.
Ram
6

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.

DW
źródło