Pełna kompletność a pełna abstrakcja tłumaczenia programu


15

Wysiłki związane z weryfikacją kompilatora często sprowadzają się do udowodnienia, że ​​kompilator jest w pełni abstrakcyjny: zachowuje i odzwierciedla (kontekstowe) równoważności.

Zamiast dostarczania pełnych dowodów abstrakcji, niektóre ostatnie (oparte na kategoriach) prace weryfikacyjne kompilatora Hasegawy [ 1 , 2 ] i Egger i in. glin. [ 3 ] udowodnić pełną kompletność różnych tłumaczeń CPS.

Pytanie: Jaka jest różnica między pełną kompletnością a pełną abstrakcją?

Dla mnie kompletność wygląda jak odbicie równoważności tłumaczenia, a pełnia wydaje się być konsekwencją zachowania równoważności.

Uwaga : Zarówno Curien [ 7 ], jak i Abramsky [ 8 ] badają związek między definiowalnością, pełną abstrakcją i do pewnego stopnia pełną kompletnością. Podejrzewam, że te zasoby mogą mieć odpowiedź na moje pytanie, ale po powierzchownym przeczytaniu muszę jeszcze to potwierdzić.

Niektóre tło : termin „pełna kompletność” został wymyślony przez Abramsky'ego i Jagadeesana [ 4 ] w celu scharakteryzowania poprawności semantycznego modelu multiplikatywnej logiki liniowej.

Blute [ 5 ] zawiera następującą definicję:

Niech będzie kategorią bezpłatną. Mówimy, że kategoryczny model M jest w pełni kompletny dla F lub że mamy pełną kompletność F w odniesieniu do M, jeżeli w odniesieniu do niektórych interpretacji generatorów unikalny swobodny funktor [FM FFM jest pełny.[[]]:FM

O ile mogę stwierdzić, Hasegawa w [ 6 ] jest pierwszym, który dostosowuje pełną kompletność do opisu tłumaczenia programu zamiast kategorycznego modelu semantycznego. W tym przypadku tłumaczenie Girarda z po prostu wpisanego rachunku lambda na liniowy rachunek lambda. Później w [ 1 ] definiuje pełną kompletność tłumaczenia CPS () jako:

można uzyskać w liniowym rachunku lambda, wówczas istnieje Γ M : σ w obliczeniowym rachunku lambda takim, że Γ ; M = N : ( σ o ) o utrzymuje się w liniowym rachunku lambda.Γ;N:(σo)oΓM:σΓ;M=N:(σo)o

(gdzie jest typem podstawowym w liniowym rachunku lambda (język docelowy), ale nie w obliczeniowym rachunku lambda (język źródłowy).)o

Według mnie definicja Hasegawy wydaje się pełnią i powinna być naprawdę połączona z kompletnością, aby uzyskać pełną kompletność.

Egger i in. glin. [ 3 ] zdefiniuj pełną kompletność tłumaczenia CPS jako kombinację (1) kompletności i (2) kompletności:()v

(1): Jeżeli i Θ v | - M V = beta r | N V : ! τ v następnie Θ M = λ c N : τΘM,N:τΘv|Mv=βηNv:!τvΘM=λcN:τ

(2): Jeśli wtedy istnieje termin Θ M : τ taki, że Θ v | - M V = beta r | t : ! τ vΘv|t:!τvΘM:τΘv|Mv=βηt:!τv

(gdzie jest obliczeniową teorią równań Moggiego)=λc


[1] „ Liniowo używane efekty: przekształcenia monadyczne i CPS w liniowy rachunek Lambda ”, Hasegawa 2002

[2] „ Semantyka liniowej kontynuacji przekazywania według nazwisk ”, Hasegawa 2004

[3] „ Tłumaczenia CPS o zastosowaniu liniowym w rachunku wyników wzbogaconych ”, Egger i in. glin. 2012

[4] „ Gry i pełna kompletność dla multiplikatywnej logiki liniowej ”, Abramsky i Jagadeesan 1992

[5] „ Teoria kategorii dla logików liniowych ”, Blute 2003

[6] „ Girard Translation and Logical Predicates ”, Hasegawa 2000

[7] „ Definiowalność i pełna abstrakcja ”, Curien 2007

[8] „ Aksjomaty definiowalności i pełnej kompletności ”, Abramsky 1999

Odpowiedzi:


12

Niestety dzieje się tu zbyt wiele rzeczy. Łatwo jest więc pomieszać. Użycie „pełnego” w „pełnej kompletności” i „pełnej abstrakcji” odnosi się do zupełnie różnych idei pełni. Ale istnieje również niejasny związek między nimi. To będzie skomplikowana odpowiedź.

Pełna kompletność : „Dźwięk i kompletność” to właściwość, którą tradycyjna logika ma mieć pod względem semantyki. Zdrowość oznacza, że ​​wszystko, co można udowodnić w logice, jest prawdziwe w modelu semantycznym. Kompletność oznacza, że ​​wszystko, co jest prawdziwe w modelu semantycznym, można udowodnić w logice. Mówimy, że logika jest solidna i kompletna dla konkretnego modelu semantycznego. Kiedy dochodzimy do logiki konstruktywnej, takich jak teoria typu Martina-Lofa lub logika liniowa, dbamy nie tylko o to, czy formuły są możliwe do udowodnienia, ale także o to, jakie są ich dowody. Sprawdzalna formuła może mieć wiele dowodów, a konstruktywna logika chce je rozdzielić. Tak więc semantyka logiki konstruktywnej polega nie tylko na określeniu, czy formuła jest prawdziwa, ale także na abstrakcyjnym semantycznym pojęciu „dowodu” („dowodu”) na jej prawdziwość. Abramsky i współpracownicy wymyślili termin „pełna kompletność”, co oznacza, że ​​dowody w logice mogą wyrażać wszystkie dowody semantyczne w modelu. „Pełny” odnosi się tutaj do dowodów. „Kompletna” logika może udowodnić wszystko, czego potrzebuje. „W pełni kompletna” logika zawiera wszystkie dowody, które musi posiadać. Zatem „pełna kompletność” oznacza „konstruktywną kompletność” lub „kompletność dowodową”. Nie ma to nic wspólnego z pełną abstrakcją.

Pełna abstrakcja : „Adekwatna i w pełni abstrakcyjna” to właściwość, której potrzebujesz dla semantycznego modelu języka programowania. (Zauważ pierwszą różnicę: mamy teraz do czynienia z właściwościami modelu semantycznego, a nie właściwości języka!) Adekwatność oznacza, że ​​ilekroć dwa terminy mają to samo znaczenie w modelu semantycznym, są obserwacyjnie równoważne w języku programowania (w odniesieniu do niektórych pojęć wykonania). Pełna abstrakcja oznacza, że ​​jeśli dwa terminy są równoważne obserwacyjnie, mają takie samo znaczenie w modelu semantycznym. Te pomysły mogą być związane z solidnością i kompletnością, ale w nieco wymyślny sposób. Jeśli myślimy o semantycznym modelu języka programowania jako o „logice” lub „metodzie dowodowej”, aby mówić o równoważności obserwacyjnej, to adekwatność oznacza, że ​​ta metoda dowodowa jest solidna; pełna abstrakcja oznacza, że ​​ta metoda dowodowa jest kompletna. Nie ma pojęcia „pełnej kompletności”metoda dowodowa. (Ale coś takiego jest teoretycznie możliwe i pewnego dnia ktoś może to zrobić.)

W twoim przypadku interesują Cię tłumaczenia, a nie modele semantyczne. Właściwości adekwatności i pełnej abstrakcji można rozszerzyć w celu obsługi tłumaczeń w następujący sposób. Myślisz o języku docelowym jako o „modelu semantycznym”, tj. O formalizmie, który w pełni rozumiesz. Jeśli tak, masz jakieś pojęcie o równoważności. Następnie mówimy, że tłumaczenie jest odpowiednie, jeśli ilekroć tłumaczenia dwóch programów źródłowych są równoważne w języku docelowym, są one obserwacyjnie równoważne w języku źródłowym. Mówimy, że jest w pełni abstrakcyjny, jeśli ilekroć dwa programy źródłowe są obserwacyjnie równoważne w języku źródłowym, ich tłumaczenia są równoważne w języku docelowym.

W rzeczywistości nie znam żadnych języków docelowych, które naprawdę w pełni „rozumiemy”. Wszystko, co wiemy, to inne pojęcie równoważności obserwacyjnej dla języka docelowego. W takim przypadku tłumaczenie jest odpowiednie, jeżeli obserwacyjna równoważność tłumaczeń w języku docelowym implikuje równoważność obserwacyjną w języku źródłowym. Tłumaczenie jest w pełni abstrakcyjne, jeżeli obserwacyjna równoważność terminów w języku źródłowym implikuje obserwacyjną równoważność tłumaczeń w języku docelowym. M N τ ( M )

τ(M)τ(N)MN
Niektórzy autorzy uważają „tłumaczenie w pełni abstrakcyjne” za kombinację tych dwóch właściwości: M N
MNτ(M)τ(N)
MNτ(M)τ(N)

AA

N:τ(A).M:A.τ(M)=N

Teraz niejasny związek między pełną kompletnością a pełną abstrakcją. Udowodnienie, że model semantyczny lub tłumaczenie jest w pełni abstrakcyjne, często wymaga pewnej definiowalności. Jest tak, ponieważ nasze języki są na ogół wyższego rzędu. Tak więc, jeśli model semantyczny lub język docelowy ma zbyt wiele „kontekstów”, będzie w stanie wbić nasze terminy lub znaczenia semantyczne w niepożądany sposób i zepsuć ich równoważność. „Niepożądane sposoby” oznaczają sposoby, w które sam język programowania nie może ich dotknąć. Tak więc, aby uzyskać pełną abstrakcję, musimy upewnić się, że „konteksty” dostępne w modelu semantycznym lub języku docelowym pochodzą od tych w języku źródłowym w jakiejś formie. Należy pamiętać, że dotyczy to właściwości pełnej kompletności.

Dlaczego chcemy takich właściwości? Nie ma niczrobić z kompilatorami! Chcemy tych właściwości, aby twierdzić, że język źródłowy jest osadzony w języku docelowym. Jeśli jesteśmy zadowoleni z określonego języka docelowego (jako czystego, zrozumiałego, w jakiś sposób podstawowego lub podanego przez Boga), to jeśli język źródłowy jest w niego osadzony, możemy twierdzić, że nie ma nic nowego w języku źródłowym. To tylko fragment języka docelowego, który znamy i kochamy. To tylko cukier syntaktyczny. Tak więc ludzie w pełni abstrakcyjni tłumaczą, aby ustalić, że poszczególne języki docelowe są świetne. Czasami są one również podawane przez ludzi, którzy mają do czynienia z dużym lub skomplikowanym językiem. Zamiast więc bezpośrednio definiować semantykę, tłumaczą go na jakiś język podstawowy, a następnie podają semantykę na język podstawowy. Na przykład robi to raport Haskell. Jednak pełna abstrakcja tych tłumaczeń rzadko jest udowodniona, ponieważ języki źródłowe są duże i skomplikowane. Ludzie wierzą, że tłumaczenie jest dobre.

Po raz kolejny nie ma to nic wspólnego z kompilatorami. Kompilatory rzadko są adekwatne lub w pełni abstrakcyjne. I nie muszą tak być! Kompilator musi jedynie zachować zachowanie wykonawcze kompletnych programów. Język docelowy kompilatora jest na ogół ogromny, co oznacza, że ​​ma wiele kontekstów, które mogą zepsuć równoważność. Zatem równoważne programy w języku źródłowym prawie nigdy nie są równoważne kontekstowo po skompilowaniu.


Co masz na myśli mówiąc, że nie ma języków, które naprawdę w pełni „rozumiemy”?
Martin Berger

Co masz na myśli mówiąc, że nikt jeszcze nie stworzył modelu semantycznego, który reprezentuje konstruktywną metodę dowodu?
Martin Berger

1
Przykro mi, ale implikacje dla „tłumaczeń” wydają mi się w złym kierunku w porównaniu do twojego wcześniejszego tekstu. Pełna abstrakcja, powiedzmy, PCF prosi o M≅N⟹τ (M) ≅τ (N) (gdzie τ jest semantyką denotacyjną i ignoruje potrzebę zmiany symboli): jak mówisz, „Pełna abstrakcja oznacza, że ​​jeśli dwa terminy są równoważne obserwacyjnie, mają takie samo znaczenie w modelu semantycznym ". Ale twoja implikacja jest odwrotna (mianowicie piszesz τ (M) ≅τ (N) ⟹M≅N)! A może tłumaczenia działają inaczej niż semantyka denotacyjna?
Blaisorblade

1
@Blaisorblade: Masz absolutną rację! Poprawiłem tekst mojej odpowiedzi.
Uday Reddy

1
Pełna abstrakcja ma również znaczenie dla bezpieczeństwa na poziomie języka i potencjalnie dla integracji między językami. Warto wiedzieć, że nic w języku docelowym nie może naruszać abstrakcji języka źródłowego.
dmbarbour

5

Podsumowanie: pełna kompletność oznacza, że ​​funkcja interpretacji jest nie tylko kompletna, ale także przypuszczalna dla programów. Pełna abstrakcja nie wymaga surowości.

[[.]]

  • A[[A]]

  • Γ[[Γ]]

  • ΓP:α[[Γ]][[P]]:[[α]]

[[.]]

PSQ     iff     [[P]]T[[Q]]

P,QST

PΓ,αSQ     iff     [[P]][[Γ]],[[α]]T[[Q]]
Γ,α,P,Q[[.]]

[[.]]

[[.]][[Γ]]Q:[[α]]ΓP:αQ=[[P]][[.]]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.