Saya penasaran. Saya telah mengerjakan tipe data ini di OCaml :
type 'a exptree =
| Epsilon
| Delta of 'a exptree * 'a exptree
| Omicron of 'a
| Iota of 'a exptree exptree
Yang dapat dimanipulasi menggunakan fungsi rekursif yang diketik secara eksplisit (fitur yang telah ditambahkan baru-baru ini). Contoh:
let rec map : 'a 'b. ('a -> 'b) -> 'a exptree -> 'b exptree =
fun f ->
begin function
| Epsilon -> Epsilon
| Delta (t1, t2) -> Delta (map f t1, map f t2)
| Omicron t -> Omicron (f t)
| Iota tt -> Iota (map (map f) tt)
end
Tapi saya tidak pernah bisa mendefinisikannya dalam Coq :
Inductive exptree a :=
| epsilon : exptree a
| delta : exptree a -> exptree a -> exptree a
| omicron : a -> exptree a
| iota : exptree (exptree a) -> exptree a
.
Coq merengek. Itu tidak suka konstruktor terakhir, dan mengatakan sesuatu yang saya tidak sepenuhnya mengerti atau setuju dengan:
Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".
Apa yang bisa saya pahami adalah bahwa tipe induktif yang menggunakan negasi di dalam definisi mereka seperti type 'a term = Constructor ('a term -> …)
ditolak, karena mereka akan mengarah pada binatang buas yang jelek seperti (tanpa huruf) terms istilah. Namun exptree
tipe data ini tampaknya cukup berbahaya: melihat definisi OCaml -nya, argumennya 'a
tidak pernah digunakan dalam posisi negatif.
Tampaknya Coq terlalu berhati-hati di sini. Jadi apakah benar-benar ada masalah dengan tipe data induktif khusus ini? Atau bisakah Coq sedikit lebih permisif di sini?
Juga, bagaimana dengan asisten bukti lainnya, apakah mereka mampu mengatasi definisi induktif semacam itu (dengan cara alami)?