我想在语言环境解释所需的证明中使用结构的某些属性
作为示例,假设我定义了谓词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
?
答案 0 :(得分:1)
我将尝试就您的问题发表评论。如果您发现我的评论不足以回答您的问题,请随时在评论中提出其他问题。
首先,我想提一下,Isabelle的标准文档中有一个关于语言环境和语言环境解释的很好的教程。该文档的名称是“语言环境和语言环境教程”(作者Clemens Ballarin)。该文档还包含一些有用的参考。
研究完本教程和参考资料后,阅读文档“ The Isabelle / Isar参考手册”中的5.7节也可能会很有用。
我想在证明中使用我的结构的某些属性 语言环境解释所需的
参考手册中对语言环境解释的描述指出
可以实例化语言环境,并实例化结果 声明添加到当前上下文。这需要证明 实例化规范),称为区域设置解释。
当您使用一组适当说明的参数调用命令interpretation
时,该命令实现的目标仅取决于参数。您提供的用于证明已实现目标的证明将不会对“结果实例化声明”产生影响。因此,从技术上讲,是否使用您明确提到的函数的属性来证明其解释都没有关系。
我想将我的元素集解释为结构 满足某些语言环境的要求,例如
monoid
:interpretation "{s . P s}" :: monoid "(add)" "(zero)"
如果您查看参考手册(第5.7.3节)中命令interpretation
的规范,您将意识到该命令将其作为“输入语言环境参数”。参考手册的5.7.1节中描述了“语言环境表达式”。在这里,我对语言环境表达式进行了显着简化(不完整)的描述:
qualifier : name pos_insts
“ qualifier”字段是可选的,而“ name”字段则保留为您要解释的语言环境的名称。因此,您在问题中提供的表达式"{s . P s}" :: monoid "(add)" "(zero)"
不是有效的语言环境表达式。我只能猜测您是要使用单个冒号而不是双冒号::
,即"{s . P s}" : monoid "(add)" "(zero)"
,而我将根据此假设进行回答。
在您提供的示例中,“限定词”为"{s . P s}"
,“名称”为monoid
,而“ pos_insts”实际上是名称后指定的术语。
返回文档,您还将找到“ qualifier”字段的描述:
实例具有一个可选的限定符,适用于以下名称 声明
...
限定符仅影响名称空间;他们在 确定一个语言环境实例是否包含另一个语言环境实例。
因此,您指定的限定词"{s . P s}"
仅对声明的名称有效。它不会影响命令及其输出所实现的目标。
interpretation "{s . P s}" : monoid "(add)" "(zero)"
回到您的示例,如果您从理论monoid
引用语言环境HOL-Groups
,那么,如果您研究其规范以及语言环境semigroup
的规范,您将将能够推断出语言环境monoid
具有与其关联的两个参数:f
和z
。没有其他参数,并且与区域设置关联的monoid的“载体集”由给定类型的所有术语组成。
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