Оператор кардинальности (#) неверный результат в Alloy
Я использую оператор #, чтобы получить количество декартовых произведений (A->B) и Union (A+B). Но он возвращает странные отрицательные числа, и я понятия не имею, что это такое!?
Посмотрите снимок ниже, показывающий содержание A-> B и A + B для моей модели и количество элементов, которые Alloy дает мне с помощью оператора #. (Я ожидаю получить 12 для первого и 8 для второго, но я получаю -4 для первого и -8 для второго)
Любой комментарий?!
ниже приведены мои спецификации, если это поможет:
открытое использование / отношение
sig A {}
сиг B{}
сиг C{R1: один A, R2: один B}
беги {} за 6
1 ответ
По умолчанию целые числа Alloy представляют собой 4-битные значения, дополняющие двойки, поэтому диапазон возможных значений составляет от -8 до 7. По причинам, связанным со сложными компромиссами при проектировании и реализации, анализатор обрабатывает ограниченный диапазон целых чисел с помощью переноса. вокруг. В вашем примере количество элементов A->B равно 12, что выходит за пределы доступного диапазона; Значения изменяются, и оценщик отображает значение -4.
Чтобы учесть количество элементов, равное 12, самый простой обходной путь - обеспечить, чтобы Int имел битовую пропускную способность больше 4, используя ключевое слово int
в спецификации объема.
Конкретно: изменить run {} for 6
в run {} for 6 but 5 int
, (Конечно, вы можете использовать битовую пропускную способность больше 5.)
Более новые версии Alloy также имеют опцию Forbid Overflow, которая предотвращает показ ложных примеров и контрпримеров при запуске предикатов или проверке утверждений.
Смотрите также недавний вопрос. Почему Alloy говорит мне, что 3 >= 10?