Яка мета абстрактного тлумачення в мовах програмування?


9

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

У чому я не впевнений, що мотивує використання абстрактної інтерпретації? Це просто визначення фіксованих точок для обчислюваних функцій? Чи є основна мотивація, пов'язана з рекурсією більшості мов програмування?

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


цитуйте книгу пл. wikipedia абстрактне тлумачення
vzn

Скажіть, яку книгу ви читаєте?
Vijay D

Вікіпедія - не завжди найкраще місце для навчального посібника з більш технічних тем.
Vijay D

@Vijay and vzn Це одне, на що я подивився: cs.berkeley.edu/~necula/cs263/handouts/AbramskiAI.pdf
newToPL

Відповіді:


16

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

Обчислювальна твердість як мотивація

Почнемо з проблем рішення, рішення яких мають таку структуру:

проблема вирішення

Часто в цій процедурі є нижня межа жорсткої NP. Перевірка смислових властивостей програм навіть не можна визначити. Що ми можемо зробити?

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

  1. Що означає формально вирішити деякі, але не всі екземпляри проблеми?
  2. Що є приблизним рішенням проблеми рішення?

Ідея абстрактної інтерпретації 1: Змінення постановки проблеми

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

так-ні-можливо

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

Ця ідея не обмежується проблемами прийняття рішень. Розглянемо ці проблеми, що стосуються програм.

  1. Які рядки коду в програмі мертві (ніколи не будуть виконані)?
  2. Які змінні в програмі мають постійні значення?
  3. Які твердження в програмі порушені?

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

  1. Що таке набір ліній коду, який є мертвим?
  2. Що таке набір змінних у програмі, які мають постійні значення?
  3. Що таке сукупність тверджень у програмі, які не порушуються?

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

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

Зауважте, що ми не лише змінили проблему, але й суворо її узагальнили, оскільки рішення вихідної проблеми все ще є рішенням модифікованої проблеми. Зараз велике без відповіді питання: як ми можемо знайти приблизне рішення?

Ідея абстрактної інтерпретації 2: Характеристика оригінальних рішень з фіксованою точкою

Друга велика ідея полягає в тому, щоб зауважити, що безліч рішень багатьох проблем характеризується як фіксований момент у решітці кандидатських рішень. Наприклад, припустимо, що у вас є графік, і ви хочете знати, чи є вершинат досягається з вершини с. Ми можемо розбити це на пошук наборуRеаcгод(с) усіх вершин, з яких можна дістатися с а потім перевірити, чи немає тє в цьому наборі. Далі ми можемо це спостерігатиRеаcгод(с) є найменшим рішенням рівняння:

Х={с}{ш | v є в Х і (v,ш) є край}

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

Характеристика фіксованої точки є проектним рішенням. Існує багато різних характеристик набору рішень. Кожен з них може мати різні переваги. Що стосується мов програмування, у нас є більше структури, ніж просто робота з графіком. Рівняння з фіксованою точкою, які нас цікавлять, можна визначити за допомогою індукції на структурі вхідної програми. Ця ідея не характерна для програм. Застосовуючи абстрактне тлумачення до елементів структурованої мови, таких як граматика, логічна формула, програма, арифметичне вираження тощо, ми можемо визначити фіксовані точки шляхом індукції на структурі якогось синтаксичного об’єкта.

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

Ідея абстрактної інтерпретації 3: наближення до фіксованої точки

Замість обчислення фіксованої точки функції Ж в решітці L, ми можемо обчислити фіксовану точку іншої функції Г в решітці М. За умови дотримання певних умов стосовноМ до L, рішення, обчислене в М гарантовано є наближенням рішення в L. Це один із фундаментальних результатів абстрактної інтерпретації, який зазвичай називають теоремою перенесення фіксованої точки . Умова звучності задається або сполуками Галуа, або слабшими налаштуваннями, що передбачають функції абстрагування, конкретизації, або співвідношення звучності.

Теорема перенесення фіксованої точки гарантує, що вам не доведеться доводити, що ви обчислюєте звукове наближення кожного разу, коли розробляєте приблизний аналіз. Вам залишається лише довести, що ґратиL (що містять оригінальні розчини) та М (містить наближення) та функції Ж і Гзадовольняють певні обмеження. Це великий виграш, якщо ви дизайнер аналізу і піклуєтесь про надійність.

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

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

Ідея абстрактної інтерпретації 4: Алгоритми наближення фіксованої точки

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

Підсумок

На мою думку, абстрактне тлумачення забезпечує математичну основу для поняття абстракції так само, як математична логіка забезпечує математичну основу для міркування. Рішення багатьох проблем, які нас хвилюють, характеризують як фіксовані точки. Це спостереження не обмежується проблемами мови програмування і навіть інформатикою. Орієнтовні рішення можна охарактеризувати як наближення нерухомих точок і обчислити за допомогою спеціалізованих алгоритмів. Ці характеристики та алгоритми будуть використовувати структуру екземпляра проблеми. Що стосується програм, то ця структура задається синтаксисом мови.

Обчислення наближень до проблем, які не мають природної метрики, - це мистецтво, яке постійно розвивається і удосконалюється практиками. Абстрактне тлумачення - одна математична теорія для науки, що стоїть за цим мистецтвом.

Список літератури Є кілька хороших навчальних посібників з абстрактної інтерпретації, які ви можете прочитати.

  1. Повсякденне вступ до абстрактної інтерпретації , Патрік Кузот (спільна робота з Радхією Кузот), семінар з біології систем та формальних методів (SBFM'12)
  2. Лагідне вступ до формальної перевірки комп'ютерних систем шляхом абстрактної інтерпретації , Патрік і Радхія Кусо, Маркобердорфська літня школа 2010 року.
  3. Лекція 13: Абстракція, частина I , Патрік Кузот, абстрактна інтерпретація, курс MIT.
  4. Вступ до абстрактної інтерпретації , Самсон Абрамський та Кріс Ханкін, Абстрактне тлумачення декларативних мов, 1987 рік.
  5. Абстрактна інтерпретація та застосування до логічних програм , Патрік і Радгія Кусо, 1992. Перші два розділи мають загальний огляд на високому рівні з кількома прикладами.

7

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

Ось як я думаю про це:

Абстрактна інтерпретація - це запущені програми, приблизно, на великих наборах вхідних даних відразу.

Це не охоплює все, але загалом тримається.

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

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

Ви навіть не можете представити набір усіх позитивних чисел безпосередньо. Натомість вам потрібна абстракція цього набору. Також потрібно абстрагувати від’ємні числа та нуль. У вас виходить сім'я кінцевих абстрактних наборів{нег,zеrо,pос}, які представляють конкретні набори{{...,-2,-1},{0},{1,2,...}}.

Тепер ви можете придумати правила, наприклад "додавання двох позитивних чисел у додатне число" або агг:pос×pосpос. Придумайте правила для кожного з мовних примітивів, і ви можете зробити вигляд, що одночасно оцінюєте арифметичні вирази на великих наборах даних.

Звичайно, правило "додавання додатного і від'ємного числа" доставить вам проблеми, оскільки подібні доповнення можуть повернути що завгодно. Тут ви допомагаєте абстрактній рамці інтерпретації: вона говорить про те, що ви повинні повернути звук , максимально жорсткий. Якщо ваші правила є здоровими, і вони кажуть, що додавання повертає щось у абстрактному наборі, будь-яка конкретна оцінка повинна повернути число у відповідному конкретному наборі. Наприклад,агг:pос×pосpос правило - це звук, якщо агг(а,б) є позитивним для кожного позитивного а і б. Також,pос×нег(pосzеrонег) звук, де ""- це операція об'єднання ваших абстрактних наборів.

Я вважаю, що навіть наймолодший науковий співробітник з питань ЛЗ міг би кодувати таке абстрактне тлумачення вдень. Насправді це не так складно, і вам слід спробувати, перш ніж читати набагато більше, щоб відчути основи. Поки ви виявите, що ваші абстрактні набори потребують певного поняття перетину (позначається "") і підмножина (позначається""). Вони повинні відповідати конкретному перетину та підмножині.

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

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

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

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