-розрахунок з відображенням


23

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

Чи існує нетипізоване розширення числення, яке дозволяє перетворити λ -терміни у форму, яку можна синтаксично маніпулювати, а потім оцінювати?λλ

Я думаю, що в обчисленні є два основні додаткові умови:

  • : приймає v і створює подання v, придатне для синтаксичної маніпуляції.reflect vvv
  • : приймає синтаксичне подання терміна і оцінює його.eval v

Для підтримки рефлексії необхідне синтаксичне подання термінів. Це виглядатиме приблизно так:

  • буде представлено як термін ( L A M R ( e ) ) , де R ( e ) - відображена версія e ,λx.e(LAM R(e))R(e)e
  • буде представлено як термін ( A P P R ( e ) R ( e ) ) , іe e(APP R(e) R(e))
  • буде представлено у вигляді ( V A R x ) .x(VAR x)

За допомогою цього подання відповідність шаблонів може використовуватися для маніпулювання термінами.

Але ми стикаємося з проблемою. і e v a l потрібно кодувати як терміни, як і відповідність шаблонів. Справа з цим здається простою, додаючи R E F L E C T , E V A L і M A T C H , але чи потрібно мені додати інші терміни для підтримки маніпулювання ними?reflectevalREFLECTEVALMATCH

Є вибір дизайну, який потрібно зробити. Що має робити функція про яку говорилося вище, з тілом r e f l e c t і e v a l ? Чи повинен R ( - ) перетворювати тіло чи ні?R()reflectevalR()

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

Чи існують якісь розрахунки, які відповідають тому, що я щойно описав?

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

Я б хотів зробити це:

  • let x=λy.y in reflect x(LAM (VAR y) (VAR y))

А потім виконайте відповідність шаблону за результатом, щоб створити зовсім інший вираз.

Це, звичайно, не є консервативним продовженням -рахунку, і мета-теорія, ймовірно, буде некрасивою, але це є своєрідним моментом для мого застосування. Я хочу розбити λ -абстракції.λλ


MetaML - це набрана відображаюча мова з оператором брекетінгу, який виконує ваше значення REFLECT і відмежування знаку EVAL. Введення тексту є основним, але ви можете побачити фрагмент, успадкований від модального S4, у такому творі, як цей документ, який може вам допомогти.
ex0du5

@ ex0du5: Дякую, але це недостатньо далеко, наскільки я можу сказати. Звичайно, я можу створювати код на різних фазах, але, здається, я не можу розірвати терміни. (Я прочитаю детальніше, щоб побачити, чи щось я пропустив.)
Дейв Кларк

Схема (без змінних та інших ускладнень)?
Жил "ТАК - перестань бути злим"

@Gilles: Схема - мова програмування, а не обчислення. Крім того, я не думаю, що це може робити те, що я хочу.
Дейв Кларк

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

Відповіді:


15

Жан Луї Кривін представив абстрактне обчислення, яке розширює "Машину Кривіна" дуже нетривіально (зверніть увагу, що машина Krivine вже підтримує інструкцію call / cc від lisp):

Він вводить «цитата» оператор в цій статті , визначається наступним чином: якщо є λ терм, примітка п ф образ ф деякої Бієкція П : Л N з лямбда - вираженні до натуральних чисел. Примітка ¯ п церква позиція , яка відповідає п N . Кривін визначає оператора χ правилом оцінки: χ ϕ ϕ ¯ n ϕϕλnϕϕπ:ΛNn¯nNχ

χ ϕϕ nϕ¯
Я вважаю, що майстер Kleene покаже, що цього достатньо, щоб зробити те, що ви хочете: тобто визначити оператори лапок і eval, якщо обчислюється.π

Зауважте, що Кривіну, як відомо, важко читати (будь ласка, не зліться, якщо ви прочитаєте це, Жан-Луї!), А деякі дослідники зробили благодійну акцію, намагаючись витягнути технічний вміст більш читабельним чином. Ви можете спробувати поглянути на ці замітки Крістофа Раффалі.

Сподіваюся, це допомагає!


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

(λ(x y).x)((λx.x x) (λy.y))

зводиться до . Знову ж таки, я вірю, що цього більш ніж достатньо для реалізації операторів котирування та eval .λx.x x


Я хотів би підтримати цю, здавалося б, розумну відповідь, але я не маю уявлення, чи він навіть починає відповідати на питання.
Рафаель

@Raphael прочитайте статті та дізнайтеся :) По правді кажучи, це лише часткова відповідь: статті дійсно формалізують важливу особливість lisp, яку не можна знайти в лямбдальному обчисленні: а саме оператора QUOTE. Однак не існує великого метатеоретичного дослідження, вони просто вводять його як засіб висловити своєрідні непрозорі обчислення, щоб реалізувати складні аксіоми теорії множин.
коді

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

1
Єдина цитата, яку я знаю, - це Lisp. Але, як я пам’ятаю, це просто змінює все, що котирується, на синтаксичний об’єкт. "Функція" бере свій аргумент неоціненим. Функція r e f l e c t повинна прийняти значення свого аргументу (оцінити його) і повернути його назад у якийсь синтаксичний вираз, який оцінює (як ?) до цього значення. Отже, якщо формалізм Кривіна має справу з LISP q u o t e , ми ніде не наближаємось до того, що пропонується у питанні. quotereflectquote
бабу

8

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

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

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


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

5

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

Якщо ви тільки після теоретичних міркувань (на відміну від фактично корисної реалізації), ви можете спростити речі, заявивши, що quote(або reflectяк ви це називаєте) відображається у тип цілих чисел nat, повертаючи код Gödel свого аргументу. Потім ви можете розкласти число так само, як і абстрактне синтаксичне дерево. Крім того, вам це не потрібно, evalоскільки це може бути реалізовано в мові - це по суті перекладач цієї мови.

nmφn(m)φnnλquote

Якщо ви скажете мені, що ви хочете, я можу дати вам більш конкретні довідки.

До речі, тут відкрита проблема:

λquoteξ

ξ

e1e2λx.e1λx.e2
λλquotequote
e1e2quotee1quotee2,
quote((λx.x)y)quotey.
quoteλ

βquoteλξ

ξβ

Наступний документ показує деякі проблеми з рівнянням (ξ): Обчислення Лямбди - алгебраїк, Пітер Селінгер. Цікаво, щось нове я не знав! Класно.
Перелічені числа

4

Ось альтернативна відповідь, замість того, щоб використовувати мій номінальний підхід, який все ще експериментальний, є ще якийсь усталений підхід, який повертається до статті:

LEAP: Мова з
еваль та поліморфізм Френка Пфеннінга та Пітера Лі
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf

Документ починається з:

Тоді це призвело нас до питання, вперше поставленого Рейнольдсом, про те, чи сильно набрані мови допускають тлумачення метациркуляції. Звичайна мудрість ніби вказувала на те, що відповідь - «Ні». Наша відповідь - «Майже».

Зверніть увагу, що LEAP набагато сильніше, ніж те, чого хоче ОП. Перш за все це набирається. А по-друге, вона вимагає метациркулярності, що означає, наприклад, що eval може виконати своє власне визначення. У Prolog ви отримуєте метациркуляцію для рішення / 1:

solve(true).
solve((A,B)) :- solve(A), solve(B).
solve(H) :- clause(H,B), solve(B).

Якщо ви додали таке рішення для вирішення / 1:

solve(clause(H,B)) :- clause(H,B).

І якщо ви переконаєтесь у тому, що пункт / 2 також повертає пункти рішення / 1. Потім ви можете зателефонувати на вирішення (вирішити (...)) і подивитися, як рішення виконує себе.

Питання самопредставництва все ще підштовхують деякі дослідження, наприклад:

Самопредставлення в системі Girards U
Matt Matt, Jens Palsberg
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf


3

Проблема виявлена ​​в неяскравості таких помічників, як Coq та Isabelle / HOL. Це йде під абревіатурою HOAS . Навколо λ-Prolog є деякі твердження, що за допомогою нового ∇ кількісного показника такі речі можна зробити. Але я ще не зміг зрозуміти це твердження. Напевно, головне розуміння, яке я отримав поки що, - це те, що певного підходу немає, є пара можливих підходів.

Моя власна думка , ще не закінчена , натхненна нещодавньою роботою Паульсона про доведення незавершеності Геделя. Я б використовував зв'язувачі об'єктного рівня у зв'язку з деякою структурою даних, яка має назви метарів. В основному аналогічна, але чітка структура даних, як і в ОП, і з кодуванням Церкви, оскільки мене цікавлять залежні типи:

datatype Expr = var Name                 /* written as n */
              | app Expr Expr            /* written as s t */
              | abs Name Expr Expr       /* written as λn:s.t */

Вирази метарів можна відрізнити від виразів об'єктного рівня за тим, що для позначення імен ми використовуємо імена змінних n, m, .. тощо. Тоді як ми використовуємо назви змінних x, y, .. тощо .. на рівні об'єкта. Інтерпретація мета-терміна в логіці об'єкта працювала б таким чином. Нехай пише [t] σ для інтерпретації номінального терміна t у номінальному контексті σ, що має дати об’єктний термін. Тоді ми мали б:

 [n]σ = lookup σ n
 [s t]σ = [s]σ [t]σ
 [λn:s.t]σ = λx:[s]σ.[t]σ,n:x

Сказане вище визначало б те, що ОП називає функцією EVAL. Незначна різниця для Полсона, σ - лише кінцевий список, а не функціонал. На мою думку, можна було б запровадити лише функцію EVAL, а не функцію REFLECT. Оскільки на рівні об'єкта у вас може бути деяка рівність, так що різні вирази лямбда є однаковими. Що ви повинні зробити, це використовувати eval, щоб міркувати, можливо, також про роздуми, якщо відчуваєте потребу.

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

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