Sono curioso. Ho lavorato su questo tipo di dati in OCaml :
type 'a exptree =
| Epsilon
| Delta of 'a exptree * 'a exptree
| Omicron of 'a
| Iota of 'a exptree exptree
Che può essere manipolato usando funzioni ricorsive tipizzate in modo esplicito (una funzione che è stata aggiunta abbastanza di recente). Esempio:
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
Ma non sono mai stato in grado di definirlo in 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 sta piagnucolando. Non gli piace l'ultimo costruttore e dice qualcosa che non capisco completamente o con cui sono d'accordo:
Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".
Quello che posso capire è che i tipi induttivi che usano una negazione all'interno della loro definizione come type 'a term = Constructor ('a term -> …)
sono respinti, perché porterebbero a brutte bestie non ben fondate come i termini (non tipizzati) λ. Tuttavia, questo particolare exptree
tipo di dati sembra abbastanza innocuo: osservando la sua definizione OCaml , il suo argomento 'a
non viene mai usato in posizioni negative.
Sembra che Coq sia troppo esagerato qui. Quindi c'è davvero un problema con questo particolare tipo di dati induttivo? O Coq potrebbe essere leggermente più permissivo qui?
Inoltre, che dire degli altri assistenti di prova, sono in grado di far fronte a una definizione così induttiva (in modo naturale)?