primcofix中的相互递归

时间:2017-04-21 17:18:20

标签: isabelle coinduction

写作时

codatatype inftree = node nat inftree inftree

primcorec one :: inftree and two :: inftree where
    "one = node 1 one two"
  | "two = node 2 one two"

我得到了

  

" inftree"并不是与" inftree"也没有嵌套的corecursive本身

为什么,我该如何避免呢?

1 个答案:

答案 0 :(得分:2)

命令primcorec仅支持原始的corecursion,因此只有相互的corecursive codatatype支持相互的corecursion。您的两个函数onetwo不是原始的corecursive,因此不直接支持。如果更通用的命令corec支持相互的corecursion,它将落入其片段,但尚未为corec实现相互的corecursion。因此,您必须找到非相互的corecursive定义,然后将onetwo定义为派生函数。规范的解决方案是使用bool作为参数:

 primcorec one_two :: "bool => inftree" where
    "one_two is_one = Node (if is_one then 1 else 2) (one_two True) (one_two False)"

 definition "one = one_two True"
 definition "two = one_two False"

此外,在通过共同演示证明这些属性之前,您必须首先将大多数有关onetwo的属性概括为one_two