"无效的地图功能"在定义corecursive树时

时间:2014-11-12 09:17:30

标签: isabelle corecursion

我正在用codatatype进行我的第一次实验,但我很早就被卡住了。我开始使用这个分支的定义,可能是无限的树:

codatatype (lset: 'a) ltree = Node (lnext : "'a ⇒ 'a ltree option")

并且一些定义可以正常工作:

primcorec lempty :: "'a ltree"
  where "lnext lempty = (λ _ . None)"

primcorec single :: "'a ⇒ 'a ltree"
  where "lnext (single x) = (λ _ . None)(x := Some lempty)"

但这不起作用:

primcorec many :: "'a ⇒ 'a ltree"
  where "lnext (many x) = (λ _ . None)(x := Some (many x))"

我收到错误消息

primcorec error:
  Invalid map function in "[x ↦ many x]"

我可以通过编写

来解决这个问题
primcorec many :: "'a ⇒ 'a ltree"
  where "lnext (many x) = (λ x'. if x' = x then Some (many x) else None)"

这使得primcorec需要“了解”函数更新运算符,类似于fun需要fundef_cong lemmas和inductive需要{{1} lemmas。但具体到底是什么?

1 个答案:

答案 0 :(得分:2)

如果codatatype通过其他类型构造函数进行递归,则primcorec期望递归调用正确嵌套在这些类型构造函数的map函数中。在该示例中,递归遍历函数类型和选项类型,其映射函数为op omap_option。因此,对many的递归调用应采用op o (map_option many)形式。因此,以下定义有效:

primcorec many :: "'a ⇒ 'a ltree"
where "lnext (many x) = map_option many ∘ [x ↦ x]"

为方便起见,primcorec支持更多语法输入格式。特别是,函数类型的map函数也可以使用lambda抽象编写。此外,它支持大小写区分和if。这就是您的第二个版本被接受的原因。但是,当您查看生成的定义many_def时,您会发现它比使用显式地图函数更复杂。

primcorec不支持任意函数的注册,因此您无法在原始格式中使用fun_upd。原始的corecursion是句法的。也许在将来会有function的核心对应物。

地图功能在tutorial on datatypesthis paper中解释。