我正在做我的第一次实验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
引理和inductive
需要mono
引理。但究竟是什么?