калькуляция с отражением


23

Я ищу простое исчисление, которое поддерживает рассуждения о рефлексии , а именно, самоанализ и манипулирование запущенными программами.

Есть нетипизированная -исчисления расширения , которое позволяет конвертировать -терминов в форму , которая может быть синтаксический манипулирует , а затем впоследствии оценивается?λλλ

Я предполагаю, что в исчислении есть два основных дополнительных условия:

  • reflect v : принимает и создает представление изменить с помощью синтаксических манипуляций.vvv
  • eval v : принимает синтаксическое представление термина и оценивает его.

Чтобы поддержать рефлексию, требуется синтаксическое представление терминов. Это будет выглядеть примерно так:

  • λx.e будет представлен как термин , где является отраженной версией ,R ( 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)

При таком представлении сопоставление с образцом может использоваться для манипулирования терминами.

Но мы сталкиваемся с проблемой. и должны быть закодированы как термины, как и сопоставление с образцом. Разобраться с этим, кажется, просто, добавив , и , но мне нужно будет добавить другие термины для поддержки манипулирования ими?е V л Р Е Р Ь Е С Т Е В Л М Т С НreflectevalREFLECTEVALMATCH

Есть выбор дизайна, который должен быть сделан. Что должна делать функция упомянутая выше, с телом и ? Должен ли преобразовывать тело или нет?г е е л е с т е V л R ( - )R()reflectevalR()

Поскольку я не очень заинтересован в изучении самого отражения - исчисление послужит средством для других исследований - я не хочу изобретать велосипед.

Существуют ли какие-либо исчисления, которые соответствуют тому, что я только что описал?

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

Я хотел бы иметь возможность сделать следующее:

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

А затем выполните сопоставление с шаблоном для результата, чтобы создать совершенно другое выражение.

Это, конечно, не является консервативным расширением -calculus, и мета-теория, вероятно, будет некрасивой, но это своего рода точка для моего приложения. Я хочу разбить абстракции на части.λλλ


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

@ ex0du5: Спасибо, но, насколько я могу судить, этого недостаточно. Конечно, я могу создавать код на разных этапах, но мне кажется, что я не могу разлучить термины. (Я буду читать более внимательно, чтобы увидеть, пропустил ли я что-нибудь.)
Дэйв Кларк

Схема (без изменчивости и других осложнений)?
Жиль "ТАК - перестань быть злым"

@ Жиль: Схема - это язык программирования, а не исчисление. Кроме того, я не думаю, что он может делать то, что я хочу.
Дейв Кларк,

@DaveClarke Язык программирования - это исчисление с большим количеством бородавок. С первого взгляда ядро ​​Схемы кажется подходящим, но я не достаточно продумал ваши требования, чтобы быть уверенным. Как вы думаете, не будет работать? (Заходите, чтобы поболтать, если хотите.)
Жиль "ТАК - перестань быть злым"

Ответы:


15

Жан Луи Кривин представил абстрактное исчисление, которое расширяет «Машину Кривина» весьма нетривиальным способом (обратите внимание, что машина Кривина уже поддерживает инструкцию call / cc из lisp):

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

χ ϕϕ nϕ¯
Я полагаю, что Kleene wizardry покажет, что этого достаточно, чтобы делать то, что вы хотите: т.е. определять операторы кавычек и eval, если вычислимо.π

Обратите внимание, что Кривин, как известно, сложно читать (пожалуйста, не сердитесь, если вы читаете это, Жан-Луи!), И некоторые исследователи предприняли благотворительный акт, пытаясь извлечь технический контент в более читабельной форме. Вы можете попытаться взглянуть на эти заметки Кристофа Раффали.

Надеюсь это поможет!


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

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

сводится к . Опять же, я верю, что этого более чем достаточно, чтобы реализовать операторы quote и eval .λx.x x


Я хотел бы высказать этот, казалось бы, разумный ответ, но я понятия не имею, начинает ли он даже отвечать на вопрос.
Рафаэль

@ Рафаэль прочитайте статьи и узнайте :) По правде говоря, это только частичный ответ: статьи действительно формализуют важную особенность lisp, которой нет в лямбда-исчислении, а именно оператор QUOTE. Тем не менее, нет обширного мета-теоретического исследования, они просто представляют его как средство выражения своего рода странного непрозрачного вычисления для реализации сложных аксиом теории множеств.
Коди

1
Если я правильно помню, в PPC вы не можете сопоставлять шаблоны при переопределении, причина, которую они дали, ради слияния. Кроме того, в PPC сопоставление с образцом строго соответствует сопоставляемому, поэтому будет немедленно нормализовано до λ y . y , тогда попытка сопоставить его с шаблоном ( x y ) не удастся. (λx.x x) (λy.y)λy.y(x y)
день

1
Единственная известная мне цитата - Лисп. Но, насколько я помню, он просто меняет все, что указано в синтаксическом объекте. «Функция» принимает ее аргумент невычисленным .. г х е л е с т функция должен принимать значение аргумента (оценить его), и превратить его обратно в какое - то синтаксическое выражение , которое (как ?) к этому значению. Так что, если Кривин формализм имеет дело с LISP д у о т е , мы не получим далеко , что предлагается в этом вопросе. quotereflectquote
Бабу

8

Это очень трудно, если не невозможно, не отказываясь от слияния. То есть я подозреваю, что вы правы насчет волосатой мета-теории. С другой стороны, можно разработать исчисление комбинатора, которое может выражать все вычислимые функции Тьюринга и которое обладает полной способностью проверять его термины: см. Jay and Give-Wilson .

Однако я считаю, что наличие этой способности вредит вашей теории эквалайзера. В частности, вы сможете доказать, что два значения равны, если они равны с точностью до альфа-эквивалентов.

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


1
Обратите внимание, что исчисление Кривина не исчисление предложений, а скорее реализаторы для них, которые имеют весьма нетривиальную эквациональную теорию.
cody

5

В теории языков программирования функция, о которой вы говорите, обычно называется «цитата». Например, Джон Лонгли писал об этом в некоторых своих работах, см. Эту статью .

Если вы просто придерживаетесь теоретических соображений (в отличие от действительно полезной реализации), то вы можете упростить вещи, заявив, что quote(или, reflectкак вы это называете) отображаются в тип целых чисел nat, возвращая код Гёделя своего аргумента. Затем вы можете разложить число так же, как и абстрактное синтаксическое дерево. Кроме того, вам не нужно, evalпотому что это может быть реализовано на языке - это по сути переводчик для языка.

Для конкретной модели, которая имеет эти особенности, вы можете рассмотреть первую комбинаторную алгебру Клини: интерпретировать все как число (представьте их как коды Гёделя) и определить приложение Клини чтобы обозначить φ n ( m ), где φ n - это n - частичная функция Это даст вам модель λ- калькуляции (с частичными отображениями), в которой это просто единичная функция. Больше никаких функций не нужно добавлять к языку.nmφn(m)φnnλquote

Если вы скажете мне, что вы ищете, я смогу дать вам более конкретные ссылки.

Кстати, здесь есть открытая проблема:

Обогащите калькуляцию (типизированную или нетипизированную), которая является конгруэнцией таким образом, что вы сохраняете ξ- правило.λquoteξ

-правило е 1е 2ξ говорит, чтоλ-абстракция является конгруэнцией. Это позволяет нам,так сказать,уменьшить подλ. В сочетании сэтим становится проблематичным, таккак предполагается также конгруэнтность, e1e2

е1е2λИкс,е1λИкс,е2
λλquotequote
е1е2QUоTее1QUоTее2,
QUоTе((λИкс,Икс)Y)QUоTеY,
quoteλ

βquoteλξ

ξβ

Следующая статья показывает некоторые проблемы с уравнением (ξ): Лямбда-исчисление алгебраическое, Питер Селинджер. Интересно, что-то новое я не знал! Круто.
Трансфинные числа

4

Вот альтернативный ответ, вместо того, чтобы использовать мой номинальный подход, который все еще экспериментален, есть еще более устоявшийся подход, который восходит к статье:

LEAP: язык с eval и полиморфизмом
Фрэнк Пфеннинг и Питер Ли
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf

Статья начинается с:

Затем это привело нас к вопросу, впервые заданному Рейнольдсом, о том, допускают ли строго типизированные языки метациркулярные интерпретаторы. Обычная мудрость, казалось, указывала, что ответ был «Нет». Наш ответ «Почти».

Обратите внимание, что LEAP намного сильнее, чем хочет ОП. Прежде всего это напечатано. И, во-вторых, он запрашивает метациркуляцию, что означает, например, что eval может выполнить свое собственное определение. В Прологе вы получаете метациркулярность для решения / 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
Мэтт Браун, Дженс Палсберг
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf


3

Проблема выявляется в непосредственной близости от таких помощников, как Coq и Isabelle / HOL. Он идет под аббревиатурой HOAS . Вокруг λ-Пролога есть некоторые утверждения, что с помощью нового квантификатора можно делать такие вещи. Но я еще не мог получить контроль над этим требованием. Я думаю, что главное понимание, которое я получил до сих пор, это то, что нет определенного подхода, есть несколько возможных подходов.

Мое собственное мнение , еще не законченное , вдохновлено недавней работой Полсона о доказательстве Гёделса неполноты. Я бы использовал связыватели уровня объекта в связи с некоторой структурой данных, которая имеет имена метауровня. По сути, такая же, но отличная структура данных, как у OP и с церковным кодированием, поскольку меня интересуют зависимые типы:

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

Выше будет определять то, что OP вызывает функцию EVAL. Небольшая разница с Полсоном в том, что σ является лишь конечным списком, а не функционалом. По моему мнению, было бы возможно только ввести функцию EVAL, а не функцию REFLECT. Поскольку на уровне объекта вы можете иметь некоторое равенство, чтобы разные лямбда-выражения были одинаковыми. Что вам нужно сделать, так это использовать eval для рассуждения, возможно, также и о рефлексии, если вы чувствуете необходимость.

Вам нужно перейти к крайностям, таким как Пролог, где ничего не расширяется, если вы хотите разрушить стену между номинальной и неноминальной. Но, как показывает пример системы λ-Prolog, в случае более высокого порядка возникают дополнительные проблемы, которые, например, могут быть преодолены только логическим путем, путем введения новых средств, таких как such квантификатор!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.