Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 如何";摘录;来自子集类型{Z:Z | Z>;0}的Z_Types_Subset_Coq - Fatal编程技术网

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.