在Isabelle中完善定义

时间:2019-07-22 18:02:33

标签: isabelle

我在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的内部定义。

我应该如何解决?

1 个答案:

答案 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的博士学位论文中得到了引用。


可行的解决方案

根据我对您的申请的了解,可能的选项按照我的个人喜好顺序显示。但是,请记住,鉴于我自己的有限经验,这可能不是一个详尽的清单,而且,我对您的最终目标知之甚少。


基于集合的商

我相信表达gluinge_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)"等...但是,我不认为这是标准做法,因此我们不鼓励这样做。