Взаимная рекурсия в 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.

Другие вопросы по тегам