如果函数将Z
作为参数,那么也应该可以采用Z
的任何子集,对吧?例如,Zmod
需要两个Z
并返回Z
。我可以使用子集类型改进此方法而无需重新实现吗?
我想要这个:
Definition Z_gt0 := {z | z > 0}.
Definition mymod (n1 n2 : Z_gt0) :=
Zmod n1 n2.
但Coq当然抱怨n1 is expected to have type Z
。如何使其与Z_gt0
一起使用?强迫?
这个问题与我的另一个问题有关:Random nat stream and subset types in Coq
编辑:proj1_sig
可能会成功,感谢Coq IRC频道!
答案 0 :(得分:1)
proj1_sig
是通常的方法。另一个解决方案是模式匹配:
match z1 with
exist _ z hz => ...
end
z
将是您的预测,hz
将成为z > 0
的证明。我通常将第一个参数保持匿名,因为我知道z : Z
。
我最近的Coq版本,还有另一种方法,使用let
(因为sig
是一个只有一个构造函数的归纳法):
Definition Zmod_gt0 (z1 z2: Z_gt0) : Z :=
let (a, _) := z1 in
let (b, _) := z2 in
Zmod a b.