Sfortunatamente, ci sono troppe cose che stanno succedendo qui. Quindi, è facile mescolare le cose. L'uso di "pieno" in "piena completezza" e "piena astrazione" si riferisce a idee completamente diverse di pienezza. Ma c'è anche una vaga connessione tra loro. Quindi, questa sarà una risposta complicata.
Completezza completa : "Suono e completezza" è una proprietà che una logica tradizionale desidera avere rispetto alla sua semantica. La solidità significa che qualunque cosa tu possa dimostrare nella logica è vera nel modello semantico. Completezza significa che tutto ciò che è vero nel modello semantico è dimostrabile nella logica. Diciamo che una logica è solida e completa per un particolare modello semantico. Quando arriviamo alla logica costruttiva, come la teoria dei tipi di Martin-Lof o la logica lineare, ci preoccupiamo non solo se le formule siano dimostrabili, ma anche quali siano le loro prove. Una formula dimostrabile può avere molte prove e una logica costruttiva vuole tenerle separate. Quindi, una semantica per una logica costruttiva implica specificare non solo se una formula è vera, ma anche qualche nozione astratta semantica di "prova" ("evidenza") per la sua verità. Abramsky e colleghi hanno coniato il termine "completezza totale" per indicare che le prove nella logica possono esprimere tutte le prove semantiche nel modello. Quindi, "completo" si riferisce alle prove qui. Una logica "completa" può dimostrare tutto ciò di cui ha bisogno. Una logica "completamente completa" ha tutte le prove che deve avere. Quindi "completezza completa" significa "completezza costruttiva" o "completezza di prova". Questo non ha nulla a che fare con la piena astrazione.
Astrazione totale : "Adeguato e completamente astratto" è una proprietà desiderata per il modello semantico di un linguaggio di programmazione. (Nota la prima differenza: ora abbiamo a che fare con le proprietà del modello semantico, non le proprietà del linguaggio!) Adeguatezza significa che, ogni volta che due termini hanno lo stesso significato nel modello semantico, sono osservativamente equivalenti nel linguaggio di programmazione (rispetto ad alcune nozioni di esecuzione). Astrazione totale significa che, se due termini sono equivalentemente osservazionali, hanno lo stesso significato nel modello semantico. Queste idee possono essere correlate alla solidità e completezza, ma in modo un po 'inventato. Se pensiamo al modello semantico di un linguaggio di programmazione come una "logica" o un "metodo di prova" per parlare di equivalenza osservativa, allora l'adeguatezza significa che questo metodo di prova è valido; astrazione completa significa che questo metodo di prova è completo. Non vi è alcuna nozione di "completezza totale"metodo di prova. (Ma una cosa del genere è teoricamente possibile e uno di questi giorni qualcuno potrebbe farlo.)
Nel tuo caso, sei interessato alle traduzioni piuttosto che ai modelli semantici. Le proprietà dell'adeguatezza e della piena astrazione possono essere estese per trattare le traduzioni come segue. Pensi alla lingua target come al tuo "modello semantico", cioè a un formalismo che in qualche modo comprendi appieno. Se è così, hai qualche nozione di equivalenza per questo. Quindi, diciamo che la traduzione è adeguata se, ogni volta che le traduzioni di due programmi sorgente sono equivalenti nella lingua di destinazione, sono equivalentemente osservazionali nella lingua sorgente. Diciamo che è completamente astratto se, ogni volta che due programmi sorgente sono equivalentemente osservazionali nella lingua sorgente, le loro traduzioni sono equivalenti nella lingua target.
In realtà, non conosco alcuna lingua di destinazione che "capiamo" completamente. Tutto ciò che sappiamo è un'altra nozione di equivalenza osservativa per la lingua di destinazione. In tal caso, la traduzione è adeguata se l'equivalenza osservativa delle traduzioni nella lingua di arrivo implica l'equivalenza osservativa nella lingua di partenza.
La traduzione è completamente astratta se l'equivalenza osservativa dei termini nella lingua di partenza implica l'equivalenza osservativa delle traduzioni nella lingua di destinazione.
Alcuni autori prendono "traduzione completamente astratta" per indicare la combinazione di queste due proprietà:
τ(M)≅τ(N)⟹M≅N
M≅N⟹τ(M)≅τ(N)
M≅N⟺τ(M)≅τ(N)
Egger et al sembrano estendere allo stesso modo l'idea di piena completezza alle traduzioni. Nel loro set-up, le formule sono tipi e le prove sono termini. La loro traduzione traduce sia tipi che termini. Chiamano loro traduzione pienamente compiuta se la definizione di un tipo ha solo quei termini che sono ottenuti traducendo le condizioni iniziali di tipo .
AA
∀N:τ(A).∃M:A.τ(M)=N
Ora per la vaga connessione tra piena completezza e piena astrazione. Dimostrare che un modello semantico o una traduzione è completamente astratta spesso implica un po 'di definibilità. Questo perché le nostre lingue sono generalmente di ordine superiore. Quindi, se il modello semantico o la lingua target hanno troppi "contesti", allora sarà in grado di stimolare i nostri termini o significati semantici in modi indesiderati e rovinare la loro equivalenza. "Modi indesiderati" significa che il linguaggio di programmazione stesso non è in grado di colpirli. Quindi, per ottenere la piena astrazione, dobbiamo garantire che i "contesti" disponibili nel modello semantico o nella lingua di destinazione provengano da quelli nella lingua di origine in qualche forma. Si noti che ciò si riferisce alla proprietà di completezza completa.
Perché vogliamo tali proprietà? Non ha nientea che fare con i compilatori! Vogliamo queste proprietà al fine di affermare che la lingua di origine è incorporata nella lingua di destinazione. Se siamo contenti di una particolare lingua di destinazione (come essere chiari, comprensibili, in qualche modo fondamentali o dati da Dio), allora, se la lingua di partenza si incorpora in essa, allora possiamo affermare che non c'è nulla di nuovo nella lingua di partenza. È solo un frammento della lingua di destinazione che conosciamo e amiamo. È solo zucchero sintattico. Quindi, le traduzioni completamente astratte sono date dalle persone per stabilire che particolari lingue di destinazione sono ottime. A volte sono anche dati da persone che hanno un linguaggio grande o complicato da affrontare. Quindi, invece di definire direttamente una semantica per essa, la traducono in un linguaggio di base e quindi forniscono la semantica al linguaggio di base. Ad esempio, il rapporto Haskell fa questo. Ma la piena astrazione di queste traduzioni raramente viene mai provata perché le lingue di origine sono grandi e complicate. Le persone credono che la traduzione sia buona.
Ancora una volta, questo non ha nulla a che fare con i compilatori. I compilatori raramente sono mai adeguati o completamente astratti. E non hanno bisogno di esserlo! Tutto quello che un compilatore deve fare è preservare il comportamento di esecuzione di programmi completi. La lingua di destinazione di un compilatore è generalmente enorme, il che significa che ha molti contesti che possono rovinare l'equivalenza. Pertanto, i programmi equivalenti nella lingua di origine non sono quasi mai contestualmente equivalenti quando compilati.