primcofix中的相互递归

Mutual recursion in primcofix

写的时候

codatatype inftree = node nat inftree inftree

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

我明白了

"inftree" is neither mutually corecursive with "inftree" nor nested corecursive through itself

为什么,我该如何避免?

命令primcorec仅支持原始核心递归,因此相互核心递归仅支持相互核心递归协同数据类型。您的两个函数 onetwo 不是原始的 corecursive,因此不直接支持。如果更通用的命令corec支持mutual corecursion,它会落入它的片段,但是corec还没有实现mutual corecursion。因此,你必须找到一个非相互的核心递归定义,然后将 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,然后才能通过共同归纳来证明它们。