Types 如何";摘录;来自子集类型{Z:Z | Z>;0}的Z
如果函数使用Types 如何";摘录;来自子集类型{Z:Z | Z>;0}的Z,types,subset,coq,Types,Subset,Coq,如果函数使用Z作为参数,那么它也可以使用Z的任何子集,对吗?例如,Zmod取两个Z并返回Z。我可以用子集类型改进此方法而不必重新实现它吗 我想要这个: Definition Z_gt0 := {z | z > 0}. Definition mymod (n1 n2 : Z_gt0) := Zmod n1 n2. 但是Coq抱怨说,当然,n1应该有Z型。如何使用Z_gt0?强迫 这个问题与我的另一个问题有关: 编辑:proj1\u sig可能会成功,谢谢Coq IRC频道 proj1
Z
作为参数,那么它也可以使用Z
的任何子集,对吗?例如,Zmod
取两个Z
并返回Z
。我可以用子集类型改进此方法而不必重新实现它吗
我想要这个:
Definition Z_gt0 := {z | z > 0}.
Definition mymod (n1 n2 : Z_gt0) :=
Zmod n1 n2.
但是Coq抱怨说,当然,n1应该有Z型。如何使用Z_gt0
?强迫
这个问题与我的另一个问题有关:
编辑:proj1\u sig
可能会成功,谢谢Coq IRC频道 proj1\u 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.