2014-10-20 3 views
0

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: добавьте тег для типов подмножеств или типов уточнения.

+0

Кстати, вы должны открыть область '' Z'' (глобально или локально) для вашего определения '' Z_gt0'', иначе '' _ <_'' будет в '' nat''. Что-то вроде '' Определение Z_gt0: = {Z | Z> 0}% Z.'' должен сделать трюк. – Vinz

+0

Правильно, поэтому 'Требовать импорт ZArith'? –

+0

Этого недостаточно, вам нужно будет '' Open Scope Zscope'' (не уверен в синтаксисе) на верхнем уровне или использовать локальную область ''% Z'', если это необходимо. – Vinz

ответ

1

Проблема с вашим типом заключается в том, что 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.

+0

Дело в том, что я хотел бы принять и другие подмножества, как «rand: Stream {Z | 10

+0

Но если n1 и n2 - простые числа,' seed'' не может быть 0, не так ли? –

+0

Я не уверен в этом. Что, если исходное семя '' n1''? – Vinz

Смежные вопросы