Мені цікаво. Я працюю над цим типом даних в OCaml :
type 'a exptree =
| Epsilon
| Delta of 'a exptree * 'a exptree
| Omicron of 'a
| Iota of 'a exptree exptree
З якими можна маніпулювати за допомогою явно набраних рекурсивних функцій (функція, яка була додана зовсім недавно). Приклад:
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
Але мені ніколи не вдалося визначити це в Coq :
Inductive exptree a :=
| epsilon : exptree a
| delta : exptree a -> exptree a -> exptree a
| omicron : a -> exptree a
| iota : exptree (exptree a) -> exptree a
.
Кок скуголить. Це не подобається останньому конструктору, і говорить щось, з чим я зовсім не розумію чи не згоден:
Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".
Я можу зрозуміти, що індуктивні типи, що використовують заперечення всередині свого визначення, як type 'a term = Constructor ('a term -> …)
відкидаються, тому що вони призведуть до некрасивих не обґрунтованих звірів, таких як (нетипізовані) λ-терміни. Однак цей конкретний exptree
тип даних видається досить нешкідливим: дивлячись на його визначення OCaml , його аргумент 'a
ніколи не використовується в негативних позиціях.
Здається, що Кок тут обережний. То чи справді є проблема з цим конкретним індуктивним типом даних? Або Кок може бути тут трохи дозвольнішим?
Крім того, що з іншими асистентами доказування, чи здатні вони впоратися з таким індуктивним визначенням (природним чином)?