で最初の実験を行っています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