Yo!Случайные типы потоков и подмножества в Coq
Мне нужен случайный поток натов с гарантированным типом подмножества, например 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: добавьте тег для типов подмножеств или типов уточнения.
Кстати, вы должны открыть область '' Z'' (глобально или локально) для вашего определения '' Z_gt0'', иначе '' _ <_'' будет в '' nat''. Что-то вроде '' Определение Z_gt0: = {Z | Z> 0}% Z.'' должен сделать трюк. – Vinz
Правильно, поэтому 'Требовать импорт ZArith'? –
Этого недостаточно, вам нужно будет '' Open Scope Zscope'' (не уверен в синтаксисе) на верхнем уровне или использовать локальную область ''% Z'', если это необходимо. – Vinz