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 this và this 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.