Взаимная рекурсия в 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" не является взаимо-действующим ядром с "inftree" и не является вложенным ядро-курсивом через себя
Почему и как мне этого избежать?
1 ответ
Команда primcorec
поддерживает только примитивный corecursion, поэтому взаимный corecursion поддерживается только для взаимно corecursive codatatypes. Ваши две функции one
а также two
не являются примитивными и поэтому не поддерживаются напрямую. Если более общая команда corec
поддерживается взаимный corecursion, он бы распался на части, но взаимный corecursion еще не был реализован для corec
, Таким образом, вы должны найти не взаимное определение 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
сначала, прежде чем вы сможете доказать их с помощью coduduction.