Оператор кардинальности (#) неверный результат в 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?

Другие вопросы по тегам