我在Isabelle中具有以下定义(有关详细信息,请参见here):
definition gluing :: "(((real × real) × bit) × (real × real) × bit) set" where
"gluing = {(((x0,y0),l),((x1,y1),j)).
((x0,y0) ∈ e_circ ∧ (x1,y1) = τ (x0,y0) ∧ j = l+1) ∨
(x0 = x1 ∧ y0 = y1 ∧ l = j)}"
现在,这种粘合应该是在集合上定义一个等价关系:
e_aff × (range Bit)
所以我想细化类型:
(real × real) × bit
对此。如果我直接在粘合的定义上进行操作,我将得到:
未定义类型名称:“ e_aff”⌂
但是如果我改为尝试通过类型定义来做到这一点:
typedef e_aff_t = "e_aff"
我得到:
代表集合中的非法变量:“ d” 上面的错误发生在typedef“ e_aff_t”
我认为这来自e_aff
的内部定义。
我应该如何解决?
答案 0 :(得分:1)
我将提供几点意见。如果这些还不够,请随时提出其他问题,我会尽力答复。
但是如果我改为尝试通过类型定义来做到这一点:
typedef e_aff_t = "e_aff"
我得到:
代表集合中存在非法变量:“ d”发生上述错误 在typedef“ e_aff_t”
发生这种情况是因为e_aff
依赖于固定变量。就我所知,此逻辑目前尚不接受(通过Types-To-Sets通过Local Typedef Rule的有限支持除外):
typedef α k = S
要求S
为封闭词,k
为封闭词
新鲜类型构造函数和S
中的所有类型变量都必须位于
α
中的变量。就您而言,S
不是封闭词。有很多有价值的资源对此进行了详细解释,其中许多在OndřejKunčar的博士学位论文中得到了引用。
可行的解决方案
根据我对您的申请的了解,可能的选项按照我的个人喜好顺序显示。但是,请记住,鉴于我自己的有限经验,这可能不是一个详尽的清单,而且,我对您的最终目标知之甚少。
基于集合的商
我相信表达gluing
是e_aff × UNIV::bit
上的等价关系的最简单方法是
definition qs where "qs = (e_aff × (range Bit)) // gluing"
lemma "equiv (e_aff × (range Bit)) gluing"
sorry
完成此操作后,Equiv_Relations
等理论将为处理基于集的商提供许多有用的定理。
类型设置
您还可以选择使用Types-To-Sets中的Local Typedef Rule创建基于固定变量的quotient_type
上下文。但是,您仍然需要先将基于类型的定理转换为基于集合的定理,然后才能在任何应用程序中使用它们(转换是自动的)。如果您有兴趣,我可以提供更多详细信息和示例。但是,我相信,对于您的应用程序,这几乎比直接处理基于集合的定理更好。
quotient_type
如果由于某种原因您仍然坚持使用基于类型的方法,那么,我想,您可以尝试以一种e_aff
不依赖于固定变量的方式来重述该理论。为此,您可以使用希尔伯特选择,例如definition c where "c = (SOME c::real. True)"
等...但是,我不认为这是标准做法,因此我们不鼓励这样做。