Я хотел бы закодировать семантику ключевого слова abstract как ограничение в Alloy (проявите терпение, мне нужно сделать это не просто так! :) ). если у меня есть следующий код:
abstract sig A {}
sig a1 extends A{}
sig a2 extends A{}
Я думаю, что его смысл будет следующим (надеюсь, я прав!):
sig A {}
sig a1 in A{}
sig a2 in A{}
fact {
A=a1+a2 //A is nothing other than a1 and a2
a1 & a2 = none // a1 and a1 are disjoint
}
поэтому две приведенные выше подписи равны (т. е. будут семантически равными):
Я очень хочу использовать ключевое слово Abstract, которое Alloy предоставляет, чтобы упростить жизнь, но проблема возникает, когда я делаю A подмножеством sig O и использую ключевое слово abstract:
sig O{}
abstract sig A in O{}
sig a1 extends A{}
sig a2 extends A{}
приведенный выше синтаксис возвращает ошибку! Alloy жалуется: «Подпись подмножества не может быть абстрактной», поэтому мой первый вопрос: Почему Alloy не допускает этого?
Я не останавливаюсь и не кодирую семантику абстрактного ключевого слова (как объяснялось выше) и прихожу к следующему коду:
sig O{}
sig A in O{}
sig a1 in A{}
sig a2 in A{}
fact {
A=a1+a2 // A can not be independently instantiated
a1 & a2 = none // a1 and a2 are disjoint
}
И это работает, и все в порядке :)
Теперь, если я хочу добавить a3 к моей спецификации Alloy, мне нужно настроить мою спецификацию следующим образом:
sig O{}
sig A in O{}
sig a1 in A{}
sig a2 in A{}
sig a3 in A{}
fact {
A=a1+a2+3
a1 & a2 = none
a1 & a3 = none
a2 & a3 = none
}
Но, как вы видите, сравнивая две приведенные выше спецификации, если я хочу продолжить это и добавить a4 аналогичным образом к моей спецификации, мне нужно еще больше изменить фактическую часть, а это по-прежнему создает проблемы! На самом деле количество выражений ai & aj =none (для i=1..n) возрастает немонотонно! т. е. добавление a4 вынуждает меня добавить более одного ограничения:
fact {
A=a1+a2+3 +a4
a1 & a2 = none
a1 & a3 = none
a1 & a4 = none
a2 & a3 = none
a2 & a4 = none
a3 & a4 = none
}
Итак, мой второй вопрос: Есть ли обходной путь (или, возможно, более простой способ) для этого?
Любой комментарий приветствуется. Спасибо :)