以下功能定义被Isabelle接受,因此终止检查员对此感到满意:
datatype 'a List = N | C 'a "'a List"
fun dequeue' :: "'a List × 'a List ⇒ ('a option × 'a queue)" where
"dequeue' (N, N) = (None, AQueue N N)"
|"dequeue' (xs, C y ys) = (Some y, AQueue xs ys)"
|"dequeue' (xs, N) = dequeue' (N, reverse xs)"
这个看似相同的定义,使用自定义但同构的数据类型而不是一对,被拒绝:
fun dequeue :: "'a queue ⇒ ('a option × 'a queue)" where
"dequeue (AQueue N N) = (None, AQueue N N)"
|"dequeue (AQueue xs (C y ys)) = (Some y, AQueue xs ys)"
|"dequeue (AQueue xs N) = dequeue (AQueue N (reverse xs))"
为什么?这里是否有对的特殊设置,如果有,我可以将该设置扩展到我的自定义数据类型吗?应该datatype
自动执行此操作吗?
答案 0 :(得分:0)
我也许能够自己回答这个问题。在深入研究了一些代码之后,我在HOL/Fun_Def.thy
中找到了这个:
lemma measure_fst[measure_function]: "is_measure f ⟹ is_measure (λp. f (fst p))"
by (rule is_measure_trivial)
lemma measure_snd[measure_function]: "is_measure f ⟹ is_measure (λp. f (snd p))"
by (rule is_measure_trivial)
实际上是通过使用
复制该设置datatype 'a queue = AQueue (young: "'a List") (old: "'a List")
lemma [measure_function]: "is_measure f ⟹ is_measure (f ∘ young)" ..
上面代码中的第二个函数定义也是如此。