Я пытаюсь смоделировать связь между числовой переменной и логической переменной, в которой, если числовая переменная находится в определенном диапазоне, тогда логическая переменная изменит значение.Я новичок в Alloy, и у меня возникают проблемы с пониманием того, как достаточно ограничить свою область видимости, чтобы получить очевидный контрпример.Мой код выглядит следующим образом:
open util/boolean
one sig Object {
discrete : one Bool,
integer : one Int
}
fact { all o : Object | o.integer > 0 and o.integer < 10 }
fact { all o : Object | o.integer > 5 iff o.discrete = False }
assert discreteCondition { all o : Object | o.discrete = True }
check discreteCondition for 1000
Поскольку o.integer
имеет целочисленные значения и колеблется от 0 до 10, это может быть только один из 10 различных вариантов.И я указал, что у каждого Object
должен быть только один integer
и один discrete
.Поэтому мне кажется разумным, что здесь нужно проверить только 10 случаев: один случай для каждого значения integer
.И все же даже с 1000 делами я получаю
Контрпример не найден.
Если я удаляю переменную integer
и связанные с ней факты, тогда он находит контрпример почти сразу,Я также пытался использовать другие решатели и увеличивать различные значения глубины и памяти в опциях, но это не помогло, поэтому ясно, что мой код ошибочен.
Как я могу ограничить область действия, чтобы Alloy нашел контрпример(перебирая возможные значения integer
)?Спасибо!