На жаль, тут відбувається дуже багато речей. Отже, речі легко переплутати. Використання "повного" у "повній повноті" та "повної абстракції" стосується абсолютно різних ідей повноти. Але, між ними також є якийсь невиразний зв’язок. Отже, це буде складною відповіддю.
Повна повнота : "Звук і повнота" - це властивість, яку ви хочете, щоб традиційна логіка мала відносно її семантики. Здоровість означає, що все, що ви можете довести логікою, вірно і в семантичній моделі. Повнота означає, що все, що є правдивим у семантичній моделі, є доказовим у логіці. Ми говоримо, що логіка є здоровою і повною для певної семантичної моделі. Коли ми приходимо до конструктивної логіки, наприклад, теорія типу Мартіна-Лофа або лінійна логіка, ми дбаємо не лише про те, чи можна формули доказувати, а й якими є їхні докази. Доказна формула може мати багато доказів, і конструктивна логіка хоче їх відставати. Отже, семантика для конструктивної логіки передбачає уточнення не лише того, чи є формула правдивою, а й якесь абстрактне семантичне поняття «доказ» («доказ») для її істинності. Абрамський та його колеги ввели термін "повна повнота", щоб означати, що докази в логіці можуть виражати всі смислові докази в моделі. Отже, "повний" стосується доказів тут. "Повна" логіка може довести все, що потрібно. "Повноцінна" логіка має всі докази, які вона повинна мати. Отже "повна повнота" означає "конструктивну повноту" або "доказову повноту". Це не має нічого спільного з повною абстракцією.
Повна абстракція : "Адекватна і повністю абстрактна" - це властивість, яку ви хочете для семантичної моделі мови програмування. (Зверніть увагу на першу відмінність: зараз ми маємо справу з властивостями семантичної моделі, а не властивості мови!) Адекватність означає, що коли два терміни мають однакове значення в семантичній моделі, вони спостережно еквівалентні мові програмування (стосовно певного поняття виконання). Повна абстракція означає, що якщо два терміни спостережно еквівалентні, вони мають однакове значення в семантичній моделі. Ці ідеї можуть бути пов’язані з обгрунтованістю та повнотою, але дещо надуманим чином. Якщо ми розглядаємо семантичну модель мови програмування як "логіку" або "метод доказування", щоб говорити про спостережливість еквівалентності, то адекватність означає, що цей метод доказування є здоровим; повна абстракція означає, що цей метод доказування закінчений. Тут немає поняття "повної повноти", оскільки ще ніхто не створив семантичну модель, що представляє собоюметод доказування. (Але теоретично таке можливо, і одного дня хтось може це зробити.)
У вашому випадку вас цікавлять переклади, а не семантичні моделі. Властивості адекватності та повної абстракції можна розширити, щоб мати справу з перекладами наступним чином. Ви розглядаєте мову цілі як свою "семантичну модель", тобто формалізм, який ви якось повністю розумієте. Якщо так, у вас є якесь поняття еквівалентності для цього. Тоді ми говоримо, що переклад є адекватним, якщо щоразу, коли переклади двох програм-джерел є рівнозначними цільовій мові, вони спостережно еквівалентні мові-джерелу. Ми говоримо, що це абсолютно абстрактно, якщо, коли дві програми-джерела спостережно еквівалентні мові джерела, їх переклади є рівнозначними цільовій мові.
Насправді я не знаю жодної мови перекладу, яку ми насправді повністю "розуміємо". Все, що ми знаємо, - це якесь інше поняття спостережливої еквівалентності для цільової мови. У цьому випадку переклад є адекватним, якщо спостережлива еквівалентність перекладів цільовою мовою передбачає спостережливість еквівалентності в мові-джерелі.
Переклад є повністю абстрактним, якщо спостережлива еквівалентність термінів мовою-джерелом передбачає спостережувальну еквівалентність перекладів цільовою мовою.
M ≅ N ⟹ τ ( M )
τ( М) ≅τ( N) ⟹ М≅N
Деякі автори вважають "повністю абстрактним перекладом" означення поєднання цих двох властивостей:
M ≅ NМ≅N⟹ τ( М) ≅τ( N)
М≅N⟺τ( М) ≅τ( N)
Еггер та інші схоже поширюють ідею повної повноти на переклади. У їх складі формули - це типи, а докази - терміни. Їх переклад перекладає як типи, так і терміни. Вони називають їх переклад повністю завершена , якщо переклад типу має тільки ті члени, які виходять шляхом перетворення вихідних умов типу А .
∀ N : τ ( A ) .АА
∀ N: τ( А ) .∃ М: .τ( М) = N
Тепер про неясний зв’язок між повною повнотою та повною абстракцією. Доведення того, що семантична модель або переклад є повністю абстрактним, часто передбачає певну визначеність. Це тому, що наші мови, як правило, вищого рівня. Отже, якщо семантична модель або мова-мішень має занадто багато "контекстів", то вона зможе підкинути наші терміни або семантичні значення небажаними способами і зіпсувати їх еквівалентність. "Небажані способи" означають, що мова програмування сама по собі не може їх підмінити. Отже, щоб отримати повну абстракцію, нам потрібно переконатися, що "контексти", доступні в семантичній моделі або цільовій мові, походять з тих, що є у вихідній мові в якійсь формі. Зауважте, що це стосується властивості повної повноти.
Чому ми хочемо такі властивості? У ньому немає нічогоробити з компіляторами! Ми хочемо ці властивості для того, щоб стверджувати, що мова-джерело вбудовується в цільову мову. Якщо ми задоволені певною цільовою мовою (як чистою, зрозумілою, якось фундаментальною чи даною Богом), тоді, якщо мова-джерело вбудовується в неї, то ми можемо стверджувати, що в мові-джерелі немає нічого нового. Це лише фрагмент мови, якою ми користуємось, яку ми знаємо і любимо. Це просто синтаксичний цукор. Отже, люди повністю дають абстрактні переклади, щоб встановити, що конкретні мови перекладу чудові. Їх також іноді дають люди, у яких є велика або складна мова для боротьби. Отже, замість того, щоб визначати семантику для неї безпосередньо, вони перекладають її на якусь основну мову, а потім надають семантику основній мові. Наприклад, звіт Haskell робить це. Але повна абстракція цих перекладів рідко доводиться, оскільки мови джерел великі і складні. Люди сприймають це з вірою, що переклад хороший.
Знову ж таки, це не має нічого спільного з компіляторами. Компілятори рідко бувають адекватними або повністю абстрактними. І їм не потрібно! Все, що потрібно зробити компілятору, - це зберегти поведінку виконання повних програм. Мова цілі компілятора, як правило, величезна, це означає, що в ньому багато контекстів, які можуть зіпсувати еквівалентність. Отже, еквівалентні програми на мові-джерелі майже ніколи не є контекстуально еквівалентними при їх складанні.