Лучшая практика использования логического значения в модели Alloy

Я создаю простой Alloy для создания простых объектов Java Pojo, и некоторые поля этого pojo являются логическими значениями. Теперь я использую следующий механизм для достижения этой функции

one sig item {
    autoPay: String,
    Price: Int
}

fact boolean {
    all n: item {
        item.autoPay = "true" or
        item.autoPay = "false"
    } 
}

Это будет работать, но каждый раз, когда я добавляю новое логическое поле, мне приходится изменять логический факт, чтобы убедиться, что значение равно «истине» или «ложи». Есть ли лучшая практика для этого? Как то, что Alloy делает для целых чисел?


person user2744486    schedule 11.09.2013    source источник


Ответы (1)


Было бы намного лучше ввести логический знак, а затем использовать его для всех ваших логических полей, например,

abstract sig Bool{}
one sig True extends Bool
one sig False extends Bool

one sig item {
  autoPay: Bool,
  Price: Int
}

Никаких дополнительных фактов в этом случае не требуется.

Если вам нравится этот подход, есть встроенная библиотека «util/boolean», которая определяет сигналы Bool, True и False точно так же, как я сделал выше, и дополнительно предоставляет некоторые вспомогательные функции (например, isTrue, And, Or и т. д.). так что вы можете просто сказать

open util/boolean 

one sig item {
  autoPay: Bool,
  Price: Int
}    
person Aleksandar Milicevic    schedule 12.09.2013
comment
Еще проще enum Boolean { True, False } - person Peter Kriens; 07.07.2017