哟!
我需要一个带有保证子集类型的随机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:请为子集类型或细化类型添加标记。
答案 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。