Coq中的随机nat流和子集类型

时间:2014-10-20 21:30:15

标签: random coq

哟!

我需要一个带有保证子集类型的随机nat流,例如this stream will only give 0 < nat < 10。有人帮我这个吗?

我发现这个函数用于生成随机数:

CoFixpoint rand (seed n1 n2 : Z) : Stream Z :=
    let seed' := Zmod seed n2 in Cons seed' (rand (seed' * n1) n1 n2).

我想用任何子集类型替换Z,例如

Definition Z_gt0 := { Z | Z > 0}.

所以我们有:

CoFixpoint rand (seed n1 n2 : Z_gt0) : Stream Z_gt0 :=
    let seed' := Zmod seed n2 in Cons seed' (rand (seed' * n1) n1 n2).

现在的问题是Zmod接受Z但不接受Z_gt0

我是否必须重新定义所有功能?或者是否已准备好使用库函数?

TO MOD:请为子集类型或细化类型添加标记。

1 个答案:

答案 0 :(得分:1)

您的类型的问题是Zmod seed n2是一个正整数,可以是0,因此seed'可以是0,这意味着seed' * n1也可以是0。

最后,CoFixpoint不是典型的,种子应该是某种Z_ge0类型,而不是Z_gt0

编辑:要回答关于库的部分,您可能会对positive类型感兴趣,这类型是严格大于0的二进制整数类型。实际上,Z定义为:

Inductive Z : Set :=
    Z0 : Z (* 0 *)
  | Zpos : positive -> Z (* z > 0 *)
  | Zneg : positive -> Z (* z < 0 *)

然而问题仍然是相同的:取正整数的模可以转义positive,因为你可以得到0。