Yo!
我需要一个具有保证子集类型的随机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:请为子集类型或精化类型添加一个标记。
类型的问题是Zmod seed n2
是一个可以为0的正整数,因此seed'
可以为0,这意味着seed' * n1
也可以为0。
最后,你的CoFixpoint
是不可键入的,种子应该是某种Z_ge0
类型,而不是Z_gt0
。
EDIT:要回答关于库的部分,您可能对positive
类型感兴趣,它是严格大于0的二进制整数的类型。事实上,Z
被定义为:
Inductive Z : Set :=
Z0 : Z (* 0 *)
| Zpos : positive -> Z (* z > 0 *)
| Zneg : positive -> Z (* z < 0 *)
然而,问题仍然是一样的:取正整数的模可以转义positive
,因为你最终可以得到0。