我创建了一个名为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 :: ord
和instantiation graph_ext :: ord
等内容,但似乎没有任何效果。有什么想法吗?
答案 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_ext
或preorder
类。)