(如何)我可以在Coq中定义部分强制?

时间:2017-09-11 03:05:48

标签: coq

我想设置Coq,而不是用符号重新定义:(并且没有插件,并且没有替换标准库或重新定义我使用的常量---没有像这样的作弊),所以我有option natnat之类的部分强制,只在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时遇到了这个问题。)

0 个答案:

没有答案