Дрібні проти глибоких вкладень


47

При кодуванні логіки до помічника перевірки, такого як Кок або Ізабел, слід вибрати вибір між неглибоким та глибоким вбудовуванням. У мілкомірне вбудовування логічні формули записуються безпосередньо в логіці доказів теореми, тоді як у глибокому вкладанні логічні формули представлені як тип даних.

  • Які переваги та обмеження різних підходів?
  • Чи є вказівки щодо визначення, які використовувати?
  • Чи можливо перемикатися між двома представленнями будь-яким систематичним способом?

В якості мотивації я хотів би кодувати різні логіки, пов'язані з безпекою, і мені цікаво, які плюси і мінуси різних підходів є.

Відповіді:


28

Які переваги та обмеження різних підходів?

  • Плюси глибокого вбудовування: Ви можете довести та визначити речі за допомогою індукції на структурі формул. Прикладами інтересів є розмір формули.

  • Мінуси глибокого вбудовування: Ви чітко займаєтесь прив'язкою змінних. Зазвичай це дуже трудомістко.

Чи є вказівки щодо визначення, які використовувати?

Неглибокі вбудовування дуже корисні для імпорту результату, доведеного в логіці об'єкта. Наприклад, якщо ви довели щось у невеликій логіці (наприклад, логіка розділення), неглибокі вбудовування можуть стати інструментом вибору для імпорту результату в Coq.

З іншого боку, глибоке вбудовування майже обов'язкове, коли ви хочете довести мета-теореми про логіку об'єкта (як, наприклад, усунення).

Чи можливо перемикатися між двома представленнями будь-яким систематичним способом?

Ідея, що стоїть за неглибоким вбудовою, - це справді працювати безпосередньо в моделі формул об'єкта. Зазвичай люди відображають формулу об'єкта Р безпосередньо (використовуючи позначення або роблячи переклад вручну) мешканцю Проп. Звичайно, є мешканці Проп, яких неможливо отримати, вклавши формулу логіки об'єкта. Тому ви втрачаєте якусь повноту.

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

Ось невеликий приклад кок:

Індуктивна формула: Встановити: =
    Ftrue: формула
  | Ffalse: формула
  | Fand: формула -> формула -> формула
  | Для: формула -> формула -> формула.

Інтерпретатор фіксованої точки (F: формула): Підписка: = збігаємо F з 
    Ftrue => Правда
  | Ffalse => Неправдиво
  | Fand ab => (інтерпретувати a) / \ (інтерпретувати b)
  | Для ab => (інтерпретувати a) \ / (інтерпретувати b)
 кінець.

Індуктивна похідна: формула -> Підписка: = 
    deep_axiom: похідна Ftrue
  | deep_and: forall ab, derivable a -> derivable b -> derivable (Fand ab)
  | deep_or1: forall ab, derivable a -> derivable (Для ab)
  | deep_or2: forall ab, derivable b -> derivable (Для ab).

Індуктивний вивідний показник: Prop -> Prop: = 
    неглибока_аксіома: правдоподібна 
  | мілкий_і: forall ab, sderivable a -> sderivable b -> sderivable (a / \ b)
  | shallow_or1: forall ab, sderivable a -> sderivable (a \ / b)
  | shallow_or2: forall ab, sderivable b -> sderivable (a \ / b).

(* Ви можете довести наступну лему: *)
Лемма неглибока_глибока: 
   forall F, похідний F -> sderivable (інтерпретувати F).

(* НЕ можна довести наступну лему: *)
Лемма t: 
   forall P, sderivable P -> існує F, інтерпретувати F = P

22

Грубо кажучи, за допомогою глибокого вбудовування логіки ви (1) визначаєте тип даних, що представляє синтаксис для вашої логіки, і (2) надаєте модель синтаксису і (3) доказуєте, що аксіоми щодо вашого синтаксису звучать відносно до моделі. За допомогою неглибокого вбудовування ви пропускаєте кроки (1) та (2), і просто починаєте з моделі та доказуєте взаємозв'язок між формулами. Це означає, що неглибокі вкладки, як правило, менше роботи, щоб зійти з землі, оскільки вони представляють роботу, яку ви, як правило, робите в будь-якому випадку з глибоким вбудовою.

Однак, якщо ви маєте глибоке вбудовування, зазвичай простіше написати процедури рефлексивного рішення, оскільки ви працюєте з формулами, які насправді мають синтаксис, який ви можете повторити. Крім того, якщо ваша модель дивна або складна, зазвичай вам не хочеться безпосередньо працювати з семантикою. (Наприклад, якщо ви використовуєте біортогональність для примушування допустимого закриття або використовуєте моделі в стилі Крипке, щоб форсувати властивості кадру в логіці розділення або подібних іграх.) Однак глибокі вбудовування майже напевно змусять вас багато думати про змінну прив'язку та підстановки , що наповнить ваше серце гнівом, оскільки це (а) тривіальне і (б) нескінченне джерело роздратування.

Правильна послідовність, яку ви повинні взяти: 1) спробуйте обходитися неглибоким вбудовою. (2) Коли у вас не вистачає пари, спробуйте скористатися тактикою та цитатою для запуску процедур прийняття рішень, які ви хочете запустити. (3) Якщо для цього також не вистачає пари, відмовтеся від використання синтаксису залежного типу для глибокого вбудовування.

  • Плануйте взяти пару місяців (3), якщо це ваш перший вихід. Вам буде необхідно ознайомитися з фантазії особливості вашого докази помічника залишитися в здоровому глузді. (Але це інвестиції, які окупляться загалом.)
  • Якщо ваш кореспондент не має залежних типів, залишайтеся на рівні 2.
  • Якщо мова об'єкта сама по собі введена залежно, залишайтеся на рівні 2.

Також не намагайтеся йти поступово вгору по сходах. Коли ви вирішите піднятися по сходах складності, зробіть повний крок за один раз. Якщо ви робите речі побітно, то ви отримаєте безліч теорем, які є дивними та непридатними (наприклад, ви отримаєте кілька синтаксисів з половинною оцінкою та теореми, які дивно поєднують синтаксис та семантику), що ви врешті-решт доведеться викинути.

EDIT: Ось коментар, який пояснює, чому поступово сходити по сходах настільки спокусливо і чому це призводить (загалом) до страждань.

ABIABBA(AB)CA(BC)(IA)(BC)A(B(CI))

Це правда, і працює! Однак зауважте, що кон'юнкція також є ACUI, а також диз'юнкція. Таким чином, ви будете проходити той самий процес в інших доказах, з різними типами даних списку, і тоді у вас будуть три синтаксиси для різних фрагментів логіки розділення, і ви матимете метатеореми для кожного з них, які неминуче будуть різними, і ти виявиш, що ти хочеш метатеореми, яку ти довів, щоб розділити сполучник на диз'юнкцію, і тоді ти захочеш змішати синтаксиси, і тоді ти зійдеш з розуму.

Краще орієнтуватися на найбільший фрагмент, з яким ви можете впоратися з розумними зусиллями, і просто зробити це.


Дякую за чудову відповідь, Ніл. Мені б хотілося прийняти дві відповіді (я вирішив, грунтуючись на голосах інших).
Дейв Кларк

Нема проблем. Я просто запам'ятав щось, що мені потрібно додати до цієї відповіді, про те, чому поступово йти так заманливо.
Neel Krishnaswami

У роботі з властивостями ACUI - це завжди неприємність. Чому Кок не може взяти листок з книги Мод?
Дейв Кларк

14

Важливо розуміти, що існує спектр від глибокого до мілкого. Ви глибоко моделюєте частини своєї мови, які повинні якось брати участь у якомусь спонукальному аргументі щодо її побудови, решту краще залишити на мілкому баченні прямої семантики субстрату логіки.

Наприклад, коли ви хочете розмірковувати про Hoare Logic, ви можете моделювати мову виразів неглибоко, але контур мови присвоєння if-while повинен бути конкретним типом даних. Вам не потрібно вводити структуру x + y або a <b, але вам потрібно працювати з whileі т.д.

В інших відповідях були натяки на залежні типи. Це нагадує стародавню проблему представляти мови з палітурками розумним чином, щоб вони були максимально дрібними, але все-таки визнавали деякі спонукальні аргументи. Моє враження, що журі все ще судить про всі різні підходи та документи, що з'явилися за останні 10-20 років з цього питання. "Виклик POPLmark" для різних громад-помічників-доказів також був певною мірою про це.

Як не дивно, в класичному HOL без залежних типів, HOL-номінальний підхід К. Урбан досить добре працював на мілкому зв’язуванні, хоча він не наздогнав культурних зрушень у цих спільнотах формалізації мови програмування.

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