2017-11-09 11 views
7

私は、明示的にインデックスをスレッド化することなく、インデックス付きの型を書くためのライブラリを持っています。これは、無関係の配管を隠すことによって、よりクリーンなトップレベルタイプにつながります。Coqで計算された型の暗黙の引数

Fail Definition id {A : nat -> Type} : [ A :-> A ] := fun a => a. 
Definition id {A : nat -> Type} : [ A :-> A ] := fun (n : nat) a => a. 

私が取得するための方法はあります:しかしコックがによって示されるように、暗黙のIForallによって導入普遍数量詞を作るために私の要求を無視し

Section Indexed. 

Local Open Scope type. 
Context {I : Type} (T : Type) (A B : I -> Type). 

Definition IArrow : I -> Type := 
    fun i => A i -> B i. 

Definition IForall : Type := 
    forall {i}, A i. 

End Indexed. 

Notation "A :-> B" := (IArrow A B) (at level 20, right associativity). 
Notation "[ A ]" := (IForall A) (at level 70). 

:それはこのような何かを行きますCoqは実際にこの議論を暗黙的にしていますか?

+0

を行うことができるようになります私はそれを試していないが、我々はこのように表記法を定義した場合: '記法「: {A:nat - >タイプ}:[A: - > A]:=:fun a = > a.'はうまくいくはずです。これがあなたが探しているものなのかどうかはわかりません。 –

+0

しかし、時々私は何かを縛りたくない。例えば。私は定義アプリ(f:[A: - > B])(a:[A]):[B]):= f a.'を箱から出したいと思います。 – gallais

答えて

2

f。 Bug #3357

ある日、私は願って、PR #668がマージされ、その後、あなたは

Notation IArrow A B := 
    (fun i => A i -> B i) 

Notation IForall A := 
    (forall {i}, A i). 

Notation "A :-> B" := (IArrow A B) (at level 20, right associativity). 
Notation "[ A ]" := (IForall A) (at level 70). 

Definition id {A : nat -> Type} : [ A :-> A ] := fun a => a. 
Definition id {A : nat -> Type} : [ A :-> A ] := fun (n : nat) a => a. 
関連する問題