Сплав семантики целочисленного сравнения с использованием запрета переполнения: Да

У меня есть следующий модуль Alloy и команда запуска:

sig A { x : set A }
run {all a: A| #a.x<3 and #a.x>1} for exactly 2 A, 2 int

С параметром «Запретить переполнение: нет» анализатор сплавов версии 4.2 (дата сборки: 25 сентября 2012 г.) не находит экземпляр. Я считаю, что причина в том, что из-за переполнения константы 3 предикат запуска читается как {all a: A| #a.x<-1 and #a.x>1}.

При выборе «Запретить переполнение: Да» анализатор сплавов находит экземпляр.

---INSTANCE---
integers={-2, -1, 0, 1}
univ={-1, -2, 0, 1, A$0, A$1}
Int={-1, -2, 0, 1}
seq/Int={0}
String={}
none={}
this/A={A$0, A$1}
this/A<:x={A$0->A$0, A$0->A$1, A$1->A$0, A$1->A$1}

Alloy Evaluator сообщает мне, что предикат {all a: A| #a.x<3 and #a.x>1}, используемый в команде запуска, оценивается как false.

Может ли кто-нибудь объяснить это поведение? Есть ли разница в семантике целочисленных сравнений в Оценщике и Анализаторе?

Изменить: я заметил, что в последней экспериментальной версии поведение отличается: Alloy 4.2_2014-03-07. Он не находит экземпляр. Такое поведение ожидаемо.


person JOR    schedule 10.03.2014    source источник


Ответы (1)


Вы уже дали все правильные ответы на свой вопрос, поэтому я могу только быстро повторить их.

  • ожидаемое поведение (без экземпляра) является «правильным» поведением для этой модели;
  • версия 4.2 имеет некоторые известные ошибки, связанные с обработкой переполнения, поэтому она находит экземпляр (они должны быть исправлены в последней версии, следовательно, правильное поведение для этой модели);
  • в семантике целых чисел "зацикливания" (обнаружение переполнения отключено) по-прежнему нет экземпляра именно по той причине, которую вы описали (-3 обрабатывается как -1);
  • у оценщика все еще есть некоторые проблемы (даже в последней версии), поэтому иногда он просто использует циклическую семантику.
person Aleksandar Milicevic    schedule 10.03.2014