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