Alloy целочислена семантика за сравнение с помощта на Forbid Overflow: Да

Имам следния модул Alloy и стартирам команда:

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

С „Забрана на препълването: Не“ Alloy Analyzer 4.2 (дата на компилация: 2012-09-25) не намира екземпляр. Вярвам, че причината е, че поради препълването на константата 3 предикатът за изпълнение чете {all a: A| #a.x<-1 and #a.x>1}.

С "Forbid Overflow: Yes" Alloy Analyzer намира екземпляр.

---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