Рассмотрим этот фрагмент:
chan sel = [0] of {int};
active proctype Selector(){
int not_me;
endselector:
do
:: sel ? not_me;
if
:: 0 != not_me -> sel ! 0;
:: 1 != not_me -> sel ! 1;
:: 2 != not_me -> sel ! 2;
:: 3 != not_me -> sel ! 3;
:: else -> -1;
fi
od
}
proctype H(){
int i = -1;
int count = 1000;
do
:: sel ! i; sel ? i; printf("currently selected: %d\n",i); count = count -1;
:: count < 0 -> break;
od
assert(false);
}
init{
atomic{
run H();
}
}
Вы ожидаете, что это будет печатать довольно произвольно значения 0..3, пока счетчик не упадет ниже 0, после чего он может либо напечатать другое число, либо завершиться.
Однако, похоже, это не так.
Единственные возвращаемые значения: 0, затем 1, затем 0, затем 1, затем 0, затем 1,...
Я как-то неправильно понял «недетерминизм» утверждений if/fi?
(используя ispin на Ubuntu, если это имеет значение).