Что за стерма? - PullRequest
       40

Что за стерма?

1 голос
/ 23 октября 2019

В руководстве по внедрению Isabelle сказано:

Типы ctyp и cterm представляют собой сертифицированные типы и термины, соответственно. Это абстрактные типы данных, которые гарантируют, что его значения прошли полную проверку правильности (и правильности типизации) относительно объявлений конструкторов типов, констант и т. Д. В теории фона.

Myпонимание заключается в следующем: когда я пишу cterm t, Изабель проверяет, что термин правильно построен в соответствии с теорией, в которой он живет.

Абстрактные типы ctyp и cterm являются частью одного ядра выводаэто в основном отвечает за THM. Таким образом, синтаксические операции над ctyp и cterm находятся в модуле Thm, хотя на этом этапе теоремы еще не задействованы.

Насколько я понимаю, если я хочу изменить cterm на уровне ML Iбудет использовать операции модуля Thm (где я могу найти этот модуль?)

Кроме того, похоже, что cterm t - это сущность, которая преобразует термин уровня теории в термин уровня ML. Поэтому я проверяю код cterm в объявлении:

ML_val ‹
  some_simproc @{context} @{cterm "some_term"}
›

и попадаю на ml_antiquotations.ML:

ML_Antiquotation.value \<^binding>‹cterm› (Args.term >> (fn t =>
    "Thm.cterm_of ML_context " ^ ML_Syntax.atomic (ML_Syntax.print_term t))) #>

Эта строка кода не читается мне, насколько мне известно.

Интересно, кто-нибудь мог бы дать лучшее объяснение cterm низкого уровня? Что означает код ниже? Где находятся проверки, которые cterm выполняет на условиях теории? Где находятся манипуляции, которые мы можем выполнять на cterms (модуль Thm выше)?

1 Ответ

1 голос
/ 23 октября 2019

«С» означает «сертифицировано» (или «проверено»? Не уверен). Cterm - это термин, который прошел проверку. Антикатотация @{cterm …} позволяет вам просто записывать термины и напрямую получать cterm в различных контекстах (в этом случае, вероятно, в контексте ML, т.е. вы напрямую получаете значение cterm с предполагаемым содержимым). То же самое работает для обычных терминов, то есть @{term …}.

. Вы можете манипулировать cterms напрямую, используя функции из структуры Thm (которую, кстати, можно найти в ~~/src/Pure/thm.ML; большинство из этих основных MLфайлы находятся в каталоге Pure). Однако, по моему опыту, обычно проще просто преобразовать cterm в обычный термин (используя Thm.term_of - в отличие от Thm.cterm_of, это очень дешевая операция), а затем вместо этого работать с термином. Непосредственное манипулирование cterms действительно имеет смысл только в том случае, если вам нужен еще один cterm в конце, потому что повторная сертификация терминов довольно дорога (тем не менее, если ваш код вызывается очень часто, это, вероятно, не является проблемой производительности).

В большинстве случаев я бы сказал, что рабочий процесс выглядит так: если вы получаете cterm в качестве входных данных, вы превращаете его в обычный термин. Это вы можете легко проверить / разобрать / что угодно. В какой-то момент вам, возможно, придется снова превратить его в cterm (например, потому что вы хотите создать для него некоторую теорему или использовать ее каким-либо другим способом, связанным с ядром), а затем вы просто используете Thm.cterm_of для этого.

Я не знаю точно , что делает внутренняя антикатотация @{cterm …}, но я мог бы представить, что в конце дня он просто анализирует свой параметр как термин Изабель, а затем сертифицируетэто с текущим контекстом (то есть @{context}), используя что-то вроде Thm.cterm_of.

...