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

Random Coq中的随机nat流和子集类型,random,coq,Random,Coq,哟! 我需要一个具有保证子集类型的随机nat流,如此流将只提供0Z(*Z>0*) |锌电极:正->Z(*Z0}%Z.应该可以做到这一点。对,所以需要导入ZArith?这还不够,你必须在顶层打开作用域Zscope(语法不确定),或者在必要的地方使用%Z本地作用域。问题是,我也想接受其他子集,asrand:Stream{Z|10

哟!

我需要一个具有保证子集类型的随机nat流,如
此流将只提供0
。有人来帮我吗

我找到了生成随机数的函数:

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

我必须重新定义所有函数吗?或者已经有一个库函数可以使用了


修改:请为子集类型或细化类型添加标记。

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

最后,您的
CoFixpoint
是不可键入的,种子应该是某种
Z_ge0
类型,而不是
Z_gt0

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

Inductive Z : Set :=
    Z0 : Z (* 0 *)
  | Zpos : positive -> Z (* z > 0 *)
  | Zneg : positive -> Z (* z < 0 *)
感应Z:设置:=
Z0:Z(*0*)
|Zpos:正->Z(*Z>0*)
|锌电极:正->Z(*Z<0*)

然而问题仍然是一样的:取正整数的模可以逃逸
,因为你可以以0结束。

顺便说一句,你应该打开
Z
范围(全局或局部)来定义
Z_gt0
,否则
测试将在
nat
中。类似于
定义Z|gt0:={Z|Z>0}%Z.
应该可以做到这一点。对,所以
需要导入ZArith
?这还不够,你必须在顶层
打开作用域Zscope
(语法不确定),或者在必要的地方使用
%Z
本地作用域。问题是,我也想接受其他子集,as
rand:Stream{Z|10
。所以我必须重新定义Zmod,还是?不,等等
mod
当然可以总是0。但是如果n1和n2是素数,
seed'
不能是0,对吗?我不确定。如果原始种子是
n1
?是的,如果
seed==n2
则流中只有零。所以
n1
n2
应该是素数,而
seed!=n2
。这段代码的作者说,
你必须选择n1n2作为素数,你将获得1和n2-1之间相当均匀的数字分布。如果我能证明这一点,我可以让这个函数返回一个子集类型,比如
{z|z>1/\z
,对吗?对不起,意思是
{z|z>0/\z