Merak ediyorum. OCaml'de bu veri türü üzerinde çalışıyorum :
type 'a exptree =
| Epsilon
| Delta of 'a exptree * 'a exptree
| Omicron of 'a
| Iota of 'a exptree exptree
Hangi açıkça yazılmış özyinelemeli işlevler (oldukça yakın zamanda eklenen bir özellik) kullanılarak manipüle edilebilir. Misal:
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
Ama bunu Coq ile tanımlayamadım :
Inductive exptree a :=
| epsilon : exptree a
| delta : exptree a -> exptree a -> exptree a
| omicron : a -> exptree a
| iota : exptree (exptree a) -> exptree a
.
Coq sızlanıyor. Son kurucudan hoşlanmıyor ve tamamen anlamadığım veya katılmadığım bir şey söylüyor:
Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".
Anlayabildiğim şey, tanımları içinde bir olumsuzlama kullanan endüktif türlerin type 'a term = Constructor ('a term -> …)
reddedilmiş olmasıdır, çünkü onlar (türsüz) λ terimleri gibi çirkin iyi kurulmuş olmayan hayvanlara yol açacaktır. Bununla birlikte, bu belirli exptree
veri türü yeterince zararsız görünmektedir: OCaml tanımına bakıldığında, argümanı 'a
asla olumsuz pozisyonlarda kullanılmaz.
Coq burada çok dikkatli görünüyor . Peki bu özel endüktif veri tipinde gerçekten bir sorun var mı? Yoksa Coq burada biraz daha izinli olabilir mi?
Ayrıca, diğer kanıt asistanları, böyle bir endüktif tanımla (doğal bir şekilde) başa çıkabilirler mi?