Tôi tò mò. Tôi đã làm việc với kiểu dữ liệu này ở OCaml :
type 'a exptree =
| Epsilon
| Delta of 'a exptree * 'a exptree
| Omicron of 'a
| Iota of 'a exptree exptree
Có thể được thao tác bằng cách sử dụng các hàm đệ quy được gõ rõ ràng (một tính năng đã được thêm vào gần đây). Thí dụ:
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
Nhưng tôi chưa bao giờ có thể định nghĩa nó trong 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 đang rên rỉ. Nó không giống như nhà xây dựng cuối cùng và nói điều gì đó tôi không hoàn toàn hiểu hoặc đồng ý với:
Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".
Những gì tôi có thể hiểu là các loại quy nạp sử dụng một phủ định bên trong định nghĩa của chúng giống như type 'a term = Constructor ('a term -> …)
bị từ chối, bởi vì chúng sẽ dẫn đến các con thú xấu xí không có căn cứ như (thuật ngữ). Tuy nhiên exptree
kiểu dữ liệu cụ thể này có vẻ vô hại đủ: nhìn vào định nghĩa OCaml của nó, đối số của nó 'a
không bao giờ được sử dụng ở các vị trí phủ định.
Có vẻ như Coq quá thận trọng ở đây. Vì vậy, có thực sự có một vấn đề với kiểu dữ liệu quy nạp đặc biệt này? Hay Coq có thể được cho phép hơn một chút ở đây?
Ngoài ra, những gì về các trợ lý chứng minh khác, họ có thể đối phó với một định nghĩa quy nạp như vậy (một cách tự nhiên)?