写作时
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本身
为什么,我该如何避免呢?
答案 0 :(得分:2)
命令primcorec
仅支持原始的corecursion,因此只有相互的corecursive codatatype支持相互的corecursion。您的两个函数one
和two
不是原始的corecursive,因此不直接支持。如果更通用的命令corec
支持相互的corecursion,它将落入其片段,但尚未为corec
实现相互的corecursion。因此,您必须找到非相互的corecursive定义,然后将one
和two
定义为派生函数。规范的解决方案是使用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"
此外,在通过共同演示证明这些属性之前,您必须首先将大多数有关one
和two
的属性概括为one_two
。