Как передать предположения интерпретации локали

Я хотел бы использовать некоторые свойства моей структуры в доказательстве, требуемом интерпретацией локали.

В качестве примера предположим, что я определил предикат P и доказал некоторые леммы (add — замкнутая бинарная операция, add ассоциативна и существует zero нейтральный элемент) об операции add над элементами, которые удовлетворяют предикату P

Тогда я хотел бы интерпретировать набор моих элементов как структуру, которая удовлетворить некоторые локали, например. monoid

interpretation "{s . P s}" :: monoid "(add)" "(zero)"
unfolding
  monoid_def
using
  add_is_associative
  zero_is_neutral

но тогда в цели моего доказательства я не могу получить, что все элементы на самом деле удовлетворяют предикату P, и у меня остается общая цель такие как add zero a = a, которые я уже доказал для элементов в моем наборе.

Как добиться в моей цели, чтобы все элементы удовлетворяли предикату P?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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


Во-первых, я хотел бы отметить, что в стандартной документации Isabelle существует хороший учебник по локали и интерпретации локалей. Название документа «Учебное пособие по локали и интерпретации локалей» (автор Клеменс Балларин). Документ также содержит несколько полезных ссылок.

После изучения учебника и ссылок может оказаться полезным просмотреть раздел 5.7 в документе «Справочное руководство Isabelle/Isar».


I would like to use some properties of my structure in the proof required by a locale interpretation

В описании интерпретации локали в справочном руководстве указано, что

Locales may be instantiated, and the resulting instantiated declarations added to the current context. This requires proof (of the instantiated specification) and is called locale interpretation.

Когда вы вызываете команду interpretation с набором правильно сформулированных аргументов, цели, выполняемые командой, зависят исключительно от аргументов. Доказательство, которое вы предоставляете для подтверждения выполненных целей, не повлияет на «полученные экземпляры объявлений». Таким образом, технически не имеет значения, используете ли вы свойства своих функций, которые вы явно упомянули, чтобы доказать интерпретацию.


I would like to interpret then the set of my elements as a structurethat satisfy some locale, e.g. monoid:interpretation "{s . P s}" :: monoid "(add)" "(zero)"

Если вы посмотрите на спецификацию команды interpretation в справочном руководстве (раздел 5.7.3), вы поймете, что в качестве входного аргумента команда принимает «выражение локали». «Выражение локали» описано в разделе 5.7.1 справочного руководства. Здесь я привожу значительно упрощенное (неполное) описание выражения локали:

qualifier : name pos_insts

Поле «квалификатор» является необязательным, а поле «имя» зарезервировано для имени локали, которую вы пытаетесь интерпретировать. Следовательно, выражение "{s . P s}" :: monoid "(add)" "(zero)", которое вы указали в своем вопросе, не является допустимым выражением локали. Я могу только догадываться, что вы хотели использовать одинарное двоеточие вместо двойного двоеточия ::, то есть "{s . P s}" : monoid "(add)" "(zero)", и я продолжу ответ, исходя из этого предположения.

В приведенном вами примере «квалификатор» — это "{s . P s}", «имя» — это monoid, а «pos_insts», по сути, являются терминами, указанными после имени.

Вернувшись к документации, вы также найдете описание поля «квалификатор»:

Instances have an optional qualifier which applies to names in declarations

...

Qualifiers only affect name spaces; they play no role in determining whether one locale instance subsumes another.

Таким образом, указанный вами квалификатор "{s . P s}" может влиять только на имена объявлений. Это никак не повлияет на отстреливаемые командой цели и ее вывод.


interpretation "{s . P s}" : monoid "(add)" "(zero)"

Возвращаясь к вашему примеру, если вы имеете в виду локаль monoid из теории HOL-Groups, то, если вы изучите ее спецификацию, а также спецификацию локали semigroup, вы сможете сделать вывод, что локаль monoid имеет два параметра, которые связаны с ним: f и z. Других параметров нет, и «набор носителей» моноида, связанного с локалью, состоит из всех терминов данного типа.

locale monoid = semigroup +
  fixes z :: 'a ("❙1")
  assumes left_neutral [simp]: "❙1 ❙* a = a"
  assumes right_neutral [simp]: "a ❙* ❙1 = a"

В заключение, локаль monoid из теории HOL-Groups не подходит для представления моноида на явном множестве носителей, являющемся собственным подмножеством термов данного типа.

Для вашего приложения вам нужно будет использовать локаль, представляющую моноид на явном наборе несущих, например, локаль monoid из теории HOL-Algebra.Group. Примеры его интерпретации вы можете увидеть в теории HOL-Algebra.IntRing.


ОБНОВИТЬ

По просьбе автора вопроса, заданного в комментариях, привожу пример интерпретации локали monoid из теории HOL-Algebra.Group:

theory SO_Question
  imports "HOL-Algebra.Group"

begin

abbreviation even_monoid :: "int monoid" ("?⇩2") where 
  "even_monoid ≡ ⦇carrier = {x. x mod 2 = 0}, mult = (+), one = 0::int⦈"

interpretation even_monoid: monoid ?⇩2
  by unfold_locales auto+

end

это было очень приятно, большое спасибо, что нашли время, чтобы объяснить. У меня мало времени, поэтому я пропустил много материала. Если вы действительно хотите добавить немного Isar, необходимого для создания записи, а затем интерпретировать локаль из Hol-Algebra.Group, я выберу ваш ответ, в противном случае я попытаюсь отредактировать его позже, чтобы другие могли увидеть, как это сделать.

edoput 31.05.2019 12:23

@edoput По вашему запросу предоставил пример интерпретации локали monoid из теории HOL-Algebra.Group.

user9716869 31.05.2019 14:34

Другие вопросы по теме