полезно/естественное неожиданное поведение в сплаве

Я попробовал следующий фрагмент Alloy4 и обнаружил, что меня смущает поведение модуля util/Natural. Комментарии объясняют более подробно, что было неожиданным. Я надеялся, что кто-то может объяснить, почему это происходит.

module weirdNatural
private open util/natural as nat

//Somehow, using number two obtained from incrementing one works as I expect, (ie, there is no 
//number greater than it in {0,1,2}. but using number two obtained from the natrual/add function
//seems to work differently. why is that?

let twoViaAdd = nat/add[nat/One, nat/One]
let twoViaInc = nat/inc[nat/One]

pred biggerAdd {
    some x: nat/Natural | nat/gt[x, twoViaAdd]
}

pred biggerInc {
    some y: nat/Natural | nat/gt[y, twoViaInc]
}

//run biggerAdd for 10 but 3 Natural //does not work well, it does find a number gt2 in {0,1,2}
run biggerInc for 10 but 3 Natural //works as expected, it finds a number gt2 in {0,1,2,3}, but not in {0,1,2}

person orm    schedule 05.09.2013    source источник


Ответы (1)


Спасибо за этот отчет об ошибке. Вы абсолютно правы, это странное поведение.

В Alloy4.2 внесены некоторые изменения в обработку целых чисел; а именно, операторы + и - в Alloy4.2 всегда интерпретируются как объединение/разность множеств, поэтому для выражения арифметического сложения/вычитания необходимо использовать встроенные функции plus/minus. С другой стороны, модуль util/natural (ошибочно) не был обновлен для использования последнего синтаксиса, который был основной причиной странного поведения, с которым вы столкнулись (в частности, функция nat/add использует старый оператор + вместо plus, а nat/inc — нет).

Чтобы обойти эту проблему, вы можете либо

    1. open the util/natural module (choose "File -> Open Sample Models" from the main menu)
    2. отредактируйте файл и замените два вхождения <a> + <b> на plus[<a>, <b>]
    3. сохраните новый файл в той же папке, что и файл als вашей модели (например, как «my_nat.als»)
    4. откройте его из основного модуля (например, open my_nat as nat)

or

  • загрузите последнюю неофициальную версию, в которой эта ошибка исправлена ​​( вам может потребоваться вручную удалить временную папку Alloy, чтобы убедиться, что анализатор Alloy не использует старую (кэшированную) версию библиотеки util/natural).
person Aleksandar Milicevic    schedule 05.09.2013