我想设置Coq,而不是用符号重新定义:
(并且没有插件,并且没有替换标准库或重新定义我使用的常量---没有像这样的作弊),所以我有option nat
到nat
之类的部分强制,只在Some _
上定义。特别是,我想要
Eval compute in Some 0 : nat.
评估为0
,我想要
Check None : nat.
引发错误。
我所管理的最接近的是能够使用两个:
执行此操作:
Definition dummy {A} (x : option A) := A.
Definition inverted_option {A} (x : option A)
:= match x with Some _ => A | _ => True end.
Definition invert_Some {A} (x : option A) : inverted_option x
:= match x with Some v => v | None => I end.
Coercion invert_Some : option >-> inverted_option.
Notation nat' := (inverted_option (A:=nat) (Some _)).
Eval compute in (Some 0 : nat') : nat.
Check (None : nat') : nat.
(* The term "None" has type "option ?A" while it is expected to have type
"nat'". *)
但是,这仅在nat'
是符号时才有效,我无法用符号来定义强制。 (并试图定义从inverted_option (Some _)
到nat
的强制违反了统一的继承条件。)我以为我可以通过使用规范结构解决这个问题,但我还没有管理找出如何将规范结构分辨率与强制插入交错(另见Can canonical structure resolution be interleaved with coercion insertion?)。
(我在尝试回答Coq: Defining a subtype时遇到了这个问题。)