Повна повнота проти повної абстракції програмного перекладу


15

Зусилля з перевірки компілятора часто зводяться до доведення компілятора повністю абстрактним: що він зберігає та відображає (контекстуальні) еквіваленти.

Замість надання повних доказів абстракції деякі останні перевірки (з урахуванням категорій) перевірки компілятора Hasegawa [ 1 , 2 ] та Egger et. ін. [ 3 ] довести повну повноту різних перекладів CPS.

Питання: Чим відрізняється повна повнота і повна абстракція?

Для мене повнота виглядає як відображення еквівалентності для перекладу, а повнота є наслідком збереження еквівалентності.

Примітка : і Курієн [ 7 ], і Абрамський [ 8 ] досліджують взаємозв'язок між визначеністю, повною абстракцією та певною мірою повнотою. Я підозрюю, що ці ресурси можуть відповісти на моє запитання, але після того, як прочитати поверхню, я ще маю це підтвердити.

Деякі передумови : Термін "повна повнота" був введений Абрамським та Джагадесаном [ 4 ] для характеристики правильності ігрово -семантичної моделі мультиплікативної лінійної логіки.

Blute [ 5 ] дає таке визначення:

Нехай - вільна категорія. Ми говоримо, що категорична модель M є повністю повною для F або що ми маємо повну повноту F відносно M, якщо стосовно деякої інтерпретації генераторів унікальний вільний функтор [ЖМ ЖЖМ заповнене.[[-]]:ЖМ

Наскільки я можу сказати, Хасегава в [ 6 ] першим адаптував повну повноту для опису програмного перекладу замість категоричної семантичної моделі. У цьому випадку переклад Жирара від просто набраного числення лямбда до лінійного числення лямбда. Пізніше, в [ 1 ], він визначає повну повноту перекладу CPS як:()

Γ M : σ Γ ; M = N : ( σ o ) oΓ;N:(σо)оΓМ:σ в обчислювальному , що утримується в лінійному обчисленні лямбда.Γ;М=N:(σо)о

(де - базовий тип в лінійному обчисленні лямбда (мова цілі), але не в обчислювальному обчисленні лямбда (мова джерела).)о

Для мене визначення Хасегава здається повнотою і його слід справді поєднувати з повнотою, щоб отримати повну повноту.

Еггер та ін. ін. [ 3 ] визначити повну повноту перекладу CPS як поєднання (1) повноти та (2) повноти:()v

(1): Якщо і тодіΘ v | - M v = & beta ; п N v : ! τ v Θ M = λ c N : τΘМ,N:τΘv|-Мv=βηNv:!τvΘМ=λcN:τ

(2): Якщо тоді існує термін такий, що Θ M : τ Θ v | - M v = & beta ; п т : ! τ vΘv|-т:!τvΘМ:τΘv|-Мv=βηт:!τv

(де - обчислювальна )=λc


[1] " Лінійно використані ефекти: трансформація монади та КПС у лінійний обчислення лямбда ", Хасегава 2002

[2] " Семантика лінійного продовження передачі в дзвінку по імені ", Хасегава 2004

[3] " CPS-переклади лінійного використання в обчисленні з збагаченим ефектом ", Egger et al. ін. 2012 рік

[4] " Ігри та повна повнота для мультиплікативної лінійної логіки ", Абрамський та Ягадесан 1992

[5] " Теорія категорій для лінійних логіків ", Blute 2003

[6] " Переклад і логічні логіки Джирарда ", Хасегава 2000

[7] " Визначальність та повна абстракція ", Curien 2007

[8] « Аксіоми для визначеності та повної повноти », Абрамський, 1999

Відповіді:


12

На жаль, тут відбувається дуже багато речей. Отже, речі легко переплутати. Використання "повного" у "повній повноті" та "повної абстракції" стосується абсолютно різних ідей повноти. Але, між ними також є якийсь невиразний зв’язок. Отже, це буде складною відповіддю.

Повна повнота : "Звук і повнота" - це властивість, яку ви хочете, щоб традиційна логіка мала відносно її семантики. Здоровість означає, що все, що ви можете довести логікою, вірно і в семантичній моделі. Повнота означає, що все, що є правдивим у семантичній моделі, є доказовим у логіці. Ми говоримо, що логіка є здоровою і повною для певної семантичної моделі. Коли ми приходимо до конструктивної логіки, наприклад, теорія типу Мартіна-Лофа або лінійна логіка, ми дбаємо не лише про те, чи можна формули доказувати, а й якими є їхні докази. Доказна формула може мати багато доказів, і конструктивна логіка хоче їх відставати. Отже, семантика для конструктивної логіки передбачає уточнення не лише того, чи є формула правдивою, а й якесь абстрактне семантичне поняття «доказ» («доказ») для її істинності. Абрамський та його колеги ввели термін "повна повнота", щоб означати, що докази в логіці можуть виражати всі смислові докази в моделі. Отже, "повний" стосується доказів тут. "Повна" логіка може довести все, що потрібно. "Повноцінна" логіка має всі докази, які вона повинна мати. Отже "повна повнота" означає "конструктивну повноту" або "доказову повноту". Це не має нічого спільного з повною абстракцією.

Повна абстракція : "Адекватна і повністю абстрактна" - це властивість, яку ви хочете для семантичної моделі мови програмування. (Зверніть увагу на першу відмінність: зараз ми маємо справу з властивостями семантичної моделі, а не властивості мови!) Адекватність означає, що коли два терміни мають однакове значення в семантичній моделі, вони спостережно еквівалентні мові програмування (стосовно певного поняття виконання). Повна абстракція означає, що якщо два терміни спостережно еквівалентні, вони мають однакове значення в семантичній моделі. Ці ідеї можуть бути пов’язані з обгрунтованістю та повнотою, але дещо надуманим чином. Якщо ми розглядаємо семантичну модель мови програмування як "логіку" або "метод доказування", щоб говорити про спостережливість еквівалентності, то адекватність означає, що цей метод доказування є здоровим; повна абстракція означає, що цей метод доказування закінчений. Тут немає поняття "повної повноти", оскільки ще ніхто не створив семантичну модель, що представляє собоюметод доказування. (Але теоретично таке можливо, і одного дня хтось може це зробити.)

У вашому випадку вас цікавлять переклади, а не семантичні моделі. Властивості адекватності та повної абстракції можна розширити, щоб мати справу з перекладами наступним чином. Ви розглядаєте мову цілі як свою "семантичну модель", тобто формалізм, який ви якось повністю розумієте. Якщо так, у вас є якесь поняття еквівалентності для цього. Тоді ми говоримо, що переклад є адекватним, якщо щоразу, коли переклади двох програм-джерел є рівнозначними цільовій мові, вони спостережно еквівалентні мові-джерелу. Ми говоримо, що це абсолютно абстрактно, якщо, коли дві програми-джерела спостережно еквівалентні мові джерела, їх переклади є рівнозначними цільовій мові.

Насправді я не знаю жодної мови перекладу, яку ми насправді повністю "розуміємо". Все, що ми знаємо, - це якесь інше поняття спостережливої ​​еквівалентності для цільової мови. У цьому випадку переклад є адекватним, якщо спостережлива еквівалентність перекладів цільовою мовою передбачає спостережливість еквівалентності в мові-джерелі. Переклад є повністю абстрактним, якщо спостережлива еквівалентність термінів мовою-джерелом передбачає спостережувальну еквівалентність перекладів цільовою мовою. M N τ ( M )

τ(М)τ(N)МN
Деякі автори вважають "повністю абстрактним перекладом" означення поєднання цих двох властивостей: M N
МNτ(М)τ(N)
МNτ(М)τ(N)

Еггер та інші схоже поширюють ідею повної повноти на переклади. У їх складі формули - це типи, а докази - терміни. Їх переклад перекладає як типи, так і терміни. Вони називають їх переклад повністю завершена , якщо переклад типу має тільки ті члени, які виходять шляхом перетворення вихідних умов типу А . N : τ ( A ) .АА

N:τ(А).М:А.τ(М)=N

Тепер про неясний зв’язок між повною повнотою та повною абстракцією. Доведення того, що семантична модель або переклад є повністю абстрактним, часто передбачає певну визначеність. Це тому, що наші мови, як правило, вищого рівня. Отже, якщо семантична модель або мова-мішень має занадто багато "контекстів", то вона зможе підкинути наші терміни або семантичні значення небажаними способами і зіпсувати їх еквівалентність. "Небажані способи" означають, що мова програмування сама по собі не може їх підмінити. Отже, щоб отримати повну абстракцію, нам потрібно переконатися, що "контексти", доступні в семантичній моделі або цільовій мові, походять з тих, що є у вихідній мові в якійсь формі. Зауважте, що це стосується властивості повної повноти.

Чому ми хочемо такі властивості? У ньому немає нічогоробити з компіляторами! Ми хочемо ці властивості для того, щоб стверджувати, що мова-джерело вбудовується в цільову мову. Якщо ми задоволені певною цільовою мовою (як чистою, зрозумілою, якось фундаментальною чи даною Богом), тоді, якщо мова-джерело вбудовується в неї, то ми можемо стверджувати, що в мові-джерелі немає нічого нового. Це лише фрагмент мови, якою ми користуємось, яку ми знаємо і любимо. Це просто синтаксичний цукор. Отже, люди повністю дають абстрактні переклади, щоб встановити, що конкретні мови перекладу чудові. Їх також іноді дають люди, у яких є велика або складна мова для боротьби. Отже, замість того, щоб визначати семантику для неї безпосередньо, вони перекладають її на якусь основну мову, а потім надають семантику основній мові. Наприклад, звіт Haskell робить це. Але повна абстракція цих перекладів рідко доводиться, оскільки мови джерел великі і складні. Люди сприймають це з вірою, що переклад хороший.

Знову ж таки, це не має нічого спільного з компіляторами. Компілятори рідко бувають адекватними або повністю абстрактними. І їм не потрібно! Все, що потрібно зробити компілятору, - це зберегти поведінку виконання повних програм. Мова цілі компілятора, як правило, величезна, це означає, що в ньому багато контекстів, які можуть зіпсувати еквівалентність. Отже, еквівалентні програми на мові-джерелі майже ніколи не є контекстуально еквівалентними при їх складанні.


Що ви маєте на увазі, говорячи про те, що не існує мов, які ми насправді повністю "розуміємо"?
Мартін Бергер

Що ви маєте на увазі під тим, що ніхто ще не створив семантичну модель, яка представляє конструктивний метод доказування?
Мартін Бергер

1
Вибачте, але наслідки для "перекладу" здаються мені не в тому напрямку, порівняно з вашим попереднім текстом. Повна абстракція, скажімо, PCF просить M≅N⟹τ (M) ≅τ (N) (при цьому τ є денотаційною семантикою та ігнорування необхідності зміни символів): як ви кажете, "Повна абстракція означає, що, якщо два терміни спостережно еквівалентні, вони мають однакове значення в смисловій моделі ". Але ваше значення - навпаки (а саме ви пишете τ (M) ≅τ (N) ⟹M≅N)! Або переклади працюють інакше, ніж денотаційна семантика?
Blaisorblade

1
@Blaisorblade: Ви абсолютно праві! Я вніс виправлення в текст своєї відповіді.
Удай Редді

1
Повна абстракція також представляє інтерес для безпеки мовного рівня та, можливо, для мовної інтеграції. Тобто корисно знати, що ніщо на цільовій мові не може порушити абстрагування мови-джерела.
марта

5

Короткий зміст: повна повнота означає, що функція інтерпретації є не просто повною, а й сприятливою для програм. Повна абстракція не вимагає сур'єктивності.

Деталі: Детальний сенс повної абстракції та повної повноти залежить від характеру того, що / де / як ви інтерпретуєте. Ось подання про інтерпретацію однієї набраної мови програмування на іншу. У вас є функція інтерпретації Яка відображає три речі.[[.]]

  • Типи вихідної мови для типів на цільовій мові.А[[А]]

  • Контексти на мові джерела до контекстів на цільовій мові.Γ[[Γ]]

  • Програми в контексті для програм у контексті .ΓП:α[[Γ]][[П]]:[[α]]

У категоричній інтерпретації перші дві карти згортаються в одну. Функція інтерпретації може мати різні властивості, наприклад, вона може бути композиційною, або зберігати закінчення або ... Повна абстракція є однією з таких властивостей. Нагадаємо, повна абстракція Означає це[[.]]

ПSQ     iff     [[П]]Т[[Q]]

П,QSТ

ПΓ,αSQ     iff     [[П]][[Γ]],[[α]]Т[[Q]]
Γ,α,П,Q[[.]]

[[.]]

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.