天泣記

2022-07-26 (Tue)

#1 Coq の Template polymorphism

Coq 8.15.2 の manual の Template polymorphism のところを 読んでいて疑問に思ったのだが、なんか Ind-Family の規則が、partial application に対応しているようなのだが、 実装はそうなっていない気がする

Coq 8.15.2, Template polymorphism

ふと思いついて、古い manual を見てみると、 Template polymorphism が入った当初の 8.1 でだけ、(fun A:Set => prod A) という例の結果が異なるようだ

Coq 8.1pl4 の manual:

Coq < Check (fun A:Set => prod A).
fun A : Set => prod A
    : Set -> Type -> Set

Coq 8.2pl2 の manual:

Coq < Check (fun A:Set => prod A).
fun A : Set => prod A
    : Set -> Type -> Type

prod は 2引数で、引数を 1つしか与えていない prod A は partial application なのだが、 これの型が Type -> Set になるか Type -> Type になるかが異なる

なんとなく、prod A B で、A が Set であっても B が Type だったら prod A B を Set にするのはまずいような気がするので、 実装が正しい、のかなぁ。 実装を直したけれど manual が直っていないという感じか?

2022-07-28 (Thu)

#1 Coq の Template polymorphism (2)

さらに manual を読み直した

そーか、具体的に与えた ql から Pl' が決まり、Ci : sqi を成立できるように si が選ばれる、 という仕掛けか

そこで ΓP' は、partial application で ql が与えられなかった部分はそのまま残るから別にいいのか

ということは manual も実装も問題ない、のかな

いや、以下の例では変?

Inductive I (A B : Type) : Type :=
| C1 : A -> B -> I A B
| C2 : I A (B * B) -> I A B.

Check (fun (A : Set) (B : Set) => I A B).
(*
fun A B : Set => I A B
     : Set -> Set -> Set
*)

B は recursively non-uniform parameters なので、 Ind-Family の中で B は扱われず、 ΓP' の中で B は Type として扱われ、 C1 : A -> B -> I A B で B が Type なので A -> B -> I A B は Type となる、 はずなのに、Set になっている、と思う

manual に対して実装が拡張されている?


[latest]


田中哲