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