Я ищу простое исчисление, которое поддерживает рассуждения о рефлексии , а именно, самоанализ и манипулирование запущенными программами.
Есть нетипизированная -исчисления расширения , которое позволяет конвертировать -терминов в форму , которая может быть синтаксический манипулирует , а затем впоследствии оценивается?λ
Я предполагаю, что в исчислении есть два основных дополнительных условия:
- : принимает и создает представление изменить с помощью синтаксических манипуляций.v
- : принимает синтаксическое представление термина и оценивает его.
Чтобы поддержать рефлексию, требуется синтаксическое представление терминов. Это будет выглядеть примерно так:
- будет представлен как термин , где является отраженной версией ,R ( e )
- ( A P P R ( e ) R ( e ′ ) ) будет представлен как термин , и
- ( V A R x ) будет представлен как .
При таком представлении сопоставление с образцом может использоваться для манипулирования терминами.
Но мы сталкиваемся с проблемой. и должны быть закодированы как термины, как и сопоставление с образцом. Разобраться с этим, кажется, просто, добавив , и , но мне нужно будет добавить другие термины для поддержки манипулирования ими?е V л Р Е Р Ь Е С Т Е В Л М Т С Н
Есть выбор дизайна, который должен быть сделан. Что должна делать функция упомянутая выше, с телом и ? Должен ли преобразовывать тело или нет?г е е л е с т е V л R ( - )
Поскольку я не очень заинтересован в изучении самого отражения - исчисление послужит средством для других исследований - я не хочу изобретать велосипед.
Существуют ли какие-либо исчисления, которые соответствуют тому, что я только что описал?
Насколько я могу судить, исчисления, такие как MetaML, предложенные в комментарии, имеют большое значение, но они не включают в себя возможность сопоставления с образцом и деконструкции уже созданных фрагментов кода.
Я хотел бы иметь возможность сделать следующее:
А затем выполните сопоставление с шаблоном для результата, чтобы создать совершенно другое выражение.
Это, конечно, не является консервативным расширением -calculus, и мета-теория, вероятно, будет некрасивой, но это своего рода точка для моего приложения. Я хочу разбить абстракции на части.λ
источник
Ответы:
Жан Луи Кривин представил абстрактное исчисление, которое расширяет «Машину Кривина» весьма нетривиальным способом (обратите внимание, что машина Кривина уже поддерживает инструкцию call / cc из lisp):
В этой статье он вводит оператор «кавычки», определенный следующим образом: если является λ- термином, заметим n ϕ образ ϕ некоторой биекцией π : Λ → N от лямбда-членов до натуральных чисел. Примечание ¯ н церковь с номером , который соответствует п ∈ N . Кривин определяет оператор х по правилу оценки: х ф → ф ¯ п фφ λ nϕ ϕ π:Λ→N n¯¯¯ n∈N χ
Обратите внимание, что Кривин, как известно, сложно читать (пожалуйста, не сердитесь, если вы читаете это, Жан-Луи!), И некоторые исследователи предприняли благотворительный акт, пытаясь извлечь технический контент в более читабельной форме. Вы можете попытаться взглянуть на эти заметки Кристофа Раффали.
Надеюсь это поможет!
Мне приходит в голову, что есть еще одна ссылка, которая может иметь отношение к вашим интересам: исчисление чистого образца Джея и Кеснера формализует вариант исчисления, который расширяет простую абстракцию над переменной на абстракцию над шаблоном, представляющим исчисление образца сам. Это феноменально выразительно и, в частности, позволяет деконструировать само приложение: если я не ошибаюсь, термин:λ
сводится к . Опять же, я верю, что этого более чем достаточно, чтобы реализовать операторы quote и eval .λx.x x
источник
Это очень трудно, если не невозможно, не отказываясь от слияния. То есть я подозреваю, что вы правы насчет волосатой мета-теории. С другой стороны, можно разработать исчисление комбинатора, которое может выражать все вычислимые функции Тьюринга и которое обладает полной способностью проверять его термины: см. Jay and Give-Wilson .
Однако я считаю, что наличие этой способности вредит вашей теории эквалайзера. В частности, вы сможете доказать, что два значения равны, если они равны с точностью до альфа-эквивалентов.
Я еще не читал связанную с Криви бумагу Коди, но я должен отметить, что в классической логике у вас есть только две вещи: истинная и ложная. Все эквивалентно одному из них. То есть, в любом случае, вы склонны иметь разрушенную эквалайзерную теорию.
источник
В теории языков программирования функция, о которой вы говорите, обычно называется «цитата». Например, Джон Лонгли писал об этом в некоторых своих работах, см. Эту статью .
Если вы просто придерживаетесь теоретических соображений (в отличие от действительно полезной реализации), то вы можете упростить вещи, заявив, что
quote
(или,reflect
как вы это называете) отображаются в тип целых чиселnat
, возвращая код Гёделя своего аргумента. Затем вы можете разложить число так же, как и абстрактное синтаксическое дерево. Кроме того, вам не нужно,eval
потому что это может быть реализовано на языке - это по сути переводчик для языка.Для конкретной модели, которая имеет эти особенности, вы можете рассмотреть первую комбинаторную алгебру Клини: интерпретировать все как число (представьте их как коды Гёделя) и определить приложение Клини чтобы обозначить φ n ( m ), где φ n - это n - частичная функция Это даст вам модель λ- калькуляции (с частичными отображениями), в которой это просто единичная функция. Больше никаких функций не нужно добавлять к языку.н ⋆ м φN( м ) φN N λ
quote
Если вы скажете мне, что вы ищете, я смогу дать вам более конкретные ссылки.
Кстати, здесь есть открытая проблема:
-правило е 1 ≡ е 2ξ говорит, чтоλ-абстракция является конгруэнцией. Это позволяет нам,так сказать,уменьшить подλ. В сочетании сэтим становится проблематичным, таккак предполагается также конгруэнтность,
e1≡e2
quote
quote
quote
источник
quote
Вот альтернативный ответ, вместо того, чтобы использовать мой номинальный подход, который все еще экспериментален, есть еще более устоявшийся подход, который восходит к статье:
LEAP: язык с eval и полиморфизмом
Фрэнк Пфеннинг и Питер Ли
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf
Статья начинается с:
Обратите внимание, что LEAP намного сильнее, чем хочет ОП. Прежде всего это напечатано. И, во-вторых, он запрашивает метациркуляцию, что означает, например, что eval может выполнить свое собственное определение. В Прологе вы получаете метациркулярность для решения / 1:
Если вы добавите следующий пункт для решения / 1:
И если вы видите, что условие / 2 также возвращает пункты решения / 1. Затем вы можете позвонить решить (решить (...)) и посмотреть, как выполняет сама себя.
Вопросы саморепрезентации все еще стимулируют некоторые исследования, см., Например:
Самопредставление в системе Girards U
Мэтт Браун, Дженс Палсберг
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf
источник
Проблема выявляется в непосредственной близости от таких помощников, как Coq и Isabelle / HOL. Он идет под аббревиатурой HOAS . Вокруг λ-Пролога есть некоторые утверждения, что с помощью нового квантификатора можно делать такие вещи. Но я еще не мог получить контроль над этим требованием. Я думаю, что главное понимание, которое я получил до сих пор, это то, что нет определенного подхода, есть несколько возможных подходов.
Мое собственное мнение , еще не законченное , вдохновлено недавней работой Полсона о доказательстве Гёделса неполноты. Я бы использовал связыватели уровня объекта в связи с некоторой структурой данных, которая имеет имена метауровня. По сути, такая же, но отличная структура данных, как у OP и с церковным кодированием, поскольку меня интересуют зависимые типы:
Выражения мета-уровня можно отличить от выражений уровня объекта тем, что мы используем имена переменных n, m, ... и т. Д. Для обозначения имен. В то время как мы используем имена переменных x, y, .. и т. Д. На уровне объекта. Интерпретация мета-термина в объектной логике будет тогда работать следующим образом. Давайте напишем [t] σ для интерпретации номинального термина t в номинальном контексте σ, который должен дать объектный термин. Тогда бы мы имели:
Выше будет определять то, что OP вызывает функцию EVAL. Небольшая разница с Полсоном в том, что σ является лишь конечным списком, а не функционалом. По моему мнению, было бы возможно только ввести функцию EVAL, а не функцию REFLECT. Поскольку на уровне объекта вы можете иметь некоторое равенство, чтобы разные лямбда-выражения были одинаковыми. Что вам нужно сделать, так это использовать eval для рассуждения, возможно, также и о рефлексии, если вы чувствуете необходимость.
Вам нужно перейти к крайностям, таким как Пролог, где ничего не расширяется, если вы хотите разрушить стену между номинальной и неноминальной. Но, как показывает пример системы λ-Prolog, в случае более высокого порядка возникают дополнительные проблемы, которые, например, могут быть преодолены только логическим путем, путем введения новых средств, таких как such квантификатор!
источник