如何从子集类型{z:Z |中“提取”Z. z> 0}

时间:2014-10-21 18:40:44

标签: 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 is expected to have type Z。如何使其与Z_gt0一起使用?强迫?

这个问题与我的另一个问题有关:Random nat stream and subset types in Coq

编辑proj1_sig可能会成功,感谢Coq IRC频道!

1 个答案:

答案 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.