假设我有一组A ⊆ nat
。我想在Isabelle中建模一个函数f : A ⇒ Y
。我可以使用:
nat ⇒ Y option
或nat ⇒ Y
类型之一,未指定A
以外的输入。我想知道哪个是“更好”的选择。我看到了几个因素:
“部分功能”方法更好,因为更容易比较部分功能是否相等。也就是说,如果我想看看f
是否等于另一个函数g : A ⇒ Y
,那么我只想说f = g
。要比较未指定的总函数f
和g
,我不得不说∀x ∈ A. f x = g x
。
“未指定的总函数”方法更好,因为我不必总是使用构造/解构option
类型。例如,如果f
是一个指定不足的总函数,x ∈ A
,那么我可以说f x
,但如果f
是部分函数,我将不得不说(the ∘ f) x
。另一个例子,在部分函数上进行函数组合比在总函数上进行函数组合更为棘手。
对于与此问题相关的具体实例,请考虑以下尝试形式化简单图。
type_synonym node = nat
record 'a graph =
V :: "node set"
E :: "(node × node) set"
label :: "node ⇒ 'a"
图表包含一组节点,它们之间的边缘关系以及每个节点的label
。我们只关心V
中节点的标签。那么,label
应该是node ⇒ 'a option
的部分函数dom label = V
,还是应该只是V
之外未指定的总函数?
答案 0 :(得分:1)
这可能是一个品味的问题,也可能取决于你的用途,所以我只会给你我的个人品味,这将是选项2.总功能。原因是我认为两种方法中的有限量化无论如何都是不可避免的。我认为使用方法1.您会发现处理Option
的最简单方法是限制您推理的域(有限量化)。至于图形示例,图形定理总是说类似于V中的所有节点。但正如我所说,这可能是一个品味问题。