궁금해. 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
가 절대 위치에서 사용되지 않습니다.
Coq 는 여기서 너무 신중한 것 같습니다 . 그렇다면이 특정 유도 데이터 유형에 실제로 문제가 있습니까? 아니면 여기에 Coq 가 조금 더 관대 할 수 있습니까?
또한 다른 증거 조수들은 어떻습니까? 그러한 귀납적 정의 (자연스럽게)에 대처할 수 있습니까?