建立记录类型属于给定的类

时间:2013-07-31 20:18:09

标签: isabelle theorem-proving

我创建了一个名为graph的记录类型,并且我已经定义了一个合适的“是”关系的子图。我想表明,图形集与子图关系形成一个顺序,即是ord类的一个实例。但我无法让它发挥作用。这是我最小的工作示例:

theory John imports
  Main
begin

typedecl node

record graph =
  nodes :: "node set"
  edges :: "(node × node) set"

definition subgraph :: "graph ⇒ graph ⇒ bool"
  (infix "⊑" 50)
where
  "G ⊑ H ≡ 
  nodes G ⊆ nodes H ∧ edges G ⊆ edges H"

lemma "(GREATEST H. H ⊑ G) = G"
oops

end

我收到错误:

  

Type unification failed: No type arity graph_ext :: ord"

我尝试输入instantiation graph :: ordinstantiation graph_ext :: ord等内容,但似乎没有任何效果。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

当定义记录graph时,在幕后实际创建新类型'a graph_ext。此类型与您的记录类型相同,但有一个额外的字段允许添加额外的数据(即,类型为'a的新字段将添加到您的记录定义中,可用于添加其他数据将数据存入您的记录中。类型graph只是unit graph_ext的缩写。

这意味着当您想要将graph实例化为类型类时,实际上需要实例化基础类型'a graph_ext。这可以按如下方式完成:

instantiation graph_ext :: (type) ord
begin
  instance ..
end

虽然您可能还想为ord类型提供一些定义,但可能如下:

instantiation graph_ext :: (type) ord
begin
  definition "less_eq_graph_ext (G :: 'a graph_ext) (H :: 'a graph_ext) ≡
           nodes G ⊆ nodes H ∧ edges G ⊆ edges H"
  definition "less_graph_ext (G :: 'a graph_ext) (H :: 'a graph_ext)
         ≡ (nodes G ⊆ nodes H ∧ edges G ⊆ edges H) ∧
                 ¬ (nodes H ⊆ nodes G ∧ edges H ⊆ edges G)"
  instance ..
end

'a graph_ext实例化到类ord后,您的最终引理类型检查(尽管实际执行证明,您可能需要做更多工作,例如实例化{ {1}}进入'a graph_extpreorder类。)