2013-04-05 22 views
6

Ocaml mã được trích xuất từ ​​Coq bao gồm (trong một số trường hợp) một loại __ và một hàm __ quy định như sau:__ trong Ocaml chiết xuất từ ​​Coq

type __ = Obj.t 
let __ = let rec f _ = Obj.repr f in Obj.repr f 

Các tài liệu nói rằng trong quá khứ, kiểu như đã được xác định như unit (và do đó __ có thể được lấy là ()) nhưng có (hiếm) trường hợp có giá trị loại __ được áp dụng cho một giá trị loại __.

__ sử dụng chức năng không có giấy tờ của mô-đun Obj từ OCaml, nhưng dường như những gì được xác định về bản chất là một hàm đa hình hoàn toàn ăn tất cả các đối số của nó (bất kể số của chúng). Có một số tài liệu liên quan đến các trường hợp không thể loại bỏ __ và giá trị của loại này đối với các giá trị cùng loại, cả từ lý thuyết (xây dựng các thuật ngữ Coq mà không thể loại bỏ) và từ thực tế (hiển thị trường hợp thực tế nơi điều này xảy ra) quan điểm?

Trả lời

2

Tài liệu tham khảo được trích dẫn trong số README cung cấp tổng quan tốt đẹp về vấn đề xóa. Cụ thể, cả báo cáo thisthis nêu chi tiết cách các lược đồ loại và các phần lôgic của các thuật ngữ CIC bị xóa và tại sao phải có __ x = __. Vấn đề không chính xác là __ có thể được áp dụng cho chính nó, nhưng nó có thể được áp dụng cho bất cứ điều gì ở tất cả.

Thật không may, nó không phải là tất cả rõ ràng nếu có hành vi này là quan trọng trong bất kỳ trường hợp không bệnh lý. Động lực được đưa ra ở đó là có thể trích xuất bất kỳ cụm từ nào có nghĩa là và các tài liệu không đề cập đến bất kỳ trường hợp nào thực sự thú vị từ quan điểm thực tế. Ví dụ đưa ra trên 3 là một trong những điều này:

Definition foo (X : Type) (f : nat -> X) (g : X -> nat) := g (f 0). 
Definition bar := foo True (fun _ => I). 

Thi Recursive Extraction bar. cho kết quả sau:

type __ = Obj.t 
let __ = let rec f _ = Obj.repr f in Obj.repr f 

type nat = 
| O 
| S of nat 

(** val foo : (nat -> 'a1) -> ('a1 -> nat) -> nat **) 

let foo f g = 
    g (f O) 

(** val bar : (__ -> nat) -> nat **) 

let bar = 
    foo (Obj.magic __) 

Kể từ foo là đa hình trên Type, không có cách nào đơn giản hóa việc áp dụng f O trên cơ thể của nó, bởi vì nó có thể có nội dung tính toán. Tuy nhiên, kể từ Prop là một loại phụ của Type, foo cũng có thể được áp dụng cho True, đó là những gì sẽ xảy ra trong bar. Khi chúng tôi cố gắng giảm bar, do đó, chúng tôi sẽ có __ được áp dụng cho O.

trường hợp cụ thể này không phải là rất thú vị, bởi vì nó sẽ có thể hoàn toàn inline foo:

let bar g = 
    g __ 

Kể từ True không thể được áp dụng cho bất cứ điều gì, nếu g tương ứng với bất kỳ điều khoản Coq quy phạm pháp luật, __ của nó lập luận cũng sẽ không được áp dụng cho bất cứ điều gì, và do đó sẽ an toàn khi có __ =() (Tôi tin). Tuy nhiên, có những trường hợp không thể biết trước liệu một thuật ngữ bị xóa có thể được áp dụng thêm hay không, điều này làm cho định nghĩa chung cho __ cần thiết. Hãy xem ví dụ: Fun ví dụ here, gần cuối tệp.

Các vấn đề liên quan