终止检查产品类型

时间:2016-02-05 13:11:01

标签: tuples isabelle termination

以下功能定义被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自动执行此操作吗?

1 个答案:

答案 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)" ..

上面代码中的第二个函数定义也是如此。