2017-11-09 18 views
7

Tôi có thư viện để viết các loại được lập chỉ mục mà không cần phải chỉ rõ chỉ mục. Điều này dẫn đến các loại cấp cao hơn sạch hơn bằng cách ẩn đi hệ thống ống nước không liên quan. Nó đi một cái gì đó như thế này:Đối số ngầm định trong một loại được tính trong Coq

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). 

Tuy nhiên Coq lờ yêu cầu của tôi để làm cho lượng hóa phổ được giới thiệu bởi IForall ngầm như chứng minh bởi:

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

Có cách nào cho tôi để có được Coq để thực sự làm cho đối số này tiềm ẩn?

+0

Tôi đã không thử nó, nhưng nếu chúng ta định nghĩa một ký hiệu như thế này: 'Notation ": vui vẻ var => body ": = (vui vẻ n var => body) (ở mức ) .', sau đó' Định nghĩa id {A: nat -> Loại}: [A: -> A]: =: fun a = > a.' nên hoạt động. Không chắc chắn nếu đây là những gì bạn đang tìm kiếm. –

+0

Nhưng đôi khi tôi không muốn ràng buộc bất cứ điều gì. Ví dụ. Tôi muốn 'ứng dụng định nghĩa (f: [A: -> B]) (a: [A]): ​​[B]): = f a.' để làm việc ra khỏi hộp. – gallais

Trả lời

2

No.

C.f. Bug #3357

Một ngày nọ, tôi hy vọng, PR #668 sẽ được sáp nhập, và sau đó bạn sẽ có thể làm

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. 
Các vấn đề liên quan