私は興味がある。私は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
は負の位置で使用されることはありません。
と思われるコックがここにovercautiousです。それでは、この特定の帰納的データ型に本当に問題があるのでしょうか?または、Coqの方が少し許容範囲が広いでしょうか?
また、他の証明アシスタントについてはどうですか?彼らはそのような帰納的な定義に(自然な方法で)対処できますか?